pro[100]Deadly | Дата: Неділя, 05.12.2010, 19:54 | Сообщение # 1 |
Группа: Видалені
|
Итак, в предыдущем урывке мы рассмотрели что такое координаты пути существа и как их создать. Так же мы рассмотрели один из способов связывания пути существа со скриптом, а именно средствами базы данных. Этот способ является наиболее удобным и рациональным. Но тем не менее, в некоторых случаях он не подходит для достижение цели и создания скрипта, который будет работать хотя бы отдаленно как на официальном сервере. Ярким примером является квест Escape from Skettis в данном квесте нам нужно что бы в зависимости от условий существо шло по абсолютно разным путям. Т.е. имело разные координаты точек пути. Что бы реализовать такую возможность, нам нужно воспользоваться методом класса npc_escortAI который называется AddWaypoint. Code void AddWaypoint(uint32 id, float x, float y, float z, uint32 WaitTimeMs = 0); С помощью этого метода мы в самом начале скрипта заполняем контейнер с точками пути существа. Так как мы это делаем в скрипте, мы можем сделать условие в результате которого точки будут иметь различные координаты. Например в квесте Escape from Skettis нам нужно что бы существо шло по различным путям в зависимости от места где оно находятся, так как у него есть 3 точки спавна. В данном квесте я воспользовался гуидом существа что бы определять какой именно путь ему выбрать. Хотя на самом деле условие может быть любым. Code void StartEvent(Player* pPlayer, const Quest* pQuest) { switch (me->GetGUIDLow()) { case 1189307: AddWaypoint(0, -4108.25, 3032.18, 344.799, 3000); AddWaypoint(1, -4114.41, 3036.73, 344.039); AddWaypoint(2, -4126.41, 3026.07, 344.156); AddWaypoint(3, -4145.17, 3029.69, 337.423); AddWaypoint(4, -4173.69, 3035.72, 343.346); AddWaypoint(5, -4173.70, 3047.37, 343.888); AddWaypoint(6, -4183.47, 3060.62, 344.157, 3000); AddWaypoint(7, -4179.13, 3090.20, 323.971, 30000); Start(false, false, pPlayer->GetGUID(), pQuest); break; case 1189309: AddWaypoint(0, -3718.81, 3787.24, 302.890, 3000); AddWaypoint(1, -3714.44, 3780.35, 302.075); AddWaypoint(2, -3698.33, 3788.04, 302.171); AddWaypoint(3, -3679.36, 3780.25, 295.077); AddWaypoint(4, -3654.82, 3770.43, 301.291); AddWaypoint(5, -3656.07, 3757.31, 301.985); AddWaypoint(6, -3648.83, 3743.07, 302.173, 3000); AddWaypoint(7, -3659.16, 3714.94, 281.576, 30000); Start(false, false, pPlayer->GetGUID(), pQuest); break; default: AddWaypoint(0, -3671.51, 3385.36, 312.956, 3000); AddWaypoint(1, -3677.74, 3379.05, 312.136); AddWaypoint(2, -3667.52, 3366.45, 312.233); AddWaypoint(3, -3672.87, 3343.52, 304.994); AddWaypoint(4, -3679.35, 3319.01, 311.419); AddWaypoint(5, -3692.93, 3318.69, 312.081); AddWaypoint(6, -3704.08, 3309.56, 312.233, 3000); AddWaypoint(7, -3733.99, 3315.77, 292.093, 30000); Start(false, false, pPlayer->GetGUID(), pQuest); break; } return; }
Добавлено (05.12.2010, 19:54) --------------------------------------------- Мы рассмотрели основу скриптов с эскортом - создание и связывание со скриптом пути существа. Теперь мы рассмотрим как запустить сам скрипт - заставить существо идти по заданному маршруту. Для этого существует метод Start Code void Start(bool bIsActiveAttacker = true, bool bRun = false, uint64 uiPlayerGUID = 0, const Quest* pQuest = NULL, bool bInstantRespawn = false, bool bCanLoopPath = false); Этот метод может быть вызван в зависимости от какого-либо условия. Наиболее частые условия - взятие квеста у существа или разговор с существом. Как вы видите у каждой переменной этой функции есть значение по умолчанию. Потому во время ее вызова можно не заполнять значение переменных. Т.е. будет достаточно ее вызвать вот так: Тем не менее чаще всего в скрипте нужны такие данные как гуид персонажа, квест, потому желательно заполнять эти переменные. Вот описание этих переменных: bool bIsActiveAttacker - если стоит значение true, то существо будет нападать на всех вражеских существ, которые будут в радиусе его агро. Соответственно если значение false, то существо будет атаковать только если само будет атаковано или же будет атакован игрок, который сопровождает это существо. bool bRun - если стоит значение true, то существо будет бежать во время эскорта, если false - идти. uint64 uiPlayerGUID гуид игрока который сопровождает существо. const Quest* pQuest ид квеста. Если стоит не нулевое значение, это означает что в случае смерти существа, квест у сопровождающего игрока провалиться. bool bInstantRespawn не использовался мною. Будет заполнено позже. (Респавн после смерти?) bCanLoopPath не использовался мною. Будет заполнено позже. Рассмотрим пример вызова этого метода во время взятия квеста. Code bool QuestAccept_npc_test(Player* pPlayer, Creature* pCreature, Quest const* pQuest) { if (pQuest->GetQuestId() == SOME_QUEST) { if (npc_escortAI* pEscortAI = CAST_AI(npc_escortAI, pCreature->AI())) pEscortAI->Start(false, false, pPlayer->GetGUID(), pQuest); } return true; } Это означает, что существо будет идти, не будет самостоятельно нападать. В случае смерти квест SOME_QUEST будет провален у игрока с гуидом pPlayer->GetGUID(). Так же теперь можно использовать гуид игрока в скрипте с помощью метода Player* GetPlayerForEscort() Например вот такой функцией в скрипте: Code Player* pPlayer = GetPlayerForEscort() .... if (Player* pPlayer = GetPlayerForEscort()) { условие; }
|
|
|
|