All pastes #958919 Raw Edit

Vermischtes

public text v1 · immutable
#958919 ·published 2008-03-27 00:20 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
*/

/* ScriptData
SDName: Boss_Skeram
SD%Complete: 50
SDComment: Mind Control buggy. Spawns splitting too. Check function missing.
EndScriptData */

#include "../../sc_defines.h"
#include "def_temple_of_ahnqiraj.h"

#define SPELL_ARCANE_EXPLOSION      25679
#define SPELL_EARTH_SHOCK           26194       
#define SPELL_TRUE_FULFILLMENT4     26526
#define SPELL_BLINK                 28391

#define SOUND_AGGRO1       8615  //8615 Are you so eager to die? I would be happy to accomodate you.
#define SOUND_AGGRO2       8616  //8616 Cower mortals! The age of darkness is at hand.
#define SOUND_AGGRO3       8621  //8621 Tremble! The end is upon you.
#define SOUND_SLAY1        8617  //8617 Let your death serve as an example!
#define SOUND_SLAY2        8619  //8619 Spineless wretchers you will drown in rivers of blood!
#define SOUND_SLAY3        8620  //8620 The screams of the dying will fill the air. A symphony of terror is about to begin!
#define SOUND_SPLIT        8618  //8618 Prepare for the return of the ancient ones!
#define SOUND_DEATH        8622  //8622 You only delay... the inevetable



struct MANGOS_DLL_DECL boss_skeramAI : public ScriptedAI
{
    boss_skeramAI(Creature *c) : ScriptedAI(c)
    {
        pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL;
        EnterEvadeMode();
    }

    ScriptedInstance *pInstance;
    
    uint32 ArcaneExplosion_Timer;
    uint32 EarthShock_Timer;
    uint32 FullFillment_Timer;
    uint32 Blink_Timer;
    uint32 Invisible_Timer;

    Creature *Image;

    
    bool InCombat;
    bool Images75;
    bool Images50;
    bool Images25;
    bool IsImage75;
    bool IsImage50;
    bool IsImage25;
    bool Invisible;

    void Reset()
    {
        ArcaneExplosion_Timer = 20000;
        EarthShock_Timer = 2000;
        FullFillment_Timer = 8000;
        Blink_Timer = 10000;
        Invisible_Timer = 2500;

        InCombat = false;
        Images75 = false;
        Images50 = false;
        Images25 = false;
        IsImage75 = false;
        IsImage50 = false;
        IsImage25 = false;
        Invisible = false;

        m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
        m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,15345);  // Skeram Model

//      m_creature->RemoveAllAuras();
//      m_creature->DeleteThreatList();
//      m_creature->CombatStop();
//      DoGoHome();
    }
    
  void ResetThreat()
  {
    std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
 
    for(uint32 i = 0; i <= (m_threatlist.size()-1); i++)
    {
      Unit* pUnit = SelectUnit(SELECT_TARGET_TOPAGGRO, i);
      if(pUnit)
        (m_creature->getThreatManager()).modifyThreatPercent(pUnit, -99);
    }
 
  }

    void KilledUnit(Unit* victim)
    {
        switch(rand()%3)
        {
            case 0:  
                   DoPlaySoundToSet(m_creature,SOUND_SLAY1);
            break;

            case 1:
                   DoPlaySoundToSet(m_creature,SOUND_SLAY2);
            break;

            case 2:
                   DoPlaySoundToSet(m_creature,SOUND_SLAY3);
            break;
        }
    }
 

    void JustDied(Unit* Killer)
    {
        DoPlaySoundToSet(m_creature,SOUND_DEATH);
    }

    void AttackStart(Unit *who)
    {
        if (!who)
            return;

        if (who->isTargetableForAttack() && who!= m_creature)
        {
            //Begin melee attack if we are within range
            DoStartMeleeAttack(who);
      if (!InCombat)
            {
                    switch(rand()%3)
                    {
                        case 0:  
                               DoPlaySoundToSet(m_creature,SOUND_AGGRO1);
                        break;

                        case 1:
                               DoPlaySoundToSet(m_creature,SOUND_AGGRO2);
                        break;

                        case 2:
                               DoPlaySoundToSet(m_creature,SOUND_AGGRO3);
                        break;
                    }
                InCombat = true;
            }
        }
    }
    
    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)
                {
                    switch(rand()%3)
                    {
                        case 0:  
                               DoPlaySoundToSet(m_creature,SOUND_AGGRO1);
                        break;

                        case 1:
                               DoPlaySoundToSet(m_creature,SOUND_AGGRO2);
                        break;

                        case 2:
                               DoPlaySoundToSet(m_creature,SOUND_AGGRO3);
                        break;
                    }

                InCombat = true;
                }

            }
        }
    }

    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
            return;

        //ArcaneExplosion_Timer
        if (ArcaneExplosion_Timer < diff)
        {
            //Cast
            DoCast(m_creature->getVictim(), SPELL_ARCANE_EXPLOSION);

            //10-20 seconds until we should cast this agian
            ArcaneExplosion_Timer = 10000 + rand()%10000;
        }else ArcaneExplosion_Timer -= diff;

        //If we are within range melee the target
        if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
        {
            //Make sure our attack is ready and we arn't currently casting
            if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
            {
                m_creature->AttackerStateUpdate(m_creature->getVictim());
                m_creature->resetAttackTimer();
            }
        }else
        {
            //EarthShock_Timer
            if (EarthShock_Timer < diff)
            {
                //Cast
                DoCast(m_creature->getVictim(),SPELL_EARTH_SHOCK);

                //1 seconds until we should cast this agian
                EarthShock_Timer = 1000;
            }else EarthShock_Timer -= diff;
        }

        //Blink_Timer
        if (Blink_Timer < diff)
        {
            //Cast
            //DoCast(m_creature, SPELL_BLINK);
            switch(rand()%3)
            {
                case 0:  
                       m_creature->Relocate(-8340.782227,2119.878418,1118.175102,0);
                       ResetThreat();
                break;

                case 1:
                       m_creature->Relocate(-8319.326172,2057.827637,118.175087,0);
                       ResetThreat();
                break;
                
                case 2:
                       m_creature->Relocate(-8349.873047,2079.848145,88.152451,0);
                       ResetThreat();
                break;
           }

            //20-40 seconds until we should cast this agian
            Blink_Timer= 20000 + rand()%20000;
        }else Blink_Timer -= diff;
        
        //Summoning 2 Images and teleporting to a random position on 75% health
        if ( !Images75 && !IsImage75 )
        {
            if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75)
            {
                DoPlaySoundToSet(m_creature,SOUND_SPLIT);
                Unit* target = NULL;
                target = SelectUnit(SELECT_TARGET_RANDOM,0);

                switch(rand()%3)
                {
                    case 0:  
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8340.782227,2083.814453,125.648788,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8341.546875,2118.504639,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Image = m_creature->SummonCreature(15263,-8318.822266,2058.231201,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target);    

                       Invisible = true;
                       Images75 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage75 = true;
                    break;

                    case 1:
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8341.546875,2118.504639,133.058151,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8340.782227,2083.814453,125.648788,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 
                       
                       Image = m_creature->SummonCreature(15263,-8318.822266,2058.231201,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Invisible = true;
                       Images75 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage75 = true;
                    break;
                
                    case 2:
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8318.822266,2058.231201,133.058151,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8340.782227,2083.814453,125.648788,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Image = m_creature->SummonCreature(15263,-8341.546875,2118.504639,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Invisible = true;
                       Images75 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage75 = true;
                    break;
               }
            }
        }
        
        //Summoning 2 Images and teleporting to a random position on 50% health
        if (!Images50 && !IsImage50)
        {
            if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50 )
            {
                DoPlaySoundToSet(m_creature,SOUND_SPLIT);
                Unit* target = NULL;
                target = SelectUnit(SELECT_TARGET_RANDOM,0);
        
                switch(rand()%3)
                {
                    case 0:  
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8340.782227,2083.814453,125.648788,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8341.546875,2118.504639,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Image = m_creature->SummonCreature(15263,-8318.822266,2058.231201,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target);        

                       Invisible = true;
                       Images50 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage50 = true;    
                    break;

                    case 1:
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8341.546875,2118.504639,133.058151,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8340.782227,2083.814453,125.648788,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 
                       
                       Image = m_creature->SummonCreature(15263,-8318.822266,2058.231201,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Invisible = true;
                       Images50 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage50 = true;
                    break;
                
                   case 2:
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8318.822266,2058.231201,133.058151,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8340.782227,2083.814453,125.648788,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Image = m_creature->SummonCreature(15263,-8341.546875,2118.504639,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Invisible = true;
                       Images50 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage50 = true;
                    break;
               }
            }
       }    

        //Summoning 2 Images and teleporting to a random position on 25% health
        if (!Images25 && !IsImage25)
        {
            if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25 )
            {
                DoPlaySoundToSet(m_creature,SOUND_SPLIT);
                Unit* target = NULL;
                target = SelectUnit(SELECT_TARGET_RANDOM,0);
        
                switch(rand()%3)
                {
                    case 0:  
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8340.782227,2083.814453,125.648788,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8341.546875,2118.504639,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Image = m_creature->SummonCreature(15263,-8318.822266,2058.231201,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target);  

                       Invisible = true;
                       Images25 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage25 = true;          
                    break;

                    case 1:
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8341.546875,2118.504639,133.058151,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8340.782227,2083.814453,125.648788,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 
                       
                       Image = m_creature->SummonCreature(15263,-8318.822266,2058.231201,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Invisible = true;
                       Images25 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage25 = true;
                    break;
                
                    case 2:
                       m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                       m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
                       m_creature->Relocate(-8318.822266,2058.231201,133.058151,0);
                       Invisible = true;
                       ResetThreat();

                       Image = m_creature->SummonCreature(15263,-8340.782227,2083.814453,125.648788,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Image = m_creature->SummonCreature(15263,-8341.546875,2118.504639,133.058151,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
                       Image->SetMaxHealth(m_creature->GetMaxHealth() / 5);
                       Image->SetHealth(m_creature->GetHealth() / 5);
                       Image->AI()->AttackStart(target); 

                       Invisible = true;
                       Images25 = true;
                       if (Image)
                       ((boss_skeramAI*)Image->AI())->IsImage25 = true;
                    break;
               }
            }
        }    
        
        //Invisible_Timer
        if (Invisible) 
        {
            if (Invisible_Timer < diff)
            {
                //Making Skeram visible after telporting
                m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,15345);  // Skeram Model
                m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

                //10-25 seconds until we should cast this agian
                Invisible_Timer = 2500;
                Invisible = false;
            }else Invisible_Timer -= diff;
       }

        DoMeleeAttackIfReady();
    }
}; 

CreatureAI* GetAI_boss_skeram(Creature *_Creature)
{
    return new boss_skeramAI (_Creature);
}


void AddSC_boss_skeram()
{
    Script *newscript;
    newscript = new Script;
    newscript->Name="boss_skeram";
    newscript->GetAI = GetAI_boss_skeram;
    m_scripts[nrscripts++] = newscript;

}