|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
18.11.2012, 21:11 | #1 | |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Телепорт мобов
Подскажите, в каком направлении копать.
Есть например босс, Эхо Джайны в 4.3.4. У неё есть спелл "Скачок" 101812, да и любого другого с этим эффектом, например блинка мага Цитата:
То етсь визуально она в клиенте остаётся на месте, но бить её уже нельзя. Так как сервер считает что она далеко. Если начать идти то она сразу появится на том месте и начнет идти к игроку. Я так понял по коду, что опкод MSG_MOVE_HEARTBEAT должен обновить состояние моба. Он вроде как отправляется. Проверил парсером пакетов, с сервера этот пакет идёт только для игрока. С клиента парсер не открывал, писал что не верный пакет. Удалил отправку перед пакетом PackGUID() парсер стал открывать, показывает правильный ID моба и координаты куда он переместился, но в клиенте не какой реакции... Пытался в IDA посмотреть по номеру опкода, но там брекпоинты срабатывали только при отправки пакета от клиента. То ли пакет не правильный и клиент его отвергает, то ли это вообще не тот пакет что нужен, то ли в клиенте при получении опкода, нет сравнения именно по числу, там же видимо как и в сервере, вызывается функция обработки опкода по полученному числу с сокета. Если это тот пакет что нужен, подскажите хотя бы, может кто знает, по каким адресам можно найти обработку пакета в клиенте, входящего. |
|
19.11.2012, 01:56 | #3 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Я думал в эту сторону. Просто этот пакет только для класса Player Отправляется. Я и думал что он для мобов не подойдёт. Попробую отправить для моба. Спасибо!
Всё действительно получилось! Ещё раз спасибо! А почему тогда и в мангосе и в тринити после спеллеффекта SPELL_EFFECT_LEAP = 29 идёт выбор, для игрока отправляется MSG_MOVE_TELEPORT а для моба MSG_MOVE_HEARTBEAT? MSG_MOVE_HEARTBEAT получается вообще ен нужно отправлять для моба? Это видимо из прошлых реализаций осталось... Не подскажете ещё, во время прыжка у себя я вижу игрока нормально, а другие видят рывками мои прыжки. Это в какую сторону смотреть? Последний раз редактировалось Easy; 19.11.2012 в 02:29. |
19.11.2012, 10:35 | #4 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
|
|
19.11.2012, 12:22 | #5 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Ну я думаю это сокрей всего связанно с опкодом или флагом.
При получении CMSG_MOVE_JUMP мы отсылаем всем игрокам SMSG_PLAYER_MOVE. И уже клиент должен построить плавность прыжка. Не передаются же с сервера попиксельно расёт перемещения игрока. Вот я смотрю, у Unit есть m_movementinfo (в Object) в котором есть позиция. А есть просто m_position... А флаги передвижения только в m_movementinfo. Чем отличаются позиция в movementinfo от позиции в Unit. Почему бы не сделать только в одном месте позицию? |
20.11.2012, 01:32 | #6 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
чем отличается плеер от моба? правильно, ничем (объектную плеерскую надстройку не будет считать здесь). для этого юнита можно отправлять любые плеерские опкоды. можно хоть MSG_MOVE_STOP слать, с шагом 100 ярдов - и будет телепорт.
почему на мангосе и трините сделано так? я не знаю. просто тот кто это делал - сделал свою работу плохо. затычками. к другим затычкам. отсюда соответствующая репутация (не в обиду всему проекту). ну не суть. я уже забыл, но по моему у клиента есть дополнительный обработчик на телепорт. но по факту все это ерунда, нужно для правильных отрисовок да и только. насколько я мог понять, сейчас все эти пакеты обрабатываются вообще одним обработчиком. с небольшими дополнительными "вставками" для некоторых опкодов. телепорт как раз в их числе. изначально мув данные передавались внутри А9 и был соответствующий кейз в клиенте (стадия альфы 2004 и последующие некоторые беты). потом стали добавлять "новые фичи", связанные с мувементом, в виде новых опкодов. вполне резонно было вынести мув блок из А9 в отдельный обработчик и объеденить старые и новые опкоды. в новом варианте видимо по привычке часть данных А9 называют мувблоком, хотя формально их там давно нет, это ошибка. один из транков моего сервера поддерживает альфу 0.5.3, что называется чисто на поржать причем я не стал тут реализовывать флаги и дополнительные блоки. вломы теперь по поводу рывков: смотреть в сторону синхронизации объектов. это довольно сложная для понимания тема и немного хитрая в реализации. боюсь не осилите снаскоку. еще никто не осилил ее ни в одном проекте (кроме одного ), даже близко не подошли. я серьезно. сплайты тут не причем, да. насчет m_movementInfo: "просто" m_position - выкинуть, правильно - разместить в m_movementInfo, в одном месте, все правильно. чем отличается плеер от юнита? правильно, ничем мувемент у них один. |
Пользователь сказал cпасибо: | Easy (20.11.2012) |
20.11.2012, 02:48 | #7 | ||
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Вот я и хотел узнать, стоит ли выбросить просто m_position, так как по сути из за того что сейчас координаты в двух разных переменных хранятся, сервер работает с m_position а в пакеты вставляются с m_movement, приходится перед отправкой m_movement, да и при получении синхронизировать переменные, значит просто перепишу Get..., Set.., UpdatePosition... на movement.
А вот по поводу прыжков, я всё же думаю тут беда с флагами возможна. Вот я прыгнул, на сервер ушел пакет Цитата:
В парсере пакетов пишет MOVEFLAG_ROOT. Чар у меня в клиенте летит плавно. То есть здесь явно нет передачи с сервера координат полёта, клиент сам рассчитывает, при приземлении может быть небольшое дёрганье, вот тут как раз видимо из за синхронизации. По поводу синхронизации картинки между клиентами я прочёл много... так как делал сервер для флешь игрушки небольшой. Но тут вопрос не в том что картинка не совпадает. А в том что картинка идёт рывками. Раньше же, даже хотя бы в 3.3.5 не было такого. Да, рассихнронизации была, за прыжок разок дёргался бывало чар или после приземления, но пока летел было плавно. Сейчас же он вообще не летит! Он просто дёргается, пропадает появляется в другом месте несколько раз за прыжок. Видимо с сервера летят пакеты игрокам с местоположением. Сейчас при получении любого MOVE пакета, уходит опкод MSG_PLAYER_MOVE с теми же данными. То етсь на прыжок ушел пакет Цитата:
|
||
20.11.2012, 09:28 | #8 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
Подергивание при приземлении - это результат рассинхронизации (или, маловероятно, неверных флагов) и обработки С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; }; Как выяснилось, наличие или отутсвие MOVEFLAG_FALLING никак не связано с присутствием fall information в пакете, а так как в тринитях об этом не знают, то и получается, что либо не она не шлется, когда она нужна, либо шлется неверная. Поэтому я и замутил эту штуку со StatusInfo. Последний раз редактировалось Amaru; 20.11.2012 в 09:30. |
|
Пользователь сказал cпасибо: | Easy (20.11.2012) |
20.11.2012, 11:38 | #9 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Я не шифруюсь, я раньше в темах писал что тринити юзаю
Просто там спрашивать не у кого, то ли не кто не знает то ли просто не кто не отвечает А По поводу телепорта мобов, я компили мангос и проверял, тоже не работало, вот и не написал что тринити. А вот прыжки... да, что то я не проверил в мангосе. по поводу movementinfo япочти все под мангос переделал, так как я понял что когда тринити это выдрали у мангоса, они не туда это запихнули как минимум, у них пакеты исходящие не перемешиваются... вот только структуру эту я и не перенёс Сегодня попробую перенести. |
20.11.2012, 16:26 | #10 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Да, перенёс ещё немного кода с мангоса в тринити по мовементам и прыжки теперь плавные
Всё таки плохо, когда в тринити копируют код, даже не думая что он делает и как работает Всем спасибо за помощь! |
20.11.2012, 16:47 | #11 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
все мув пакеты нужно передавать как есть, со всеми флагами и соответствующими им дополнительными блоками. за исключением timestamp (у близзов оно называется m_moveStartTime), которое является одним из элементов синхронизации и расчитывается на сервере.
|
20.11.2012, 16:49 | #12 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Тринити копировали не с мангоса, я уже точно не помню откуда. Идентичная Тринитям наработка была в Strawberry, но там не было этой фичи StatusInfo.
|
20.11.2012, 17:05 | #13 | ||
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Вообщем я не думаю что тринити это сделано само, и те у кого они даже взяли, раз там сделано так же, то они тоже сделали не сами, раз оно у них есть но не работает значит они при копировании не до конца понимали как оно должно работать
Я вот ещё заметил, что Timestamp в пакетах от клиента не соответствует Timestamp пакетов от сервера Цитата:
Цитата:
В тринити класс WorldObject наследует класс Position чреез класс WorldLocation. Так же как и Transport. А значит вся инфа в movementinfo о положении юнитов и транспорта дублируется, но из за наследования нужно много кда перелопатить что бы все переделать А структура movement в тринити похоже не заполняется, перед отправкой приходится заполнять... |
||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Телепорт в Логово Крыла Тьмы[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 |