All pastes #974201 Raw Edit

blind banish phase

public cpp v1 · immutable
·published 2008-04-06 17:15 UTC
rendered paste body
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>* 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*//* ScriptDataSDName: Boss_Leotheras_The_BlindSD%Complete: 50SDComment: Missing Inner DemonsEndScriptData */#include "../../../sc_defines.h"#include "def_serpent_shrine.h"#define SPELL_WHIRLWIND         40653#define SPELL_CHAOS_BLAST       37675// #define SPELL_INSIDIOUS_WHISPER 37676 // useless - dummy effect that can't be implemented#define SAY_AGGRO               "Finally my banishment ends!"#define SAY_SWITCH_TO_DEMON     "Be gone trifling elf. I'm in control now."#define SAY_INNER_DEMONS        "We all have our demons..."#define SAY_DEMON_SLAY1         "I have no equal."#define SAY_DEMON_SLAY2         "Perish, mortal."#define SAY_DEMON_SLAY3         "Yes, YES! Ahahah!"#define SAY_NIGHTELF_SLAY1      "Kill! KILL!"#define SAY_NIGHTELF_SLAY2      "That's right! Yes!"#define SAY_NIGHTELF_SLAY3      "Who's the master now?"#define SAY_FINAL_FORM          "No! NO! What have you done?! I am the master, do you hear me? I... aaghh... Can't... contain him..."#define SAY_FREE                "At last I am liberated. It has been too long since I have tasted true freedom!"#define SAY_DEATH               "You cannot kill me! Fools, I'll be back! I'll... aarghh..."#include <iostream>#define SOUND_AGGRO             11312#define SOUND_SWITCH_TO_DEMON   11304#define SOUND_INNER_DEMONS      11305#define SOUND_DEMON_SLAY1       11306#define SOUND_DEMON_SLAY2       11307#define SOUND_DEMON_SLAY3       11308#define SOUND_NIGHTELF_SLAY1    11314#define SOUND_NIGHTELF_SLAY2    11315#define SOUND_NIGHTELF_SLAY3    11316#define SOUND_FINAL_FORM        11313#define SOUND_FREE              11309#define SOUND_DEATH             11317#define MODEL_DEMON             14555#define MODEL_NIGHTELF          20514#define DEMON_FORM              21845// BANISH PHASE#define GREEN_BEAM				38909#define BANISH_EFFECT			37833float add1SPlace[4] ={	364.219208, -448.394073, 29.515247, 0.170111};float add2SPlace[4] ={	375.948334, -426.4744335, 29.524292, 4.982298};float add3SPlace[4] ={	396.755188, -433.087402, 30.189342, 3.782232};//Original Leotheras the Blind AIstruct MANGOS_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI{    boss_leotheras_the_blindAI(Creature *c) : ScriptedAI(c)    {        pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL;        Demon = 0;		initialize();                EnterEvadeMode();    }	Creature *add1;	Creature *add2;	Creature *add3;    ScriptedInstance *pInstance;    uint32 Whirlwind_Timer;    uint32 ChaosBlast_Timer;    uint32 Switch_Timer;    bool DemonForm;    bool IsFinalForm;    bool InCombat;		bool spawned;	bool relased;	bool channeling[3];	bool add1Dead;	bool add2Dead;	bool add3Dead;    uint64 Demon;			void initialize()	{		relased = false;		spawned = false;		relased = false;		for(uint8 i = 0; i < 3; ++i)			channeling[i] = false;		add1Dead = false;		add2Dead = false;		add3Dead = false;		add1 = NULL;		add2 = NULL;		add3 = NULL;	}    void Reset()    {		Whirlwind_Timer = 20000;        ChaosBlast_Timer = 1000;        Switch_Timer = 45000;        DemonForm = false;        IsFinalForm = false;        InCombat = false;		        m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);		        //m_creature->RemoveAllAuras();        //m_creature->DeleteThreatList();        //m_creature->CombatStop();        //DoGoHome();        if(pInstance)            pInstance->SetData(DATA_LEOTHERASTHEBLINDEVENT, 0);            }    void StartEvent()    {		if(!relased)		{			m_creature->CombatStop();			return;		}        DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);        DoPlaySoundToSet(m_creature, SOUND_AGGRO);        if(pInstance)            pInstance->SetData(DATA_LEOTHERASTHEBLINDEVENT, 1);        InCombat = true;    }    void KilledUnit(Unit *victim)    {        if(victim->GetTypeId() != TYPEID_PLAYER)            return;        if(DemonForm)            switch(rand()%3)            {                case 0:                DoYell(SAY_DEMON_SLAY1, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(m_creature, SOUND_DEMON_SLAY1);                break;                case 1:                DoYell(SAY_DEMON_SLAY2, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(m_creature, SOUND_DEMON_SLAY2);                break;                case 2:                DoYell(SAY_DEMON_SLAY3, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(m_creature, SOUND_DEMON_SLAY3);                break;            }        else            switch(rand()%3)            {                case 0:                DoYell(SAY_NIGHTELF_SLAY1, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(m_creature, SOUND_NIGHTELF_SLAY1);                break;                case 1:                DoYell(SAY_NIGHTELF_SLAY2, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(m_creature, SOUND_NIGHTELF_SLAY2);                break;                case 2:                DoYell(SAY_NIGHTELF_SLAY3, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(m_creature, SOUND_NIGHTELF_SLAY3);                break;            }    }    void JustDied(Unit *victim)    {        DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);        DoPlaySoundToSet(m_creature, SOUND_DEATH);        //despawn copy        if(Demon)        {            Unit *pUnit = NULL;            pUnit = Unit::GetUnit((*m_creature), Demon);            if(pUnit)                pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false);        }        if(pInstance)            pInstance->SetData(DATA_LEOTHERASTHEBLINDEVENT, 0);		initialize();    }    void AttackStart(Unit *who)    {        if(!who && who != m_creature)            return;        if (who->isTargetableForAttack() && who!= m_creature)        {            //Begin melee attack if we are within range            DoStartMeleeAttack(who);			            if(!InCombat)                StartEvent();        }    }    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);                DoStartMeleeAttack(who);                if(!InCombat)                    StartEvent();            }        }    }// VICTIMSTATE_DODGE    void UpdateAI(const uint32 diff)    {		banishPhase();        //Return since we have no target        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if(!DemonForm)        {            //Whirlwind_Timer            if(Whirlwind_Timer < diff)            {                DoCast(m_creature, SPELL_WHIRLWIND);                Whirlwind_Timer = 25000;            }else Whirlwind_Timer -= diff;            //Switch_Timer            if(!IsFinalForm)                if(Switch_Timer < diff)                {                    //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;                    Switch_Timer = 60000;                }else Switch_Timer -= diff;            DoMeleeAttackIfReady();        }        else        {            //ChaosBlast_Timer            if(ChaosBlast_Timer < diff)            {                DoCast(m_creature->getVictim(), SPELL_CHAOS_BLAST);                ChaosBlast_Timer = 1500;            }else ChaosBlast_Timer -= diff;            //Switch_Timer            if(Switch_Timer < diff)            {                //switch to nightelf form                m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);                DemonForm = false;                Switch_Timer = 45000;            }else Switch_Timer -= diff;        }        if(!IsFinalForm && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 15)        {            //at this point he divides himself in two parts            Creature *Copy = NULL;            Copy = DoSpawnCreature(DEMON_FORM, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);            if(Copy)            {                Demon = Copy->GetGUID();                Copy->AI()->AttackStart(m_creature->getVictim());            }            //set nightelf final form            IsFinalForm = true;            DemonForm = false;            DoYell(SAY_FINAL_FORM, LANG_UNIVERSAL, NULL);            DoPlaySoundToSet(m_creature, SOUND_FINAL_FORM);            m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);        }    }	void banishPhase()	{		// ---------- BANISH PHASE START ----------		if(!spawned)		{			m_creature->ApplySpellImmune(BANISH_EFFECT,IMMUNITY_MECHANIC,MECHANIC_BANISH,false); // ¿eby móg³ rzuciæ banisha - Ustawione na true podczas relase			add1 = m_creature->SummonCreature(21806, add1SPlace[0], add1SPlace[1],add1SPlace[2],add1SPlace[3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,1000);			add2 = m_creature->SummonCreature(21806, add2SPlace[0], add2SPlace[1],add2SPlace[2],add2SPlace[3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,1000);			add3 = m_creature->SummonCreature(21806, add3SPlace[0], add3SPlace[1],add3SPlace[2],add3SPlace[3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,1000);						m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_DEMON); // DemonModel - Blizzlike banishment			DoCast(m_creature, BANISH_EFFECT); // selfCast banisha 			spawned = true;		}		// Zaczn¹ castowaæ tylko  gdy nie s¹ w combacie (jak wejd¹ w combat to channeling[] = false, ¿eby w razie gdy zabij¹ cel to powróc¹ i znów wycastuj¹ ten channeling spell		if(!add1 == NULL)		{			// odwróci je w stronê blinda - Visual bug... trzeba siê odsun¹c i wróciæ, to wtedy bêd¹ odwrócone -_-			if(add1->GetPositionX()   == add1SPlace[0] &&			   add1->GetPositionY()   == add1SPlace[1] &&			   add1->GetPositionZ()   == add1SPlace[2] &&			   add1->GetOrientation() != add1SPlace[3]   )					add1->SetOrientation(add1SPlace[3]);	/*		Unit *target = add1->getVictim();			if(target)				<- test, ¿eby addy castowa³y shocka tylko jak cel castuje ( pozniej przerobie na random.target@threatlist ale chcialem sprawdzic czy zadziala wykrywanie casta				if(target->m_currentSpells[3] || target->m_currentSpells[2] || target->m_currentSpells[1])//->getState() == 2 && target)//->getState() == 2 && target)					add1->CastSpell(add1->getVictim(), 39076, false);*/						if(!channeling[0] && !add1->isInCombat())			{				add1->CastSpell(m_creature,GREEN_BEAM,false);				channeling[0] = true;			}			if(add1->isInCombat() && channeling[0] == true)			{				channeling[0] = false;				add1->InterruptSpell(CURRENT_CHANNELED_SPELL, true);							if(!add2->isInCombat())					add2->getThreatManager().addThreat(add1->getVictim(),1);				if(!add3->isInCombat())					add3->getThreatManager().addThreat(add1->getVictim(),1);			}			if(add1->GetHealth() == 0)			{				add1Dead = true;				add1 = NULL;			}		}		if(!add2 == NULL)		{			if(add2->GetPositionX()   == add2SPlace[0] &&			   add2->GetPositionY()   == add2SPlace[1] &&			   add2->GetPositionZ()   == add2SPlace[2] &&			   add2->GetOrientation() != add2SPlace[3]   )					add2->SetOrientation(add2SPlace[3]);			if(!channeling[1] && !add2->isInCombat())			{				add2->CastSpell(m_creature,GREEN_BEAM,false);				channeling[1] = true;			}			if(add2->isInCombat() && channeling[1] == true)			{				channeling[1] = false;				add2->InterruptSpell(CURRENT_CHANNELED_SPELL, true);							if(!add1->isInCombat())					add1->getThreatManager().addThreat(add2->getVictim(),1);				if(!add3->isInCombat())					add3->getThreatManager().addThreat(add2->getVictim(),1);			}			if(add2->GetHealth() == 0)			{				add2Dead = true;				add2 = NULL;			}		}		if(!add3 == NULL)		{			if(add3->GetPositionX()   == add3SPlace[0] &&			   add3->GetPositionY()   == add3SPlace[1] &&			   add3->GetPositionZ()   == add3SPlace[2] &&			   add3->GetOrientation() != add3SPlace[3]   )					add3->SetOrientation(add3SPlace[3]);			if(!channeling[2] && !add3->isInCombat())			{				add3->CastSpell(m_creature,GREEN_BEAM,false);				channeling[2] = true;			}			if(add3->isInCombat() && channeling[2] == true)			{				channeling[2] = false;				add3->InterruptSpell(CURRENT_CHANNELED_SPELL, true);				//zaatakuja wszystkie gdy 1 wejdzie w combat				if(!add1->isInCombat())					add1->getThreatManager().addThreat(add3->getVictim(),1);				if(!add2->isInCombat())					add2->getThreatManager().addThreat(add3->getVictim(),1);							}			if(add3->GetHealth() == 0)			{				add3Dead = true;				add3 = NULL;			}		}				if(add1Dead && add2Dead && add3Dead)		{			m_creature->RemoveAllAuras();			m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);			m_creature->ApplySpellImmune(37546,IMMUNITY_MECHANIC,MECHANIC_BANISH,true);			relased = true;			add1Dead = false;			add2Dead = false;			add3Dead = false;		}// ---------- BANISH PHASE END ----------	}};//Leotheras the Blind Demon Form AIstruct MANGOS_DLL_DECL boss_leotheras_the_blind_demonformAI : public ScriptedAI{    boss_leotheras_the_blind_demonformAI(Creature *c) : ScriptedAI(c)    {        InCombat = false;        EnterEvadeMode();    }    uint32 ChaosBlast_Timer;    bool InCombat;    void Reset()    {        ChaosBlast_Timer = 1000;        InCombat = false;        //m_creature->RemoveAllAuras();        //m_creature->DeleteThreatList();        //m_creature->CombatStop();        //DoGoHome();    }    void StartEvent()    {        DoYell(SAY_FREE, LANG_UNIVERSAL, NULL);        DoPlaySoundToSet(m_creature, SOUND_FREE);        InCombat = true;    }    void KilledUnit(Unit *victim)    {        if(victim->GetTypeId() != TYPEID_PLAYER)            return;        switch(rand()%3)        {        case 0:            DoYell(SAY_DEMON_SLAY1, LANG_UNIVERSAL, NULL);            DoPlaySoundToSet(m_creature, SOUND_DEMON_SLAY1);            break;        case 1:            DoYell(SAY_DEMON_SLAY2, LANG_UNIVERSAL, NULL);            DoPlaySoundToSet(m_creature, SOUND_DEMON_SLAY2);            break;        case 2:            DoYell(SAY_DEMON_SLAY3, LANG_UNIVERSAL, NULL);            DoPlaySoundToSet(m_creature, SOUND_DEMON_SLAY3);            break;        }    }    void JustDied(Unit *victim)    {        //invisibility (blizzlike, at the end of the fight he doesn't die, he disappears)        m_creature->CastSpell(m_creature, 8149, true);    }    void AttackStart(Unit *who)    {        if(!who && who != m_creature)            return;        if (who->isTargetableForAttack() && who!= m_creature)        {            //Begin melee attack if we are within range            DoStartMeleeAttack(who);            if(!InCombat)                StartEvent();        }    }    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);                DoStartMeleeAttack(who);                if(!InCombat)                    StartEvent();            }        }    }    void UpdateAI(const uint32 diff)    {        //Return since we have no target        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        //ChaosBlast_Timer        if(ChaosBlast_Timer < diff)        {            DoCast(m_creature->getVictim(), SPELL_CHAOS_BLAST);            ChaosBlast_Timer = 1500;        }else ChaosBlast_Timer -= diff;        //Do NOT deal any melee damage to the target.    }};CreatureAI* GetAI_boss_leotheras_the_blind(Creature *_Creature){    return new boss_leotheras_the_blindAI (_Creature);}CreatureAI* GetAI_boss_leotheras_the_blind_demonform(Creature *_Creature){    return new boss_leotheras_the_blind_demonformAI (_Creature);}void AddSC_boss_leotheras_the_blind(){    Script *newscript;    newscript = new Script;    newscript->Name="boss_leotheras_the_blind";    newscript->GetAI = GetAI_boss_leotheras_the_blind;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="boss_leotheras_the_blind_demonform";    newscript->GetAI = GetAI_boss_leotheras_the_blind_demonform;    m_scripts[nrscripts++] = newscript;}