PDA

Просмотр полной версии : [Fix]EscortAI


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

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

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

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

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

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

MaxXx2021
18.10.2010, 06:28
нет такого на оффе.

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

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

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

MaxXx2021
19.10.2010, 04:55
В СД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
Надо еще в базе посмотреть, назначен ли ему АИ-скрипт, т.к. часто скрипты СД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();
}
Вот так я решил эту проблему.