*Small fixes in Murmur script - by Iskander
--HG-- branch : trunk
This commit is contained in:
@@ -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');
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user