|
Баг-репорты Описываем проблемы и ошибки работы ядра |
|
Опции темы | Поиск в этой теме | Опции просмотра |
14.05.2010, 10:15 | #1 |
Администратор
|
Скорость полета на такси
Как-то сравнивал скорость полета на такси на мангосе и на офе (по видео) по квестам и пришел к выводу, что скорость разная: на мангосе квестовые маунты летают быстрее.
Наткнулся на этот косяк при попытке реализовать квесты http://ru.wowhead.com/quest=9718 и http://ru.wowhead.com/quest=12028. По квесту 12028 на игрока вешается баф 47189 продолжительностью 2:40, время полета на такси чуть меньше (на офе), а на мангосе время полета 1:40, т.е. на минуту меньше. По окончании действия спелла квест должен комплититься, но из-за разности в минуту квест будет работать неправильно. Спелл 47190 запускает такси 811, у которого во время полета есть 6 эвентов, в каждом из которых прописал определенную фразу, которую нпц должен говорить игроку в личку. Засекал время в каждой точке со стартом эвента от начала полета на офе и мангосе. Путем деления соответствующих отрезков времени пришел к выводу, что скорость на мангосе должна быть в 1.6 раза меньше. В базе нашел нпц по двум указанным квестам, которые выступают в роли маунтов с невидимой моделью. Код:
17972 - Invisible Mount Speed 30 21396 - Invisible Mount Speed 20 Код:
#define PLAYER_FLIGHT_SPEED 32.0f Если принять во внимание, что в названии заложена скорость полета на этом маунте для такси, то найдем коэффициент замедления: 32 / 20 = 1.6, что совпадает с расчетным значением. Внес изменения в ядро: Код:
inline float Traveller<Player>::Speed() { if (i_traveller.isInFlight()) { float PlayerFlightSpeed = PLAYER_FLIGHT_SPEED; if (!i_traveller.m_taxi.empty()){ switch (i_traveller.m_taxi.GetCurrentTaxiPath()){ case 512: // Stormcrow Amulet - spell 31606 PlayerFlightSpeed = 30.0f; break; case 811: // Toalu'u's Spiritual Incense - spell 47190 PlayerFlightSpeed = 20.0f; break; } } return PlayerFlightSpeed; } else return i_traveller.GetSpeed(i_traveller.m_movementInfo.HasMovementFlag(MOVEFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN); } Это продолжается примерно минуту. Эвенты запускаются, как и положено. Получается, что меняется реальный полет игрока, а визуальное отображение осталось прежним. 1. Возможно, надо послать клиенту какой-нибудь пакет об изменении скорости, например, MSG_MOVE_SET_FLIGHT_SPEED и т.д.? 2. Можно ли менять скорость полета не в Traveller<Player>::Speed(), а в описании эффекта спелла, который накладывается на игрока в начале полета? 3. Кто-нибудь встречал еще такси без маунтов или со скоростью, отличающейся от офа? 4. Есть ли возможность заставить нпц говорить фразу в личку игроку независимо от расстояния, например, по гуиду нпц? В квесте 12028 игрок улетает далеко, поэтому бОльшую часть фраз он говорит сам. |
14.05.2010, 13:24 | #2 | |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Визуальная часть полность контролируется клинетом. Сервер только синхронизирует серверную позицию.
Цитата:
Возможно скорость должна браться из данных маунта
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
14.05.2010, 13:50 | #3 |
Forum bot
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
|
То есть именно из-за этого (из-за того, что скорость полета не контролируется сервером) на одном и том же маршруте при различных условиях (например при высоких и низких настройках графики) бывает что дисмаунт происходит до подлета к таксисту и все окружение уже прорисовано, а бывает что по прилете вешает на звере возле таксиста, вокруг все мерцает и не прорисовывается сколько-то времени, а если с этой точки уйти, то по окончании времени полета перс обратно на нее прибегает?
Просто меня иногда при максимальной графике: Код:
/console groundEffectDensity 256 /console GroundEffectDist 200 /console FarClip 3500 /console HorizonFarClip 6226 /console SmallCull 0 /console DetailDoodadAlpha 100 /console CharacterAmbient 0 /console SkyCloudLod 3 А на минимальных: Код:
/console groundEffectDensity 16 /console GroundEffectDist 1 /console FarClip 177 /console HorizonFarClip 1305 /console SmallCull 1 /console DetailDoodadAlpha 1 /console CharacterAmbient 1 /console SkyCloudLod 1
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. |
14.05.2010, 14:01 | #4 | |
Администратор
|
Цитата:
Вариант с добавлением поля я вчера предлагал Laise. Кроме итого, добавление поля случайно не приведет к тому же эффекту? Ведь скорость будет браться из: Код:
return i_traveller.GetSpeed(i_traveller.m_movementInfo.HasMovementFlag(MOVEFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN); В итоге получим какое-то значение скорости. После изменения скорости полета для конкретного такси в коде сервер стал отрабатывать правильно, но визуально все работало, как и раньше. |
|
26.10.2010, 18:09 | #5 |
Администратор
|
Решил снова поднять данную тему.
Нашел 4 маунта, при полете на которых на такси должна меняться скорость полета. Код:
17972 Invisible Mount Speed 30 18392 Invisible Man Mount 30 21396 Invisible Mount Speed 20 21355 Invisible Man Mount 20 На текущий момент появился механизм изменения скорости полета на такси для клиента? |
26.10.2010, 18:16 | #6 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Там скорость от времени зависит вроде, клиент вычисляет ее насколько я помню...
|
26.10.2010, 18:19 | #7 |
MaNGOS Dev
Регистрация: 14.03.2010
Сообщений: 38
Сказал(а) спасибо: 23
Поблагодарили 49 раз(а) в 16 сообщениях
|
Смотрим в Unit::SendMonsterMoveByPath и видим захардкоденную скорость
почему именно "time = uint32(path.GetTotalLength(start, end) * 32);" я не знаю считать нужно по time = length / speed * 1000 но, со скорость 32 работает и старая формула, т.к. (length / 32) * 1000 равно length * 31,25 т.е. скорее всего сервер задает как скорость, так и все точки полета не тестировал, но уверен достаточно добавить еще 1 параметр в SendMonsterMoveByPath и скорость можно будет менять Последний раз редактировалось SilverIce; 26.10.2010 в 18:29. |
26.10.2010, 18:25 | #8 |
Администратор
|
Править будете?
Точки полета забиты в дбц. Если скорость полета для клиента и сервера будет считаться одинаково, то уже можно будет править скорость для данных маунтов. |
26.10.2010, 18:41 | #9 |
Администратор
|
Я ж не против.
Если можно будет с помощью одного параметра регулировать скорость полета на такси, то это будет замечательно. Для одного и того же такси могут быть использованы 2 разных маунта из указанного выше списка. В первой точке указан один, а в последней - другой, правда, скорость у них одинаковая. Это будет работать с дополнительным параметром? |
26.10.2010, 18:43 | #10 |
MaNGOS Dev
Регистрация: 14.03.2010
Сообщений: 38
Сказал(а) спасибо: 23
Поблагодарили 49 раз(а) в 16 сообщениях
|
не очень хотелось бы хардкодить в Traveller<Player>::Speed, хотя таблица с 2 записями это тоже смешно..
будет, ведь дополнительный параметр это есть скорость возможно speed_template, т.к. не думаю что все существа должны иметь абсолютно разные скорости Последний раз редактировалось SilverIce; 26.10.2010 в 18:55. |
26.10.2010, 18:53 | #11 |
Администратор
|
Скорость у этих мантов точно должна быть своя, сравнивал с офом с секундомером.
Выходит, что именно в Traveller и придется делать реализацию скорости. Только правильнее будет писать для указанных маунтов, т.к. они используются в разных такси, или для такси, использующих этих маунтов? |
26.10.2010, 19:05 | #12 | |
Администратор
|
Цитата:
Получается, что либо создавать таблицу, либо писать правку в ядре, либо добавлять поле в `creature_template`, например, `speed_taxi`. |
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
SCRIPT_COMMAND_QUEST_EXPLORED для эвентов такси | virusav | Принятые патчи | 0 | 05.05.2010 21:04 |