diff options
Diffstat (limited to 'src')
3 files changed, 126 insertions, 27 deletions
diff --git a/src/bindings/scripts/scripts/npc/npcs_special.cpp b/src/bindings/scripts/scripts/npc/npcs_special.cpp index c438ef2d8af..e67fa031d42 100644 --- a/src/bindings/scripts/scripts/npc/npcs_special.cpp +++ b/src/bindings/scripts/scripts/npc/npcs_special.cpp @@ -131,12 +131,79 @@ bool QuestComplete_npc_chicken_cluck(Player *player, Creature *_Creature, const ## npc_dancing_flames ######*/ -bool ReceiveEmote_npc_dancing_flames( Player *player, Creature *_Creature, uint32 emote ) +#define SPELL_BRAZIER 45423 +#define SPELL_SEDUCTION 47057 +#define SPELL_FIERY_AURA 45427 + +struct TRINITY_DLL_DECL npc_dancing_flamesAI : public ScriptedAI { - if( emote == TEXTEMOTE_DANCE ) - _Creature->CastSpell(player,47057,false); + npc_dancing_flamesAI(Creature *c) : ScriptedAI(c) {Reset();} + + bool active; + uint32 can_iteract; - return true; + void Reset() + { + active = true; + can_iteract = 3500; + DoCast(m_creature,SPELL_BRAZIER,true); + DoCast(m_creature,SPELL_FIERY_AURA,false); + float x, y, z; + m_creature->GetPosition(x,y,z); + m_creature->Relocate(x,y,z + 0.94f); + m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING); + m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE); + WorldPacket data; //send update position to client + m_creature->BuildHeartBeatMsg(&data); + m_creature->SendMessageToSet(&data,true); + } + + void UpdateAI(const uint32 diff) + { + if (!active) + { + if(can_iteract <= diff){ + active = true; + can_iteract = 3500; + m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE); + }else can_iteract -= diff; + } + } + + void Aggro(Unit* who){} +}; + +CreatureAI* GetAI_npc_dancing_flames(Creature *_Creature) +{ + return new npc_dancing_flamesAI(_Creature); +} + +bool ReceiveEmote_npc_dancing_flames( Player *player, Creature *flame, uint32 emote ) +{ + if ( ((npc_dancing_flamesAI*)flame->AI())->active && + flame->IsWithinLOS(player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()) && flame->IsWithinDistInMap(player,30.0f)) + { + flame->SetInFront(player); + ((npc_dancing_flamesAI*)flame->AI())->active = false; + + WorldPacket data; + flame->BuildHeartBeatMsg(&data); + flame->SendMessageToSet(&data,true); + switch(emote) + { + case TEXTEMOTE_KISS: flame->HandleEmoteCommand(EMOTE_ONESHOT_SHY); break; + case TEXTEMOTE_WAVE: flame->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break; + case TEXTEMOTE_BOW: flame->HandleEmoteCommand(EMOTE_ONESHOT_BOW); break; + case TEXTEMOTE_JOKE: flame->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); break; + case TEXTEMOTE_DANCE: + { + if (!player->HasAura(SPELL_SEDUCTION,0)) + flame->CastSpell(player,SPELL_SEDUCTION,true); + } + break; + } + } + return true; } /*###### @@ -940,6 +1007,7 @@ void AddSC_npcs_special() newscript = new Script; newscript->Name="npc_dancing_flames"; + newscript->GetAI = &GetAI_npc_dancing_flames; newscript->pReceiveEmote = &ReceiveEmote_npc_dancing_flames; newscript->RegisterSelf(); diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp index afc161afed4..d0273e22d34 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp @@ -23,7 +23,7 @@ EndScriptData */ #include "precompiled.h" -#define SPELL_INHABITMAGIC 32264 +#define SPELL_INHIBITMAGIC 32264 #define SPELL_ATTRACTMAGIC 32265 #define N_SPELL_CARNIVOROUSBITE 36383 #define H_SPELL_CARNIVOROUSBITE 39382 @@ -44,7 +44,7 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI Reset(); } - uint32 Inhabitmagic_Timer; + uint32 Inhibitmagic_Timer; uint32 Attractmagic_Timer; uint32 Carnivorousbite_Timer; uint32 FocusFire_Timer; @@ -53,7 +53,7 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI void Reset() { - Inhabitmagic_Timer = 3000; + Inhibitmagic_Timer = 0; Attractmagic_Timer = 28000; Carnivorousbite_Timer = 10000; FocusFire_Timer = 17000; @@ -79,22 +79,38 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI void UpdateAI(const uint32 diff) { + //Inhibitmagic_Timer + if (Inhibitmagic_Timer < diff) + { + float dist; + Map *map = m_creature->GetMap(); + Map::PlayerList const &PlayerList = map->GetPlayers(); + for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* i_pl = i->getSource()) + if (i_pl->isAlive() && (dist = i_pl->GetDistance(m_creature)) < 45) + { + i_pl->RemoveAurasDueToSpell(SPELL_INHIBITMAGIC); + m_creature->AddAura(SPELL_INHIBITMAGIC, i_pl); + if(dist < 35) + m_creature->AddAura(SPELL_INHIBITMAGIC, i_pl); + if(dist < 25) + m_creature->AddAura(SPELL_INHIBITMAGIC, i_pl); + if(dist < 15) + m_creature->AddAura(SPELL_INHIBITMAGIC, i_pl); + } + Inhibitmagic_Timer = 3000+(rand()%1000); + }else Inhibitmagic_Timer -= diff; + //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; - //Inhabitmagic_Timer - if (Inhabitmagic_Timer < diff) - { - DoCast(m_creature,SPELL_INHABITMAGIC); - Inhabitmagic_Timer = 2000+(rand()%2000); - }else Inhabitmagic_Timer -= diff; - //Attractmagic_Timer if (Attractmagic_Timer < diff) { DoCast(m_creature,SPELL_ATTRACTMAGIC); Attractmagic_Timer = 30000; + Carnivorousbite_Timer = 1500; }else Attractmagic_Timer -= diff; //Carnivorousbite_Timer @@ -108,20 +124,20 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI if (FocusFire_Timer < diff) { // Summon Focus Fire & Emote - Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0); - if (target && target->GetTypeId() == TYPEID_PLAYER) + Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1); + if (target && target->GetTypeId() == TYPEID_PLAYER && target->isAlive()) { focusedTarget = target; m_creature->SummonCreature(ENTRY_FOCUS_FIRE,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,5500); // Emote - std::string *emote = new std::string("focuses his energy on "); + std::string *emote = new std::string("focuses on "); emote->append(target->GetName()); + emote->append("!"); DoTextEmote(emote->c_str(),NULL,true); delete emote; - - FocusFire_Timer = 15000+(rand()%5000); } + FocusFire_Timer = 15000+(rand()%5000); }else FocusFire_Timer -= diff; DoMeleeAttackIfReady(); @@ -143,7 +159,7 @@ struct TRINITY_DLL_DECL mob_focus_fireAI : public ScriptedAI bool HeroicMode; uint32 FieryBlast_Timer; - bool fiery1, fiery2, fiery3; + bool fiery1, fiery2; void Reset() { diff --git a/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp b/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp index a5d66b02ddc..2631b9ac3ae 100644 --- a/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp +++ b/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp @@ -72,13 +72,28 @@ struct TRINITY_DLL_DECL mob_yennikuAI : public ScriptedAI void UpdateAI(const uint32 diff) { if (bReset) - if(Reset_Timer < diff) - { - EnterEvadeMode(); - bReset = false; - m_creature->setFaction(28); //troll, bloodscalp - } - else Reset_Timer -= diff; + { + if(Reset_Timer < diff) + { + EnterEvadeMode(); + bReset = false; + m_creature->setFaction(28); //troll, bloodscalp + } + else Reset_Timer -= diff; + + if(m_creature->isInCombat() && m_creature->getVictim()) + { + if(m_creature->getVictim()->GetTypeId() == TYPEID_PLAYER) + { + Unit *victim = m_creature->getVictim(); + if(((Player*)victim)->GetTeam() == HORDE) + { + m_creature->CombatStop(); + m_creature->DeleteThreatList(); + } + } + } + } //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) |