aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp11
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp25
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp158
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h3
-rw-r--r--src/server/scripts/Spells/spell_item.cpp40
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp37
7 files changed, 166 insertions, 110 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index b0d1b252c5b..3fb378d245f 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -967,6 +967,17 @@ void GameObject::SaveRespawnTime()
GetMap()->SaveGORespawnTime(m_DBTableGuid, m_respawnTime);
}
+bool GameObject::IsNeverVisible() const
+{
+ if (WorldObject::IsNeverVisible())
+ return true;
+
+ if (GetGoType() == GAMEOBJECT_TYPE_SPELL_FOCUS && GetGOInfo()->spellFocus.serverOnly == 1)
+ return true;
+
+ return false;
+}
+
bool GameObject::IsAlwaysVisibleFor(WorldObject const* seer) const
{
if (WorldObject::IsAlwaysVisibleFor(seer))
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 11df5a17409..5b53a1ff421 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -781,6 +781,8 @@ class GameObject : public WorldObject, public GridObject<GameObject>, public Map
void TriggeringLinkedGameObject(uint32 trapEntry, Unit* target);
+ bool IsNeverVisible() const override;
+
bool IsAlwaysVisibleFor(WorldObject const* seer) const;
bool IsInvisibleDueToDespawn() const;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e41243e5337..664fbf708c4 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -6145,31 +6145,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
}
break;
}
- // Item - Shaman T10 Elemental 2P Bonus
- case 70811:
- {
- // Lightning Bolt & Chain Lightning
- if (procSpell->SpellFamilyFlags[0] & 0x3)
- {
- if (ToPlayer()->HasSpellCooldown(16166))
- {
- uint32 newCooldownDelay = ToPlayer()->GetSpellCooldownDelay(16166);
- if (newCooldownDelay < 3)
- newCooldownDelay = 0;
- else
- newCooldownDelay -= 2;
- ToPlayer()->AddSpellCooldown(16166, 0, uint32(time(NULL) + newCooldownDelay));
-
- WorldPacket data(SMSG_MODIFY_COOLDOWN, 4+8+4);
- data << uint32(16166); // Spell ID
- data << uint64(GetGUID()); // Player GUID
- data << int32(-2000); // Cooldown mod in milliseconds
- ToPlayer()->GetSession()->SendPacket(&data);
- return true;
- }
- }
- return false;
- }
// Item - Shaman T10 Elemental 4P Bonus
case 70817:
{
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
index 787bf7584e5..f18c0aac8bb 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
- * 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
@@ -16,15 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Arcanist_Doan
-SD%Complete: 100
-SDComment:
-SDCategory: Scarlet Monastery
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "scarlet_monastery.h"
enum Yells
{
@@ -34,103 +27,100 @@ enum Yells
enum Spells
{
- SPELL_POLYMORPH = 13323,
- SPELL_AOESILENCE = 8988,
- SPELL_ARCANEEXPLOSION = 9433,
- SPELL_FIREAOE = 9435,
- SPELL_ARCANEBUBBLE = 9438
+ SPELL_SILENCE = 8988,
+ SPELL_ARCANE_EXPLOSION = 9433,
+ SPELL_DETONATION = 9435,
+ SPELL_ARCANE_BUBBLE = 9438,
+ SPELL_POLYMORPH = 13323
};
-class boss_arcanist_doan : public CreatureScript
+enum Events
{
-public:
- boss_arcanist_doan() : CreatureScript("boss_arcanist_doan") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_arcanist_doanAI(creature);
- }
-
- struct boss_arcanist_doanAI : public ScriptedAI
- {
- boss_arcanist_doanAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 Polymorph_Timer;
- uint32 AoESilence_Timer;
- uint32 ArcaneExplosion_Timer;
- bool bCanDetonate;
- bool bShielded;
-
- void Reset() override
- {
- Polymorph_Timer = 20000;
- AoESilence_Timer = 15000;
- ArcaneExplosion_Timer = 3000;
- bCanDetonate = false;
- bShielded = false;
- }
+ EVENT_SILENCE = 1,
+ EVENT_ARCANE_EXPLOSION = 2,
+ EVENT_ARCANE_BUBBLE = 3,
+ EVENT_POLYMORPH = 4
+};
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- }
+class boss_arcanist_doan : public CreatureScript
+{
+ public:
+ boss_arcanist_doan() : CreatureScript("boss_arcanist_doan") { }
- void UpdateAI(uint32 diff) override
+ struct boss_arcanist_doanAI : public BossAI
{
- if (!UpdateVictim())
- return;
-
- if (bShielded && bCanDetonate)
+ boss_arcanist_doanAI(Creature* creature) : BossAI(creature, DATA_ARCANIST_DOAN)
{
- DoCast(me, SPELL_FIREAOE);
- bCanDetonate = false;
+ _healthAbove50Pct = true;
}
- if (me->HasAura(SPELL_ARCANEBUBBLE))
- return;
-
- //If we are <50% hp cast Arcane Bubble
- if (!bShielded && !HealthAbovePct(50))
+ void Reset() override
{
- //wait if we already casting
- if (me->IsNonMeleeSpellCast(false))
- return;
-
- Talk(SAY_SPECIALAE);
- DoCast(me, SPELL_ARCANEBUBBLE);
-
- bCanDetonate = true;
- bShielded = true;
+ _Reset();
+ _healthAbove50Pct = true;
}
- if (Polymorph_Timer <= diff)
+ void EnterCombat(Unit* /*who*/) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
- DoCast(target, SPELL_POLYMORPH);
+ _EnterCombat();
+ Talk(SAY_AGGRO);
- Polymorph_Timer = 20000;
+ events.ScheduleEvent(EVENT_SILENCE, 15 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 3 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_POLYMORPH, 30 * IN_MILLISECONDS);
}
- else Polymorph_Timer -= diff;
- //AoESilence_Timer
- if (AoESilence_Timer <= diff)
+ void UpdateAI(uint32 diff) override
{
- DoCastVictim(SPELL_AOESILENCE);
- AoESilence_Timer = urand(15000, 20000);
- }
- else AoESilence_Timer -= diff;
+ if (!UpdateVictim())
+ return;
- //ArcaneExplosion_Timer
- if (ArcaneExplosion_Timer <= diff)
- {
- DoCastVictim(SPELL_ARCANEEXPLOSION);
- ArcaneExplosion_Timer = 8000;
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SILENCE:
+ DoCastVictim(SPELL_SILENCE);
+ events.ScheduleEvent(EVENT_SILENCE, urand(15, 20) * IN_MILLISECONDS);
+ break;
+ case EVENT_ARCANE_EXPLOSION:
+ DoCastVictim(SPELL_ARCANE_EXPLOSION);
+ events.ScheduleEvent(EVENT_SILENCE, 8 * IN_MILLISECONDS);
+ break;
+ case EVENT_POLYMORPH:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f, true))
+ DoCast(target, SPELL_POLYMORPH);
+ events.ScheduleEvent(EVENT_POLYMORPH, 20 * IN_MILLISECONDS);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (_healthAbove50Pct && HealthBelowPct(50))
+ {
+ _healthAbove50Pct = false;
+ Talk(SAY_SPECIALAE);
+ DoCast(me, SPELL_ARCANE_BUBBLE);
+ DoCastAOE(SPELL_DETONATION);
+ }
+
+ DoMeleeAttackIfReady();
}
- else ArcaneExplosion_Timer -= diff;
- DoMeleeAttackIfReady();
+ private:
+ bool _healthAbove50Pct;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new boss_arcanist_doanAI(creature);
}
- };
};
void AddSC_boss_arcanist_doan()
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
index cd5a74ee478..bdac6b089fd 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
@@ -30,7 +30,8 @@ enum DataTypes
DATA_HORSEMAN_EVENT = 5,
GAMEOBJECT_PUMPKIN_SHRINE = 6,
- DATA_VORREL = 7
+ DATA_VORREL = 7,
+ DATA_ARCANIST_DOAN = 8
};
#endif // SCARLET_M_
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index c4a521ea41d..f8c68f99270 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -383,6 +383,45 @@ class spell_item_echoes_of_light : public SpellScriptLoader
}
};
+// 7434 - Fate Rune of Unsurpassed Vigor
+enum FateRuneOfUnsurpassedVigor
+{
+ SPELL_UNSURPASSED_VIGOR = 25733
+};
+
+class spell_item_fate_rune_of_unsurpassed_vigor : public SpellScriptLoader
+{
+ public:
+ spell_item_fate_rune_of_unsurpassed_vigor() : SpellScriptLoader("spell_item_fate_rune_of_unsurpassed_vigor") { }
+
+ class spell_item_fate_rune_of_unsurpassed_vigor_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_fate_rune_of_unsurpassed_vigor_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_UNSURPASSED_VIGOR))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ GetTarget()->CastSpell(GetTarget(), SPELL_UNSURPASSED_VIGOR, true);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_fate_rune_of_unsurpassed_vigor_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_fate_rune_of_unsurpassed_vigor_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=47499 Flask of the North
// 67019 Flask of the North
enum FlaskOfTheNorthSpells
@@ -2562,6 +2601,7 @@ void AddSC_item_spell_scripts()
new spell_item_desperate_defense();
new spell_item_deviate_fish();
new spell_item_echoes_of_light();
+ new spell_item_fate_rune_of_unsurpassed_vigor();
new spell_item_flask_of_the_north();
new spell_item_gnomish_death_ray();
new spell_item_make_a_wish();
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index bc568904b80..94c304bf82e 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -841,6 +841,42 @@ class spell_sha_item_mana_surge : public SpellScriptLoader
}
};
+// 70811 - Item - Shaman T10 Elemental 2P Bonus
+class spell_sha_item_t10_elemental_2p_bonus : public SpellScriptLoader
+{
+ public:
+ spell_sha_item_t10_elemental_2p_bonus() : SpellScriptLoader("spell_sha_item_t10_elemental_2p_bonus") { }
+
+ class spell_sha_item_t10_elemental_2p_bonus_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_item_t10_elemental_2p_bonus_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELEMENTAL_MASTERY))
+ return false;
+ return true;
+ }
+
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ if (Player* target = GetTarget()->ToPlayer())
+ target->ModifySpellCooldown(SPELL_SHAMAN_ELEMENTAL_MASTERY, -aurEff->GetAmount());
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_item_t10_elemental_2p_bonus_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_sha_item_t10_elemental_2p_bonus_AuraScript();
+ }
+};
+
// 60103 - Lava Lash
/// Updated 4.3.4
class spell_sha_lava_lash : public SpellScriptLoader
@@ -1205,6 +1241,7 @@ void AddSC_shaman_spell_scripts()
new spell_sha_item_lightning_shield();
new spell_sha_item_lightning_shield_trigger();
new spell_sha_item_mana_surge();
+ new spell_sha_item_t10_elemental_2p_bonus();
new spell_sha_lava_lash();
new spell_sha_lava_surge();
new spell_sha_lava_surge_proc();