diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/ScriptMgr.cpp | 2 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_loken.cpp | 244 |
2 files changed, 195 insertions, 51 deletions
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp index d2857501705..1cf4a27915a 100644 --- a/src/bindings/scripts/ScriptMgr.cpp +++ b/src/bindings/scripts/ScriptMgr.cpp @@ -661,6 +661,7 @@ extern void AddSC_boss_razorscale(); //Halls of lightning extern void AddSC_boss_bjarngrim(); +extern void AddSC_boss_loken(); //Region extern void AddSC_wintergrasp(); @@ -1580,6 +1581,7 @@ void ScriptsInit(char const* cfg_file = "trinitycore.conf") //Halls of lightning AddSC_boss_bjarngrim(); + AddSC_boss_loken(); //Region AddSC_wintergrasp(); diff --git a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_loken.cpp b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_loken.cpp index 9459587e3c1..8316c466d9b 100644 --- a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_loken.cpp +++ b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_loken.cpp @@ -1,66 +1,113 @@ -/* Script Data Start -SDName: Boss loken -SDAuthor: LordVanMartin -SD%Complete: -SDComment: -SDCategory: -Script Data End */ - -/*** SQL START *** -update creature_template set scriptname = 'boss_loken' where entry = ''; -*** SQL END ***/ +/* Copyright (C) 2006 - 2009 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 Loken +SD%Complete: 60% +SDComment: Missing intro. Remove hack of Pulsing Shockwave when core supports. Aura is not working (59414) +SDCategory: Halls of Lightning +EndScriptData */ + #include "precompiled.h" +#include "def_halls_of_lightning.h" + +enum +{ + SAY_AGGRO = -1602018, + SAY_INTRO_1 = -1602019, + SAY_INTRO_2 = -1602020, + SAY_SLAY_1 = -1602021, + SAY_SLAY_2 = -1602022, + SAY_SLAY_3 = -1602023, + SAY_DEATH = -1602024, + SAY_NOVA_1 = -1602025, + SAY_NOVA_2 = -1602026, + SAY_NOVA_3 = -1602027, + SAY_75HEALTH = -1602028, + SAY_50HEALTH = -1602029, + SAY_25HEALTH = -1602030, + EMOTE_NOVA = -1602031, + + SPELL_ARC_LIGHTNING = 52921, + SPELL_LIGHTNING_NOVA_N = 52960, + SPELL_LIGHTNING_NOVA_H = 59835, + + SPELL_PULSING_SHOCKWAVE_N = 52961, + SPELL_PULSING_SHOCKWAVE_H = 59836, + SPELL_PULSING_SHOCKWAVE_AURA = 59414 +}; -//Spells -#define SPELL_ARC_NOVA 52921 -//Effect #1 School Damage (Nature), Value: 3238 to 3762 -//Effect #2 Apply Aura: Dummy, Value: 3238 to 3762, Server-side script - -#define SPELL_LIGHTNING_NOVA 52960 -#define SPELL_LIGHTNING_NOVA_2 59835 - -//Yell -#define SAY_AGGRO -1602015 -#define SAY_INTRO_1 -1602016 -#define SAY_INTRO_2 -1602017 -#define SAY_SLAY_1 -1602018 -#define SAY_SLAY_2 -1602019 -#define SAY_SLAY_3 -1602020 -#define SAY_DEATH -1602021 -#define SAY_NOVA_1 -1602022 -#define SAY_NOVA_2 -1602023 -#define SAY_NOVA_3 -1602024 -#define SAY_75HEALTH -1602025 -#define SAY_50HEALTH -1602026 -#define SAY_25HEALTH -1602027 +/*###### +## Boss Loken +######*/ struct TRINITY_DLL_DECL boss_lokenAI : public ScriptedAI { - boss_lokenAI(Creature *c) : ScriptedAI(c) {} + boss_lokenAI(Creature *pCreature) : ScriptedAI(pCreature) + { + m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + m_bIsHeroic = pCreature->GetMap()->IsHeroic(); + Reset(); + } + + ScriptedInstance* m_pInstance; + + bool m_bIsHeroic; + bool m_bIsAura; - void Reset() {} - void EnterCombat(Unit* who) + uint32 m_uiArcLightning_Timer; + uint32 m_uiLightningNova_Timer; + uint32 m_uiPulsingShockwave_Timer; + uint32 m_uiResumePulsingShockwave_Timer; + + uint32 m_uiHealthAmountModifier; + + void Reset() { - DoScriptText(SAY_AGGRO, m_creature); + m_bIsAura = false; + + m_uiArcLightning_Timer = 15000; + m_uiLightningNova_Timer = 20000; + m_uiPulsingShockwave_Timer = 2000; + m_uiResumePulsingShockwave_Timer = 15000; + + m_uiHealthAmountModifier = 1; + + if (m_pInstance) + m_pInstance->SetData(TYPE_LOKEN, NOT_STARTED); } - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} - void UpdateAI(const uint32 diff) + + void EnterCombat(Unit* pWho) { - //Return since we have no target - if(!UpdateVictim()) - return; + DoScriptText(SAY_AGGRO, m_creature); - DoMeleeAttackIfReady(); + if (m_pInstance) + m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS); } - void JustDied(Unit* killer) + + void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); + + if (m_pInstance) + m_pInstance->SetData(TYPE_LOKEN, DONE); } - void KilledUnit(Unit *victim) + + void KilledUnit(Unit* pVictim) { - if(victim == m_creature) - return; switch(rand()%3) { case 0: DoScriptText(SAY_SLAY_1, m_creature);break; @@ -68,11 +115,106 @@ struct TRINITY_DLL_DECL boss_lokenAI : public ScriptedAI case 2: DoScriptText(SAY_SLAY_3, m_creature);break; } } + + void UpdateAI(const uint32 uiDiff) + { + //Return since we have no target + if(!UpdateVictim()) + return; + + if (m_bIsAura) + { + // workaround for PULSING_SHOCKWAVE + if (m_uiPulsingShockwave_Timer < uiDiff) + { + Map *map = m_creature->GetMap(); + if (map->IsDungeon()) + { + Map::PlayerList const &PlayerList = map->GetPlayers(); + + if (PlayerList.isEmpty()) + return; + + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (i->getSource()->isAlive() && i->getSource()->isTargetableForAttack()) + { + int32 dmg; + float m_fDist = m_creature->GetDistance(i->getSource()); + + if (m_fDist <= 1.0f) // Less than 1 yard + dmg = (m_bIsHeroic ? 850 : 800); // need to correct damage + else // Further from 1 yard + dmg = ((m_bIsHeroic ? 250 : 200) * m_fDist) + (m_bIsHeroic ? 850 : 800); // need to correct damage + + m_creature->CastCustomSpell(i->getSource(), (m_bIsHeroic ? 59837 : 52942), &dmg, 0, 0, false); + } + } + m_uiPulsingShockwave_Timer = 2000; + }else m_uiPulsingShockwave_Timer -= uiDiff; + } + else + { + if (m_uiResumePulsingShockwave_Timer < uiDiff) + { + //breaks at movement, can we assume when it's time, this spell is casted and also must stop movement? + m_creature->CastSpell(m_creature, SPELL_PULSING_SHOCKWAVE_AURA, true); + + DoCast(m_creature, m_bIsHeroic ? SPELL_PULSING_SHOCKWAVE_H : SPELL_PULSING_SHOCKWAVE_N); // need core support + m_bIsAura = true; + m_uiResumePulsingShockwave_Timer = 0; + } + else + m_uiResumePulsingShockwave_Timer -= uiDiff; + } + + if (m_uiArcLightning_Timer < uiDiff) + { + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, SPELL_ARC_LIGHTNING); + + m_uiArcLightning_Timer = 15000 + rand()%1000; + } + else + m_uiArcLightning_Timer -= uiDiff; + + if (m_uiLightningNova_Timer < uiDiff) + { + switch(rand()%3) + { + case 0: DoScriptText(SAY_NOVA_1, m_creature);break; + case 1: DoScriptText(SAY_NOVA_2, m_creature);break; + case 2: DoScriptText(SAY_NOVA_3, m_creature);break; + } + + DoCast(m_creature, m_bIsHeroic ? SPELL_LIGHTNING_NOVA_H : SPELL_LIGHTNING_NOVA_N); + + m_bIsAura = false; + m_uiResumePulsingShockwave_Timer = (m_bIsHeroic ? 4000 : 5000); // Pause Pulsing Shockwave aura + m_uiLightningNova_Timer = 20000 + rand()%1000; + } + else + m_uiLightningNova_Timer -= uiDiff; + + // Health check + if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < (100-(25*m_uiHealthAmountModifier))) + { + switch(m_uiHealthAmountModifier) + { + case 1: DoScriptText(SAY_75HEALTH, m_creature); break; + case 2: DoScriptText(SAY_50HEALTH, m_creature); break; + case 3: DoScriptText(SAY_25HEALTH, m_creature); break; + } + + ++m_uiHealthAmountModifier; + } + + DoMeleeAttackIfReady(); + } }; -CreatureAI* GetAI_boss_loken(Creature *_Creature) +CreatureAI* GetAI_boss_loken(Creature* pCreature) { - return new boss_lokenAI (_Creature); + return new boss_lokenAI(pCreature); } void AddSC_boss_loken() @@ -80,7 +222,7 @@ void AddSC_boss_loken() Script *newscript; newscript = new Script; - newscript->Name="boss_loken"; + newscript->Name = "boss_loken"; newscript->GetAI = &GetAI_boss_loken; newscript->RegisterSelf(); } |