| HammeR | Дата: Середа, 01.12.2010, 12:37 | Сообщение # 1 |
Рыцарь
Группа: Пользователи
|
Всем привет. Продолжаю работать над инстом Зул Гуруб. Второй мой скрипт на босса: http://ru.wowhead.com/npc=11382 В данный момент скрипт не является 100% рабочим по сравнению с официальным сервером, нужно проработать еще несколько моментов. Code enum MandokirNPC { // ID босса Bloodlord Mandokir ZG_MANDOKIR = 11382, //ID раптора ZG_OHGAN = 14988, //ID духа CHAINED_SPIRIT = 15117 };
enum MandokirSpells { //все заклинания босса Bloodlord Mandokir MANDOKIR_CHARGE = 24315, MANDOKIR_CLEAVE = 20691, MANDOKIR_FEAR = 29321, //заклинание страха, в версиях игры до 3.0.1 босс использовал спелл, если в ближнем бою его били три и более игроков MANDOKIR_WHIRLWIND = 24236, MANDOKIR_MORTAL_STRIKE = 24573, MANDOKIR_ENRAGE = 23537, MANDOKIR_WATCH = 24314, MANDOKIR_SUMMON_PLAYER = 25104, MANDOKIR_LEVEL_UP = 24312, //спелл маунта у босса MANDOKIR_MOUNT = 23243, //этот спелл брался из предмета, который визульно призывает такого же раптора //Способность резать броню у раптора OHGAN_SUNDERARMOR = 24317, //Заклинание воскрешения у духов SPIRIT_REVIVE = 24341, };
//Координаты спавна духов static Coords SpiritSpawns[] = { {}, {-12150.9f, -1956.24f, 133.407f, 2.57835f}, {-12157.1f, -1972.78f, 133.947f, 2.64903f}, {-12172.3f, -1982.63f, 134.061f, 1.48664f}, {-12194.0f, -1979.54f, 132.194f, 1.45916f}, {-12211.3f, -1978.49f, 133.580f, 1.35705f}, {-12228.4f, -1977.10f, 132.728f, 1.25495f}, {-12250.0f, -1964.78f, 135.066f, 0.92901f}, {-12264.0f, -1953.08f, 134.072f, 0.62663f}, {-12289.0f, -1924.00f, 132.620f, 5.37829f}, {-12267.3f, -1902.26f, 131.328f, 5.32724f}, {-12255.3f, -1893.53f, 134.026f, 5.06413f}, {-12229.9f, -1891.39f, 134.704f, 4.40047f}, {-12215.9f, -1889.09f, 137.273f, 4.70285f}, {-12200.5f, -1890.69f, 135.777f, 4.84422f}, {-12186.0f, -1890.12f, 134.261f, 4.36513f}, {-12246.3f, -1890.09f, 135.475f, 4.73427f}, {-12170.7f, -1894.85f, 133.852f, 3.51690f}, {-12279.0f, -1931.92f, 136.130f, 0.04151f}, {-12266.1f, -1940.72f, 132.606f, 0.70910f} };
//основной скрипт на босса
class BloodlordMandokirAI : public MoonScriptBossAI { UnitArray duh;
MOONSCRIPT_FACTORY_FUNCTION(BloodlordMandokirAI, MoonScriptBossAI); BloodlordMandokirAI(Creature* pCreature) : MoonScriptBossAI(pCreature) { AddSpell(MANDOKIR_CLEAVE, Target_Current, 75, 0, 7); AddSpell(MANDOKIR_WHIRLWIND, Target_Current, 90, 0, 18);
//эмоции и озвучка AddEmote(Event_OnCombatStart, "I'll feed your souls to Hakkar himself!", Text_Yell, 8413);
mount = AddSpell(MANDOKIR_MOUNT, Target_Self, 0, 0, 0);
mortalstrike = AddSpell(MANDOKIR_MORTAL_STRIKE, Target_Current, 0, 0, 0);
enrage = AddSpell(MANDOKIR_ENRAGE, Target_Self, 0, 0, 0);
}
void OnCombatStart(Unit* pTarget) { RemoveAura(23243); for (uint i=1;i<20;i++) { MoonScriptCreatureAI *spirit; spirit = SpawnCreature(CHAINED_SPIRIT, SpiritSpawns[i].mX, SpiritSpawns[i].mY, SpiritSpawns[i].mZ, SpiritSpawns[i].mO); if(spirit) duh.push_back(TO_UNIT(spirit)); } MoonScriptCreatureAI *Ohgan = NULL;
Ohgan = SpawnCreature(ZG_OHGAN, (_unit->GetPositionX()+RandomFloat(2)-2), (_unit->GetPositionY()+RandomFloat(2)-2), _unit->GetPositionZ(), _unit->GetOrientation(), true);
MortalStrikeTimer = AddTimer(15000);
ParentClass::OnCombatStart( pTarget ); }
void OnCombatStop(Unit* pTarget) { for(UnitArray::iterator itr = duh.begin(); itr!=duh.end(); ++itr) if ((*itr)!=NULL && (*itr)->isAlive() && (*itr)->GetEntry() == CHAINED_SPIRIT) (*itr)->Delete(); duh.clear();
Ohgan = (MoonScriptBossAI*)GetNearestCreature(ZG_OHGAN);
if(Ohgan != NULL) Ohgan->Despawn(2000, 0);
CastSpell(mount);
ParentClass::OnCombatStop(pTarget); }
void OnDied(Unit* pKiller) { ParentClass::OnDied(pKiller); }
void OnTargetDied(Unit *pTarget) { float range; Unit *Spirit; for(UnitArray::iterator itr=duh.begin(); itr!=duh.end(); ++itr) { if((*itr)!=NULL && (*itr)->GetEntry() == CHAINED_SPIRIT && (*itr)->isAlive()) if(range > (*itr)->CalcDistance(TO_OBJECT(pTarget))) { range = (*itr)->CalcDistance(TO_OBJECT(pTarget)); Spirit = TO_UNIT(*itr); } }
if(RandomUInt(100) < 10) if(pTarget!=NULL && pTarget->IsPlayer() && !pTarget->isAlive()) Spirit->CastSpell(pTarget, SPIRIT_REVIVE, false); }
void AIUpdate() { if(_unit->IsPlayer() && _unit->GetHealthPct() <= 50) { if(IsTimerFinished(MortalStrikeTimer)) { CastSpell(mortalstrike); ResetTimer(MortalStrikeTimer, 15000); } }
ParentClass::AIUpdate(); }
SpellDesc* mount; SpellDesc* mortalstrike; SpellDesc* enrage; int32 MortalStrikeTimer; MoonScriptBossAI* Ohgan; };
// Скрипт на Раптора class OhganAI : public MoonScriptCreatureAI { MOONSCRIPT_FACTORY_FUNCTION(OhganAI, MoonScriptCreatureAI); OhganAI(Creature *pCreature) : MoonScriptCreatureAI(pCreature) { AddSpell(OHGAN_SUNDERARMOR, Target_Current, 100, 0, 12);
}
void OnDied(Unit* pKiller) {
//Mandokir = NULL; Mandokir = (MoonScriptBossAI*)GetNearestCreature(ZG_MANDOKIR);
if(Mandokir && Mandokir->IsAlive() ) {
for (unordered_set<Player *>::iterator itr = Mandokir->GetUnit()->GetInRangePlayerSetBegin(); itr != Mandokir->GetUnit()->GetInRangePlayerSetEnd(); ++itr) { Player *pPlayer = TO_PLAYER(*itr); pPlayer->GetSession()->SystemMessage("Bloodlord Mandokir goes into a rage after seeing his raptor fall in battle!"); } Mandokir->CastSpell(enrage); } ParentClass::OnDied(pKiller); } MoonScriptBossAI* Mandokir; SpellDesc* enrage; };
void SetupZulGurub(ScriptMgr * mgr) {
mgr->register_creature_script(ZG_MANDOKIR, &BloodlordMandokirAI::Create); mgr->register_creature_script(ZG_OHGAN, &OhganAI::Create); } Скрипт готов к использованию и протестирован, ну и как в предыдущем скрипте напишу список того, что еще нужно реализовать. - убрать предупреждение при компиляции: Код: Code \src\scripts\src\instancescripts\zulgurub\raid_zulgurub.cpp(337) : warning C4700: использована неинициализированная локальная переменная "range" - добавить еще несколько текстов с озвучкой - если игроки увивают раптора, то босс использует заклинание Enrage и в логе чата: Bloodlord Mandokir goes into a rage after seeing his raptor fall in battle! Брал из примера по Ониксии, но код данный не работает. Quote Mandokir = (MoonScriptBossAI*)GetNearestCreature(ZG_MANDOKIR); if(Mandokir && Mandokir->IsAlive() ) { for (unordered_set<Player *>::iterator itr = Mandokir->GetUnit()->GetInRangePlayerSetBegin(); itr != Mandokir->GetUnit()->GetInRangePlayerSetEnd(); ++itr) { Player *pPlayer = TO_PLAYER(*itr); pPlayer->GetSession()->SystemMessage("Bloodlord Mandokir goes into a rage after seeing his raptor fall in battle!"); } Mandokir->CastSpell(enrage); } - при остановки урона/при смерти босса все духи дожны пропадать. есть строчка (TO_CREATURE(*itr))->Despawn(); но не пойму куда её засунуть. - при смерти одного из игроков вовремя боя с боссом сервер выбирает одного духа, который с вероятностью 10% воскресит игрока. К сожалению протестировать не смог, так как ни в одной базе они нормально не работают. В Sadb они при спавне еще и нападают. - раптор, которого призывает босс отлично реализован (в разы лучше, чем на других эмуляторах), но нужно еще доработать, чтобы он как только появлялся сразу искал вражескую цель, чтобы напасть так как если с далека стрельнуть по боссу, то раптор не нападет. - если у игрока, корого атакует босс ХП меньше или равно 50% босс должен использовать спелл Mortal Strike (по данным из 1.12.1 это было так), но с wotlk скорее всего просто кастует. Сегондня может схожу на официальном сервере и проверю. Как ни как код есть: Код: Code //если здоровье противника и этот противник игрок, меньше или равно 50% if(_unit->IsPlayer() && _unit->GetHealthPct() <= 50) { if(IsTimerFinished(MortalStrikeTimer)) { CastSpell(mortalstrike); ResetTimer(MortalStrikeTimer, 15000); } } Но почему то не работает, скорее всего косяк в условии. - босса на раптора должен садить скрипт, а не база. - как только босс вернется на стартовую точку он должен кастануть спелл маунта (Но в отличии от Мангоса поддержки такого эвента нету и придется писать отдельным условием) И опять же чтобы работали эти две последних фишки, нужно сделать clean_up в базе. P.S нужно еще вейпоит прописать, чтобы босс спускался с зигурата, из-за того что нет реализации Mmaps нужна еще одна гора кода. На официальном сервере он не всегда сидит на вершине своего зиггурата, а иногда спускается. Как последний пунк: - реализовать вейпоинты через базу или через скрипт, из-за отсутствия данных не могу дать точный ответ.
|
| |
|
|