*Small fixes in Murmur script - by Iskander

--HG--
branch : trunk
This commit is contained in:
Blaymoira
2009-02-08 00:39:11 +01:00
parent 97c6ed48c8
commit 02d6b7c683
4 changed files with 112 additions and 67 deletions
+5
View File
@@ -0,0 +1,5 @@
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN ('-33711','-38794','33686');
INSERT INTO `spell_linked_spell`(`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES
('-33711','33686','0','Murmur\'s Shockwave (Normal)'),
('-38794','33686','0','Murmur\'s Shockwave (Heroic)'),
('33686','31705','0','Murmur\'s Shockwave Jump');
+2
View File
@@ -162,4 +162,6 @@ INSTALL(FILES
966_world_scripts.sql 966_world_scripts.sql
970_world_scripts.sql 970_world_scripts.sql
973_world_scripts.sql 973_world_scripts.sql
1018_world.sql
1026_world.sql
DESTINATION share/trinity/sql/updates) DESTINATION share/trinity/sql/updates)
@@ -1,4 +1,4 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
@@ -16,8 +16,8 @@
/* ScriptData /* ScriptData
SDName: Boss_Murmur SDName: Boss_Murmur
SD%Complete: 75 SD%Complete: 90
SDComment: Database should have `RegenHealth`=0 to prevent regen. Also, his shockwave triggered after magnetic pull may be incorrect. Murmur's Touch does not work properly. SDComment: Timers may be incorrect
SDCategory: Auchindoun, Shadow Labyrinth SDCategory: Auchindoun, Shadow Labyrinth
EndScriptData */ EndScriptData */
@@ -25,118 +25,156 @@ EndScriptData */
#define EMOTE_SONIC_BOOM -1555036 #define EMOTE_SONIC_BOOM -1555036
#define SPELL_MAGNETIC_PULL 33689 #define SPELL_SONIC_BOOM_CAST (HeroicMode?38796:33923)
#define SPELL_SONIC_BOOM_PRE 33923 #define SPELL_SONIC_BOOM_EFFECT (HeroicMode?38795:33666)
#define SPELL_SONIC_BOOM_CAST 38795
#define SPELL_MURMURS_TOUCH 33711
#define SPELL_RESONANCE 33657 #define SPELL_RESONANCE 33657
#define SPELL_SHOCKWAVE 33686 #define SPELL_MURMURS_TOUCH (HeroicMode?38794:33711)
#define SPELL_MURMURS_TOUCH_VISUAL 33760
#define SPELL_MAGNETIC_PULL 33689
#define SPELL_SONIC_SHOCK 38797
#define SPELL_THUNDERING_STORM 39365
struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
{ {
boss_murmurAI(Creature *c) : Scripted_NoMovementAI(c) {Reset();} boss_murmurAI(Creature *c) : Scripted_NoMovementAI(c)
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
// need core fix
if(SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_MURMURS_TOUCH))
{
TempSpell->EffectTriggerSpell[0] = SPELL_MURMURS_TOUCH_VISUAL;
TempSpell->MaxAffectedTargets = 1;
}
}
uint32 SonicBoom_Timer; uint32 SonicBoom_Timer;
uint32 MurmursTouch_Timer; uint32 MurmursTouch_Timer;
uint32 Resonance_Timer; uint32 Resonance_Timer;
uint32 MagneticPull_Timer; uint32 MagneticPull_Timer;
bool CanSonicBoom; uint32 SonicShock_Timer;
bool CanShockWave; uint32 ThunderingStorm_Timer;
uint64 pTarget; bool HeroicMode;
bool SonicBoom;
void Reset() void Reset()
{ {
SonicBoom_Timer = 30000; SonicBoom_Timer = 30000;
MurmursTouch_Timer = 20000; MurmursTouch_Timer = 20000;
Resonance_Timer = 10000; Resonance_Timer = 10000;
MagneticPull_Timer = 45000; MagneticPull_Timer = 20000;
CanSonicBoom = false; ThunderingStorm_Timer = 15000;
CanShockWave = false; SonicShock_Timer = 10000;
pTarget = 0; SonicBoom = false;
//database should have `RegenHealth`=0 to prevent regen //database should have `RegenHealth`=0 to prevent regen
uint32 hp = (m_creature->GetMaxHealth()*40)/100; uint32 hp = (m_creature->GetMaxHealth()*40)/100;
if (hp) if (hp) m_creature->SetHealth(hp);
m_creature->SetHealth(hp);
} }
void Aggro(Unit *who) { } void Aggro(Unit *who) { }
// Sonic Boom instant damage (needs core fix instead of this)
void SpellHitTarget(Unit *target, const SpellEntry *spell)
{
if(target && target->isAlive() && spell && spell->Id == SPELL_SONIC_BOOM_EFFECT)
m_creature->DealDamage(target,(target->GetHealth()*90)/100,NULL,SPELL_DIRECT_DAMAGE,SPELL_SCHOOL_MASK_NATURE,spell);
}
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
//Return since we have no target //Return since we have no target or casting
if (!UpdateVictim() ) if (!UpdateVictim() || m_creature->IsNonMeleeSpellCasted(false))
return; return;
//SonicBoom_Timer // Sonic Boom
if(SonicBoom)
{
DoCast(m_creature, SPELL_SONIC_BOOM_EFFECT, true);
SonicBoom = false;
Resonance_Timer = 1500;
}
if (SonicBoom_Timer < diff) if (SonicBoom_Timer < diff)
{ {
if (CanSonicBoom) DoScriptText(EMOTE_SONIC_BOOM, m_creature);
{ DoCast(m_creature, SPELL_SONIC_BOOM_CAST);
DoCast(m_creature, SPELL_SONIC_BOOM_CAST,true); SonicBoom_Timer = 30000;
CanSonicBoom = false; SonicBoom = true;
SonicBoom_Timer = 30000; return;
}
else
{
DoScriptText(EMOTE_SONIC_BOOM, m_creature);
DoCast(m_creature,SPELL_SONIC_BOOM_PRE);
CanSonicBoom = true;
SonicBoom_Timer = 5000;
}
}else SonicBoom_Timer -= diff; }else SonicBoom_Timer -= diff;
//MurmursTouch_Timer // Murmur's Touch
if (MurmursTouch_Timer < diff) if (MurmursTouch_Timer < diff)
{ {
/*Unit* target = NULL; if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,80,true))
target = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(target, SPELL_MURMURS_TOUCH);
if(target)
DoCast(target, SPELL_MURMURS_TOUCH);*/
DoCast(m_creature, SPELL_MURMURS_TOUCH);
MurmursTouch_Timer = 30000; MurmursTouch_Timer = 30000;
}else MurmursTouch_Timer -= diff; }else MurmursTouch_Timer -= diff;
//Resonance_Timer // Resonance
if (Resonance_Timer < diff) if (Resonance_Timer < diff)
{ {
if (!m_creature->IsWithinMeleeRange(m_creature->getVictim())) if (!m_creature->IsWithinMeleeRange(SelectUnit(SELECT_TARGET_NEAREST,0,20,true)))
DoCast(m_creature->getVictim(), SPELL_RESONANCE); DoCast(m_creature, SPELL_RESONANCE);
Resonance_Timer = 5000; Resonance_Timer = 5000;
}else Resonance_Timer -= diff; }else Resonance_Timer -= diff;
//MagneticPull_Timer // Magnetic Pull
if (MagneticPull_Timer < diff) if (MagneticPull_Timer < diff)
{ {
if (!CanShockWave) if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{ if (target->GetTypeId() == TYPEID_PLAYER && target->isAlive())
if (Unit* temp = SelectUnit(SELECT_TARGET_RANDOM,0))
{ {
if (temp->GetTypeId() == TYPEID_PLAYER) DoCast(target, SPELL_MAGNETIC_PULL);
{ MagneticPull_Timer = 20000+rand()%15000;
DoCast(temp, SPELL_MAGNETIC_PULL); return;
pTarget = temp->GetGUID();
CanShockWave = true;
}
MagneticPull_Timer = 2500;
} }
} MagneticPull_Timer = 500;
else
{
if (Unit* target = Unit::GetUnit(*m_creature,pTarget))
target->CastSpell(target,SPELL_SHOCKWAVE,true);
MagneticPull_Timer = 35000;
CanShockWave = false;
pTarget = 0;
}
}else MagneticPull_Timer -= diff; }else MagneticPull_Timer -= diff;
//no meele if preparing for sonic boom if(HeroicMode)
if (!CanSonicBoom) {
DoMeleeAttackIfReady(); // Thundering Storm
if(ThunderingStorm_Timer < diff)
{
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::iterator i = m_threatlist.begin(); i != m_threatlist.end(); ++i)
if(Unit* target = Unit::GetUnit((*m_creature),(*i)->getUnitGuid()))
if(target->isAlive() && m_creature->GetDistance2d(target) > 35)
DoCast(target, SPELL_THUNDERING_STORM, true);
ThunderingStorm_Timer = 15000;
}else ThunderingStorm_Timer -= diff;
// Sonic Shock
if(SonicShock_Timer < diff)
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,20,false))
if(target->isAlive())
DoCast(target, SPELL_SONIC_SHOCK);
SonicShock_Timer = 10000+rand()%10000;
}else SonicShock_Timer -= diff;
}
// Select nearest most aggro target if top aggro too far
if(!m_creature->isAttackReady())
return;
if(!m_creature->IsWithinMeleeRange(m_creature->getVictim()))
{
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::iterator i = m_threatlist.begin(); i != m_threatlist.end(); ++i)
if(Unit* target = Unit::GetUnit((*m_creature),(*i)->getUnitGuid()))
if(target->isAlive() && m_creature->IsWithinMeleeRange(target))
{
m_creature->TauntApply(target);
break;
}
}
DoMeleeAttackIfReady();
} }
}; };
CreatureAI* GetAI_boss_murmur(Creature *_Creature) CreatureAI* GetAI_boss_murmur(Creature *_Creature)
{ {
return new boss_murmurAI (_Creature); return new boss_murmurAI (_Creature);