aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2014-09-13 22:38:25 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2014-09-13 22:38:25 +0200
commitca3961f9875608bd02ba42445f165a02002444f8 (patch)
tree419c54ec37303a5639f33180e507230d8cb50f1b /src/server/scripts
parent524788712a879d26428b3c7f2b56765e4099f5ff (diff)
parentd9fdbb06e48dd5b384cf9a8b58289c3ccf7b8731 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Achievements/AchievementMgr.cpp src/server/game/Entities/Object/Object.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Player/Player.h src/server/game/Entities/Unit/Unit.h src/server/game/Handlers/ChatHandler.cpp src/server/game/Spells/SpellEffects.cpp src/server/scripts/Commands/cs_wp.cpp src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp4
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp8
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp23
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp18
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp12
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp173
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp374
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h14
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp5
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp2
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp2
21 files changed, 278 insertions, 391 deletions
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 54925a4546b..f2ee9a8c971 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -2261,7 +2261,7 @@ public:
// Get the args that we might have (up to 2)
char const* arg1 = strtok((char*)args, " ");
char const* arg2 = strtok(NULL, " ");
-
+
// Analyze them to see if we got either a playerName or duration or both
if (arg1)
{
@@ -2447,7 +2447,7 @@ public:
}
WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(soundId) << handler->GetSession()->GetPlayer()->GetGUID();
+ data << uint32(soundId);
sWorld->SendGlobalMessage(&data);
handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId);
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 6928492aa42..c82ab30eaae 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -1224,7 +1224,7 @@ public:
return false;
}
- creature->MonsterSay(args, LANG_UNIVERSAL, NULL);
+ creature->Say(args, LANG_UNIVERSAL);
// make some emotes
char lastchar = args[strlen(args) - 1];
@@ -1253,7 +1253,7 @@ public:
return false;
}
- creature->MonsterTextEmote(args, 0);
+ creature->TextEmote(args);
return true;
}
@@ -1330,7 +1330,7 @@ public:
if (handler->HasLowerSecurity(receiver, 0))
return false;
- creature->MonsterWhisper(text, receiver);
+ creature->Whisper(text, LANG_UNIVERSAL, receiver);
return true;
}
@@ -1351,7 +1351,7 @@ public:
return false;
}
- creature->MonsterYell(args, LANG_UNIVERSAL, NULL);
+ creature->Yell(args, LANG_UNIVERSAL);
// make an emote
creature->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT);
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index 9b8f6aff992..5698366acc9 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -214,7 +214,7 @@ public:
target->LoadPath(pathid);
target->SetDefaultMovementType(WAYPOINT_MOTION_TYPE);
target->GetMotionMaster()->Initialize();
- target->MonsterSay("Path loaded.", LANG_UNIVERSAL, NULL);
+ target->Say("Path loaded.", LANG_UNIVERSAL);
return true;
}
@@ -275,7 +275,7 @@ public:
target->SetDefaultMovementType(IDLE_MOTION_TYPE);
target->GetMotionMaster()->MoveTargetedHome();
target->GetMotionMaster()->Initialize();
- target->MonsterSay("Path unloaded.", LANG_UNIVERSAL, NULL);
+ target->Say("Path unloaded.", LANG_UNIVERSAL);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index 53e14b88050..4869ffc4756 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
@@ -28,7 +28,6 @@ EndScriptData */
#include "deadmines.h"
#include "TemporarySummon.h"
#include "WorldPacket.h"
-#include "Opcodes.h"
enum Sounds
{
@@ -101,9 +100,9 @@ class instance_deadmines : public InstanceMapScript
case CANNON_GUNPOWDER_USED:
CannonBlast_Timer = DATA_CANNON_BLAST_TIMER;
// it's a hack - Mr. Smite should do that but his too far away
- pIronCladDoor->SetName("Mr. Smite");
- pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL);
- DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM1);
+ //pIronCladDoor->SetName("Mr. Smite");
+ //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL);
+ pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM1);
State = CANNON_BLAST_INITIATED;
break;
case CANNON_BLAST_INITIATED:
@@ -114,8 +113,8 @@ class instance_deadmines : public InstanceMapScript
ShootCannon();
BlastOutDoor();
LeverStucked();
- pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL);
- DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM2);
+ //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL);
+ pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM2);
State = PIRATES_ATTACK;
} else CannonBlast_Timer -= diff;
break;
@@ -170,7 +169,7 @@ class instance_deadmines : public InstanceMapScript
if (GameObject* pDefiasCannon = instance->GetGameObject(DefiasCannonGUID))
{
pDefiasCannon->SetGoState(GO_STATE_ACTIVE);
- DoPlaySound(pDefiasCannon, SOUND_CANNONFIRE);
+ pDefiasCannon->PlayDirectSound(SOUND_CANNONFIRE);
}
}
@@ -179,7 +178,7 @@ class instance_deadmines : public InstanceMapScript
if (GameObject* pIronCladDoor = instance->GetGameObject(IronCladDoorGUID))
{
pIronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- DoPlaySound(pIronCladDoor, SOUND_DESTROYDOOR);
+ pIronCladDoor->PlayDirectSound(SOUND_DESTROYDOOR);
}
}
@@ -238,14 +237,6 @@ class instance_deadmines : public InstanceMapScript
return 0;
}
-
- void DoPlaySound(GameObject* unit, uint32 sound)
- {
- WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(sound);
- data << uint64(unit->GetGUID());
- unit->SendMessageToSet(&data, false);
- }
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index c37829e26d5..716b32601be 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -560,25 +560,25 @@ public:
{
case 0: return 9999999;
case 1:
- me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL);
return 10000;
case 2:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL);
return 20000;
case 3:
- me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL);
return 10000;
case 4:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL);
return 20000;
case 5:
- me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL);
return 20000;
case 6:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL);
return 10000;
case 7:
FireArcanagosTimer = 500;
@@ -588,7 +588,7 @@ public:
DoCast(me, SPELL_MANA_SHIELD);
return 10000;
case 9:
- me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, NULL, false);
+ me->TextEmote(EMOTE_DIALOG_MEDIVH_7);
return 10000;
case 10:
if (arca)
@@ -596,7 +596,7 @@ public:
return 1000;
case 11:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL);
return 5000;
case 12:
if (arca)
@@ -608,7 +608,7 @@ public:
}
return 10000;
case 13:
- me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL);
return 10000;
case 14:
me->SetVisible(false);
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 0733640f4c3..b9429954dea 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -352,7 +352,7 @@ public:
Creature* speaker = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 1000);
if (speaker)
speaker->CastSpell(speaker, SPELL_HEAD_SPEAKS, false);
- me->MonsterTextEmote(EMOTE_LAUGHS, NULL);
+ me->TextEmote(EMOTE_LAUGHS);
}
else laugh -= diff;
}
@@ -670,14 +670,14 @@ public:
if (count < 3)
{
if (player)
- player->Say(Text[count], 0);
+ player->Say(Text[count], LANG_UNIVERSAL);
}
else
{
DoCast(me, SPELL_RHYME_BIG);
if (player)
{
- player->Say(Text[count], 0);
+ player->Say(Text[count], LANG_UNIVERSAL);
player->HandleEmoteCommand(ANIM_EMOTE_SHOUT);
}
wp_reached = true;
@@ -735,7 +735,7 @@ public:
if (laugh <= diff)
{
laugh = urand(11000, 22000);
- me->MonsterTextEmote(EMOTE_LAUGHS, NULL);
+ me->TextEmote(EMOTE_LAUGHS);
DoPlaySoundToSet(me, RandomLaugh[rand32() % 3]);
}
else laugh -= diff;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 3284febb9f3..60bfae36f47 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -769,7 +769,7 @@ public:
}
else
{
- me->MonsterTextEmote(EMOTE_UNABLE_TO_FIND, NULL);
+ me->TextEmote(EMOTE_UNABLE_TO_FIND);
EnterEvadeMode();
return;
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
index a7fa54b12e1..b5c226b15cb 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
@@ -940,7 +940,7 @@ void hyjalAI::WaypointReached(uint32 waypointId)
{
if (waypointId == 1 || (waypointId == 0 && me->GetEntry() == THRALL))
{
- me->MonsterYell(YELL_HURRY, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_HURRY, LANG_UNIVERSAL);
WaitForTeleport = true;
TeleportTimer = 20000;
if (me->GetEntry() == JAINA)
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
index 93252802522..9bcc7c933fb 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
@@ -29,7 +29,6 @@ EndScriptData */
#include "hyjal_trash.h"
#include "Player.h"
#include "WorldPacket.h"
-#include "Opcodes.h"
#include "Chat.h"
#include "WorldSession.h"
@@ -186,16 +185,13 @@ public:
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
- if (i->GetSource())
+ if (Player* player = i->GetSource())
{
WorldPacket packet;
- ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, i->GetSource(), YELL_EFFORTS);
- i->GetSource()->GetSession()->SendPacket(&packet);
- WorldPacket data2(SMSG_PLAY_SOUND, 4);
- data2 << uint32(10986);
- data2 << uint64(unit->GetGUID());
- i->GetSource()->GetSession()->SendPacket(&data2);
+ ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS);
+ player->SendDirectMessage(&packet);
+ player->PlayDirectSound(10986, player);
}
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
index 3d1e9363cd8..7b3314ef4e9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -229,7 +229,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
instance->SetBossState(DATA_MAL_GANIS, DONE);
- DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT);
+ DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT, true);
// give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc
DoCastAOE(SPELL_KILL_CREDIT);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
index 6925badf272..ec7aa742975 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
@@ -15,14 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss salramm
-SDAuthor: Tartalo
-SD%Complete: 80
-SDComment: @todo Intro
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "culling_of_stratholme.h"
@@ -31,9 +23,7 @@ enum Spells
{
SPELL_CURSE_OF_TWISTED_FLESH = 58845,
SPELL_EXPLODE_GHOUL = 52480,
- H_SPELL_EXPLODE_GHOUL = 58825,
SPELL_SHADOW_BOLT = 57725,
- H_SPELL_SHADOW_BOLT = 58828,
SPELL_STEAL_FLESH = 52708,
SPELL_SUMMON_GHOULS = 52451
};
@@ -49,114 +39,89 @@ enum Yells
SAY_SUMMON_GHOULS = 6
};
-class boss_salramm : public CreatureScript
+enum Events
{
-public:
- boss_salramm() : CreatureScript("boss_salramm") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_salrammAI>(creature);
- }
-
- struct boss_salrammAI : public ScriptedAI
- {
- boss_salrammAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- Talk(SAY_SPAWN);
- }
-
- void Initialize()
- {
- uiCurseFleshTimer = 30000; //30s DBM
- uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls
- uiShadowBoltTimer = urand(8000, 12000); // approx 10s
- uiStealFleshTimer = 12345;
- uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro
- }
-
- uint32 uiCurseFleshTimer;
- uint32 uiExplodeGhoulTimer;
- uint32 uiShadowBoltTimer;
- uint32 uiStealFleshTimer;
- uint32 uiSummonGhoulsTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
-
- instance->SetBossState(DATA_SALRAMM, NOT_STARTED);
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ EVENT_CURSE_FLESH = 1,
+ EVENT_EXPLODE_GHOUL,
+ EVENT_SHADOW_BOLT,
+ EVENT_STEAL_FLESH,
+ EVENT_SUMMON_GHOULS
+};
- instance->SetBossState(DATA_SALRAMM, IN_PROGRESS);
- }
+class boss_salramm : public CreatureScript
+{
+ public:
+ boss_salramm() : CreatureScript("boss_salramm") { }
- void UpdateAI(uint32 diff) override
+ struct boss_salrammAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- //Curse of twisted flesh timer
- if (uiCurseFleshTimer <= diff)
+ boss_salrammAI(Creature* creature) : BossAI(creature, DATA_SALRAMM)
{
- DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH);
- uiCurseFleshTimer = 37000;
- } else uiCurseFleshTimer -= diff;
+ Talk(SAY_SPAWN);
+ }
- //Shadow bolt timer
- if (uiShadowBoltTimer <= diff)
+ void EnterCombat(Unit* /*who*/) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SHADOW_BOLT);
- uiShadowBoltTimer = urand(8000, 12000);
- } else uiShadowBoltTimer -= diff;
+ Talk(SAY_AGGRO);
+ _EnterCombat();
- //Steal Flesh timer
- if (uiStealFleshTimer <= diff)
- {
- Talk(SAY_STEAL_FLESH);
- if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(random_pTarget, SPELL_STEAL_FLESH);
- uiStealFleshTimer = 10000;
- } else uiStealFleshTimer -= diff;
+ events.ScheduleEvent(EVENT_CURSE_FLESH, 30000);
+ events.ScheduleEvent(EVENT_SUMMON_GHOULS, urand(19000, 24000));
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000));
+ events.ScheduleEvent(EVENT_STEAL_FLESH, 12345); /// @todo: adjust timer
+ }
- //Summon ghouls timer
- if (uiSummonGhoulsTimer <= diff)
+ void ExecuteEvent(uint32 eventId) override
{
- Talk(SAY_SUMMON_GHOULS);
- if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(random_pTarget, SPELL_SUMMON_GHOULS);
- uiSummonGhoulsTimer = 10000;
- } else uiSummonGhoulsTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ switch (eventId)
+ {
+ case EVENT_CURSE_FLESH:
+ DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH);
+ events.ScheduleEvent(EVENT_CURSE_FLESH, 37000);
+ break;
+ case EVENT_SUMMON_GHOULS:
+ Talk(SAY_SUMMON_GHOULS);
+ DoCast(me, SPELL_SUMMON_GHOULS);
+ events.ScheduleEvent(EVENT_SUMMON_GHOULS, 10000);
+ events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 6000);
+ break;
+ case EVENT_SHADOW_BOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000));
+ break;
+ case EVENT_STEAL_FLESH:
+ Talk(SAY_STEAL_FLESH);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
+ DoCast(target, SPELL_STEAL_FLESH);
+ events.ScheduleEvent(EVENT_STEAL_FLESH, 12345);
+ break;
+ case EVENT_EXPLODE_GHOUL:
+ Talk(SAY_EXPLODE_GHOUL);
+ DoCast(me, SPELL_EXPLODE_GHOUL, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- instance->SetBossState(DATA_SALRAMM, DONE);
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+ };
- void KilledUnit(Unit* victim) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Talk(SAY_SLAY);
+ return GetInstanceAI<boss_salrammAI>(creature);
}
- };
-
};
void AddSC_boss_salramm()
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
index cea4b540f7b..e98e74634e2 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
@@ -75,7 +75,7 @@ public:
{
SetGazeOn(who);
/// @todo use a script text
- me->MonsterTextEmote(EMOTE_NEARBY, NULL, true);
+ me->TextEmote(EMOTE_NEARBY, nullptr, true);
}
else
BossAI::MoveInLineOfSight(who);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 091fe1d33fe..5f65d0ea89e 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -1564,11 +1564,11 @@ class spell_auto_repair : public SpellScriptLoader
if (!vehicle)
return;
- Player* driver = vehicle->GetPassenger(0) ? vehicle->GetPassenger(0)->ToPlayer() : NULL;
+ Unit* driver = vehicle->GetPassenger(0);
if (!driver)
return;
- driver->MonsterTextEmote(EMOTE_REPAIR, driver, true);
+ driver->TextEmote(EMOTE_REPAIR, driver, true);
InstanceScript* instance = driver->GetInstanceScript();
if (!instance)
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 60b898e1786..1d3fcba09de 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
@@ -15,22 +15,16 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss ymiron
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment:
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "utgarde_pinnacle.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
enum Spells
{
SPELL_BANE = 48294,
+ SPELL_BANE_HIT = 59203, // Checked for King's Bane achievement.
SPELL_DARK_SLASH = 48292,
SPELL_FETID_ROT = 48291,
SPELL_SCREAMS_OF_THE_DEAD = 51750,
@@ -47,8 +41,7 @@ enum Spells
SPELL_SPIRIT_FOUNT = 48380
};
-//not in db
-enum Yells
+enum Texts
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
@@ -59,18 +52,27 @@ enum Yells
SAY_SUMMON_TORGYN = 6
};
-enum Creatures
+enum Events
+{
+ EVENT_BANE = 1,
+ EVENT_FETID_ROT,
+ EVENT_DARK_SLASH,
+ EVENT_ANCESTORS_VENGEANCE,
+ EVENT_RESUME_COMBAT, // Handles react state and schedules the next event after roleplay ends.
+ EVENT_BJORN_SPIRIT_FOUNT,
+ EVENT_HALDOR_SPIRIT_STRIKE,
+ EVENT_RANULF_SPIRIT_BURST,
+ EVENT_TORGYN_SUMMON_AVENGING_SPIRITS
+};
+
+enum EventGroups
{
- NPC_BJORN = 27303,
- NPC_BJORN_VISUAL = 27304,
- NPC_HALDOR = 27307,
- NPC_HALDOR_VISUAL = 27310,
- NPC_RANULF = 27308,
- NPC_RANULF_VISUAL = 27311,
- NPC_TORGYN = 27309,
- NPC_TORGYN_VISUAL = 27312,
- NPC_SPIRIT_FOUNT = 27339,
- NPC_AVENGING_SPIRIT = 27386
+ EVENT_GROUP_BASE_SPELLS = 1
+};
+
+enum MovePoints
+{
+ POINT_BOAT
};
struct ActiveBoatStruct
@@ -78,14 +80,15 @@ struct ActiveBoatStruct
uint32 npc;
int32 say;
float MoveX, MoveY, MoveZ, SpawnX, SpawnY, SpawnZ, SpawnO;
+ uint32 event;
};
static ActiveBoatStruct ActiveBoat[4] =
{
- {NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f},
- {NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f},
- {NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f},
- {NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f}
+ {NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f, EVENT_BJORN_SPIRIT_FOUNT},
+ {NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f, EVENT_HALDOR_SPIRIT_STRIKE},
+ {NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f, EVENT_RANULF_SPIRIT_BURST},
+ {NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f, EVENT_TORGYN_SUMMON_AVENGING_SPIRITS}
};
enum Misc
@@ -103,89 +106,48 @@ public:
boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON)
{
Initialize();
+ // This ensures a random sequence of ancestors. Not sure if the order should change on reset or not, reason why this is left out of Initialize().
for (int i = 0; i < 4; ++i)
- m_uiActiveOrder[i] = i;
+ ActiveOrder[i] = i;
for (int i = 0; i < 3; ++i)
{
int r = i + (rand32() % (4 - i));
- int temp = m_uiActiveOrder[i];
- m_uiActiveOrder[i] = m_uiActiveOrder[r];
- m_uiActiveOrder[r] = temp;
+ int temp = ActiveOrder[i];
+ ActiveOrder[i] = ActiveOrder[r];
+ ActiveOrder[r] = temp;
}
}
void Initialize()
{
- m_bIsWalking = false;
- m_bIsPause = false;
- m_bIsActiveWithBJORN = false;
- m_bIsActiveWithHALDOR = false;
- m_bIsActiveWithRANULF = false;
- m_bIsActiveWithTORGYN = false;
kingsBane = true;
-
- m_uiFetidRot_Timer = urand(8000, 13000);
- m_uiBane_Timer = urand(18000, 23000);
- m_uiDarkSlash_Timer = urand(28000, 33000);
- m_uiAncestors_Vengeance_Timer = DUNGEON_MODE(60000, 45000);
- m_uiPause_Timer = 0;
-
- m_uiAbility_BJORN_Timer = 0;
- m_uiAbility_HALDOR_Timer = 0;
- m_uiAbility_RANULF_Timer = 0;
- m_uiAbility_TORGYN_Timer = 0;
-
- m_uiActivedNumber = 0;
- m_uiHealthAmountModifier = 1;
- m_uiHealthAmountMultipler = DUNGEON_MODE(20, 25);
-
- m_uiActivedCreatureGUID = 0;
- m_uiOrbGUID = 0;
+ ActivedNumber = 0;
+ HealthAmountModifier = 1;
+ HealthAmountMultipler = DUNGEON_MODE(20, 25);
+ ActiveAncestorGUID = 0;
+ SpiritFountGUID = 0;
}
- bool m_bIsWalking;
- bool m_bIsPause;
- bool m_bIsActiveWithBJORN;
- bool m_bIsActiveWithHALDOR;
- bool m_bIsActiveWithRANULF;
- bool m_bIsActiveWithTORGYN;
- bool kingsBane; // Achievement King's Bane
-
- uint8 m_uiActiveOrder[4];
- uint8 m_uiActivedNumber;
-
- uint32 m_uiFetidRot_Timer;
- uint32 m_uiBane_Timer;
- uint32 m_uiDarkSlash_Timer;
- uint32 m_uiAncestors_Vengeance_Timer;
-
- uint32 m_uiAbility_BJORN_Timer;
- uint32 m_uiAbility_HALDOR_Timer;
- uint32 m_uiAbility_RANULF_Timer;
- uint32 m_uiAbility_TORGYN_Timer;
-
- uint32 m_uiPause_Timer;
- uint32 m_uiHealthAmountModifier;
- uint32 m_uiHealthAmountMultipler;
-
- uint64 m_uiActivedCreatureGUID;
- uint64 m_uiOrbGUID;
-
void Reset() override
{
_Reset();
Initialize();
+ me->SetReactState(REACT_AGGRESSIVE);
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_BANE, urand(18000, 23000), EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_FETID_ROT, urand(8000, 13000), EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_DARK_SLASH, urand(28000, 33000), EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(60000, 45000), EVENT_GROUP_BASE_SPELLS);
}
void SpellHitTarget(Unit* who, SpellInfo const* spell) override
{
- if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == 59302)
+ if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_BANE_HIT)
kingsBane = false;
}
@@ -197,161 +159,115 @@ public:
return 0;
}
- void UpdateAI(uint32 diff) override
+ void MovementInform(uint32 type, uint32 pointId) override
{
- if (m_bIsWalking)
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (pointId == POINT_BOAT) // Check might not be needed.
{
- if (m_uiPause_Timer <= diff)
+ Talk(ActiveBoat[ActiveOrder[ActivedNumber]].say);
+ if (Creature* ancestor = me->SummonCreature(ActiveBoat[ActiveOrder[ActivedNumber]].npc, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnX, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnY, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnZ, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0))
{
- Talk(ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].say);
- DoCast(me, SPELL_CHANNEL_YMIRON_TO_SPIRIT); // should be on spirit
- if (Creature* temp = me->SummonCreature(ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].npc, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnX, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnY, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnZ, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0))
- {
- m_uiActivedCreatureGUID = temp->GetGUID();
- temp->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- temp->SetDisableGravity(true);
- switch (m_uiActiveOrder[m_uiActivedNumber])
- {
- case 0: m_bIsActiveWithBJORN = true; break;
- case 1: m_bIsActiveWithHALDOR = true; break;
- case 2: m_bIsActiveWithRANULF = true; break;
- case 3: m_bIsActiveWithTORGYN = true; break;
- }
- }
-
- m_bIsPause = true;
- m_bIsWalking = false;
- m_uiPause_Timer = 3000;
- } else m_uiPause_Timer -= diff;
- return;
+ DoCast(ancestor, SPELL_CHANNEL_YMIRON_TO_SPIRIT);
+ ancestor->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
+ ancestor->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ ancestor->SetDisableGravity(true);
+ ActiveAncestorGUID = ancestor->GetGUID();
+ }
+ events.ScheduleEvent(EVENT_RESUME_COMBAT, 5000);
}
- else if (m_bIsPause)
+ }
+
+ void JustSummoned(Creature* summon) override
+ {
+ switch (summon->GetEntry())
{
- if (m_uiPause_Timer <= diff)
- {
- m_uiAbility_BJORN_Timer = 5000;
- m_uiAbility_HALDOR_Timer = 5000;
- m_uiAbility_RANULF_Timer = 5000;
- m_uiAbility_TORGYN_Timer = 5000;
-
- m_bIsPause = false;
- m_uiPause_Timer = 0;
- } else m_uiPause_Timer -= diff;
- return;
+ case NPC_SPIRIT_FOUNT:
+ summon->CastSpell(summon, SPELL_SPIRIT_FOUNT, true);
+ summon->SetDisplayId(11686);
+ SpiritFountGUID = summon->GetGUID();
+ break;
+ case NPC_AVENGING_SPIRIT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ summon->AddThreat(target, 0.0f);
+ summon->AI()->AttackStart(target);
+ }
+ break;
+ default:
+ break;
}
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ summons.Summon(summon);
+ }
- if (!m_bIsPause)
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (me->HealthBelowPctDamaged(100 - HealthAmountMultipler * HealthAmountModifier, damage))
{
- // Normal spells ------------------------------------------------------------------------
- if (m_uiBane_Timer <= diff)
- {
- DoCast(me, SPELL_BANE);
- m_uiBane_Timer = urand(20000, 25000);
- } else m_uiBane_Timer -= diff;
+ uint8 Order = HealthAmountModifier - 1;
+ ++HealthAmountModifier;
- if (m_uiFetidRot_Timer <= diff)
- {
- DoCastVictim(SPELL_FETID_ROT);
- m_uiFetidRot_Timer = urand(10000, 15000);
- } else m_uiFetidRot_Timer -= diff;
+ me->InterruptNonMeleeSpells(true);
+ DoCast(me, SPELL_SCREAMS_OF_THE_DEAD);
- if (m_uiDarkSlash_Timer <= diff)
- {
- DoCastVictim(SPELL_DARK_SLASH);
- m_uiDarkSlash_Timer = urand(30000, 35000);
- } else m_uiDarkSlash_Timer -= diff;
+ me->AttackStop();
+ me->SetReactState(REACT_PASSIVE);
+ me->GetMotionMaster()->MovePoint(POINT_BOAT, ActiveBoat[ActiveOrder[Order]].MoveX, ActiveBoat[ActiveOrder[Order]].MoveY, ActiveBoat[ActiveOrder[Order]].MoveZ);
- if (m_uiAncestors_Vengeance_Timer <= diff)
- {
- DoCast(me, SPELL_ANCESTORS_VENGEANCE);
- m_uiAncestors_Vengeance_Timer = DUNGEON_MODE(urand(60000, 65000), urand(45000, 50000));
- } else m_uiAncestors_Vengeance_Timer -= diff;
+ DespawnBoatGhosts(ActiveAncestorGUID);
+ DespawnBoatGhosts(SpiritFountGUID);
- // Abilities ------------------------------------------------------------------------------
- if (m_bIsActiveWithBJORN && m_uiAbility_BJORN_Timer <= diff)
- {
- //DoCast(me, SPELL_SUMMON_SPIRIT_FOUNT); // works fine, but using summon has better control
- if (Creature* temp = me->SummonCreature(NPC_SPIRIT_FOUNT, 385.0f + rand32() % 10, -330.0f + rand32() % 10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000))
- {
- temp->SetSpeed(MOVE_RUN, 0.4f);
- temp->CastSpell(temp, SPELL_SPIRIT_FOUNT, true);
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- temp->SetDisplayId(11686);
- m_uiOrbGUID = temp->GetGUID();
- }
- m_bIsActiveWithBJORN = false; // only one orb
- } else m_uiAbility_BJORN_Timer -= diff;
+ events.CancelEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event); // Cancels the event started on the previous transition.
+ events.DelayEvents(10000, EVENT_GROUP_BASE_SPELLS);
- if (m_bIsActiveWithHALDOR && m_uiAbility_HALDOR_Timer <= diff)
- {
- DoCastVictim(SPELL_SPIRIT_STRIKE);
- m_uiAbility_HALDOR_Timer = 5000; // overtime
- } else m_uiAbility_HALDOR_Timer -= diff;
+ ActivedNumber = Order;
+ }
+ }
- if (m_bIsActiveWithRANULF && m_uiAbility_RANULF_Timer <= diff)
- {
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_BANE:
+ DoCast(SPELL_BANE);
+ events.ScheduleEvent(EVENT_BANE, urand(20000, 25000));
+ break;
+ case EVENT_FETID_ROT:
+ DoCastVictim(SPELL_FETID_ROT);
+ events.ScheduleEvent(EVENT_FETID_ROT, urand(10000, 15000));
+ break;
+ case EVENT_DARK_SLASH:
+ DoCastVictim(SPELL_DARK_SLASH);
+ events.ScheduleEvent(EVENT_DARK_SLASH, urand(30000, 35000));
+ break;
+ case EVENT_ANCESTORS_VENGEANCE:
+ DoCast(me, SPELL_ANCESTORS_VENGEANCE);
+ events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(urand(60000, 65000), urand(45000, 50000)));
+ break;
+ case EVENT_RESUME_COMBAT:
+ me->SetReactState(REACT_AGGRESSIVE);
+ events.ScheduleEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event, 5000);
+ break;
+ case EVENT_BJORN_SPIRIT_FOUNT:
+ DoCast(SPELL_SUMMON_SPIRIT_FOUNT);
+ break;
+ case EVENT_HALDOR_SPIRIT_STRIKE:
+ DoCastVictim(SPELL_SPIRIT_STRIKE);
+ events.ScheduleEvent(EVENT_HALDOR_SPIRIT_STRIKE, 5000);
+ break;
+ case EVENT_RANULF_SPIRIT_BURST:
DoCast(me, SPELL_SPIRIT_BURST);
- m_uiAbility_RANULF_Timer = 10000; // overtime
- } else m_uiAbility_RANULF_Timer -= diff;
-
- if (m_bIsActiveWithTORGYN && m_uiAbility_TORGYN_Timer <= diff)
- {
- float x, y, z;
- x = me->GetPositionX()-5;
- y = me->GetPositionY()-5;
- z = me->GetPositionZ();
+ events.ScheduleEvent(EVENT_RANULF_SPIRIT_BURST, 10000);
+ break;
+ case EVENT_TORGYN_SUMMON_AVENGING_SPIRITS:
for (uint8 i = 0; i < 4; ++i)
- {
- //DoCast(me, SPELL_SUMMON_AVENGING_SPIRIT); // works fine, but using summon has better control
- if (Creature* temp = me->SummonCreature(NPC_AVENGING_SPIRIT, x + rand32() % 10, y + rand32() % 10, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- temp->AddThreat(target, 0.0f);
- temp->AI()->AttackStart(target);
- }
- }
- }
- m_uiAbility_TORGYN_Timer = 15000; // overtime
- } else m_uiAbility_TORGYN_Timer -= diff;
-
- // Health check -----------------------------------------------------------------------------
- if (me->HealthBelowPct(100 - m_uiHealthAmountMultipler * m_uiHealthAmountModifier))
- {
- uint8 m_uiOrder = m_uiHealthAmountModifier - 1;
- ++m_uiHealthAmountModifier;
-
- me->InterruptNonMeleeSpells(true);
- DoCast(me, SPELL_SCREAMS_OF_THE_DEAD);
- me->GetMotionMaster()->Clear();
- me->StopMoving();
- me->AttackStop();
- me->GetMotionMaster()->MovePoint(0, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveX, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveY, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveZ);
-
- DespawnBoatGhosts(m_uiActivedCreatureGUID);
- DespawnBoatGhosts(m_uiOrbGUID);
-
- m_bIsActiveWithBJORN = false;
- m_bIsActiveWithHALDOR = false;
- m_bIsActiveWithRANULF = false;
- m_bIsActiveWithTORGYN = false;
-
- m_uiBane_Timer += 8000;
- m_uiFetidRot_Timer += 8000;
- m_uiDarkSlash_Timer += 8000;
- m_uiAncestors_Vengeance_Timer += 8000;
-
- m_uiActivedNumber = m_uiOrder;
- m_bIsWalking = true;
- m_uiPause_Timer = 2000;
- return;
- }
- DoMeleeAttackIfReady();
+ DoCast(SPELL_SUMMON_AVENGING_SPIRIT);
+ events.ScheduleEvent(EVENT_TORGYN_SUMMON_AVENGING_SPIRITS, 15000);
+ break;
+ default:
+ break;
}
}
@@ -367,14 +283,24 @@ public:
Talk(SAY_SLAY);
}
- void DespawnBoatGhosts(uint64& m_uiCreatureGUID)
+ void DespawnBoatGhosts(uint64& CreatureGUID)
{
- if (m_uiCreatureGUID)
- if (Creature* temp = ObjectAccessor::GetCreature(*me, m_uiCreatureGUID))
+ // @todo: fire visual after ancestor despawns.
+ if (CreatureGUID)
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, CreatureGUID))
temp->DisappearAndDie();
- m_uiCreatureGUID = 0;
+ CreatureGUID = 0;
}
+
+ private:
+ bool kingsBane; // Achievement King's Bane
+ uint8 ActiveOrder[4];
+ uint8 ActivedNumber;
+ uint32 HealthAmountModifier;
+ uint32 HealthAmountMultipler;
+ uint64 ActiveAncestorGUID;
+ uint64 SpiritFountGUID;
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
index cccfcede80b..5373446ba02 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
@@ -59,7 +59,19 @@ enum CreatureIds
NPC_RAVENOUS_FURBOLG = 26684,
NPC_MASSIVE_JORMUNGAR = 26685,
NPC_FEROCIOUS_RHINO = 26686,
- NPC_PALEHOOF_ORB = 26688
+ NPC_PALEHOOF_ORB = 26688,
+
+ // Ymiron
+ NPC_BJORN = 27303,
+ NPC_BJORN_VISUAL = 27304,
+ NPC_HALDOR = 27307,
+ NPC_HALDOR_VISUAL = 27310,
+ NPC_RANULF = 27308,
+ NPC_RANULF_VISUAL = 27311,
+ NPC_TORGYN = 27309,
+ NPC_TORGYN_VISUAL = 27312,
+ NPC_SPIRIT_FOUNT = 27339,
+ NPC_AVENGING_SPIRIT = 27386
};
enum GameObjectIds
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index a4d6ab31846..3f35fc0e172 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -977,15 +977,15 @@ public:
void HandleScript(SpellEffIndex /*effIndex*/)
{
- if (Player* player = GetHitUnit()->ToPlayer())
+ if (Unit* target = GetHitUnit())
{
switch (GetSpellInfo()->Id)
{
case SPELL_CORRECT_TRACKS:
- player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_CORRECT_TRACKS), LANG_UNIVERSAL, player);
+ target->Say(SAY_CORRECT_TRACKS, target);
break;
case SPELL_INCORRECT_TRACKS:
- player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_INCORRECT_TRACKS), LANG_UNIVERSAL, player);
+ target->Say(SAY_INCORRECT_TRACKS, target);
break;
default:
break;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 08fc588e923..22cd886d99b 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -31,8 +31,6 @@ EndScriptData */
#include "Player.h"
#include "SpellInfo.h"
-#define EMOTE_UNABLE_TO_SUMMON "%s is unable to summon Maiev Shadowsong and enter Phase 4. Resetting Encounter."
-
// Other defines
#define CENTER_X 676.740f
#define CENTER_Y 305.297f
@@ -605,7 +603,7 @@ public:
if (Conversation[count].emote)
creature->HandleEmoteCommand(Conversation[count].emote); // Make the Creature do some animation!
if (Conversation[count].text.size())
- creature->MonsterYell(Conversation[count].text.c_str(), LANG_UNIVERSAL, NULL); // Have the Creature yell out some text
+ creature->Yell(Conversation[count].text.c_str(), LANG_UNIVERSAL); // Have the Creature yell out some text
if (Conversation[count].sound)
DoPlaySoundToSet(creature, Conversation[count].sound); // Play some sound on the creature
}
@@ -761,7 +759,6 @@ public:
if (!MaievGUID) // If Maiev cannot be summoned, reset the encounter and post some errors to the console.
{
EnterEvadeMode();
- me->MonsterTextEmote(EMOTE_UNABLE_TO_SUMMON, NULL);
TC_LOG_ERROR("scripts", "SD2 ERROR: Unable to summon Maiev Shadowsong (entry: 23197). Check your database to see if you have the proper SQL for Maiev Shadowsong (entry: 23197)");
}
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
index 7e24f4b54b2..683efcdbcf0 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
@@ -281,7 +281,7 @@ public:
if (continueTriggering)
{
DoCast(me, SPELL_BLESSING_OF_THE_TIDES);
- me->MonsterYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_GAIN_BLESSING_OF_TIDES);
}
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index a0ff469733c..83b8722ce47 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -234,7 +234,7 @@ public:
if (SpoutTimer <= diff)
{
- me->MonsterTextEmote(EMOTE_SPOUT, NULL, true);
+ me->TextEmote(EMOTE_SPOUT, nullptr, true);
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->MoveRotate(20000, urand(0, 1) ? ROTATE_DIRECTION_LEFT : ROTATE_DIRECTION_RIGHT);
SpoutTimer = 45000;
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
index ae5ad009942..45262f9109c 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
@@ -181,7 +181,7 @@ class instance_magtheridons_lair : public InstanceMapScript
Creature* Magtheridon = instance->GetCreature(MagtheridonGUID);
if (Magtheridon && Magtheridon->IsAlive())
{
- Magtheridon->MonsterTextEmote(EMOTE_BONDS_WEAKEN, NULL);
+ Magtheridon->TextEmote(EMOTE_BONDS_WEAKEN);
CageTimer = 120000;
}
HandleGameObject(DoorGUID, false);
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index e135bb08e73..8373752ee1f 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -1777,7 +1777,7 @@ class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader
}
};
- SpellScript *GetSpellScript() const override
+ SpellScript* GetSpellScript() const override
{
return new spell_q12847_summon_soul_moveto_bunny_SpellScript();
}