Code
enum
{
ACHIEVEMENT_ID = 100000,
CAST_SPELL = 1000,
MOB_ID = 999999,
};
class boss_test_mob2 : public CreatureScript
{
public:
boss_test_mob2() : CreatureScript("boss_test_mob2") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_test_mob2AI (creature);
}
struct boss_test_mob2AI : public ScriptedAI
{
boss_test_mob2AI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
bool AchievCheck;
InstanceScript* instance;
void Reset()
{
AchievCheck = false;
}
void VoidCheck()
{
AchievCheck = true;
}
void JustDied(Unit* /*killer*/)
{
if (!AchievCheck)
instance->DoCompleteAchievement(ACHIEVEMENT_ID);
}
void UpdateAI(cinst uint32 diff) {}
};
};
class boss_test_mob1 : public CreatureScript
{
public:
boss_test_mob1() : CreatureScript("boss_test_mob1") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_test_mob1AI (creature);
}
struct boss_test_mob1AI : public ScriptedAI
{
boss_test_mob1AI(Creature* creature) : ScriptedAI(creature) { }
uint64 mobGUID;
uint32 CastTimer;
void Reset()
{
CastTimer = 10000;
if (Creature* mob = GetClosestCreatureWithEntry(*me, MOB_ID, 1000.0f))
mobGUID = mob->GetGUID();
}
void UpdateAI(cinst uint32 diff)
{
if (CastTimer <= diff)
{
CastTimer = 10000;
DoCast(me->getVicte(), CAST_SPELL);
if (Creature* testMob = Unit::GetCreature(*me, mobGUID)
if (testMob->isAlive())
if (boss_test_mob2::boss_test_mob2AI* mobAI = dynamic_cast<boss_test_mob2::boss_test_mob2AI*>(testMob->AI())
mobAI->VoidCheck();
}
else CastTimer -= diff;
}
};
};
1 - энум(перечисление значений)
Записываем ИД достижения, ИД спелла для каста и ИД моба
2 - Инициализируем АИ второго моба. Все мы уже проходили(если читатель изучил все предыдущие материалы)
Но в этом случае вводим обязательные переменные:
Code
bool AchievCheck;
InstanceScript* instance;
Без них не получится ничего.
Инициализируем их:
Code
{
instance = creature->GetInstanceScript();
}
void Reset()
{
AchievCheck = false;
}
Без инициализации первой (instance) не будет работать ф-ция "DoCompleteAchievement"
Вторая - булевая переменная. Она может иметь два значения: true(логическая истина) и false(логическая ложь)
Присваиваем ей "ложь".
Дальше создаем воидную функцию
Code
void VoidCheck()
{
AchievCheck = true;
}
В которой, в случае действия этой ф-ции, меняем значение переменное на истинное.
Тут мы проходили в первом мануале: ф-ции, вызываемая при смерти моба и в ней ф-ция заверщения достижения.
Code
void JustDied(Unit* /*killer*/)
{
if (!AchievCheck)
instance->DoCompleteAchievement(ACHIEVEMENT_ID);
}
Первый моб разобран.
Идем ко второму, у которого все и делается -)
Code
uint64 mobGUID;
uint32 CastTimer;
Не буду объяснять еще раз что это такое и для чего.
Что такое UpdateAI я уже тоже объяснял.
Code
if (CastTimer <= diff)
{
CastTimer = 10000;
DoCast(me->getVictim(), CAST_SPELL);
if (Creature* testMob = Unit::GetCreature(*me, mobGUID)
if (testMob->isAlive())
if (boss_test_mob2::boss_test_mob2AI* mobAI = dynamic_cast<boss_test_mob2::boss_test_mob2AI*>(testMob->AI())
mobAI->VoidCheck();
}
else CastTimer -= diff;
}
Все это мы разбирали. Но вкратце еще раз по-быстрому разберем.
Code
if (CastTimer <= diff)
{
CastTimer = 10000;
DoCast(me->getVictim(), CAST_SPELL);
проверка на окончание таймера, в ней обновление таймера и каст спелла на выбранную мобом цель(танка)
Code
if (Creature* testMob = Unit::GetCreature(*me, mobGUID)
if (testMob->isAlive())
if (boss_test_mob2::boss_test_mob2AI* mobAI = dynamic_cast<boss_test_mob2::boss_test_mob2AI*>(testMob->AI())
mobAI->VoidCheck();
проверки на существование моба вообще, на "жив ли моб" и на "есть ли у моба АИ".
После чего от лица моба (mobAI->) применяем ф-цию VoidCheck(); (значит меняем значение нашей переменной (AchievCheck) на истинное.