Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Баг-репорты (http://mangos.ytdb.ru/forumdisplay.php?f=27)
-   -   Скорость полета на такси (http://mangos.ytdb.ru/showthread.php?t=1068)

virusav 14.05.2010 10:15

Скорость полета на такси
 
Как-то сравнивал скорость полета на такси на мангосе и на офе (по видео) по квестам и пришел к выводу, что скорость разная: на мангосе квестовые маунты летают быстрее.

Наткнулся на этот косяк при попытке реализовать квесты 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
По квесту 12028 маунт 21396.
Если принять во внимание, что в названии заложена скорость полета на этом маунте для такси, то найдем коэффициент замедления: 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:40, но после приземления вокруг нет нпц, го, игрок фактически сидит на невидимом маунте.
Это продолжается примерно минуту.
Эвенты запускаются, как и положено.

Получается, что меняется реальный полет игрока, а визуальное отображение осталось прежним.

1. Возможно, надо послать клиенту какой-нибудь пакет об изменении скорости, например, MSG_MOVE_SET_FLIGHT_SPEED и т.д.?
2. Можно ли менять скорость полета не в Traveller<Player>::Speed(), а в описании эффекта спелла, который накладывается на игрока в начале полета?
3. Кто-нибудь встречал еще такси без маунтов или со скоростью, отличающейся от офа?

4. Есть ли возможность заставить нпц говорить фразу в личку игроку независимо от расстояния, например, по гуиду нпц? В квесте 12028 игрок улетает далеко, поэтому бОльшую часть фраз он говорит сам.

Vladimir 14.05.2010 13:24

Визуальная часть полность контролируется клинетом. Сервер только синхронизирует серверную позицию.

Цитата:

1. Возможно, надо послать клиенту какой-нибудь пакет об изменении скорости, например, MSG_MOVE_SET_FLIGHT_SPEED и т.д.?
Полеты на такси никакого отношения к полетам вообще не имеют.

Возможно скорость должна браться из данных маунта

tempura 14.05.2010 13:50

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




Просто меня иногда при максимальной графике:
Код:

/console groundEffectDensity 256
/console GroundEffectDist 200
/console FarClip 3500
/console HorizonFarClip 6226
/console SmallCull 0
/console DetailDoodadAlpha 100
/console CharacterAmbient 0
/console SkyCloudLod 3

(экран 2560х1024, фуллскрин) в полете (особенно в Нортренде) так вешает, что логаутом выбивает. :) :) :)

А на минимальных:
Код:

/console groundEffectDensity 16
/console GroundEffectDist 1
/console FarClip 177
/console HorizonFarClip 1305
/console SmallCull 1
/console DetailDoodadAlpha 1
/console CharacterAmbient 1
/console SkyCloudLod 1

(экран 640х480, в окне) как истребитель шныряет. :)

virusav 14.05.2010 14:01

Цитата:

Сообщение от Vladimir (Сообщение 6411)
Визуальная часть полность контролируется клинетом. Сервер только синхронизирует серверную позицию.


Полеты на такси никакого отношения к полетам вообще не имеют.

Возможно скорость должна браться из данных маунта

В базе нет поля для скорости полета для нпц.
Вариант с добавлением поля я вчера предлагал Laise.:)

Кроме итого, добавление поля случайно не приведет к тому же эффекту?
Ведь скорость будет браться из:
Код:

        return i_traveller.GetSpeed(i_traveller.m_movementInfo.HasMovementFlag(MOVEFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
только параметр будет другой.

В итоге получим какое-то значение скорости.

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

virusav 26.10.2010 18:09

Решил снова поднять данную тему.

Нашел 4 маунта, при полете на которых на такси должна меняться скорость полета.
Код:

17972        Invisible Mount Speed 30
18392        Invisible Man Mount 30
21396        Invisible Mount Speed 20
21355        Invisible Man Mount 20

В первом посте указан пример, как можно менять скорость для сервера.

На текущий момент появился механизм изменения скорости полета на такси для клиента?

TOM_RUS 26.10.2010 18:16

Там скорость от времени зависит вроде, клиент вычисляет ее насколько я помню...

SilverIce 26.10.2010 18:19

Смотрим в Unit::SendMonsterMoveByPath и видим захардкоденную скорость

почему именно "time = uint32(path.GetTotalLength(start, end) * 32);" я не знаю
считать нужно по time = length / speed * 1000
но, со скорость 32 работает и старая формула, т.к.
(length / 32) * 1000 равно length * 31,25

т.е. скорее всего сервер задает как скорость, так и все точки полета
не тестировал, но уверен

достаточно добавить еще 1 параметр в SendMonsterMoveByPath и скорость можно будет менять

virusav 26.10.2010 18:25

Править будете?

Точки полета забиты в дбц.
Если скорость полета для клиента и сервера будет считаться одинаково, то уже можно будет править скорость для данных маунтов.

virusav 26.10.2010 18:41

Я ж не против.:)

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

Для одного и того же такси могут быть использованы 2 разных маунта из указанного выше списка.
В первой точке указан один, а в последней - другой, правда, скорость у них одинаковая.

Это будет работать с дополнительным параметром?

SilverIce 26.10.2010 18:43

не очень хотелось бы хардкодить в Traveller<Player>::Speed, хотя таблица с 2 записями это тоже смешно..
будет, ведь дополнительный параметр это есть скорость :)

Цитата:

Сообщение от virusav (Сообщение 6416)
В базе нет поля для скорости полета для нпц.
Вариант с добавлением поля я вчера предлагал Laise.:)

возможно speed_template, т.к. не думаю что все существа должны иметь абсолютно разные скорости

virusav 26.10.2010 18:53

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

Только правильнее будет писать для указанных маунтов, т.к. они используются в разных такси, или для такси, использующих этих маунтов?

virusav 26.10.2010 19:05

Цитата:

Сообщение от SilverIce (Сообщение 15429)
возможно speed_template, т.к. не думаю что все существа должны иметь абсолютно разные скорости

Проверял квест с полетом на такси с видимым маунтом и сравнивал по видео с офом - общее время полета разное.

Получается, что либо создавать таблицу, либо писать правку в ядре, либо добавлять поле в `creature_template`, например, `speed_taxi`.


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

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