Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Скрипты (http://mangos.ytdb.ru/forumdisplay.php?f=19)
-   -   [Fix]EscortAI (http://mangos.ytdb.ru/showthread.php?t=2702)

MaxXx2021 18.10.2010 05:46

[Fix]EscortAI
 
Вложений: 1
Ну начну с того что поправил одну ошибку в эскорте, а именно что когда ставим паузу эскорту и к примеру на эскортера нападают, то при выходе из комбата он бежит месту спауна в базе. Щас, при паузе, он будет бежать к месту начала атаки.
Вторая модификация. Незнаю как на оффе (я сужу по другим играм), если игрок отстает от эскортера он останавливается, поворачивается к игроку и ждет его (радиус отставания я сделал 28), подбегаем к нему на расстояние 10 он снова начинает бежать. Думаю это будет гораздо лудше чем он умрет. Делал на основе курицы в танарисе :) . Она бежит через всех мобов на пролом, пока их убьешь курица в деспавн уйдет. Для того чтобы функция была активна указываем при старте эскорта гуид игрока. Start(true, pPlayer->GetGUID());
Для того чтобы эскортер игнорировал остановку и не ждал, пишем так Start(true);
Сразу говорю я гитом не пользуюсь и черепахой, escort.cpp полностью.

alien 18.10.2010 06:14

Цитата:

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

MaxXx2021 18.10.2010 06:17

Цитата:

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

Я про убийство не говорю :) я про то что если моб спокойно бежит, то он останавливается подождать если игрок отбегает через чур далеко он деспавнится :)

SeT 18.10.2010 06:25

Цитата:

Сообщение от MaxXx2021 (Сообщение 15153)
Я про убийство не говорю :) я про то что если моб спокойно бежит, то он останавливается подождать если игрок отбегает через чур далеко он деспавнится :)

нет такого на оффе.

MaxXx2021 18.10.2010 06:28

Цитата:

Сообщение от SeT (Сообщение 15154)
нет такого на оффе.

Эххх ну да ладно оставлю для себя :)

virusav 18.10.2010 18:24

В СД2 при сопровождении нпц идет по точкам с паузами, если они есть.
При вхождении нпц в бой в точке 3, после окончания боя он вернется в точку 3 и продолжит путь к точке 4.

Упомянутый квест на курицу в Танарисе и подобные ему работают именно так (те, что мне довелось выполнять).

MaxXx2021 19.10.2010 04:55

Цитата:

Сообщение от virusav (Сообщение 15165)
В СД2 при сопровождении нпц идет по точкам с паузами, если они есть.
При вхождении нпц в бой в точке 3, после окончания боя он вернется в точку 3 и продолжит путь к точке 4.

Упомянутый квест на курицу в Танарисе и подобные ему работают именно так (те, что мне довелось выполнять).

Пример, битва за подгород. Ведем Тралла до двора ставим эскорту SetEscortPause(true);
Тралл входит в бой, ну скажем игроки более одеты, тралл выходит из комбата и бежит к месту спауна в базе, что потверждает данный текст
Код:

void npc_escortAI::EnterEvadeMode()
{
    m_creature->RemoveAllAuras();
    m_creature->DeleteThreatList();
    m_creature->CombatStop(true);
    m_creature->SetLootRecipient(NULL);

    if (HasEscortState(STATE_ESCORT_ESCORTING))
    {
        debug_log("SD2: EscortAI has left combat and is now returning to CombatStartPosition.");

        if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
        {
            AddEscortState(STATE_ESCORT_RETURNING);

            float fPosX, fPosY, fPosZ;
            m_creature->GetCombatStartPosition(fPosX, fPosY, fPosZ);
            m_creature->GetMotionMaster()->MovePoint(POINT_LAST_POINT, fPosX, fPosY, fPosZ);
        }
    }
    else
    {
        if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
            m_creature->GetMotionMaster()->MoveTargetedHome();
    }

    Reset();
}

из которого видно что при HasEscortState(STATE_ESCORT_ESCORTING)
он начинает движение.
А если будет HasEscortState(STATE_ESCORT_PAUSED) куда он побежит?

virusav 19.10.2010 19:32

Надо еще в базе посмотреть, назначен ли ему АИ-скрипт, т.к. часто скрипты СД2 и АИ идут вместе, о чем пишется в коммитах на форуме СД2.
Если АИ есть, то это может сильно изменить общее поведение заскриптованного нпц.

MaxXx2021 21.10.2010 05:45

Цитата:

Сообщение от virusav (Сообщение 15213)
Надо еще в базе посмотреть, назначен ли ему АИ-скрипт, т.к. часто скрипты СД2 и АИ идут вместе, о чем пишется в коммитах на форуме СД2.
Если АИ есть, то это может сильно изменить общее поведение заскриптованного нпц.

Это я знаю :) И всегда обнуляю поле ЕвентАИ, при выставление СкриптНэйм. Дело в самом коде эскорта, что пауза не учитана в EnterEvadeMode()
Код:

void npc_escortAI::EnterEvadeMode()
{
    m_creature->RemoveAllAuras();
    m_creature->DeleteThreatList();
    m_creature->CombatStop(true);
    m_creature->SetLootRecipient(NULL);

    if (HasEscortState(STATE_ESCORT_ESCORTING) || HasEscortState(STATE_ESCORT_PAUSED))
    {
        debug_log("SD2: EscortAI has left combat and is now returning to CombatStartPosition.");

        if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
        {
            float fPosX, fPosY, fPosZ;
            m_creature->GetCombatStartPosition(fPosX, fPosY, fPosZ);

            if(!HasEscortState(STATE_ESCORT_PAUSED))
            {
              AddEscortState(STATE_ESCORT_RETURNING);
              m_creature->GetMotionMaster()->MovePoint(POINT_LAST_POINT, fPosX, fPosY, fPosZ);
            }
            else
              m_creature->GetMotionMaster()->MovePoint(0, fPosX, fPosY, fPosZ);
        }
    }
    else
    {
        if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
            m_creature->GetMotionMaster()->MoveTargetedHome();
    }

    Reset();
}

Вот так я решил эту проблему.


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

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