Index: boss_leotheras_the_blind.cpp =================================================================== --- boss_leotheras_the_blind.cpp (revision 252) +++ boss_leotheras_the_blind.cpp (working copy) @@ -1,27 +1,11 @@ -/* Copyright (C) 2006 - 2008 ScriptDev2 -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ +/** +*Copyright by BloodWorld DevTeam ® 2008 +made by: aNakin, Bucu, Pandora +**/ -/* ScriptData -SDName: Boss_Leotheras_The_Blind -SD%Complete: 50 -SDComment: Missing Inner Demons -EndScriptData */ - #include "../../../sc_defines.h" - +#define SPELL_EN 33653 +#define SPELL_BOLT 39025 #define SPELL_WHIRLWIND 40653 #define SPELL_CHAOS_BLAST 37675 // #define SPELL_INSIDIOUS_WHISPER 37676 // useless - dummy effect that can't be implemented @@ -72,10 +56,17 @@ uint32 Whirlwind_Timer; uint32 ChaosBlast_Timer; uint32 Switch_Timer; + uint32 Inner_Timer; + uint32 Die_Timer; bool DemonForm; bool IsFinalForm; bool InCombat; + bool demons; + int Rand; + int RandX; + int RandY; + Creature* Summoned; uint64 Demon; @@ -84,7 +75,10 @@ Whirlwind_Timer = 20000; ChaosBlast_Timer = 1000; Switch_Timer = 45000; + Inner_Timer = 15000; + Die_Timer = 600000; + demons=false; DemonForm = false; IsFinalForm = false; InCombat = false; @@ -174,7 +168,56 @@ if(pInstance) pInstance->SetData("LeotherasTheBlindEvent", 0); } + + void SummonInner(Unit* victim) + { + Rand = rand()%10; + switch (rand()%2) + { + case 0: RandX = 0 - Rand; break; + case 1: RandX = 0 + Rand; break; + } + Rand = 0; + Rand = rand()%10; + switch (rand()%2) + { + case 0: RandY = 0 - Rand; break; + case 1: RandY = 0 + Rand; break; + } + Rand = 0; + Summoned = DoSpawnCreature(21857, RandX+15, RandY+15, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); + if(Summoned) + Summoned->CastSpell(Summoned,37713,false);//rzuca na inner demona buffe (niby powinien juz ja miec z bazy ale niema) + Summoned = DoSpawnCreature(21857, RandX-15, RandY+15, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); + if(Summoned) + Summoned->CastSpell(Summoned,37713,false); + Summoned = DoSpawnCreature(21857, RandX-15, RandY-15, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); + if(Summoned) + Summoned->CastSpell(Summoned,37713,false); + Summoned = DoSpawnCreature(21857, RandX+10, RandY-10, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); + if(Summoned) + Summoned->CastSpell(Summoned,37713,false); + Summoned = DoSpawnCreature(21857, RandX-20, RandY+20, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); + if(Summoned) + Summoned->CastSpell(Summoned,37713,false); + Summoned = DoSpawnCreature(21857, RandX-20, RandY-20, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); + if(Summoned) + Summoned->CastSpell(Summoned,37713,false); + + } +void wipe_aggro() +{ + Unit *target; + std::list t_list = m_creature->getThreatManager().getThreatList(); + std::vector target_list; + for(std::list::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) + { + target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); + m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100); + target = NULL; + } +} void AttackStart(Unit *who) { if(!who && who != m_creature) @@ -216,10 +259,17 @@ //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; - - if(!DemonForm) + if(Die_Timer < diff) { - //Whirlwind_Timer + const CreatureInfo *cinfo = m_creature->GetCreatureInfo(); + DoCast(m_creature, SPELL_EN); + m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 10000))); + m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 10000))); + Die_Timer = 90000; + }else Die_Timer -= diff; + if(!DemonForm) + { + //Whirlwind_Timer if(Whirlwind_Timer < diff) { DoCast(m_creature, SPELL_WHIRLWIND); @@ -230,12 +280,16 @@ if(!IsFinalForm) if(Switch_Timer < diff) { + demons=false; //switch to demon form m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_DEMON); DoYell(SAY_SWITCH_TO_DEMON, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_SWITCH_TO_DEMON); DemonForm = true; - + //wipe aggro + if(pInstance) + pInstance->SetData("LeotherasTheBlindEvent_model", 1); + wipe_aggro(); Switch_Timer = 60000; }else Switch_Timer -= diff; @@ -243,6 +297,17 @@ } else { + if (!demons){//tylko raz na demon forme + if(!IsFinalForm){ //i nie w ostatniej fazie + if (Inner_Timer < diff) //summon tylko w demonie! + { + //Cast + demons=true; //reset jest w zmianie formy elf->demon + SummonInner(m_creature->getVictim()); + Inner_Timer = 15000; //15 sec od zaczecia fazy demona + }else Inner_Timer -= diff; + } + } //ChaosBlast_Timer if(ChaosBlast_Timer < diff) { @@ -256,6 +321,10 @@ //switch to nightelf form m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF); DemonForm = false; + //wipe aggro + wipe_aggro(); + if(pInstance) + pInstance->SetData("LeotherasTheBlindEvent_model", 0); Switch_Timer = 45000; }else Switch_Timer -= diff; @@ -282,10 +351,13 @@ m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF); } + } }; //Leotheras the Blind Demon Form AI +//uzyte tylko w 3 fazie +//wiec nie summonuje struct MANGOS_DLL_DECL boss_leotheras_the_blind_demonformAI : public ScriptedAI { boss_leotheras_the_blind_demonformAI(Creature *c) : ScriptedAI(c) @@ -295,13 +367,11 @@ } uint32 ChaosBlast_Timer; - bool InCombat; void EnterEvadeMode() { ChaosBlast_Timer = 1000; - InCombat = false; m_creature->RemoveAllAuras(); @@ -317,7 +387,7 @@ InCombat = true; } - + void KilledUnit(Unit *victim) { if(victim->GetTypeId() != TYPEID_PLAYER) @@ -391,7 +461,7 @@ return; //ChaosBlast_Timer - if(ChaosBlast_Timer < diff) + if(ChaosBlast_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_CHAOS_BLAST); ChaosBlast_Timer = 1500; @@ -400,7 +470,117 @@ //Do NOT deal any melee damage to the target. } }; +struct MANGOS_DLL_DECL mob_inner_demonAI : public ScriptedAI +{ + mob_inner_demonAI(Creature *c) : ScriptedAI(c) + { + pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL; + EnterEvadeMode(); + } + ScriptedInstance *pInstance; + + uint32 Bolt_Timer; + + + void EnterEvadeMode() + { + if (m_creature){ + Bolt_Timer = 5000; + m_creature->RemoveAllAuras(); + m_creature->DeleteThreatList(); + m_creature->CombatStop(); + DoGoHome(); + + m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true); + } + } + + void AttackStart(Unit *who) + { + if(!who && who != m_creature) + return; + + if (who->isTargetableForAttack() && who!= m_creature) + { + DoStartMeleeAttack(who); + m_creature->getThreatManager().addThreat(who,100000);//zeby demon niezmianial celu + } + } + + void DamageTaken(Unit *killer, uint32 &damage) +{ + if (!m_creature) + return; + if (!killer) + return; + if (!m_creature->getVictim()) + return; + if ((killer->GetGUID()!=m_creature->getVictim()->GetGUID())&&(killer->GetGUID()!=m_creature->GetGUID())) +damage=0; + } + + void MoveInLineOfSight(Unit *who) + { + if (!who || m_creature->getVictim()) + return; + + if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who)) + { + float attackRadius = m_creature->GetAttackDistance(who); + if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who)) + { + if(who->HasStealthAura()) + who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); + m_creature->getThreatManager().addThreat(who,100000);//zeby demon niezmianial celu + DoStartMeleeAttack(who); + } + } + } + + void KilledUnit(Unit *victim) + { + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); + } + + void UpdateAI (const uint32 diff) + { + + if (!m_creature) + return; + //tu spr czy slepy jest w demonie, jezeli nie to mind control (albo stun bo mc niedziała) + bool model=false; + if(pInstance) + model=pInstance->GetData("LeotherasTheBlindEvent_model"); + if (!model) + { + //jezeli nie jest demonem... + if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) + { + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); + } + else + { + m_creature->getVictim()->CastSpell(m_creature->getVictim(),3618,false);//stun na 5 min bo niema mc + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); + } + } + if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) + return; + if(Bolt_Timer < diff) + { + Unit *target = NULL; + target = SelectUnit(SELECT_TARGET_RANDOM, 0); + if(target) + DoCast(target, SPELL_BOLT); + + Bolt_Timer = 5000; + }else Bolt_Timer -= diff; + + DoMeleeAttackIfReady(); + } +}; + CreatureAI* GetAI_boss_leotheras_the_blind(Creature *_Creature) { return new boss_leotheras_the_blindAI (_Creature); @@ -409,7 +589,10 @@ { return new boss_leotheras_the_blind_demonformAI (_Creature); } - +CreatureAI* GetAI_mob_inner_demonAI(Creature *_Creature) +{ + return new mob_inner_demonAI (_Creature); +} void AddSC_boss_leotheras_the_blind() { Script *newscript; @@ -422,4 +605,10 @@ newscript->Name="boss_leotheras_the_blind_demonform"; newscript->GetAI = GetAI_boss_leotheras_the_blind_demonform; m_scripts[nrscripts++] = newscript; + newscript = new Script; + newscript->Name="mob_inner_demon"; + newscript->GetAI = GetAI_mob_inner_demonAI; + m_scripts[nrscripts++] = newscript; + + } Index: instance_serpent_shrine.cpp =================================================================== --- instance_serpent_shrine.cpp (revision 252) +++ instance_serpent_shrine.cpp (working copy) @@ -43,7 +43,7 @@ uint64 LadyVashj; uint64 Karathress; uint64 KarathressEvent_Starter; - +bool model; bool ShieldGeneratorDeactivated[4]; bool Encounters[ENCOUNTERS]; @@ -56,7 +56,7 @@ LadyVashj = 0; Karathress = 0; KarathressEvent_Starter = 0; - +model=0; ShieldGeneratorDeactivated[0] = false; ShieldGeneratorDeactivated[1] = false; ShieldGeneratorDeactivated[2] = false; @@ -130,6 +130,8 @@ Encounters[0] = (data) ? true : false; else if(type == "LeotherasTheBlindEvent") Encounters[1] = (data) ? true : false; + else if(type == "LeotherasTheBlindEvent_model") + model = (data) ? true : false; else if(type == "TheLurkerBelowEvent") Encounters[2] = (data) ? true : false; else if(type == "KarathressEvent") @@ -165,6 +167,8 @@ return Encounters[0]; else if (type == "LeotherasTheBlindEvent") return Encounters[1]; + else if(type == "LeotherasTheBlindEvent_model") + return model; else if(type == "TheLurkerBelowEvent") return Encounters[2]; else if(type == "KarathressEvent")