aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/westfall.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp2
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp2
-rw-r--r--src/server/scripts/Kalimdor/durotar.cpp2
-rw-r--r--src/server/scripts/Kalimdor/mulgore.cpp2
-rw-r--r--src/server/scripts/Kalimdor/the_barrens.cpp2
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp2
-rw-r--r--src/server/scripts/Northrend/grizzly_hills.cpp2
-rw-r--r--src/server/scripts/Northrend/icecrown.cpp157
-rw-r--r--src/server/scripts/Northrend/sholazar_basin.cpp81
-rw-r--r--src/server/scripts/Outland/shadowmoon_valley.cpp2
-rw-r--r--src/server/scripts/Spells/CMakeLists.txt1
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp5
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp110
21 files changed, 375 insertions, 25 deletions
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 363f7645f6f..17c819f2f22 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -992,7 +992,7 @@ public:
return true;
}
- static bool HandleReloadWpCommand(ChatHandler* /*handler*/, const char* args)
+ static bool HandleReloadWpCommand(ChatHandler* handler, const char* args)
{
if (*args != 'a')
sLog->outString("Re-Loading Waypoints data from 'waypoints_data'");
@@ -1000,7 +1000,7 @@ public:
sWaypointMgr->Load();
if (*args != 'a')
- sLog->outString("DB Table 'waypoint_data' reloaded.");
+ handler->SendGlobalGMSysMessage("DB Table 'waypoint_data' reloaded.");
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
index 8eff3e3a042..17cf775603f 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
@@ -1238,10 +1238,10 @@ public:
me->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
break;
case 2:
- me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACKUNARMED);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED);
break;
case 3:
- me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACKUNARMED);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED);
break;
case 4:
me->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
index febe89772fd..9512d66b6eb 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
@@ -91,7 +91,7 @@ public:
case 2:
if (!player->isRessurectRequested())
{
- me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOMSPELL01);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01);
DoCast(player, SPELL_REVIVE, true);
me->MonsterWhisper(VALK_WHISPER, player->GetGUID());
}
diff --git a/src/server/scripts/EasternKingdoms/westfall.cpp b/src/server/scripts/EasternKingdoms/westfall.cpp
index 34cc8559a71..271e1d99d63 100644
--- a/src/server/scripts/EasternKingdoms/westfall.cpp
+++ b/src/server/scripts/EasternKingdoms/westfall.cpp
@@ -110,7 +110,7 @@ public:
case 4:
SetEquipmentSlots(false, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE, EQUIP_ID_RIFLE);
me->SetSheath(SHEATH_STATE_RANGED);
- me->HandleEmoteCommand(EMOTE_STATE_USESTANDING_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_STATE_USE_STANDING_NO_SHEATHE);
break;
case 7:
me->SummonCreature(NPC_DEFIAS_RAIDER, -11450.836f, 1569.755f, 54.267f, 4.230f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
@@ -141,7 +141,7 @@ public:
case 13:
SetEquipmentSlots(true);
me->SetSheath(SHEATH_STATE_UNARMED);
- me->HandleEmoteCommand(EMOTE_STATE_USESTANDING_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_STATE_USE_STANDING_NO_SHEATHE);
break;
case 17:
player->GroupEventHappens(QUEST_TOME_VALOR, me);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 6466780f024..65bc8f6a8e6 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -678,7 +678,7 @@ public:
}
if (i == LastOverronPos && IsOverrun)
{
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACKUNARMED);
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK_UNARMED);
if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
me->setDeathState(DEAD);
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index d56608ba7f1..7f3c19ac69c 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
@@ -38,7 +38,7 @@ EndScriptData */
#define SPELL_ARCANE_EXPLOSION 25679
#define SPELL_EARTH_SHOCK 26194
-#define SPELL_TRUE_FULFILLMENT4 26526
+#define SPELL_TRUE_FULFILLMENT 785
#define SPELL_BLINK 28391
class ov_mycoordinates
diff --git a/src/server/scripts/Kalimdor/durotar.cpp b/src/server/scripts/Kalimdor/durotar.cpp
index 8cf72b3538d..6c91c64f981 100644
--- a/src/server/scripts/Kalimdor/durotar.cpp
+++ b/src/server/scripts/Kalimdor/durotar.cpp
@@ -84,7 +84,7 @@ public:
void UpdateAI(const uint32 uiDiff)
{
if (work == true)
- me->HandleEmoteCommand(466);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_WORK_CHOPWOOD);
if (m_uiRebuffTimer <= uiDiff)
{
DoCast(me, SPELL_BUFF_SLEEP);
diff --git a/src/server/scripts/Kalimdor/mulgore.cpp b/src/server/scripts/Kalimdor/mulgore.cpp
index 01cca58359e..c689d6954a4 100644
--- a/src/server/scripts/Kalimdor/mulgore.cpp
+++ b/src/server/scripts/Kalimdor/mulgore.cpp
@@ -171,7 +171,7 @@ public:
break;
case 2:
DoScriptText(EMOTE_EAT_LUNCH, me);
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USESTANDING);
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
break;
case 3:
if (Player* unit = Unit::GetPlayer(*me, uiPlayerGUID))
diff --git a/src/server/scripts/Kalimdor/the_barrens.cpp b/src/server/scripts/Kalimdor/the_barrens.cpp
index 6f2ddb1febb..e12897c1def 100644
--- a/src/server/scripts/Kalimdor/the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/the_barrens.cpp
@@ -512,7 +512,7 @@ public:
//creature->GetMotionMaster()->MovePoint(0, -1693, -4343, 4.32f);
//creature->GetMotionMaster()->MovePoint(1, -1684, -4333, 2.78f);
creature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79f);
- creature->HandleEmoteCommand(EMOTE_STATE_READYUNARMED);
+ creature->HandleEmoteCommand(EMOTE_STATE_READY_UNARMED);
EventBigWill = true;
Wave_Timer = 1000;
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index b17b6f1286b..3831e4824ad 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -429,7 +429,7 @@ class npc_fizzlebang_toc : public CreatureScript
case 1130:
me->GetMotionMaster()->MovementExpired();
DoScriptText(SAY_STAGE_1_03, me);
- me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST_OMNI);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST_OMNI);
if (Unit* pTrigger = me->SummonCreature(NPC_TRIGGER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 4.69494f, TEMPSUMMON_MANUAL_DESPAWN))
{
m_uiTriggerGUID = pTrigger->GetGUID();
@@ -446,7 +446,7 @@ class npc_fizzlebang_toc : public CreatureScript
m_uiUpdateTimer = 4000;
break;
case 1134:
- me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST_OMNI);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST_OMNI);
if (Creature* pPortal = me->SummonCreature(NPC_WILFRED_PORTAL, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 4.71239f, TEMPSUMMON_MANUAL_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 9866d2aace0..2acd014e063 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -883,7 +883,7 @@ class boss_the_lich_king : public CreatureScript
case EVENT_INTRO_TALK_1:
Talk(SAY_LK_INTRO_2);
// for some reason blizz sends 2 emotes in row here so (we handle one in Talk)
- me->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE);
events.ScheduleEvent(EVENT_EMOTE_CAST_SHOUT, 7000, 0, PHASE_INTRO);
events.ScheduleEvent(EVENT_INTRO_EMOTE_1, 13000, 0, PHASE_INTRO);
events.ScheduleEvent(EVENT_EMOTE_CAST_SHOUT, 18000, 0, PHASE_INTRO);
@@ -893,7 +893,7 @@ class boss_the_lich_king : public CreatureScript
DoCast(me, SPELL_EMOTE_SHOUT_NO_SHEATH, false);
break;
case EVENT_INTRO_EMOTE_1:
- me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE);
break;
case EVENT_INTRO_CAST_FREEZE:
Talk(SAY_LK_INTRO_3);
@@ -1043,7 +1043,7 @@ class boss_the_lich_king : public CreatureScript
DoCastAOE(SPELL_EMOTE_QUESTION_NO_SHEATH);
break;
case EVENT_OUTRO_EMOTE_TALK:
- me->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE);
break;
case EVENT_OUTRO_TALK_3:
if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING)))
@@ -1268,7 +1268,7 @@ class npc_tirion_fordring_tft : public CreatureScript
_events.ScheduleEvent(EVENT_INTRO_CHARGE, 5000, 0, PHASE_INTRO);
break;
case EVENT_INTRO_EMOTE_1:
- me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE);
break;
case EVENT_INTRO_CHARGE:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index d02d8f3f316..00a6a02f2da 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -477,7 +477,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
Talk(SAY_TIRION_INTRO_3);
break;
case EVENT_LK_INTRO_1:
- me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NOSHEATHE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE);
if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing))
theLichKing->AI()->Talk(SAY_LK_INTRO_1);
break;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 26e4b33ad8a..8c6afba18fd 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
@@ -354,7 +354,7 @@ class boss_gothik : public CreatureScript
}
if (spellId && me->isInCombat())
{
- me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST);
if (Creature* pRandomDeadTrigger = Unit::GetCreature(*me, DeadTriggerGUID[rand() % POS_DEAD]))
me->CastSpell(pRandomDeadTrigger, spellId, true);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index 6b170bab6d8..45f9a1fa012 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -668,7 +668,7 @@ class npc_expedition_commander : public CreatureScript
break;
case 4:
for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
- Engineer[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USESTANDING);
+ Engineer[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
for (uint8 n = 0; n < 4; ++n)
Defender[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H);
me->MonsterYell(SAY_AGGRO_2, LANG_UNIVERSAL, 0);
diff --git a/src/server/scripts/Northrend/grizzly_hills.cpp b/src/server/scripts/Northrend/grizzly_hills.cpp
index c0fad2374bc..ccb31c869a4 100644
--- a/src/server/scripts/Northrend/grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/grizzly_hills.cpp
@@ -415,7 +415,7 @@ public:
// call this each update tick?
if (me->FindNearestCreature(TALLHORN_STAG, 0.2f))
{
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USESTANDING);
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
}
else
if (m_uiPhase)
diff --git a/src/server/scripts/Northrend/icecrown.cpp b/src/server/scripts/Northrend/icecrown.cpp
index 91522503d65..8da992af8fb 100644
--- a/src/server/scripts/Northrend/icecrown.cpp
+++ b/src/server/scripts/Northrend/icecrown.cpp
@@ -335,6 +335,162 @@ public:
}
};
+/*######
+* npc_tournament_training_dummy
+######*/
+enum TournamentDummy
+{
+ NPC_CHARGE_TARGET = 33272,
+ NPC_MELEE_TARGET = 33229,
+ NPC_RANGED_TARGET = 33243,
+
+ SPELL_CHARGE_CREDIT = 62658,
+ SPELL_MELEE_CREDIT = 62672,
+ SPELL_RANGED_CREDIT = 62673,
+
+ SPELL_PLAYER_THRUST = 62544,
+ SPELL_PLAYER_BREAK_SHIELD = 62626,
+ SPELL_PLAYER_CHARGE = 62874,
+
+ SPELL_RANGED_DEFEND = 62719,
+ SPELL_CHARGE_DEFEND = 64100,
+ SPELL_VULNERABLE = 62665,
+
+ SPELL_COUNTERATTACK = 62709,
+
+ EVENT_DUMMY_RECAST_DEFEND = 1,
+ EVENT_DUMMY_RESET = 2,
+};
+
+class npc_tournament_training_dummy : public CreatureScript
+{
+ public:
+ npc_tournament_training_dummy(): CreatureScript("npc_tournament_training_dummy"){}
+
+ struct npc_tournament_training_dummyAI : Scripted_NoMovementAI
+ {
+ npc_tournament_training_dummyAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+
+ EventMap events;
+ bool isVulnerable;
+
+ void Reset()
+ {
+ me->SetControlled(true, UNIT_STATE_STUNNED);
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
+ isVulnerable = false;
+
+ // Cast Defend spells to max stack size
+ switch (me->GetEntry())
+ {
+ case NPC_CHARGE_TARGET:
+ DoCast(SPELL_CHARGE_DEFEND);
+ break;
+ case NPC_RANGED_TARGET:
+ me->CastCustomSpell(SPELL_RANGED_DEFEND, SPELLVALUE_AURA_STACK, 3, me);
+ break;
+ }
+
+ events.Reset();
+ events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000);
+ }
+
+ void EnterEvadeMode()
+ {
+ if (!_EnterEvadeMode())
+ return;
+
+ Reset();
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage)
+ {
+ damage = 0;
+ events.RescheduleEvent(EVENT_DUMMY_RESET, 10000);
+ }
+
+ void SpellHit(Unit* caster, SpellInfo const* spell)
+ {
+ switch (me->GetEntry())
+ {
+ case NPC_CHARGE_TARGET:
+ if (spell->Id == SPELL_PLAYER_CHARGE)
+ if (isVulnerable)
+ DoCast(caster, SPELL_CHARGE_CREDIT, true);
+ break;
+ case NPC_MELEE_TARGET:
+ if (spell->Id == SPELL_PLAYER_THRUST)
+ {
+ DoCast(caster, SPELL_MELEE_CREDIT, true);
+
+ if (Unit* target = caster->GetVehicleBase())
+ DoCast(target, SPELL_COUNTERATTACK, true);
+ }
+ break;
+ case NPC_RANGED_TARGET:
+ if (spell->Id == SPELL_PLAYER_BREAK_SHIELD)
+ if (isVulnerable)
+ DoCast(caster, SPELL_RANGED_CREDIT, true);
+ break;
+ }
+
+ if (spell->Id == SPELL_PLAYER_BREAK_SHIELD)
+ if (!me->HasAura(SPELL_CHARGE_DEFEND) && !me->HasAura(SPELL_RANGED_DEFEND))
+ isVulnerable = true;
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ events.Update(diff);
+
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_DUMMY_RECAST_DEFEND:
+ switch (me->GetEntry())
+ {
+ case NPC_CHARGE_TARGET:
+ {
+ if (!me->HasAura(SPELL_CHARGE_DEFEND))
+ DoCast(SPELL_CHARGE_DEFEND);
+ break;
+ }
+ case NPC_RANGED_TARGET:
+ {
+ Aura* defend = me->GetAura(SPELL_RANGED_DEFEND);
+ if (!defend || defend->GetStackAmount() < 3 || defend->GetDuration() <= 8000)
+ DoCast(SPELL_RANGED_DEFEND);
+ break;
+ }
+ }
+ isVulnerable = false;
+ events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000);
+ break;
+ case EVENT_DUMMY_RESET:
+ if (UpdateVictim())
+ {
+ EnterEvadeMode();
+ events.ScheduleEvent(EVENT_DUMMY_RESET, 10000);
+ }
+ break;
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ if (!me->HasUnitState(UNIT_STATE_STUNNED))
+ me->SetControlled(true, UNIT_STATE_STUNNED);
+ }
+
+ void MoveInLineOfSight(Unit* /*who*/){}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_tournament_training_dummyAI(creature);
+ }
+
+};
+
void AddSC_icecrown()
{
new npc_arete;
@@ -342,4 +498,5 @@ void AddSC_icecrown()
new npc_argent_valiant;
new npc_guardian_pavilion;
new npc_vereth_the_cunning;
+ new npc_tournament_training_dummy;
}
diff --git a/src/server/scripts/Northrend/sholazar_basin.cpp b/src/server/scripts/Northrend/sholazar_basin.cpp
index c7153eb4006..40e1051f218 100644
--- a/src/server/scripts/Northrend/sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/sholazar_basin.cpp
@@ -665,6 +665,86 @@ public:
}
};
+/*######
+## Quest The Lifewarden's Wrath
+######*/
+
+enum MiscLifewarden
+{
+ NPC_PRESENCE = 28563, // Freya's Presence
+ NPC_SABOTEUR = 28538, // Cultist Saboteur
+ NPC_SERVANT = 28320, // Servant of Freya
+
+ WHISPER_ACTIVATE = 0,
+
+ SPELL_FREYA_DUMMY = 51318,
+ SPELL_LIFEFORCE = 51395,
+ SPELL_FREYA_DUMMY_TRIGGER = 51335,
+ SPELL_LASHER_EMERGE = 48195,
+ SPELL_WILD_GROWTH = 52948,
+};
+
+class spell_q12620_the_lifewarden_wrath : public SpellScriptLoader
+{
+public:
+ spell_q12620_the_lifewarden_wrath() : SpellScriptLoader("spell_q12620_the_lifewarden_wrath") { }
+
+ class spell_q12620_the_lifewarden_wrath_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12620_the_lifewarden_wrath_SpellScript);
+
+ void HandleSendEvent(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* caster = GetCaster())
+ {
+ if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f))
+ {
+ presence->AI()->Talk(WHISPER_ACTIVATE, caster->GetGUID());
+ presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants
+ // Freya Dummy could be scripted with the following code
+
+ // Revive plants
+ std::list<Creature*> servants;
+ GetCaster()->GetCreatureListWithEntryInGrid(servants, NPC_SERVANT, 200.0f);
+ for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr)
+ {
+ // Couldn't find a spell that does this
+ if ((*itr)->isDead())
+ (*itr)->Respawn(true);
+
+ (*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true);
+ (*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false);
+ (*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false);
+
+ if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
+ (*itr)->AI()->AttackStart(target);
+ }
+
+ // Kill nearby enemies
+ std::list<Creature*> saboteurs;
+ caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f);
+ for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr)
+ if ((*itr)->isAlive())
+ // Lifeforce has a cast duration, it should be cast at all saboteurs one by one
+ presence->CastSpell((*itr), SPELL_LIFEFORCE, false);
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_q12620_the_lifewarden_wrath_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q12620_the_lifewarden_wrath_SpellScript();
+ }
+};
+
void AddSC_sholazar_basin()
{
new npc_injured_rainspeaker_oracle();
@@ -674,4 +754,5 @@ void AddSC_sholazar_basin()
new npc_engineer_helice();
new npc_adventurous_dwarf();
new npc_jungle_punch_target();
+ new spell_q12620_the_lifewarden_wrath();
}
diff --git a/src/server/scripts/Outland/shadowmoon_valley.cpp b/src/server/scripts/Outland/shadowmoon_valley.cpp
index 07de7fe4786..19c4754c4fd 100644
--- a/src/server/scripts/Outland/shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/shadowmoon_valley.cpp
@@ -117,7 +117,7 @@ public:
{
bIsEating = true;
EatTimer = 7000;
- me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACKUNARMED);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED);
}
}
diff --git a/src/server/scripts/Spells/CMakeLists.txt b/src/server/scripts/Spells/CMakeLists.txt
index 0df7cf907b6..496324e4de9 100644
--- a/src/server/scripts/Spells/CMakeLists.txt
+++ b/src/server/scripts/Spells/CMakeLists.txt
@@ -23,6 +23,7 @@ set(scripts_STAT_SRCS
Spells/spell_mage.cpp
Spells/spell_paladin.cpp
Spells/spell_item.cpp
+ Spells/spell_holiday.cpp
)
message(" -> Prepared: Spells")
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 6fc93733a85..9899e50cd28 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -1652,7 +1652,7 @@ enum BreakShieldSpells
class spell_gen_break_shield: public SpellScriptLoader
{
public:
- spell_gen_break_shield() : SpellScriptLoader("spell_gen_break_shield") { }
+ spell_gen_break_shield(const char* name) : SpellScriptLoader(name) {}
class spell_gen_break_shield_SpellScript : public SpellScript
{
@@ -2387,7 +2387,8 @@ void AddSC_generic_spell_scripts()
new spell_gen_dalaran_disguise("spell_gen_sunreaver_disguise");
new spell_gen_dalaran_disguise("spell_gen_silver_covenant_disguise");
new spell_gen_elune_candle();
- new spell_gen_break_shield();
+ new spell_gen_break_shield("spell_gen_break_shield");
+ new spell_gen_break_shield("spell_gen_tournament_counterattack");
new spell_gen_mounted_charge();
new spell_gen_defend();
new spell_gen_tournament_duel();
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
new file mode 100644
index 00000000000..19b6a29e24b
--- /dev/null
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Spells used in holidays/game events that do not fit any other category.
+ * Scriptnames in this file should be prefixed with "spell_#holidayname_".
+ */
+
+#include "ScriptPCH.h"
+
+// 45102 Romantic Picnic
+
+enum SpellsPicnic
+{
+ SPELL_BASKET_CHECK = 45119, // Holiday - Valentine - Romantic Picnic Near Basket Check
+ SPELL_MEAL_PERIODIC = 45103, // Holiday - Valentine - Romantic Picnic Meal Periodic - effect dummy
+ SPELL_MEAL_EAT_VISUAL = 45120, // Holiday - Valentine - Romantic Picnic Meal Eat Visual
+ // SPELL_MEAL_PARTICLE = 45114, // Holiday - Valentine - Romantic Picnic Meal Particle - unused
+ SPELL_DRINK_VISUAL = 45121, // Holiday - Valentine - Romantic Picnic Drink Visual
+ SPELL_ROMANTIC_PICNIC_ACHIEV = 45123, // Romantic Picnic periodic = 5000
+};
+
+class spell_love_is_in_the_air_romantic_picnic : public SpellScriptLoader
+{
+public:
+ spell_love_is_in_the_air_romantic_picnic() : SpellScriptLoader("spell_love_is_in_the_air_romantic_picnic") { }
+
+ class spell_love_is_in_the_air_romantic_picnic_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_love_is_in_the_air_romantic_picnic_AuraScript);
+
+ void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* target = GetTarget())
+ {
+ target->SetStandState(UNIT_STAND_STATE_SIT);
+ target->CastSpell(target, SPELL_MEAL_PERIODIC, false);
+ }
+ }
+
+ void OnPeriodic(AuraEffect const* /*aurEff*/)
+ {
+ // Every 5 seconds
+ if (Unit* target = GetTarget())
+ {
+ // If our player is no longer sit, remove all auras
+ if (target->getStandState() != UNIT_STAND_STATE_SIT)
+ {
+ target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV);
+ target->RemoveAura(GetAura());
+ return;
+ }
+
+ target->CastSpell(target, SPELL_BASKET_CHECK, false); // unknown use, it targets Romantic Basket
+ target->CastSpell(target, RAND(SPELL_MEAL_EAT_VISUAL, SPELL_DRINK_VISUAL), false);
+
+ bool foundSomeone = false;
+ // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123)
+ // required by achievement and "hearts" visual
+ std::list<Player*> playerList;
+ Trinity::AnyPlayerInObjectRangeCheck checker(target, INTERACTION_DISTANCE*2);
+ Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(target, playerList, checker);
+ target->VisitNearbyWorldObject(INTERACTION_DISTANCE*2, searcher);
+ for (std::list<Player*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
+ {
+ if ((*itr) != target && (*itr)->HasAura(GetId())) // && (*itr)->getStandState() == UNIT_STAND_STATE_SIT)
+ {
+ GetCaster()->CastSpell(*itr, SPELL_ROMANTIC_PICNIC_ACHIEV, true);
+ GetCaster()->CastSpell(target, SPELL_ROMANTIC_PICNIC_ACHIEV, true);
+ foundSomeone = true;
+ // break;
+ }
+ }
+
+ if (!foundSomeone && target->HasAura(SPELL_ROMANTIC_PICNIC_ACHIEV))
+ target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV);
+ }
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_love_is_in_the_air_romantic_picnic_AuraScript();
+ }
+};
+
+void AddSC_holiday_spell_scripts()
+{
+ new spell_love_is_in_the_air_romantic_picnic();
+}