All pastes #568907 Raw Edit

Stuff

public text v1 · immutable
·published 2007-06-15 21:41 UTC
rendered paste body

#include "StdAfx.h"
#include "Setup.h"

/************************************************************************/
/* Raid_Karazhan.cpp Script                                             */
/************************************************************************/


// Midnight
#define CN_MIDNIGHT 16151

#define CN_ATTUMEN 15550


class MidnightAI : public CreatureAIScript
{
public:
    ADD_CREATURE_FACTORY_FUNCTION(MidnightAI);

    MidnightAI(Creature* pCreature) : CreatureAIScript(pCreature)
    {
        attumen = NULL;
        m_phase = 1;
    }

    void OnCombatStart(Unit* mTarget)
    {
        RegisterAIUpdateEvent(_unit->GetUInt32Value(UNIT_FIELD_BASEATTACKTIME));
        _unit->GetAIInterface()->setOutOfCombatRange(100000);
    }

    void OnCombatStop(Unit *mTarget)
    {
        _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL);
        _unit->GetAIInterface()->SetAIState(STATE_IDLE);
        RemoveAIUpdateEvent();
    }

		void OnTargetDied(Unit* mTarget)
    {
		if (_unit->GetHealthPct() > 0)
		{
			int RandomSpeach;
			sRand.randInt(1000);
			RandomSpeach=rand()%2;
			switch (RandomSpeach)
			{
			case 0: 
				_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "Well done Midnight !");
				_unit->PlaySoundToSet(9173);
				break;

			}
		}
    


    void OnDied(Unit * mKiller)
    {
       RemoveAIUpdateEvent();
    }

    void AIUpdate()
    {
        switch(m_phase)
        {
        case 1:
            {
                PhaseOne();
            }break;
        case 2:
            {
                PhaseTwo();
            }break;
        case 3:
            {
            }break;
        default:
            {
                m_phase = 1;
            };
        };
    }

    void PhaseOne()
    {
        if(_unit->GetHealthPct() <= 91)
        {
            // spawn Attumen
// MapScriptInterface::SpawnCreature not yet implemented :(
//            attumen = _unit->GetMapMgr()->GetInterface()->SpawnCreature(CN_ATTUMEN,
//                   _unit->GetPositionX(), _unit->GetPositionY(),
//                    _unit->GetPositionZ(), _unit->GetOrientation(),
//                    true, false, 0, 0);

            attumen = _unit->GetMapMgr()->CreateCreature();
            attumen->spawnid = 0;
            attumen->m_spawn = 0;
            attumen->Load(objmgr.GetCreatureProto(CN_ATTUMEN), _unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ());
            attumen->SetMapId(_unit->GetMapId());
            attumen->SetInstanceID(_unit->GetInstanceID());
            attumen->PushToWorld(_unit->GetMapMgr());

            m_phase = 2;
        }
    }

    void PhaseTwo()
    {
        if(_unit->GetHealthPct() <= 25)
        {
            _unit->PlaySoundToSet(9168);
            // change Model & despawn Midnight
            attumen->SetUInt32Value(UNIT_FIELD_DISPLAYID , 16040);
            Creature *midnight = ((Creature*) _unit);
            midnight->Despawn(0, 0); 
            m_phase = 3;
        }
    }

protected:
    uint32 m_phase;
    Creature *attumen;
};


// Attumen

#define CLEAVE			31345
#define CHARGE			35754

class AttumenAI : public CreatureAIScript
{
public:
    ADD_CREATURE_FACTORY_FUNCTION(AttumenAI);

    AttumenAI(Creature* pCreature) : CreatureAIScript(pCreature)
    {
        m_phase = 1;
       	m_spellcheck = new bool[2];
	spells = new SP_AI_Spell[2];
	for(int i=0;i<2;i++)
	{
		m_spellcheck[i] = false;
	} 

	spells[0].info = sSpellStore.LookupEntry(CLEAVE);
	spells[0].targettype = TARGET_ATTACKING;	
	spells[0].instant = true;
	spells[0].perctrigger = 11.0f;
	spells[0].attackstoptimer = 1000;

	spells[1].info = sSpellStore.LookupEntry(CHARGE);
	spells[1].targettype = TARGET_ATTACKING; // Needs checking
	spells[1].instant = true;
	spells[1].perctrigger = 6.0f;
	spells[1].attackstoptimer = 1000; 
    }

    void OnCombatStart(Unit* mTarget)
    {
		int RandomSpeach;
		sRand.randInt(1000);
		RandomSpeach=rand()%3;
		switch (RandomSpeach)
		{
		case 0: 
			_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "Cowards, Wretches !");
			_unit->PlaySoundToSet(9167);
			break;
		case 1:
			_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "Who dares attack the stead of the Huntsman !");
			_unit->PlaySoundToSet(9298);
			break;
		case 2:
			_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "Perhaps you would test yourself against a more formidable opponent...");
			_unit->PlaySoundToSet(9299);
			break;
		}

        RegisterAIUpdateEvent(_unit->GetUInt32Value(UNIT_FIELD_BASEATTACKTIME));
    }

    void OnCombatStop(Unit *mTarget)
    {
				if (_unit->GetHealthPct() > 0)
		{
			int RandomSpeach;
			sRand.randInt(1000);
			RandomSpeach=rand()%2;
			switch (RandomSpeach)
			{
			case 0: 
				_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "I always knew someday i would become ... The hunted");
				_unit->PlaySoundToSet(9165);
				break;

			}
        _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL);
        _unit->GetAIInterface()->SetAIState(STATE_IDLE);
        RemoveAIUpdateEvent();
    }

	void OnTargetDied(Unit* mTarget)
    {
		if (_unit->GetHealthPct() > 0)
		{
			int RandomSpeach;
			sRand.randInt(1000);
			RandomSpeach=rand()%2;
			switch (RandomSpeach)
			{
			case 0: 
				_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "It was inevetable...");
				_unit->PlaySoundToSet(9169);
				break;

							case 1: 
				_unit->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, "Another trophy to add to my collection");
				_unit->PlaySoundToSet(9300);
				break;

			}
		}

    void AIUpdate()
    {
        switch(m_phase)
        {
        case 1:
            {
                PhaseOne();
            }break;
        case 2:
            {
            }break;
        default:
            {
                m_phase = 1;
            };
        };
	float val = sRand.rand(100.0f);
        SpellCast(val);
    }

    void PhaseOne()
    {
        if(_unit->GetUInt32Value(UNIT_FIELD_DISPLAYID) == 16040)
        {
            _unit->SetUInt32Value(UNIT_FIELD_HEALTH, _unit->GetUInt32Value(UNIT_FIELD_MAXHEALTH));
            m_phase = 2;
        }
        else if(_unit->GetHealthPct() <= 25)
        {
            _unit->SetUInt32Value(UNIT_FIELD_MINDAMAGE, 15000);
            _unit->SetUInt32Value(UNIT_FIELD_MAXDAMAGE, 20000);
            m_phase = 2;
        }
    }

    void SpellCast(float val)
    {
        if(m_spellcheck && spells && _unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget())
        {
            float comulativeperc = 0;
	    Unit *target = NULL;
            for(int i=0;i<m_phase;i++)
            {
                if(!spells[i].perctrigger) continue;

                if(m_spellcheck[i])
                {
                    target = _unit->GetAIInterface()->GetNextTarget();
                    switch(spells[i].targettype)
                    {
                        case TARGET_SELF:
		        case TARGET_VARIOUS:
			    _unit->CastSpell(_unit, spells[i].info, spells[i].instant); break;
			case TARGET_ATTACKING:
			    _unit->CastSpell(target, spells[i].info, spells[i].instant); break;
			case TARGET_DESTINATION:
			    _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break;
		    }
		    m_spellcheck[i] = false;
		    return;
		}
		if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger))
		{
		    _unit->setAttackTimer(spells[i].attackstoptimer, false);
		    m_spellcheck[i] = true;
		}
		comulativeperc += spells[i].perctrigger;
	    }
        }
    }

protected:
    bool *m_spellcheck;
    SP_AI_Spell *spells;
    int m_phase;
};

void SetupKarazhan(ScriptMgr * mgr)

	mgr->register_creature_script(CN_MIDNIGHT, &MidnightAI::Create);
	mgr->register_creature_script(CN_ATTUMEN, &AttumenAI::Create);