Пример скрипта где использован один спелл у одного моба
Code
//Начинает сам скрипт моба
//Задание констант для удобного пользования
// CRYSTALCORE MECHANIC
#define CN_CRYSTAL_MECHANIC 20052 //номер моба
#define SAW_BLADE 37123 //номер спела
//Начинается сам скрипт, важно задавать имя скрипта уникальным
class CRYSTALMECHANICAI : public CreatureAIScript
{
//Сдесь задаются переменные и функции доступные только для этого моба
protected:
int nrspells; //создание целой переменной
SP_AI_Spell spells[1]; //создание массива спелов из 1 одного спела
//Сдесь задаются переменные и функции доступные для всего скрипта или класса(точно не уверен)
public:
ADD_CREATURE_FACTORY_FUNCTION(CRYSTALMECHANICAI);
CRYSTALMECHANICAI(Creature* pCreature) : CreatureAIScript(pCreature)
{
nrspells = 1;//указывается число спелов в массиве(если число больше числа в массиве краш сервера)
[b]//Часть где указываются характеристики спелов
spells[0].info = dbcSpell.LookupEntry(SAW_BLADE);//создание самого спела
spells[0].targettype=TARGET_SELF;//Тип спела
/*Все типы
TARGET_SELF,на себя
TARGET_VARIOUS,на себя//Не использовать
TARGET_ATTACKING,на атакуещего
TARGET_DESTINATION,каст по области где атакакующий
TARGET_SOURCE,//каст по области где сам юнит
//касты на рандом цели(смысл тот же)
TARGET_RANDOM_FRIEND,
TARGET_RANDOM_SINGLE,
TARGET_RANDOM_SINGLE_ANGLE,//выбор цели по углу место положения цели относительно взгляда моба(пока не реализовал угл но уже можно прописывать)
TARGET_RANDOM_DESTINATION,
*/
spells[0].instant=false;//мгновенный ли каст. если мгновенный то можно не указывать поле
spells[0].perctrigger=100.0f;//процент каст при каждой попытке
spells[0].attackstoptimer=2000;//остановка физ урона на определенное время(по умолчанию 1000) если 1000 не указывать(в мил сек)
spells[0].soundid=0;//звук который будет играть при касте
spells[0].speech='бла бла';//речь которую скажет моб при касте
spells[0].cooldown=2;//перезарядка спела(в секах)
spells[0].casttime=3000;//время каста(лучше указывать пока сам не знаю зачем)(в мил сек)
spells[0].mindist2cast=0.0f;//минимальная дистанция каста для рандом цели(по умолч 0)
spells[0].maxdist2cast=100.0f;//макс ---(умолчан 100)
spells[0].minhp2cast=0;//минимальное здоровье цели
spells[0].maxhp2cast=100;//максимальное здоровье цели
//Если вы используете значение по умолчанию то просто не надо его вообще задавать
}
//функция срабатывающая при начале боя
void OnCombatStart(Unit* mTarget)
{
for(int i=0;i<nrspells;i++) spells[i].Timer = 0; //обнуление таймеров
RegisterAIUpdateEvent(1000); //создания события которое будет повторятся каждые 1000 милсек
}
//функция при смерти моба
void OnTargetDied(Unit* mTarget)
{
}
//при остановке боя
void OnCombatStop(Unit *mTarget)
{
_unit->GetAIInterface()->setCurrentAgent(AGENT_NULL);//нужно чтоб моб остался в последнем месте где дрался
_unit->GetAIInterface()->SetAIState(STATE_IDLE);//нужно чтоб моб остался в последнем месте где дрался
RemoveAIUpdateEvent();//удаления события таймера
}
//событие при смерти
void OnDied(Unit * mKiller)
{
RemoveAIUpdateEvent();//удаления события таймера
}
//Функция таймера которая постоянно повторяется
void AIUpdate()
{
SpellCastVal(spells,_unit,0,nrspells);//передатача массива спелов для рандом кастов и тп(вообщем сам каст мобов
}
};
//сдесь прописывают сами скрипты мобов
void SetupTheEye(ScriptMgr * mgr)
{
mgr->register_creature_script(CN_CRYSTAL_MECHANIC, &CRYSTALMECHANICAI::Create);
}
Пример скрипт Сгущёного_молочка
Code
spells[0].info = dbcSpell.LookupEntry(THUNDER_SHOCK);
spells[0].targettype=TARGET_DESTINATION;
spells[0].instant=false;
spells[0].perctrigger=50.0f;
spells[0].attackstoptimer=2000;
spells[0].cooldown=10;
spells[0].casttime=30;
spells[1].info = dbcSpell.LookupEntry(TERRIFY);
spells[1].targettype=TARGET_ATTACKING;
spells[1].perctrigger=60.0f;
spells[1].attackstoptimer=2000;
spells[1].cooldown=50;
}
void OnCombatStart(Unit* mTarget)
{
for(int i=0;i<nrspells;i++) spells[i].Timer = 0;
RegisterAIUpdateEvent(1000);
}
void OnTargetDied(Unit* mTarget)
{
}
void OnCombatStop(Unit *mTarget)
{
_unit->GetAIInterface()->setCurrentAgent(AGENT_NULL);
_unit->GetAIInterface()->SetAIState(STATE_IDLE);
RemoveAIUpdateEvent();
}
void OnDied(Unit * mKiller)
{
RemoveAIUpdateEvent();
}
void AIUpdate()
{
SpellCastVal(spells,_unit,0,nrspells);
}
};
void SetupWC(ScriptMgr * mgr)
{
mgr->register_creature_script(CN_MUTANUS_THE_DEVOURERAI, &MUTANUSTHEDEVOURERAIAI::Create);