aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp28
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp35
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp7
-rw-r--r--src/server/game/Battlegrounds/Battleground.h3
-rw-r--r--src/server/game/Entities/Object/Object.cpp153
-rw-r--r--src/server/game/Entities/Object/Object.h12
-rw-r--r--src/server/game/Entities/Player/Player.cpp37
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp88
-rw-r--r--src/server/game/Entities/Unit/Unit.h12
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp52
-rw-r--r--src/server/game/Globals/ObjectMgr.h4
-rw-r--r--src/server/game/Groups/Group.cpp2
-rw-r--r--src/server/game/Groups/Group.h14
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp6
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp24
-rw-r--r--src/server/game/Miscellaneous/Language.h1
-rw-r--r--src/server/game/Scripting/MapScripts.cpp92
-rw-r--r--src/server/game/Server/Protocol/PacketLog.cpp3
-rw-r--r--src/server/game/Server/WorldSocket.cpp4
-rw-r--r--src/server/game/Server/WorldSocket.h3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp16
-rw-r--r--src/server/game/Texts/ChatTextBuilder.h73
-rw-r--r--src/server/game/World/World.cpp3
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp4
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp33
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp10
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp22
-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/Scholomance/boss_jandice_barov.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp24
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp4
-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_chrono_lord_epoch.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp98
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp20
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp143
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp173
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp129
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h70
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp283
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp7
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_eck.cpp17
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp12
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_noth.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp5
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp21
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp21
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp31
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp25
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp18
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp42
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp12
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp24
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp14
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp18
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp22
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp52
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp16
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp50
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp24
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp38
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp21
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp36
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp61
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp127
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp14
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp42
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp33
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp127
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp86
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp19
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp3
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp12
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp89
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp26
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp35
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp380
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h14
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp8
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp8
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp16
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_erekem.cpp28
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp24
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp6
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp3
-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/BloodFurnace/boss_broggok.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp2
-rw-r--r--src/server/scripts/Outland/zone_shattrath_city.cpp69
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp32
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp6
-rw-r--r--src/server/scripts/World/npcs_special.cpp97
-rw-r--r--src/server/shared/Networking/AsyncAcceptor.h9
-rw-r--r--src/server/shared/Networking/MessageBuffer.h2
-rw-r--r--src/server/shared/Networking/NetworkThread.h4
-rw-r--r--src/server/shared/Networking/Socket.h3
-rw-r--r--src/server/shared/Networking/SocketMgr.h8
116 files changed, 2001 insertions, 1765 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 93fe943b26b..1ec20830140 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -17,7 +17,7 @@
#include "Cell.h"
#include "CellImpl.h"
-#include "Chat.h"
+#include "ChatTextBuilder.h"
#include "CreatureTextMgr.h"
#include "DatabaseEnv.h"
#include "GossipDef.h"
@@ -38,26 +38,6 @@
#include "MoveSplineInit.h"
#include "GameEventMgr.h"
-class BroadcastTextBuilder
-{
- public:
- BroadcastTextBuilder(WorldObject const* obj, ChatMsg msgtype, uint32 id, WorldObject const* target, uint32 gender = GENDER_MALE)
- : _source(obj), _msgType(msgtype), _textId(id), _target(target), _gender(gender) { }
-
- size_t operator()(WorldPacket* data, LocaleConstant locale) const
- {
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
-
- return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _gender) : "", 0, "", locale);
- }
-
- WorldObject const* _source;
- ChatMsg _msgType;
- uint32 _textId;
- WorldObject const* _target;
- uint32 _gender;
-};
-
SmartScript::SmartScript()
{
go = NULL;
@@ -232,7 +212,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (IsUnit(*itr))
{
- (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.onlySelf > 0);
+ (*itr)->PlayDirectSound(e.action.sound.sound, e.action.sound.onlySelf ? (*itr)->ToPlayer() : nullptr);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: %s (GuidLow: %u), sound: %u, onlyself: %u",
(*itr)->GetName().c_str(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.onlySelf);
}
@@ -762,7 +742,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
me->DoFleeToGetAssistance();
if (e.action.flee.withEmote)
{
- BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_FLEE_FOR_ASSIST, NULL, me->getGender());
+ Trinity::BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_FLEE_FOR_ASSIST);
sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE);
}
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: Creature %u DoFleeToGetAssistance", me->GetGUIDLow());
@@ -1005,7 +985,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
me->CallForHelp((float)e.action.callHelp.range);
if (e.action.callHelp.withEmote)
{
- BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP, NULL, me->getGender());
+ Trinity::BroadcastTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP);
sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE);
}
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_CALL_FOR_HELP: Creature %u", me->GetGUIDLow());
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 547cd9a8502..46e02f9547f 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -21,7 +21,7 @@
#include "ArenaTeamMgr.h"
#include "Battleground.h"
#include "CellImpl.h"
-#include "Chat.h"
+#include "ChatTextBuilder.h"
#include "Common.h"
#include "DatabaseEnv.h"
#include "DBCEnums.h"
@@ -42,29 +42,6 @@
#include "World.h"
#include "WorldPacket.h"
-namespace Trinity
-{
- class AchievementChatBuilder
- {
- public:
- AchievementChatBuilder(Player const* player, ChatMsg msgType, uint32 textId, uint32 achievementId)
- : _player(player), _msgType(msgType), _textId(textId), _achievementId(achievementId) { }
-
- void operator()(WorldPacket& data, LocaleConstant locale)
- {
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
-
- ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _player, _player, bct ? bct->GetText(locale, _player->getGender()) : "", _achievementId);
- }
-
- private:
- Player const* _player;
- ChatMsg _msgType;
- uint32 _textId;
- uint32 _achievementId;
- };
-} // namespace Trinity
-
bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
{
if (dataType >= MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE)
@@ -661,8 +638,8 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
{
- Trinity::AchievementChatBuilder _builder(GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, achievement->ID);
- Trinity::LocalizedPacketDo<Trinity::AchievementChatBuilder> _localizer(_builder);
+ Trinity::BroadcastTextBuilder _builder(GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, GetPlayer(), achievement->ID);
+ Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> _localizer(_builder);
guild->BroadcastWorker(_localizer, GetPlayer());
}
@@ -679,9 +656,9 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
// if player is in world he can tell his friends about new achievement
else if (GetPlayer()->IsInWorld())
{
- Trinity::AchievementChatBuilder _builder(GetPlayer(), CHAT_MSG_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, achievement->ID);
- Trinity::LocalizedPacketDo<Trinity::AchievementChatBuilder> _localizer(_builder);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::AchievementChatBuilder> > _worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _localizer);
+ Trinity::BroadcastTextBuilder _builder(GetPlayer(), CHAT_MSG_ACHIEVEMENT, BROADCAST_TEXT_ACHIEVEMENT_EARNED, GetPlayer(), achievement->ID);
+ Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> _localizer(_builder);
+ Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> > _worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _localizer);
GetPlayer()->VisitNearbyWorldObject(sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), _worker);
}
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 6f6d1b66308..f2a112cbeba 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -738,7 +738,7 @@ void Battleground::EndBattleground(uint32 winner)
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVPSTATS_BATTLEGROUND);
stmt->setUInt64(0, battlegroundId);
stmt->setUInt8(1, GetWinner());
- stmt->setUInt8(2, m_BracketId + 1);
+ stmt->setUInt8(2, GetUniqueBracketId());
stmt->setUInt8(3, GetTypeID(true));
CharacterDatabase.Execute(stmt);
}
@@ -1832,3 +1832,8 @@ bool Battleground::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const*
TC_LOG_ERROR("bg.battleground", "Battleground::CheckAchievementCriteriaMeet: No implementation for criteria %u", criteriaId);
return false;
}
+
+uint8 Battleground::GetUniqueBracketId() const
+{
+ return GetMinLevel() / 10;
+}
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index b0270192fd1..b14c18c9335 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -469,6 +469,9 @@ class Battleground
virtual uint32 GetPrematureWinner();
+ // because BattleGrounds with different types and same level range has different m_BracketId
+ uint8 GetUniqueBracketId() const;
+
protected:
// this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground
void EndNow();
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 45450a0c129..e402836f4c2 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1879,16 +1879,6 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj) const
return true;
}
-void WorldObject::SendPlaySound(uint32 Sound, bool OnlySelf)
-{
- WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << Sound;
- if (OnlySelf && GetTypeId() == TYPEID_PLAYER)
- this->ToPlayer()->GetSession()->SendPacket(&data);
- else
- SendMessageToSet(&data, true); // ToSelf ignored in this case
-}
-
void Object::ForceValuesUpdateAtIndex(uint32 i)
{
_changesMask.SetBit(i);
@@ -1899,149 +1889,6 @@ void Object::ForceValuesUpdateAtIndex(uint32 i)
}
}
-namespace Trinity
-{
- class MonsterChatBuilder
- {
- public:
- MonsterChatBuilder(WorldObject const* obj, ChatMsg msgtype, int32 textId, uint32 language, WorldObject const* target)
- : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(Language(language)), i_target(target) { }
- void operator()(WorldPacket& data, LocaleConstant loc_idx)
- {
- char const* text = sObjectMgr->GetTrinityString(i_textId, loc_idx);
- ChatHandler::BuildChatPacket(data, i_msgtype, i_language, i_object, i_target, text, 0, "", loc_idx);
- }
-
- private:
- WorldObject const* i_object;
- ChatMsg i_msgtype;
- int32 i_textId;
- Language i_language;
- WorldObject const* i_target;
- };
-
- class MonsterCustomChatBuilder
- {
- public:
- MonsterCustomChatBuilder(WorldObject const* obj, ChatMsg msgtype, const char* text, uint32 language, WorldObject const* target)
- : i_object(obj), i_msgtype(msgtype), i_text(text), i_language(Language(language)), i_target(target)
- {}
- void operator()(WorldPacket& data, LocaleConstant loc_idx)
- {
- ChatHandler::BuildChatPacket(data, i_msgtype, i_language, i_object, i_target, i_text, 0, "", loc_idx);
- }
-
- private:
- WorldObject const* i_object;
- ChatMsg i_msgtype;
- const char* i_text;
- Language i_language;
- WorldObject const* i_target;
- };
-} // namespace Trinity
-
-void WorldObject::MonsterSay(const char* text, uint32 language, WorldObject const* target)
-{
- CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY());
-
- Cell cell(p);
- cell.SetNoCreate();
-
- Trinity::MonsterCustomChatBuilder say_build(this, CHAT_MSG_MONSTER_SAY, text, language, target);
- Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> say_do(say_build);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), say_do);
- TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> >, WorldTypeMapContainer > message(say_worker);
- cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY));
-}
-
-void WorldObject::MonsterSay(int32 textId, uint32 language, WorldObject const* target)
-{
- CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY());
-
- Cell cell(p);
- cell.SetNoCreate();
-
- Trinity::MonsterChatBuilder say_build(this, CHAT_MSG_MONSTER_SAY, textId, language, target);
- Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> say_do(say_build);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), say_do);
- TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
- cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY));
-}
-
-void WorldObject::MonsterYell(const char* text, uint32 language, WorldObject const* target)
-{
- CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY());
-
- Cell cell(p);
- cell.SetNoCreate();
-
- Trinity::MonsterCustomChatBuilder say_build(this, CHAT_MSG_MONSTER_YELL, text, language, target);
- Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> say_do(say_build);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), say_do);
- TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterCustomChatBuilder> >, WorldTypeMapContainer > message(say_worker);
- cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL));
-}
-
-void WorldObject::MonsterYell(int32 textId, uint32 language, WorldObject const* target)
-{
- CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY());
-
- Cell cell(p);
- cell.SetNoCreate();
-
- Trinity::MonsterChatBuilder say_build(this, CHAT_MSG_MONSTER_YELL, textId, language, target);
- Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> say_do(say_build);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), say_do);
- TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
- cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL));
-}
-
-void WorldObject::MonsterTextEmote(const char* text, WorldObject const* target, bool IsBossEmote)
-{
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL,
- this, target, text);
- SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true);
-}
-
-void WorldObject::MonsterTextEmote(int32 textId, WorldObject const* target, bool IsBossEmote)
-{
- CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY());
-
- Cell cell(p);
- cell.SetNoCreate();
-
- Trinity::MonsterChatBuilder say_build(this, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, textId, LANG_UNIVERSAL, target);
- Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> say_do(say_build);
- Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> > say_worker(this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), say_do);
- TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
- cell.Visit(p, message, *GetMap(), *this, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
-}
-
-void WorldObject::MonsterWhisper(const char* text, Player const* target, bool IsBossWhisper)
-{
- if (!target)
- return;
-
- LocaleConstant loc_idx = target->GetSession()->GetSessionDbLocaleIndex();
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, text, 0, "", loc_idx);
- target->GetSession()->SendPacket(&data);
-}
-
-void WorldObject::MonsterWhisper(int32 textId, Player const* target, bool IsBossWhisper)
-{
- if (!target)
- return;
-
- LocaleConstant loc_idx = target->GetSession()->GetSessionDbLocaleIndex();
- char const* text = sObjectMgr->GetTrinityString(textId, loc_idx);
- WorldPacket data;
- ChatHandler::BuildChatPacket(data, IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, text, 0, "", loc_idx);
-
- target->GetSession()->SendPacket(&data);
-}
-
void Unit::BuildHeartBeatMsg(WorldPacket* data) const
{
data->Initialize(MSG_MOVE_HEARTBEAT, 32);
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 85381c1dfd9..652a4d4b71f 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -652,15 +652,6 @@ class WorldObject : public Object, public WorldLocation
virtual uint8 getLevelForTarget(WorldObject const* /*target*/) const { return 1; }
- void MonsterSay(const char* text, uint32 language, WorldObject const* target);
- void MonsterYell(const char* text, uint32 language, WorldObject const* target);
- void MonsterTextEmote(const char* text, WorldObject const* target, bool IsBossEmote = false);
- void MonsterWhisper(const char* text, Player const* target, bool IsBossWhisper = false);
- void MonsterSay(int32 textId, uint32 language, WorldObject const* target);
- void MonsterYell(int32 textId, uint32 language, WorldObject const* target);
- void MonsterTextEmote(int32 textId, WorldObject const* target, bool IsBossEmote = false);
- void MonsterWhisper(int32 textId, Player const* target, bool IsBossWhisper = false);
-
void PlayDistanceSound(uint32 sound_id, Player* target = NULL);
void PlayDirectSound(uint32 sound_id, Player* target = NULL);
@@ -683,9 +674,6 @@ class WorldObject : public Object, public WorldLocation
FlaggedValuesArray32<int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES> m_serverSideVisibility;
FlaggedValuesArray32<int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES> m_serverSideVisibilityDetect;
- // Low Level Packets
- void SendPlaySound(uint32 Sound, bool OnlySelf);
-
virtual void SetMap(Map* map);
virtual void ResetMap();
Map* GetMap() const { ASSERT(m_currMap); return m_currMap; }
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index f7ef9a3d895..a5b97cbee3c 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -3807,7 +3807,8 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
if (!pSkill)
continue;
- if (_spell_idx->second->AutolearnType == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id))
+ ///@todo: confirm if rogues start with lockpicking skill at level 1 but only receive the spell to use it at level 16
+ if ((_spell_idx->second->AutolearnType == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || (pSkill->id == SKILL_LOCKPICKING && _spell_idx->second->max_value == 0))
LearnDefaultSkill(pSkill->id, 0);
if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
@@ -20527,27 +20528,27 @@ void Player::StopCastingCharm()
}
}
-void Player::Say(const std::string& text, const uint32 language)
+void Player::Say(std::string const& text, Language language, WorldObject const* /*= nullptr*/)
{
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, Language(language), this, this, _text);
+ ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
}
-void Player::Yell(const std::string& text, const uint32 language)
+void Player::Yell(std::string const& text, Language language, WorldObject const* /*= nullptr*/)
{
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
WorldPacket data;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, Language(language), this, this, _text);
+ ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true);
}
-void Player::TextEmote(const std::string& text)
+void Player::TextEmote(std::string const& text, WorldObject const* /*= nullptr*/, bool /*= false*/)
{
std::string _text(text);
sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
@@ -20557,40 +20558,40 @@ void Player::TextEmote(const std::string& text)
SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT));
}
-void Player::Whisper(const std::string& text, uint32 language, uint64 receiver)
+void Player::Whisper(std::string const& text, Language language, Player* target, bool /*= false*/)
{
+ ASSERT(target);
+
bool isAddonMessage = language == LANG_ADDON;
if (!isAddonMessage) // if not addon data
language = LANG_UNIVERSAL; // whispers should always be readable
- Player* rPlayer = ObjectAccessor::FindPlayer(receiver);
-
std::string _text(text);
- sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, rPlayer);
+ sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
WorldPacket data;
ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, Language(language), this, this, _text);
- rPlayer->GetSession()->SendPacket(&data);
+ target->GetSession()->SendPacket(&data);
// rest stuff shouldn't happen in case of addon message
if (isAddonMessage)
return;
- ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), rPlayer, rPlayer, _text);
+ ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
GetSession()->SendPacket(&data);
- if (!isAcceptWhispers() && !IsGameMaster() && !rPlayer->IsGameMaster())
+ if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
{
SetAcceptWhispers(true);
ChatHandler(GetSession()).SendSysMessage(LANG_COMMAND_WHISPERON);
}
// announce afk or dnd message
- if (rPlayer->isAFK())
- ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, rPlayer->GetName().c_str(), rPlayer->autoReplyMsg.c_str());
- else if (rPlayer->isDND())
- ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, rPlayer->GetName().c_str(), rPlayer->autoReplyMsg.c_str());
+ if (target->isAFK())
+ ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName().c_str(), target->autoReplyMsg.c_str());
+ else if (target->isDND())
+ ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName().c_str(), target->autoReplyMsg.c_str());
}
Item* Player::GetMItem(uint32 id)
@@ -23146,6 +23147,8 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank)
skillValue = std::min(std::max<uint16>({ 1, uint16((getLevel() - 1) * 5) }), maxValue);
else if (skillId == SKILL_FIST_WEAPONS)
skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
+ else if (skillId == SKILL_LOCKPICKING)
+ skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
SetSkill(skillId, 0, skillValue, maxValue);
break;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 27ea8355345..5705d95190d 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1215,13 +1215,13 @@ class Player : public Unit, public GridObject<Player>
uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
/// Handles said message in regular chat based on declared language and in config pre-defined Range.
- void Say(std::string const& text, const uint32 language);
+ void Say(std::string const& text, Language language, WorldObject const* = nullptr) override;
/// Handles yelled message in regular chat based on declared language and in config pre-defined Range.
- void Yell(std::string const& text, const uint32 language);
+ void Yell(std::string const& text, Language language, WorldObject const* = nullptr) override;
/// Outputs an universal text which is supposed to be an action.
- void TextEmote(std::string const& text);
+ void TextEmote(std::string const& text, WorldObject const* = nullptr, bool = false) override;
/// Handles whispers from Addons and players based on sender, receiver's guid and language.
- void Whisper(std::string const& text, const uint32 language, uint64 receiver);
+ void Whisper(std::string const& text, Language language, Player* receiver, bool = false) override;
/*********************************************************/
/*** STORAGE SYSTEM ***/
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 9423284c76d..97b0bb75e4d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -23,6 +23,7 @@
#include "Battleground.h"
#include "BattlegroundScore.h"
#include "CellImpl.h"
+#include "ChatTextBuilder.h"
#include "ConditionMgr.h"
#include "CreatureAI.h"
#include "CreatureAIImpl.h"
@@ -458,7 +459,7 @@ bool Unit::IsWithinMeleeRange(const Unit* obj, float dist) const
float dx = GetPositionX() - obj->GetPositionX();
float dy = GetPositionY() - obj->GetPositionY();
- float dz = GetPositionZ() - obj->GetPositionZ();
+ float dz = GetPositionZMinusOffset() - obj->GetPositionZMinusOffset();
float distsq = dx*dx + dy*dy + dz*dz;
float sizefactor = GetMeleeReach() + obj->GetMeleeReach();
@@ -8132,7 +8133,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
if (triggerEntry == NULL)
{
// Don't cast unknown spell
- // TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u has 0 in EffectTriggered[%d]. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex());
+ TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u (effIndex: %u) has unknown TriggerSpell %u. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
return false;
}
@@ -15504,7 +15505,7 @@ void Unit::SetControlled(bool apply, UnitState state)
case UNIT_STATE_STUNNED:
SetStunned(true);
// i need to stop fear on stun and root or i will get teleport to destination issue as MVMGEN for fear keeps going on
- if (HasUnitState(UNIT_STATE_FLEEING))
+ if (HasUnitState(UNIT_STATE_FLEEING))
SetFeared(false);
CastStop();
break;
@@ -17848,3 +17849,84 @@ bool Unit::IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplicat
return true;
}
+
+void Unit::Talk(std::string const& text, ChatMsg msgType, Language language, float textRange, WorldObject const* target)
+{
+ Trinity::CustomChatTextBuilder builder(this, msgType, text, language, target);
+ Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> localizer(builder);
+ Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> > worker(this, textRange, localizer);
+ VisitNearbyWorldObject(textRange, worker);
+}
+
+void Unit::Say(std::string const& text, Language language, WorldObject const* target /*= nullptr*/)
+{
+ Talk(text, CHAT_MSG_MONSTER_SAY, language, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
+}
+
+void Unit::Yell(std::string const& text, Language language, WorldObject const* target /*= nullptr*/)
+{
+ Talk(text, CHAT_MSG_MONSTER_YELL, language, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
+}
+
+void Unit::TextEmote(std::string const& text, WorldObject const* target /*= nullptr*/, bool isBossEmote /*= false*/)
+{
+ Talk(text, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
+}
+
+void Unit::Whisper(std::string const& text, Language language, Player* target, bool isBossWhisper /*= false*/)
+{
+ if (!target)
+ return;
+
+ LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex();
+ WorldPacket data;
+ ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
+ target->SendDirectMessage(&data);
+}
+
+void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target)
+{
+ if (!sObjectMgr->GetBroadcastText(textId))
+ {
+ TC_LOG_ERROR("entities.unit", "WorldObject::MonsterText: `broadcast_text` was not %u found", textId);
+ return;
+ }
+
+ Trinity::BroadcastTextBuilder builder(this, msgType, textId, target);
+ Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> localizer(builder);
+ Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> > worker(this, textRange, localizer);
+ VisitNearbyWorldObject(textRange, worker);
+}
+
+void Unit::Say(uint32 textId, WorldObject const* target /*= nullptr*/)
+{
+ Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
+}
+
+void Unit::Yell(uint32 textId, WorldObject const* target /*= nullptr*/)
+{
+ Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
+}
+
+void Unit::TextEmote(uint32 textId, WorldObject const* target /*= nullptr*/, bool isBossEmote /*= false*/)
+{
+ Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
+}
+
+void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/)
+{
+ if (!target)
+ return;
+
+ BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
+ if (!bct)
+ {
+ TC_LOG_ERROR("entities.unit", "WorldObject::MonsterWhisper: `broadcast_text` was not %u found", textId);
+ return;
+ }
+
+ LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex();
+ WorldPacket data;
+ ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
+ target->SendDirectMessage(&data);
+}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a18bc3b0848..7d40b1c24db 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1619,6 +1619,7 @@ class Unit : public WorldObject
bool IsLevitating() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); }
bool IsWalking() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING); }
+ bool IsHovering() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_HOVER); }
virtual bool SetWalk(bool enable);
virtual bool SetDisableGravity(bool disable, bool packetOnly = false);
virtual bool SetSwim(bool enable);
@@ -2157,6 +2158,17 @@ class Unit : public WorldObject
int32 GetHighestExclusiveSameEffectSpellGroupValue(AuraEffect const* aurEff, AuraType auraType, bool checkMiscValue = false, int32 miscValue = 0) const;
bool IsHighestExclusiveAura(Aura const* aura, bool removeOtherAuraApplications = false);
+ virtual void Talk(std::string const& text, ChatMsg msgType, Language language, float textRange, WorldObject const* target);
+ virtual void Say(std::string const& text, Language language, WorldObject const* target = nullptr);
+ virtual void Yell(std::string const& text, Language language, WorldObject const* target = nullptr);
+ virtual void TextEmote(std::string const& text, WorldObject const* target = nullptr, bool isBossEmote = false);
+ virtual void Whisper(std::string const& text, Language language, Player* target, bool isBossWhisper = false);
+ void Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target);
+ void Say(uint32 textId, WorldObject const* target = nullptr);
+ void Yell(uint32 textId, WorldObject const* target = nullptr);
+ void TextEmote(uint32 textId, WorldObject const* target = nullptr, bool isBossEmote = false);
+ void Whisper(uint32 textId, Player* target, bool isBossWhisper = false);
+
protected:
explicit Unit (bool isWorldObject);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 7ab843943f8..20c20a883d2 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -4602,18 +4602,12 @@ void ObjectMgr::LoadScripts(ScriptsType type)
tableName.c_str(), tmp.Talk.ChatType, tmp.id);
continue;
}
- if (!tmp.Talk.TextID)
+ if (!sObjectMgr->GetBroadcastText(uint32(tmp.Talk.TextID)))
{
TC_LOG_ERROR("sql.sql", "Table `%s` has invalid talk text id (dataint = %i) in SCRIPT_COMMAND_TALK for script id %u",
tableName.c_str(), tmp.Talk.TextID, tmp.id);
continue;
}
- if (tmp.Talk.TextID < MIN_DB_SCRIPT_STRING_ID || tmp.Talk.TextID >= MAX_DB_SCRIPT_STRING_ID)
- {
- TC_LOG_ERROR("sql.sql", "Table `%s` has out of range text id (dataint = %i expected %u-%u) in SCRIPT_COMMAND_TALK for script id %u",
- tableName.c_str(), tmp.Talk.TextID, MIN_DB_SCRIPT_STRING_ID, MAX_DB_SCRIPT_STRING_ID, tmp.id);
- continue;
- }
break;
}
@@ -8635,33 +8629,6 @@ uint32 ObjectMgr::GetScriptId(const char *name)
return uint32(itr - _scriptNamesStore.begin());
}
-void ObjectMgr::CheckScripts(ScriptsType type, std::set<int32>& ids)
-{
- ScriptMapMap* scripts = GetScriptsMapByType(type);
- if (!scripts)
- return;
-
- for (ScriptMapMap::const_iterator itrMM = scripts->begin(); itrMM != scripts->end(); ++itrMM)
- {
- for (ScriptMap::const_iterator itrM = itrMM->second.begin(); itrM != itrMM->second.end(); ++itrM)
- {
- switch (itrM->second.command)
- {
- case SCRIPT_COMMAND_TALK:
- {
- if (!GetTrinityStringLocale (itrM->second.Talk.TextID))
- TC_LOG_ERROR("sql.sql", "Table `%s` references invalid text id %u from `db_script_string`, script id: %u.", GetScriptsTableNameByType(type).c_str(), itrM->second.Talk.TextID, itrMM->first);
-
- if (ids.find(itrM->second.Talk.TextID) != ids.end())
- ids.erase(itrM->second.Talk.TextID);
- }
- default:
- break;
- }
- }
- }
-}
-
void ObjectMgr::LoadBroadcastTexts()
{
uint32 oldMSTime = getMSTime();
@@ -8797,23 +8764,6 @@ void ObjectMgr::LoadBroadcastTextLocales()
TC_LOG_INFO("server.loading", ">> Loaded %u broadcast text locales in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
-void ObjectMgr::LoadDbScriptStrings()
-{
- LoadTrinityStrings("db_script_string", MIN_DB_SCRIPT_STRING_ID, MAX_DB_SCRIPT_STRING_ID);
-
- std::set<int32> ids;
-
- for (int32 i = MIN_DB_SCRIPT_STRING_ID; i < MAX_DB_SCRIPT_STRING_ID; ++i)
- if (GetTrinityStringLocale(i))
- ids.insert(i);
-
- for (int type = SCRIPTS_FIRST; type < SCRIPTS_LAST; ++type)
- CheckScripts(ScriptsType(type), ids);
-
- for (std::set<int32>::const_iterator itr = ids.begin(); itr != ids.end(); ++itr)
- TC_LOG_ERROR("sql.sql", "Table `db_script_string` has unused string id %u", *itr);
-}
-
CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint8 level, uint8 unitClass)
{
CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index dc9196dd0df..d15ca257d67 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -466,8 +466,6 @@ typedef std::unordered_map<uint32/*(mapid, spawnMode) pair*/, CellObjectGuidsMap
// Trinity string ranges
#define MIN_TRINITY_STRING_ID 1 // 'trinity_string'
#define MAX_TRINITY_STRING_ID 2000000000
-#define MIN_DB_SCRIPT_STRING_ID MAX_TRINITY_STRING_ID // 'db_script_string'
-#define MAX_DB_SCRIPT_STRING_ID 2000010000
// Trinity Trainer Reference start range
#define TRINITY_TRAINER_START_REF 200000
@@ -968,7 +966,6 @@ class ObjectMgr
void LoadBroadcastTextLocales();
bool LoadTrinityStrings(char const* table, int32 min_value, int32 max_value);
bool LoadTrinityStrings() { return LoadTrinityStrings("trinity_string", MIN_TRINITY_STRING_ID, MAX_TRINITY_STRING_ID); }
- void LoadDbScriptStrings();
void LoadCreatureClassLevelStats();
void LoadCreatureLocales();
void LoadCreatureTemplates();
@@ -1386,7 +1383,6 @@ class ObjectMgr
private:
void LoadScripts(ScriptsType type);
- void CheckScripts(ScriptsType type, std::set<int32>& ids);
void LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReverse* reverseMap, std::string const& table, bool starter, bool go);
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count);
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 88a83ab6fde..4becedfe41a 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -226,7 +226,7 @@ void Group::LoadMemberFromDB(uint32 guidLow, uint8 memberFlags, uint8 subgroup,
void Group::ConvertToLFG()
{
- m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_UNK1);
+ m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_LFG_RESTRICTED);
m_lootMethod = NEED_BEFORE_GREED;
if (!isBGGroup() && !isBFGroup())
{
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index 08f91ca816a..59f77a06308 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -82,13 +82,15 @@ enum GroupMemberAssignment
enum GroupType
{
- GROUPTYPE_NORMAL = 0x00,
- GROUPTYPE_BG = 0x01,
- GROUPTYPE_RAID = 0x02,
- GROUPTYPE_BGRAID = GROUPTYPE_BG | GROUPTYPE_RAID, // mask
- GROUPTYPE_UNK1 = 0x04,
- GROUPTYPE_LFG = 0x08
+ GROUPTYPE_NORMAL = 0x00,
+ GROUPTYPE_BG = 0x01,
+ GROUPTYPE_RAID = 0x02,
+ GROUPTYPE_BGRAID = GROUPTYPE_BG | GROUPTYPE_RAID, // mask
+ GROUPTYPE_LFG_RESTRICTED = 0x04, // Script_HasLFGRestrictions()
+ GROUPTYPE_LFG = 0x08,
// 0x10, leave/change group?, I saw this flag when leaving group and after leaving BG while in group
+ // GROUPTYPE_ONE_PERSON_PARTY = 0x20, 4.x Script_IsOnePersonParty()
+ // GROUPTYPE_EVERYONE_ASSISTANT = 0x40 4.x Script_IsEveryoneAssistant()
};
enum GroupUpdateFlags
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index eccf7a6fd38..e820f23299d 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -254,11 +254,11 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
}
if (type == CHAT_MSG_SAY)
- sender->Say(msg, lang);
+ sender->Say(msg, Language(lang));
else if (type == CHAT_MSG_EMOTE)
sender->TextEmote(msg);
else if (type == CHAT_MSG_YELL)
- sender->Yell(msg, lang);
+ sender->Yell(msg, Language(lang));
} break;
case CHAT_MSG_WHISPER:
{
@@ -298,7 +298,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
(HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !sender->isAcceptWhispers() && !sender->IsInWhisperWhiteList(receiver->GetGUID())))
sender->AddWhisperWhiteList(receiver->GetGUID());
- GetPlayer()->Whisper(msg, lang, receiver->GetGUID());
+ GetPlayer()->Whisper(msg, Language(lang), receiver);
} break;
case CHAT_MSG_PARTY:
case CHAT_MSG_PARTY_LEADER:
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index f7c3c8a2be6..50beaa65972 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -298,10 +298,14 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
// Send next quest
if (Quest const* nextQuest = _player->GetNextQuest(guid, quest))
{
- if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true) && _player->CanTakeQuest(nextQuest, true))
- _player->AddQuestAndCheckCompletion(nextQuest, object);
-
- _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true);
+ // Only send the quest to the player if the conditions are met
+ if (_player->CanTakeQuest(nextQuest, false))
+ {
+ if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true))
+ _player->AddQuestAndCheckCompletion(nextQuest, object);
+
+ _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true);
+ }
}
questgiver->AI()->sQuestReward(_player, quest, reward);
@@ -316,10 +320,14 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
// Send next quest
if (Quest const* nextQuest = _player->GetNextQuest(guid, quest))
{
- if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true) && _player->CanTakeQuest(nextQuest, true))
- _player->AddQuestAndCheckCompletion(nextQuest, object);
-
- _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true);
+ // Only send the quest to the player if the conditions are met
+ if (_player->CanTakeQuest(nextQuest, false))
+ {
+ if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true))
+ _player->AddQuestAndCheckCompletion(nextQuest, object);
+
+ _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true);
+ }
}
questGiver->AI()->QuestReward(_player, quest, reward);
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index c1de3aae7cb..814deba78db 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -1194,7 +1194,6 @@ enum TrinityStrings
LANG_NPCINFO_FLAGS_EXTRA = 11009
// NOT RESERVED IDS 12000-1999999999
- // `db_script_string` table index 2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID)
// For other tables maybe 2000010000-2147483647 (max index)
};
#endif
diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp
index 3ccc876e1a2..888c1ec7e8d 100644
--- a/src/server/game/Scripting/MapScripts.cpp
+++ b/src/server/game/Scripting/MapScripts.cpp
@@ -373,83 +373,49 @@ void Map::ScriptsProcess()
switch (step.script->command)
{
case SCRIPT_COMMAND_TALK:
+ {
if (step.script->Talk.ChatType > CHAT_TYPE_WHISPER && step.script->Talk.ChatType != CHAT_MSG_RAID_BOSS_WHISPER)
{
TC_LOG_ERROR("scripts", "%s invalid chat type (%u) specified, skipping.", step.script->GetDebugInfo().c_str(), step.script->Talk.ChatType);
break;
}
- if (step.script->Talk.Flags & SF_TALK_USE_PLAYER)
- {
- if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script))
- {
- LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex();
- std::string text(sObjectMgr->GetTrinityString(step.script->Talk.TextID, loc_idx));
+ Unit* source = nullptr;
- switch (step.script->Talk.ChatType)
- {
- case CHAT_TYPE_SAY:
- player->Say(text, LANG_UNIVERSAL);
- break;
- case CHAT_TYPE_YELL:
- player->Yell(text, LANG_UNIVERSAL);
- break;
- case CHAT_TYPE_TEXT_EMOTE:
- case CHAT_TYPE_BOSS_EMOTE:
- player->TextEmote(text);
- break;
- case CHAT_TYPE_WHISPER:
- case CHAT_MSG_RAID_BOSS_WHISPER:
- {
- uint64 targetGUID = target ? target->GetGUID() : 0;
- if (!targetGUID || !IS_PLAYER_GUID(targetGUID))
- TC_LOG_ERROR("scripts", "%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str());
- else
- player->Whisper(text, LANG_UNIVERSAL, targetGUID);
- break;
- }
- default:
- break; // must be already checked at load
- }
- }
- }
+ if (step.script->Talk.Flags & SF_TALK_USE_PLAYER)
+ source = _GetScriptPlayerSourceOrTarget(source, target, step.script);
else
+ source = _GetScriptCreatureSourceOrTarget(source, target, step.script);
+
+ if (source)
{
- // Source or target must be Creature.
- if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
+ switch (step.script->Talk.ChatType)
{
- uint64 targetGUID = target ? target->GetGUID() : 0;
- switch (step.script->Talk.ChatType)
+ case CHAT_TYPE_SAY:
+ source->Say(step.script->Talk.TextID, target);
+ break;
+ case CHAT_TYPE_YELL:
+ source->Yell(step.script->Talk.TextID, target);
+ break;
+ case CHAT_TYPE_TEXT_EMOTE:
+ case CHAT_TYPE_BOSS_EMOTE:
+ source->TextEmote(step.script->Talk.TextID, target, step.script->Talk.ChatType == CHAT_TYPE_BOSS_EMOTE);
+ break;
+ case CHAT_TYPE_WHISPER:
+ case CHAT_MSG_RAID_BOSS_WHISPER:
{
- case CHAT_TYPE_SAY:
- cSource->MonsterSay(step.script->Talk.TextID, LANG_UNIVERSAL, target);
- break;
- case CHAT_TYPE_YELL:
- cSource->MonsterYell(step.script->Talk.TextID, LANG_UNIVERSAL, target);
- break;
- case CHAT_TYPE_TEXT_EMOTE:
- cSource->MonsterTextEmote(step.script->Talk.TextID, target);
- break;
- case CHAT_TYPE_BOSS_EMOTE:
- cSource->MonsterTextEmote(step.script->Talk.TextID, target, true);
- break;
- case CHAT_TYPE_WHISPER:
- if (!targetGUID || !IS_PLAYER_GUID(targetGUID))
- TC_LOG_ERROR("scripts", "%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str());
- else
- cSource->MonsterWhisper(step.script->Talk.TextID, target->ToPlayer());
- break;
- case CHAT_MSG_RAID_BOSS_WHISPER:
- if (!targetGUID || !IS_PLAYER_GUID(targetGUID))
- TC_LOG_ERROR("scripts", "%s attempt to raidbosswhisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str());
- else
- cSource->MonsterWhisper(step.script->Talk.TextID, target->ToPlayer(), true);
- break;
- default:
- break; // must be already checked at load
+ Player* receiver = target ? target->ToPlayer() : nullptr;
+ if (!receiver)
+ TC_LOG_ERROR("scripts", "%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str());
+ else
+ source->Whisper(step.script->Talk.TextID, receiver, step.script->Talk.ChatType == CHAT_MSG_RAID_BOSS_WHISPER);
+ break;
}
+ default:
+ break; // must be already checked at load
}
}
break;
+ }
case SCRIPT_COMMAND_EMOTE:
// Source or target must be Creature.
diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp
index 0d5168cc5a9..0a085ccc565 100644
--- a/src/server/game/Server/Protocol/PacketLog.cpp
+++ b/src/server/game/Server/Protocol/PacketLog.cpp
@@ -93,7 +93,8 @@ void PacketLog::Initialize()
header.SniffStartTicks = getMSTime();
header.OptionalDataSize = 0;
- fwrite(&header, sizeof(header), 1, _file);
+ if (CanLogPacket())
+ fwrite(&header, sizeof(header), 1, _file);
}
}
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index f8673e5d5b7..ef92a59a73d 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -119,7 +119,7 @@ bool WorldSocket::ReadHeaderHandler()
EndianConvertReverse(header->size);
EndianConvert(header->cmd);
- if (!header->IsValid())
+ if (!header->IsValidSize() || !header->IsValidOpcode())
{
if (_worldSession)
{
@@ -129,7 +129,7 @@ bool WorldSocket::ReadHeaderHandler()
}
else
TC_LOG_ERROR("network", "WorldSocket::ReadHeaderHandler(): client %s sent malformed packet (size: %hu, cmd: %u)",
- GetRemoteIpAddress().to_string().c_str(), header->size, header->cmd);
+ GetRemoteIpAddress().to_string().c_str(), header->size, header->cmd);
CloseSocket();
return false;
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index d301e239340..3355c3d8cca 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -39,7 +39,8 @@ struct ClientPktHeader
uint16 size;
uint32 cmd;
- bool IsValid() const { return size >= 4 && size < 10240 && cmd < NUM_MSG_TYPES; }
+ bool IsValidSize() const { return size >= 4 && size < 10240; }
+ bool IsValidOpcode() const { return cmd < NUM_MSG_TYPES; }
};
#pragma pack(pop)
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 00b787345d4..adc120ade49 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3798,7 +3798,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
if (m_caster->getGender() > 0)
gender = "her";
sprintf(buf, "%s rubs %s [Decahedral Dwarven Dice] between %s hands and rolls. One %u and one %u.", m_caster->GetName().c_str(), gender, gender, urand(1, 10), urand(1, 10));
- m_caster->MonsterTextEmote(buf, NULL);
+ m_caster->TextEmote(buf);
break;
}
// Roll 'dem Bones - Worn Troll Dice
@@ -3809,7 +3809,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
if (m_caster->getGender() > 0)
gender = "her";
sprintf(buf, "%s causually tosses %s [Worn Troll Dice]. One %u and one %u.", m_caster->GetName().c_str(), gender, urand(1, 6), urand(1, 6));
- m_caster->MonsterTextEmote(buf, NULL);
+ m_caster->TextEmote(buf);
break;
}
// Death Knight Initiate Visual
@@ -5783,14 +5783,18 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex)
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
return;
- if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
+ if (!unitTarget)
+ return;
+
+ Player* player = unitTarget->ToPlayer();
+ if (!player)
return;
switch (m_spellInfo->Id)
{
case 58730: // Restricted Flight Area
case 58600: // Restricted Flight Area
- unitTarget->ToPlayer()->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE);
+ player->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE);
break;
default:
break;
@@ -5804,9 +5808,7 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex)
return;
}
- WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(soundId);
- unitTarget->ToPlayer()->GetSession()->SendPacket(&data);
+ player->PlayDirectSound(soundId, player);
}
void Spell::EffectRemoveAura(SpellEffIndex effIndex)
diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h
new file mode 100644
index 00000000000..72f80bb07a3
--- /dev/null
+++ b/src/server/game/Texts/ChatTextBuilder.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2008-2014 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/>.
+ */
+
+#ifndef __CHATTEXT_BUILDER_H
+#define __CHATTEXT_BUILDER_H
+
+#include "Chat.h"
+#include "ObjectMgr.h"
+
+namespace Trinity
+{
+ class BroadcastTextBuilder
+ {
+ public:
+ BroadcastTextBuilder(Unit const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, uint32 achievementId = 0)
+ : _source(obj), _msgType(msgType), _textId(textId), _target(target), _achievementId(achievementId) { }
+
+ void operator()(WorldPacket& data, LocaleConstant locale)
+ {
+ BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
+ ChatHandler::BuildChatPacket(data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale);
+ }
+
+ size_t operator()(WorldPacket* data, LocaleConstant locale) const
+ {
+ BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
+ return ChatHandler::BuildChatPacket(*data, _msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale);
+ }
+
+ private:
+ Unit const* _source;
+ ChatMsg _msgType;
+ uint32 _textId;
+ WorldObject const* _target;
+ uint32 _achievementId;
+ };
+
+ class CustomChatTextBuilder
+ {
+ public:
+ CustomChatTextBuilder(WorldObject const* obj, ChatMsg msgType, std::string const& text, Language language = LANG_UNIVERSAL, WorldObject const* target = nullptr)
+ : _source(obj), _msgType(msgType), _text(text), _language(language), _target(target) { }
+
+ void operator()(WorldPacket& data, LocaleConstant locale)
+ {
+ ChatHandler::BuildChatPacket(data, _msgType, _language, _source, _target, _text, 0, "", locale);
+ }
+
+ private:
+ WorldObject const* _source;
+ ChatMsg _msgType;
+ std::string _text;
+ Language _language;
+ WorldObject const* _target;
+ };
+}
+// namespace Trinity
+
+#endif // __CHATTEXT_BUILDER_H
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 58e3cffa8de..35ad588c0aa 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1702,9 +1702,6 @@ void World::SetInitialWorldSettings()
sObjectMgr->LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data)
sObjectMgr->LoadWaypointScripts();
- TC_LOG_INFO("server.loading", "Loading Scripts text locales..."); // must be after Load*Scripts calls
- sObjectMgr->LoadDbScriptStrings();
-
TC_LOG_INFO("server.loading", "Loading spell script names...");
sObjectMgr->LoadSpellScriptNames();
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 3e7b242f3cc..e248a835ee0 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -2266,7 +2266,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)
{
@@ -2452,7 +2452,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 66988b499d2..00e5fc22d92 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -761,8 +761,8 @@ public:
handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value);
handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
- for (uint8 i = 0; i < MAX_MECHANIC; ++i)
- if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value)
+ for (uint8 i = 1; i < MAX_MECHANIC; ++i)
+ if (mechanicImmuneMask & (1 << (mechanicImmunes[i].Value - 1)))
handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value);
return true;
@@ -1222,7 +1222,7 @@ public:
return false;
}
- creature->MonsterSay(args, LANG_UNIVERSAL, NULL);
+ creature->Say(args, LANG_UNIVERSAL);
// make some emotes
char lastchar = args[strlen(args) - 1];
@@ -1251,7 +1251,7 @@ public:
return false;
}
- creature->MonsterTextEmote(args, 0);
+ creature->TextEmote(args);
return true;
}
@@ -1297,14 +1297,29 @@ public:
static bool HandleNpcWhisperCommand(ChatHandler* handler, char const* args)
{
if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
return false;
+ }
char* receiver_str = strtok((char*)args, " ");
char* text = strtok(NULL, "");
+ if (!receiver_str || !text)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
Creature* creature = handler->getSelectedCreature();
- if (!creature || !receiver_str || !text)
+ if (!creature)
+ {
+ handler->SendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
return false;
+ }
uint64 receiver_guid = atol(receiver_str);
@@ -1313,14 +1328,18 @@ public:
if (handler->HasLowerSecurity(receiver, 0))
return false;
- creature->MonsterWhisper(text, receiver);
+ creature->Whisper(text, LANG_UNIVERSAL, receiver);
return true;
}
static bool HandleNpcYellCommand(ChatHandler* handler, char const* args)
{
if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
return false;
+ }
Creature* creature = handler->getSelectedCreature();
if (!creature)
@@ -1330,7 +1349,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_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 70aacbfc227..5f061fab595 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -88,7 +88,6 @@ public:
{ "creature_queststarter", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTSTARTER, true, &HandleReloadCreatureQuestStarterCommand, "", NULL },
{ "creature_summon_groups", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_SUMMON_GROUPS, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
{ "creature_template", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_TEMPLATE, true, &HandleReloadCreatureTemplateCommand, "", NULL },
- //{ "db_script_string", rbac::RBAC_PERM_COMMAND_RELOAD_, true, &HandleReloadDbScriptStringCommand, "", NULL },
{ "disables", rbac::RBAC_PERM_COMMAND_RELOAD_DISABLES, true, &HandleReloadDisablesCommand, "", NULL },
{ "disenchant_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesDisenchantCommand, "", NULL },
{ "event_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS, true, &HandleReloadEventScriptsCommand, "", NULL },
@@ -266,7 +265,6 @@ public:
HandleReloadEventScriptsCommand(handler, "a");
HandleReloadSpellScriptsCommand(handler, "a");
handler->SendGlobalGMSysMessage("DB tables `*_scripts` reloaded.");
- HandleReloadDbScriptStringCommand(handler, "a");
HandleReloadWpScriptsCommand(handler, "a");
HandleReloadWpCommand(handler, "a");
return true;
@@ -960,14 +958,6 @@ public:
return true;
}
- static bool HandleReloadDbScriptStringCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO("misc", "Re-Loading Script strings from `db_script_string`...");
- sObjectMgr->LoadDbScriptStrings();
- handler->SendGlobalGMSysMessage("DB table `db_script_string` reloaded.");
- return true;
- }
-
static bool HandleReloadGameGraveyardZoneCommand(ChatHandler* handler, const char* /*args*/)
{
TC_LOG_INFO("misc", "Re-Loading Graveyard-zone links...");
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index 647d8b49c1b..0c11c77af6a 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;
}
@@ -267,7 +267,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/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index ca46ff36079..651e487522d 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -72,7 +72,7 @@ public:
void Reset() override
{
Initialize();
-
+ events.Reset();
summons.DespawnAll();
}
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index c5f4f9cdbf9..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,13 +237,6 @@ class instance_deadmines : public InstanceMapScript
return 0;
}
-
- void DoPlaySound(GameObject* unit, uint32 sound)
- {
- WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(sound);
- 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/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
index b218e3f2978..c5f7a5da6d7 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
@@ -21,7 +21,7 @@
enum Spells
{
SPELL_CURSE_OF_BLOOD = 24673,
- SPELL_ILLUSION = 17773,
+ SPELL_ILLUSION = 17773
};
enum Events
@@ -113,7 +113,7 @@ public:
CreatureAI* GetAI(Creature* creature) const override
{
- return new boss_jandicebarovAI(creature);
+ return GetInstanceAI<boss_jandicebarovAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
index 897799a708c..348e2212870 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
@@ -81,7 +81,7 @@ public:
events.ScheduleEvent(EVENT_ICE_ARMOR, 180000);
break;
case EVENT_FROSTBOLT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
DoCast(target, SPELL_FROSTBOLT);
events.ScheduleEvent(EVENT_FROSTBOLT, 8000);
break;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
index 792649f2998..f5b1dc34062 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
@@ -89,6 +89,7 @@ public:
case EVENT_BLAST_WAVE:
DoCast(me, SPELL_BLAST_WAVE);
events.ScheduleEvent(EVENT_BLAST_WAVE, 12000);
+ break;
case EVENT_FRENZY:
DoCast(me, SPELL_FRENZY);
Talk(EMOTE_FRENZY);
@@ -106,7 +107,6 @@ public:
EventMap events;
};
-
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_vectusAI(creature);
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/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index 3c9d4397d24..077597e4706 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -306,7 +306,7 @@ class boss_hexlord_malacrass : public CreatureScript
instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS);
DoZoneInCombat();
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_AGGRO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_AGGRO);
for (uint8 i = 0; i < 4; ++i)
@@ -327,11 +327,11 @@ class boss_hexlord_malacrass : public CreatureScript
switch (urand(0, 1))
{
case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE);
break;
case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO);
break;
}
@@ -341,7 +341,7 @@ class boss_hexlord_malacrass : public CreatureScript
{
instance->SetData(DATA_HEXLORDEVENT, DONE);
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_DEATH, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_DEATH);
for (uint8 i = 0; i < 4; ++i)
@@ -415,7 +415,7 @@ class boss_hexlord_malacrass : public CreatureScript
if (DrainPower_Timer <= diff)
{
DoCast(me, SPELL_DRAIN_POWER, true);
- me->MonsterYell(YELL_DRAIN_POWER, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_DRAIN_POWER, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER);
DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear
} else DrainPower_Timer -= diff;
@@ -427,7 +427,7 @@ class boss_hexlord_malacrass : public CreatureScript
else
{
DoCast(me, SPELL_SPIRIT_BOLTS, false);
- me->MonsterYell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_SPIRIT_BOLTS);
SpiritBolts_Timer = 40000;
SiphonSoul_Timer = 10000; // ready to drain
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index c9c028021f1..279ca60a484 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
@@ -227,7 +227,7 @@ class boss_nalorakk : public CreatureScript
case 0:
if (me->IsWithinDistInMap(who, 50))
{
- me->MonsterYell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1);
(*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]);
@@ -240,7 +240,7 @@ class boss_nalorakk : public CreatureScript
case 2:
if (me->IsWithinDistInMap(who, 40))
{
- me->MonsterYell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2);
(*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]);
@@ -253,7 +253,7 @@ class boss_nalorakk : public CreatureScript
case 5:
if (me->IsWithinDistInMap(who, 40))
{
- me->MonsterYell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3);
(*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]);
@@ -268,7 +268,7 @@ class boss_nalorakk : public CreatureScript
{
SendAttacker(who);
- me->MonsterYell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -287,7 +287,7 @@ class boss_nalorakk : public CreatureScript
{
instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS);
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_AGGRO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_AGGRO);
DoZoneInCombat();
}
@@ -296,7 +296,7 @@ class boss_nalorakk : public CreatureScript
{
instance->SetData(DATA_NALORAKKEVENT, DONE);
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_DEATH, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_DEATH);
}
@@ -305,11 +305,11 @@ class boss_nalorakk : public CreatureScript
switch (urand(0, 1))
{
case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE);
break;
case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO);
break;
}
@@ -373,7 +373,7 @@ class boss_nalorakk : public CreatureScript
if (Berserk_Timer <= diff)
{
DoCast(me, SPELL_BERSERK, true);
- me->MonsterYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_BERSERK, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_BERSERK);
Berserk_Timer = 600000;
} else Berserk_Timer -= diff;
@@ -383,7 +383,7 @@ class boss_nalorakk : public CreatureScript
if (inBearForm)
{
// me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
- me->MonsterYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_TOTROLL);
me->RemoveAurasDueToSpell(SPELL_BEARFORM);
Surge_Timer = urand(15000, 20000);
@@ -395,7 +395,7 @@ class boss_nalorakk : public CreatureScript
else
{
// me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
- me->MonsterYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_TOBEAR);
DoCast(me, SPELL_BEARFORM, true);
LaceratingSlash_Timer = 2000; // dur 18s
@@ -426,7 +426,7 @@ class boss_nalorakk : public CreatureScript
if (Surge_Timer <= diff)
{
- me->MonsterYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SURGE, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_SURGE);
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true);
if (target)
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 84f650ec9f4..598717a1c3b 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -280,7 +280,7 @@ public:
{
case 0:
if (WaitTimer == WAIT_SECS)
- me->MonsterSay(NPCSAY_INIT, LANG_UNIVERSAL, NULL); //no blizzlike
+ me->Say(NPCSAY_INIT, LANG_UNIVERSAL); //no blizzlike
if (WaitTimer <= diff)
{
@@ -310,7 +310,7 @@ public:
{
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
{
- me->MonsterSay(NPCSAY_END, LANG_UNIVERSAL, NULL); //not blizzlike
+ me->Say(NPCSAY_END, LANG_UNIVERSAL); //not blizzlike
player->GroupEventHappens(QUEST_PYREWOOD_AMBUSH, me);
}
}
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 6c718a4a16a..69eba98f406 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"
/* Battle of Mount Hyjal encounters:
@@ -185,15 +184,12 @@ 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 << 10986;
- 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_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
index 0a666488e84..fa87247f19f 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
@@ -87,14 +87,14 @@ public:
{
Initialize();
- instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_EPOCH, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
- instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_EPOCH, IN_PROGRESS);
}
void UpdateAI(uint32 diff) override
@@ -136,7 +136,7 @@ public:
{
Talk(SAY_DEATH);
- instance->SetData(DATA_EPOCH_EVENT, DONE);
+ instance->SetBossState(DATA_EPOCH, DONE);
}
void KilledUnit(Unit* victim) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
index f3333c0b0b6..d693ec38e44 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
@@ -22,7 +22,9 @@
enum Spells
{
SPELL_CORRUPTING_BLIGHT = 60588,
- SPELL_VOID_STRIKE = 60590
+ SPELL_VOID_STRIKE = 60590,
+ SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
+ SPELL_CORRUPTION_OF_TIME_TARGET = 60451
};
enum Yells
@@ -32,52 +34,78 @@ enum Yells
SAY_FAIL = 2
};
-class boss_infinite_corruptor : public CreatureScript
+enum Events
{
-public:
- boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { }
+ EVENT_CORRUPTING_BLIGHT = 1,
+ EVENT_VOID_STRIKE
+};
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_infinite_corruptorAI>(creature);
- }
+class boss_infinite_corruptor : public CreatureScript
+{
+ public:
+ boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { }
- struct boss_infinite_corruptorAI : public ScriptedAI
- {
- boss_infinite_corruptorAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_infinite_corruptorAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_infinite_corruptorAI(Creature* creature) : BossAI(creature, DATA_INFINITE) { }
- InstanceScript* instance;
+ void Reset() override
+ {
+ _Reset();
- void Reset() override
- {
- instance->SetData(DATA_INFINITE_EVENT, NOT_STARTED);
- }
+ if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
+ {
+ DoCast((Unit*)NULL, SPELL_CORRUPTION_OF_TIME_CHANNEL, false);
+ guardian->CastSpell(guardian, SPELL_CORRUPTION_OF_TIME_TARGET, false);
+ }
+ }
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS);
- }
+ void EnterCombat(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 7000);
+ events.ScheduleEvent(EVENT_VOID_STRIKE, 5000);
+ }
- void UpdateAI(uint32 /*diff*/) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
- DoMeleeAttackIfReady();
- }
+ if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
+ {
+ guardian->RemoveAurasDueToSpell(SPELL_CORRUPTION_OF_TIME_TARGET);
+ guardian->DespawnOrUnsummon(5000);
+ }
- void JustDied(Unit* /*killer*/) override
+ if (Creature* rift = me->FindNearestCreature(NPC_TIME_RIFT, 100.0f))
+ rift->DespawnOrUnsummon();
+ }
+
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_CORRUPTING_BLIGHT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
+ DoCast(target, SPELL_CORRUPTING_BLIGHT);
+ events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 17000);
+ break;
+ case EVENT_VOID_STRIKE:
+ DoCastVictim(SPELL_VOID_STRIKE);
+ events.ScheduleEvent(EVENT_VOID_STRIKE, 5000);
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- Talk(SAY_DEATH);
- instance->SetData(DATA_INFINITE_EVENT, DONE);
+ return GetInstanceAI<boss_infinite_corruptorAI>(creature);
}
- };
-
};
void AddSC_boss_infinite_corruptor()
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 d9356b724c0..7b3314ef4e9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -26,15 +26,13 @@ Script Data End */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "culling_of_stratholme.h"
+#include "Player.h"
enum Spells
{
SPELL_CARRION_SWARM = 52720, //A cresting wave of chaotic magic splashes over enemies in front of the caster, dealing 3230 to 3570 Shadow damage and 380 to 420 Shadow damage every 3 sec. for 15 sec.
- H_SPELL_CARRION_SWARM = 58852,
SPELL_MIND_BLAST = 52722, //Inflicts 4163 to 4837 Shadow damage to an enemy.
- H_SPELL_MIND_BLAST = 58850,
SPELL_SLEEP = 52721, //Puts an enemy to sleep for up to 10 sec. Any damage caused will awaken the target.
- H_SPELL_SLEEP = 58849,
SPELL_VAMPIRIC_TOUCH = 52723, //Heals the caster for half the damage dealt by a melee attack.
SPELL_MAL_GANIS_KILL_CREDIT = 58124, // Quest credit
SPELL_KILL_CREDIT = 58630 // Non-existing spell as encounter credit, created in spell_dbc
@@ -75,7 +73,6 @@ public:
{
Initialize();
instance = creature->GetInstanceScript();
- uiOutroStep = 0;
}
void Initialize()
@@ -108,14 +105,13 @@ public:
void Reset() override
{
Initialize();
-
- instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAL_GANIS, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
- instance->SetData(DATA_MAL_GANIS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MAL_GANIS, IN_PROGRESS);
}
void DamageTaken(Unit* done_by, uint32 &damage) override
@@ -159,7 +155,7 @@ public:
{
EnterEvadeMode();
me->DisappearAndDie();
- instance->SetData(DATA_MAL_GANIS_EVENT, FAIL);
+ instance->SetBossState(DATA_MAL_GANIS, FAIL);
}
if (uiCarrionSwarmTimer < diff)
@@ -197,7 +193,7 @@ public:
switch (uiOutroStep)
{
case 1:
- Talk(SAY_ESCAPE_SPEECH_1);
+ Talk(SAY_OUTRO);
me->GetMotionMaster()->MoveTargetedHome();
++uiOutroStep;
uiOutroTimer = 8000;
@@ -212,7 +208,7 @@ public:
case 3:
Talk(SAY_OUTRO);
++uiOutroStep;
- uiOutroTimer = 16000;
+ //uiOutroTimer = 16000;
break;
case 4:
me->HandleEmoteCommand(33);
@@ -232,8 +228,8 @@ public:
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_MAL_GANIS_EVENT, DONE);
- DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT);
+ instance->SetBossState(DATA_MAL_GANIS, DONE);
+ 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_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
index c961bf9b2c6..10ee66c86d0 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
@@ -15,14 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss meathook
-SDAuthor: Tartalo
-SD%Complete: 100
-SDComment: It may need timer adjustment
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "culling_of_stratholme.h"
@@ -30,9 +22,7 @@ Script Data End */
enum Spells
{
SPELL_CONSTRICTING_CHAINS = 52696, //Encases the targets in chains, dealing 1800 Physical damage every 1 sec. and stunning the target for 5 sec.
- H_SPELL_CONSTRICTING_CHAINS = 58823,
SPELL_DISEASE_EXPULSION = 52666, //Meathook belches out a cloud of disease, dealing 1710 to 1890 Nature damage and interrupting the spell casting of nearby enemy targets for 4 sec.
- H_SPELL_DISEASE_EXPULSION = 58824,
SPELL_FRENZY = 58841 //Increases the caster's Physical damage by 10% for 30 sec.
};
@@ -44,96 +34,73 @@ enum Yells
SAY_DEATH = 3
};
-class boss_meathook : public CreatureScript
+enum Events
{
-public:
- boss_meathook() : CreatureScript("boss_meathook") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_meathookAI>(creature);
- }
-
- struct boss_meathookAI : public ScriptedAI
- {
- boss_meathookAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- Talk(SAY_SPAWN);
- }
-
- void Initialize()
- {
- uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
- uiDiseaseTimer = urand(2000, 4000); //approx 3s
- uiFrenzyTimer = urand(21000, 26000); //made it up
- }
-
- uint32 uiChainTimer;
- uint32 uiDiseaseTimer;
- uint32 uiFrenzyTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
-
- instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED);
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ EVENT_CHAIN = 1,
+ EVENT_DISEASE,
+ EVENT_FRENZY
+};
- instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS);
- }
+class boss_meathook : public CreatureScript
+{
+ public:
+ boss_meathook() : CreatureScript("boss_meathook") { }
- void UpdateAI(uint32 diff) override
+ struct boss_meathookAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- if (uiDiseaseTimer <= diff)
+ boss_meathookAI(Creature* creature) : BossAI(creature, DATA_MEATHOOK)
{
- DoCastAOE(SPELL_DISEASE_EXPULSION);
- uiDiseaseTimer = urand(1500, 4000);
- } else uiDiseaseTimer -= diff;
+ Talk(SAY_SPAWN);
+ }
- if (uiFrenzyTimer <= diff)
+ void EnterCombat(Unit* /*who*/) override
{
- DoCast(me, SPELL_FRENZY);
- uiFrenzyTimer = urand(21000, 26000);
- } else uiFrenzyTimer -= diff;
-
- if (uiChainTimer <= diff)
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_CHAIN, urand(12000, 17000));
+ events.ScheduleEvent(EVENT_DISEASE, urand(2000, 4000));
+ events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000));
+ }
+
+ void ExecuteEvent(uint32 eventId) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_CONSTRICTING_CHAINS); //anyone but the tank
- uiChainTimer = urand(2000, 4000);
- } else uiChainTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ switch (eventId)
+ {
+ case EVENT_CHAIN:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_CONSTRICTING_CHAINS);
+ events.ScheduleEvent(EVENT_CHAIN, urand(2000, 4000));
+ break;
+ case EVENT_DISEASE:
+ DoCastAOE(SPELL_DISEASE_EXPULSION);
+ events.ScheduleEvent(EVENT_DISEASE, urand(1500, 4000));
+ break;
+ case EVENT_FRENZY:
+ DoCast(me, SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- instance->SetData(DATA_MEATHOOK_EVENT, 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_meathookAI>(creature);
}
- };
-
};
void AddSC_boss_meathook()
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 1c35a38a5e3..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->SetData(DATA_SALRAMM_EVENT, 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->SetData(DATA_SALRAMM_EVENT, 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->SetData(DATA_SALRAMM_EVENT, 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/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index b8a9b295161..3c80be2734a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -103,7 +103,7 @@ enum Says
//Drakonian
SAY_PHASE302 = 0,
- SAY_PHASE305 = 1,
+ SAY_PHASE305 = 1
};
enum NPCs
@@ -111,7 +111,6 @@ enum NPCs
NPC_INFINITE_ADVERSARY = 27742,
NPC_INFINITE_HUNTER = 27743,
NPC_INFINITE_AGENT = 27744,
- NPC_TIME_RIFT = 28409,
NPC_ZOMBIE = 27737,
NPC_GHOUL = 28249,
NPC_NECROMANCER = 28200,
@@ -128,7 +127,7 @@ enum NPCs
NPC_CITY_MAN = 28167,
NPC_CITY_MAN2 = 28169,
NPC_CITY_MAN3 = 31126,
- NPC_CITY_MAN4 = 31127,
+ NPC_CITY_MAN4 = 31127
};
enum Spells
@@ -138,7 +137,7 @@ enum Spells
SPELL_EXORCISM_N = 52445,
SPELL_EXORCISM_H = 58822,
SPELL_HOLY_LIGHT = 52444,
- SPELL_ARCANE_DISRUPTION = 49590,
+ SPELL_ARCANE_DISRUPTION = 49590
};
enum GossipMenuArthas
@@ -392,6 +391,7 @@ public:
uint32 gossipStep;
uint32 bossEvent;
uint32 wave;
+ uint32 WavesCounter;
uint64 utherGUID;
uint64 jainaGUID;
@@ -411,17 +411,19 @@ public:
{
Initialize();
- instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED);
- switch (instance->GetData(DATA_ARTHAS_EVENT))
- {
- case NOT_STARTED:
- bStepping = true;
- step = 0;
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- bossEvent = DATA_MEATHOOK_EVENT;
- gossipStep = 0;
- break;
- }
+ instance->SetBossState(DATA_ARTHAS, NOT_STARTED);
+
+ bStepping = true;
+ step = 0;
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ bossEvent = DATA_MEATHOOK;
+ gossipStep = 0;
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (who && !who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
+ npc_escortAI::AttackStart(who);
}
void EnterCombat(Unit* /*who*/) override
@@ -431,7 +433,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_ARTHAS_EVENT, FAIL);
+ instance->SetBossState(DATA_ARTHAS, FAIL);
}
void SpawnTimeRift(uint32 timeRiftID, uint64* guidVector)
@@ -488,16 +490,15 @@ public:
case 11:
case 22:
case 23:
- case 26:
case 55:
case 56:
SetHoldState(true);
bStepping = true;
break;
case 7:
- if (Unit* cityman0 = me->SummonCreature(NPC_CITY_MAN, 2091.977f, 1275.021f, 140.757f, 0.558f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
+ if (Unit* cityman0 = me->FindNearestCreature(NPC_CITY_MAN, 160.0f))
citymenGUID[0] = cityman0->GetGUID();
- if (Unit* cityman1 = me->SummonCreature(NPC_CITY_MAN2, 2093.514f, 1275.842f, 140.408f, 3.801f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
+ if (Unit* cityman1 = me->FindNearestCreature(NPC_CITY_MAN2, 160.0f))
citymenGUID[1] = cityman1->GetGUID();
break;
case 8:
@@ -534,10 +535,12 @@ public:
case 21:
Talk(SAY_PHASE301);
break;
- case 25:
+ case 26:
SetRun(false);
SpawnTimeRift(0, &infiniteDraconianGUID[0]);
Talk(SAY_PHASE307);
+ SetHoldState(true);
+ bStepping = true;
break;
case 29:
SetRun(false);
@@ -565,8 +568,8 @@ public:
Talk(SAY_PHASE403);
break;
case 36:
- if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_SHKAF_GATE)))
- pGate->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_SHKAF_GATE)))
+ gate->SetGoState(GO_STATE_ACTIVE);
break;
case 45:
SetRun(true);
@@ -575,18 +578,18 @@ public:
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
SetHoldState(true);
break;
- case 47:
+ case 48:
SetRun(false);
Talk(SAY_PHASE405);
break;
- case 48:
+ case 49:
SetRun(true);
Talk(SAY_PHASE406);
break;
- case 53:
+ case 50:
Talk(SAY_PHASE407);
break;
- case 54:
+ case 51:
gossipStep = 5;
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
SetHoldState(true);
@@ -598,8 +601,6 @@ public:
{
npc_escortAI::UpdateAI(diff);
- DoMeleeAttackIfReady();
-
if (bStepping)
{
if (phaseTimer <= diff)
@@ -765,6 +766,9 @@ public:
stalkerGUID = pStalker->GetGUID();
me->SetTarget(stalkerGUID);
}
+
+ instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 0);
+
JumpToNextStep(1000);
break;
case 25:
@@ -892,14 +896,15 @@ public:
}
Talk(SAY_PHASE209);
- bossEvent = DATA_MEATHOOK_EVENT;
- instance->SetData(DATA_ARTHAS_EVENT, IN_PROGRESS);
+ bossEvent = DATA_MEATHOOK;
+ instance->SetBossState(DATA_ARTHAS, IN_PROGRESS);
me->SetReactState(REACT_DEFENSIVE);
SetDespawnAtFar(false);
JumpToNextStep(5000);
break;
- case 41: //Summon wave group
+ // Summon wave groups - start the Infinite Corruptor timer
+ case 41:
case 43:
case 45:
case 47:
@@ -907,10 +912,15 @@ public:
case 53:
case 55:
case 57:
- if (instance->GetData(bossEvent) != DONE)
+ if (!wave && IsHeroic() && instance->GetData(DATA_INFINITE_COUNTER) == NOT_STARTED)
+ instance->SetData(DATA_INFINITE_COUNTER, IN_PROGRESS);
+
+ if (instance->GetBossState(bossEvent) != DONE)
{
SpawnWaveGroup(wave, waveGUID);
wave++;
+ WavesCounter++;
+ instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter);
}
JumpToNextStep(500);
break;
@@ -922,7 +932,7 @@ public:
case 54:
case 56:
case 58:
- if (instance->GetData(bossEvent) != DONE)
+ if (instance->GetBossState(bossEvent) != DONE)
{
uint32 mobCounter = 0;
uint32 deadCounter = 0;
@@ -946,12 +956,14 @@ public:
break;
case 49: //Summon Boss
case 59:
- if (instance->GetData(bossEvent) != DONE)
+ if (instance->GetBossState(bossEvent) != DONE)
{
+ WavesCounter++;
+ instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter);
uint32 uiBossID = 0;
- if (bossEvent == DATA_MEATHOOK_EVENT)
+ if (bossEvent == DATA_MEATHOOK)
uiBossID = NPC_MEATHOOK;
- else if (bossEvent == DATA_SALRAMM_EVENT)
+ else if (bossEvent == DATA_SALRAMM)
uiBossID = NPC_SALRAMM;
if (Unit* pBoss = me->SummonCreature(uiBossID, 2232.19f, 1331.933f, 126.662f, 3.15f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000))
@@ -965,19 +977,19 @@ public:
break;
case 50: //Wait Boss death
case 60:
- if (instance->GetData(bossEvent) == DONE)
+ if (instance->GetBossState(bossEvent) == DONE)
{
JumpToNextStep(1000);
- if (bossEvent == DATA_MEATHOOK_EVENT)
- bossEvent = DATA_SALRAMM_EVENT;
- else if (bossEvent == DATA_SALRAMM_EVENT)
+ if (bossEvent == DATA_MEATHOOK)
+ bossEvent = DATA_SALRAMM;
+ else if (bossEvent == DATA_SALRAMM)
{
SetHoldState(false);
bStepping = false;
- bossEvent = DATA_EPOCH_EVENT;
+ bossEvent = DATA_EPOCH;
}
}
- else if (instance->GetData(bossEvent) == FAIL)
+ else if (instance->GetBossState(bossEvent) == FAIL)
npc_escortAI::EnterEvadeMode();
else
phaseTimer = 10000;
@@ -1074,9 +1086,12 @@ public:
phaseTimer = 1000;
else
{
- if (step == 72) Talk(SAY_PHASE308);
- if (step == 74) Talk(SAY_PHASE308);
- if (step == 76) Talk(SAY_PHASE310);
+ if (step == 72)
+ Talk(SAY_PHASE308);
+ if (step == 74)
+ Talk(SAY_PHASE308);
+ if (step == 76)
+ Talk(SAY_PHASE310);
SetHoldState(false);
bStepping = false;
SetRun(true);
@@ -1097,7 +1112,7 @@ public:
JumpToNextStep(1000);
break;
case 80:
- if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
+ if (instance->GetBossState(DATA_EPOCH) != DONE)
{
SpawnTimeRift(17, &epochGUID);
if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID))
@@ -1107,12 +1122,12 @@ public:
JumpToNextStep(18000);
break;
case 81:
- if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
+ if (instance->GetBossState(DATA_EPOCH) != DONE)
Talk(SAY_PHASE315);
JumpToNextStep(6000);
break;
case 82:
- if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
+ if (instance->GetBossState(DATA_EPOCH) != DONE)
{
if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID))
{
@@ -1126,15 +1141,15 @@ public:
JumpToNextStep(1000);
break;
case 83:
- if (instance->GetData(DATA_EPOCH_EVENT) == DONE)
+ if (instance->GetBossState(DATA_EPOCH) == DONE)
{
gossipStep = 3;
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
bStepping = false;
- bossEvent = DATA_MAL_GANIS_EVENT;
+ bossEvent = DATA_MAL_GANIS;
JumpToNextStep(15000);
}
- else if (instance->GetData(DATA_EPOCH_EVENT) == FAIL)
+ else if (instance->GetBossState(DATA_EPOCH) == FAIL)
npc_escortAI::EnterEvadeMode();
else
phaseTimer = 10000;
@@ -1153,8 +1168,8 @@ public:
malganisGUID = malganis->GetGUID();
malganis->SetReactState(REACT_PASSIVE);
}
- if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_MAL_GANIS_GATE_1)))
- pGate->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_MAL_GANIS_GATE_1)))
+ gate->SetGoState(GO_STATE_ACTIVE);
SetHoldState(false);
bStepping = false;
JumpToNextStep(0);
@@ -1174,12 +1189,12 @@ public:
JumpToNextStep(1000);
break;
case 88:
- if (instance->GetData(DATA_MAL_GANIS_EVENT) == DONE)
+ if (instance->GetBossState(DATA_MAL_GANIS) == DONE)
{
SetHoldState(false);
JumpToNextStep(1000);
}
- else if (instance->GetData(DATA_MAL_GANIS_EVENT) == FAIL)
+ else if (instance->GetBossState(DATA_MAL_GANIS) == FAIL)
npc_escortAI::EnterEvadeMode();
else
phaseTimer = 10000;
@@ -1192,7 +1207,7 @@ public:
JumpToNextStep(7000);
break;
case 90:
- instance->SetData(DATA_ARTHAS_EVENT, DONE); //Rewards: Achiev & Chest ;D
+ instance->SetBossState(DATA_ARTHAS, DONE); //Rewards: Achiev & Chest ;D
me->SetTarget(instance->GetData64(DATA_MAL_GANIS_GATE_2)); //Look behind
Talk(SAY_PHASE504);
bStepping = false;
@@ -1214,6 +1229,8 @@ public:
if (HealthBelowPct(40))
DoCast(me, SPELL_HOLY_LIGHT);
+
+ DoMeleeAttackIfReady();
}
};
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
index e7d1033e55f..192654c87f1 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
@@ -19,19 +19,10 @@
#define DEF_CULLING_OF_STRATHOLME_H
#define DataHeader "CS"
+#define CoSScriptName "instance_culling_of_stratholme"
+uint32 const EncounterCount = 5;
-enum Data
-{
- DATA_MEATHOOK_EVENT,
- DATA_SALRAMM_EVENT,
- DATA_EPOCH_EVENT,
- DATA_MAL_GANIS_EVENT,
- DATA_INFINITE_EVENT,
- DATA_ARTHAS_EVENT,
- DATA_CRATE_COUNT,
-};
-
-enum Data64
+enum DataTypes
{
DATA_ARTHAS,
DATA_MEATHOOK,
@@ -39,28 +30,35 @@ enum Data64
DATA_EPOCH,
DATA_MAL_GANIS,
DATA_INFINITE,
+ DATA_CRATE_COUNT,
DATA_SHKAF_GATE,
DATA_MAL_GANIS_GATE_1,
DATA_MAL_GANIS_GATE_2,
DATA_EXIT_GATE,
- DATA_MAL_GANIS_CHEST
+ DATA_MAL_GANIS_CHEST,
+ DATA_INFINITE_COUNTER
};
-enum Creatures
+enum CreatureIds
{
- NPC_MEATHOOK = 26529,
- NPC_SALRAMM = 26530,
- NPC_EPOCH = 26532,
- NPC_MAL_GANIS = 26533,
- NPC_INFINITE = 32273,
- NPC_ARTHAS = 26499,
- NPC_JAINA = 26497,
- NPC_UTHER = 26528,
- NPC_CHROMIE_2 = 27915,
- NPC_GENERIC_BUNNY = 28960,
+ NPC_MEATHOOK = 26529,
+ NPC_SALRAMM = 26530,
+ NPC_EPOCH = 26532,
+ NPC_MAL_GANIS = 26533,
+ NPC_INFINITE = 32273,
+ NPC_ARTHAS = 26499,
+ NPC_JAINA = 26497,
+ NPC_UTHER = 26528,
+ NPC_CHROMIE = 26527,
+ NPC_CHROMIE_2 = 27915,
+ NPC_CHROMIE_3 = 30997,
+ NPC_GENERIC_BUNNY = 28960,
+
+ NPC_TIME_RIFT = 28409,
+ NPC_GUARDIAN_OF_TIME = 32281
};
-enum GameObjects
+enum GameObjectIds
{
GO_SHKAF_GATE = 188686,
GO_MALGANIS_GATE_1 = 187711,
@@ -69,7 +67,7 @@ enum GameObjects
GO_MALGANIS_CHEST_N = 190663,
GO_MALGANIS_CHEST_H = 193597,
GO_SUSPICIOUS_CRATE = 190094,
- GO_PLAGUED_CRATE = 190095,
+ GO_PLAGUED_CRATE = 190095
};
enum WorldStatesCoT
@@ -78,12 +76,28 @@ enum WorldStatesCoT
WORLDSTATE_CRATES_REVEALED = 3480,
WORLDSTATE_WAVE_COUNT = 3504,
WORLDSTATE_TIME_GUARDIAN = 3931,
- WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
+ WORLDSTATE_TIME_GUARDIAN_SHOW = 3932
};
enum CrateSpells
{
- SPELL_CRATES_CREDIT = 58109,
+ SPELL_CRATES_CREDIT = 58109
+};
+
+enum Texts
+{
+ SAY_CRATES_COMPLETED = 0,
+ // Chromie
+ SAY_INFINITE_START = 0, // On Infinite Corruptor event start
+ SAY_INFINITE = 1, // On Infinite Corruptor event at 5 minutes
+ SAY_INFINITE_FAIL = 2, // On Infinite Corruptor event fail
+ // Infinite Corruptor
+ SAY_FAIL_EVENT = 2 // On Infinite Corruptor event fail
+};
+
+enum InstanceEvents
+{
+ EVENT_INFINITE_TIMER = 1
};
#endif
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index 7af2b3f63aa..ab86b5d8f42 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
@@ -23,8 +23,6 @@
#include "TemporarySummon.h"
#include "SpellInfo.h"
-#define MAX_ENCOUNTER 5
-
/* Culling of Stratholme encounters:
0 - Meathook
1 - Salramm the Fleshcrafter
@@ -33,51 +31,52 @@
4 - Infinite Corruptor (Heroic only)
*/
-enum Texts
+Position const ChromieSummonPos[] =
{
- SAY_CRATES_COMPLETED = 0,
+ { 1813.298f, 1283.578f, 142.3258f, 3.878161f },
+ { 2273.725f, 1483.684f, 128.7205f, 6.057528f }
};
-Position const ChromieSummonPos = {1813.298f, 1283.578f, 142.3258f, 3.878161f};
+Position const InfiniteCorruptorPos = { 2335.47f, 1262.04f, 132.921f, 1.42079f };
+Position const TimeRiftPos = { 2334.626f, 1280.45f, 133.0066f, 1.727876f };
+Position const GuardianOfTimePos = { 2321.489f, 1268.383f, 132.8507f, 0.418879f };
+
+DoorData const doorData[] =
+{
+ { GO_MALGANIS_GATE_2, DATA_MAL_GANIS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_EXIT_GATE, DATA_MAL_GANIS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
class instance_culling_of_stratholme : public InstanceMapScript
{
public:
- instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_culling_of_stratholme_InstanceMapScript(map);
- }
+ instance_culling_of_stratholme() : InstanceMapScript(CoSScriptName, 595) { }
struct instance_culling_of_stratholme_InstanceMapScript : public InstanceScript
{
instance_culling_of_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
- _arthasGUID = 0;
- _meathookGUID = 0;
- _salrammGUID = 0;
- _epochGUID = 0;
- _malGanisGUID = 0;
- _infiniteGUID = 0;
- _shkafGateGUID = 0;
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+
+ _chromieGUID = 0;
+ _arthasGUID = 0;
+ _meathookGUID = 0;
+ _salrammGUID = 0;
+ _epochGUID = 0;
+ _malGanisGUID = 0;
+ _infiniteGUID = 0;
+ _shkafGateGUID = 0;
_malGanisGate1GUID = 0;
_malGanisGate2GUID = 0;
- _exitGateGUID = 0;
+ _exitGateGUID = 0;
_malGanisChestGUID = 0;
- _genericBunnyGUID = 0;
- memset(&_encounterState[0], 0, sizeof(uint32) * MAX_ENCOUNTER);
- _crateCount = 0;
- }
-
- bool IsEncounterInProgress() const override
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (_encounterState[i] == IN_PROGRESS)
- return true;
-
- return false;
+ _genericBunnyGUID = 0;
+ _crateCount = 0;
+ _eventTimer = 0;
+ _infiniteCouterState = NOT_STARTED;
}
void FillInitialWorldStates(WorldPacket& data) override
@@ -93,6 +92,9 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
switch (creature->GetEntry())
{
+ case NPC_CHROMIE:
+ _chromieGUID = creature->GetGUID();
+ break;
case NPC_ARTHAS:
_arthasGUID = creature->GetGUID();
break;
@@ -110,10 +112,13 @@ class instance_culling_of_stratholme : public InstanceMapScript
break;
case NPC_INFINITE:
_infiniteGUID = creature->GetGUID();
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 1);
break;
case NPC_GENERIC_BUNNY:
_genericBunnyGUID = creature->GetGUID();
break;
+ default:
+ break;
}
}
@@ -129,55 +134,38 @@ class instance_culling_of_stratholme : public InstanceMapScript
break;
case GO_MALGANIS_GATE_2:
_malGanisGate2GUID = go->GetGUID();
+ AddDoor(go, true);
break;
case GO_EXIT_GATE:
_exitGateGUID = go->GetGUID();
- if (_encounterState[3] == DONE)
- HandleGameObject(_exitGateGUID, true);
+ AddDoor(go, true);
break;
case GO_MALGANIS_CHEST_N:
case GO_MALGANIS_CHEST_H:
_malGanisChestGUID = go->GetGUID();
- if (_encounterState[3] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
+ default:
break;
}
}
- void SetData(uint32 type, uint32 data) override
+ void OnGameObjectRemove(GameObject* go) override
{
- switch (type)
+ switch (go->GetEntry())
{
- case DATA_MEATHOOK_EVENT:
- _encounterState[0] = data;
- break;
- case DATA_SALRAMM_EVENT:
- _encounterState[1] = data;
+ case GO_MALGANIS_GATE_2:
+ case GO_EXIT_GATE:
+ AddDoor(go, false);
break;
- case DATA_EPOCH_EVENT:
- _encounterState[2] = data;
+ default:
break;
- case DATA_MAL_GANIS_EVENT:
- _encounterState[3] = data;
+ }
+ }
- switch (_encounterState[3])
- {
- case NOT_STARTED:
- HandleGameObject(_malGanisGate2GUID, true);
- break;
- case IN_PROGRESS:
- HandleGameObject(_malGanisGate2GUID, false);
- break;
- case DONE:
- HandleGameObject(_exitGateGUID, true);
- if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- break;
- }
- break;
- case DATA_INFINITE_EVENT:
- _encounterState[4] = data;
- break;
+ void SetData(uint32 type, uint32 data) override
+ {
+ switch (type)
+ {
case DATA_CRATE_COUNT:
_crateCount = data;
if (_crateCount == 5)
@@ -186,34 +174,70 @@ class instance_culling_of_stratholme : public InstanceMapScript
bunny->CastSpell(bunny, SPELL_CRATES_CREDIT, true);
// Summon Chromie and global whisper
- if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos))
+ if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos[0]))
if (!instance->GetPlayers().isEmpty())
chromie->AI()->TalkToMap(SAY_CRATES_COMPLETED);
}
DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
break;
+ case DATA_INFINITE_COUNTER:
+ _infiniteCouterState = data;
+ if (data == IN_PROGRESS)
+ {
+ if (!_infiniteGUID)
+ {
+ _eventTimer = 25;
+ instance->SummonCreature(NPC_INFINITE, InfiniteCorruptorPos);
+ instance->SummonCreature(NPC_TIME_RIFT, TimeRiftPos);
+ instance->SummonCreature(NPC_GUARDIAN_OF_TIME, GuardianOfTimePos);
+ events.ScheduleEvent(EVENT_INFINITE_TIMER, 1);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ bool SetBossState(uint32 type, EncounterState state) override
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_INFINITE:
+ if (state == DONE)
+ {
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, 0);
+ }
+ break;
+ case DATA_MAL_GANIS:
+ if (state == DONE)
+ {
+ if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ instance->SummonCreature(NPC_CHROMIE_3, ChromieSummonPos[1]);
+ }
+ break;
+ default:
+ break;
}
- if (data == DONE)
- SaveToDB();
+ return true;
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
- case DATA_MEATHOOK_EVENT:
- return _encounterState[0];
- case DATA_SALRAMM_EVENT:
- return _encounterState[1];
- case DATA_EPOCH_EVENT:
- return _encounterState[2];
- case DATA_MAL_GANIS_EVENT:
- return _encounterState[3];
- case DATA_INFINITE_EVENT:
- return _encounterState[4];
case DATA_CRATE_COUNT:
return _crateCount;
+ case DATA_INFINITE_COUNTER:
+ return _infiniteCouterState;
+ default:
+ break;
}
return 0;
}
@@ -244,58 +268,70 @@ class instance_culling_of_stratholme : public InstanceMapScript
return _exitGateGUID;
case DATA_MAL_GANIS_CHEST:
return _malGanisChestGUID;
+ default:
+ break;
}
return 0;
}
- std::string GetSaveData() override
+ void Update(uint32 diff) override
{
- OUT_SAVE_INST_DATA;
+ events.Update(diff);
- std::ostringstream saveStream;
- saveStream << "C S " << _encounterState[0] << ' ' << _encounterState[1] << ' '
- << _encounterState[2] << ' ' << _encounterState[3] << ' ' << _encounterState[4];
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* in) override
- {
- if (!in)
+ while (uint32 eventId = events.ExecuteEvent())
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3, data4;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
-
- if (dataHead1 == 'C' && dataHead2 == 'S')
- {
- _encounterState[0] = data0;
- _encounterState[1] = data1;
- _encounterState[2] = data2;
- _encounterState[3] = data3;
- _encounterState[4] = data4;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (_encounterState[i] == IN_PROGRESS)
- _encounterState[i] = NOT_STARTED;
-
+ switch (eventId)
+ {
+ case EVENT_INFINITE_TIMER:
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, _eventTimer);
+
+ switch (_eventTimer)
+ {
+ case 25:
+ if (instance->HavePlayers())
+ if (Creature* chromie = instance->GetCreature(_chromieGUID))
+ chromie->AI()->TalkToMap(SAY_INFINITE_START);
+ break;
+ case 5:
+ if (instance->HavePlayers())
+ if (Creature* chromie = instance->GetCreature(_chromieGUID))
+ chromie->AI()->TalkToMap(SAY_INFINITE);
+ break;
+ case 0:
+ if (instance->HavePlayers())
+ if (Creature* chromie = instance->GetCreature(_chromieGUID))
+ chromie->AI()->TalkToMap(SAY_INFINITE_FAIL);
+
+ if (Creature* infinite = instance->GetCreature(_infiniteGUID))
+ {
+ if (Creature* guardian = infinite->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
+ infinite->Kill(guardian);
+
+ if (Creature* rift = infinite->FindNearestCreature(NPC_TIME_RIFT, 100.0f))
+ {
+ infinite->GetMotionMaster()->MovePoint(0, rift->GetPositionX(), rift->GetPositionY(), rift->GetPositionZ());
+ rift->DespawnOrUnsummon(3000);
+ }
+
+ infinite->DespawnOrUnsummon(3000);
+ infinite->AI()->Talk(SAY_FAIL_EVENT);
+ }
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
+ return;
+ default:
+ break;
+ }
+ events.ScheduleEvent(EVENT_INFINITE_TIMER, 60000);
+ --_eventTimer;
+ break;
+ default:
+ break;
+ }
}
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
}
private:
+ uint64 _chromieGUID;
uint64 _arthasGUID;
uint64 _meathookGUID;
uint64 _salrammGUID;
@@ -308,9 +344,18 @@ class instance_culling_of_stratholme : public InstanceMapScript
uint64 _exitGateGUID;
uint64 _malGanisChestGUID;
uint64 _genericBunnyGUID;
- uint32 _encounterState[MAX_ENCOUNTER];
+
uint32 _crateCount;
+ uint32 _eventTimer;
+ uint32 _infiniteCouterState;
+
+ EventMap events;
};
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const override
+ {
+ return new instance_culling_of_stratholme_InstanceMapScript(map);
+ }
};
void AddSC_instance_culling_of_stratholme()
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index 62c85491a20..0a6b2e88b26 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
@@ -153,7 +153,7 @@ public:
SetCombatMovement(true);
_Reset();
-
+ me->SetReactState(REACT_AGGRESSIVE);
instance->SetData(DATA_ONYXIA_PHASE, Phase);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
@@ -162,12 +162,10 @@ public:
{
_EnterCombat();
Talk(SAY_AGGRO);
-
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000));
-
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
@@ -331,9 +329,10 @@ public:
{
if (HealthBelowPct(65))
{
+ if (Unit* target = me->GetVictim())
+ tankGUID = target->GetGUID();
SetCombatMovement(false);
Phase = PHASE_BREATH;
- tankGUID = me->GetVictim()->GetGUID();
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
me->GetMotionMaster()->MovePoint(10, Phase2Location);
diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
index 4803cb4934f..9f8cc818958 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
@@ -45,13 +45,18 @@ public:
{
boss_eckAI(Creature* creature) : BossAI(creature, DATA_ECK_THE_FEROCIOUS_EVENT)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
Berserk = false;
}
void Reset() override
{
_Reset();
- Berserk = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -85,9 +90,8 @@ public:
events.ScheduleEvent(EVENT_SPIT, urand(6 * IN_MILLISECONDS, 14 * IN_MILLISECONDS));
break;
case EVENT_SPRING:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
- if (target->GetTypeId() == TYPEID_PLAYER)
- DoCast(target, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2));
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 35.0f, true))
+ DoCast(target, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2));
events.ScheduleEvent(EVENT_SPRING, urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS));
break;
case EVENT_BERSERK:
@@ -99,11 +103,6 @@ public:
}
}
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
-
private:
bool Berserk;
};
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index ee3069b5eb2..388d43e8dca 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -31,7 +31,7 @@
4 - Eck the Ferocious
*/
-static Position EckSpawnPoint = {1643.877930f, 936.278015f, 107.204948f, 0.668432f};
+Position const EckSpawnPoint = { 1643.877930f, 936.278015f, 107.204948f, 0.668432f };
class instance_gundrak : public InstanceMapScript
{
@@ -136,7 +136,7 @@ public:
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
}
- bool IsEncounterInProgress() const override
+ bool IsEncounterInProgress() const override
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
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/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
index 5b02b7a2009..209e689e615 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
@@ -66,14 +66,22 @@ public:
struct boss_maexxnaAI : public BossAI
{
- boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA) { }
+ boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ enraged = false;
+ }
bool enraged;
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
- enraged = false;
+ Initialize();
events.ScheduleEvent(EVENT_WRAP, 20000);
events.ScheduleEvent(EVENT_SPRAY, 40000);
events.ScheduleEvent(EVENT_SHOCK, urand(5000, 10000));
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
index 94117e9dbbf..0e07ff027f6 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
@@ -72,7 +72,11 @@ public:
struct boss_nothAI : public BossAI
{
- boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) { }
+ boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH)
+ {
+ balconyCount = 0;
+ waveCount = 0;
+ }
void Reset() override
{
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
index 3e8a54f7cec..116cee5f275 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
@@ -61,7 +61,10 @@ public:
struct boss_patchwerkAI : public BossAI
{
- boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) { }
+ boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK)
+ {
+ Enraged = false;
+ }
bool Enraged;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index 0f5320a8fa1..ce5010c972f 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -90,9 +90,19 @@ class boss_sapphiron : public CreatureScript
struct boss_sapphironAI : public BossAI
{
boss_sapphironAI(Creature* creature) :
- BossAI(creature, BOSS_SAPPHIRON), _phase(PHASE_NULL),
- _map(me->GetMap())
- { }
+ BossAI(creature, BOSS_SAPPHIRON), _map(me->GetMap())
+ {
+ Initialize();
+ _iceboltCount = 0;
+ }
+
+ void Initialize()
+ {
+ _phase = PHASE_NULL;
+
+ _canTheHundredClub = true;
+ _checkFrostResistTimer = 5 * IN_MILLISECONDS;
+ }
void InitializeAI() override
{
@@ -115,10 +125,7 @@ class boss_sapphiron : public CreatureScript
if (_phase == PHASE_FLIGHT)
ClearIceBlock();
- _phase = PHASE_NULL;
-
- _canTheHundredClub = true;
- _checkFrostResistTimer = 5 * IN_MILLISECONDS;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index 0dfae16323b..8ae3b5790db 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
@@ -137,6 +137,9 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
me->SetReactState(REACT_PASSIVE);
}
+
+ polaritySwitch = false;
+ uiAddsTimer = 0;
}
bool checkStalaggAlive;
@@ -287,9 +290,16 @@ public:
{
npc_stalaggAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ powerSurgeTimer = urand(20000, 25000);
+ magneticPullTimer = 20000;
+ }
+
InstanceScript* instance;
uint32 powerSurgeTimer;
@@ -300,8 +310,7 @@ public:
if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS)))
if (pThaddius->AI())
pThaddius->AI()->DoAction(ACTION_STALAGG_RESET);
- powerSurgeTimer = urand(20000, 25000);
- magneticPullTimer = 20000;
+ Initialize();
}
void KilledUnit(Unit* /*victim*/) override
@@ -379,9 +388,15 @@ public:
{
npc_feugenAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ staticFieldTimer = 5000;
+ }
+
InstanceScript* instance;
uint32 staticFieldTimer;
@@ -391,7 +406,7 @@ public:
if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS)))
if (pThaddius->AI())
pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET);
- staticFieldTimer = 5000;
+ Initialize();
}
void KilledUnit(Unit* /*victim*/) override
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index 173b6e2d094..2fc49be0903 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -126,6 +126,9 @@ class instance_naxxramas : public InstanceMapScript
SapphironGUID = 0;
KelthuzadGUID = 0;
KelthuzadTriggerGUID = 0;
+ minHorsemenDiedTime = 0;
+ maxHorsemenDiedTime = 0;
+ AbominationCount = 0;
playerDied = 0;
@@ -447,7 +450,6 @@ class instance_naxxramas : public InstanceMapScript
uint64 BaronGUID;
uint64 SirGUID;
uint64 HorsemenChestGUID;
- uint64 HorsemenTeleporterGUID;
time_t minHorsemenDiedTime;
time_t maxHorsemenDiedTime;
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index ac6fd29d8a1..9ba0806ffd2 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -342,16 +342,13 @@ public:
{
boss_malygosAI(Creature* creature) : BossAI(creature, DATA_MALYGOS_EVENT)
{
+ Initialize();
_despawned = false; // We determine if Malygos will be realocated to spawning position on reset triggered by boss despawn on evade
_flySpeed = me->GetSpeed(MOVE_FLIGHT); // Get initial fly speed, otherwise on each wipe fly speed would add up if we get it
}
- void Reset() override
+ void Initialize()
{
- // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner.
- if (!_despawned)
- _Reset();
-
_summonDeaths = 0;
_preparingPulsesChecker = 0;
_arcaneOverloadGUID = 0;
@@ -366,6 +363,15 @@ public:
_firstCyclicMovementStarted = false;
_performingSurgeOfPower = false;
_performingDestroyPlatform = false;
+ }
+
+ void Reset() override
+ {
+ // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner.
+ if (!_despawned)
+ _Reset();
+
+ Initialize();
me->SetDisableGravity(true);
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
@@ -1173,17 +1179,23 @@ public:
{
npc_melee_hover_diskAI(Creature* creature) : VehicleAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
me->SetReactState(REACT_PASSIVE);
// TO DO: These were a bit faster than what they should be. Not sure what is the reason.
me->SetSpeed(MOVE_FLIGHT, 1.25f);
}
+ void Initialize()
+ {
+ _wpCount = 0;
+ }
+
void Reset() override
{
VehicleAI::Reset();
- _wpCount = 0;
+ Initialize();
}
void PassengerBoarded(Unit* unit, int8 /*seat*/, bool apply) override
@@ -1507,10 +1519,7 @@ public:
void IsSummonedBy(Unit* summoner) override
{
if (Creature* creature = summoner->ToCreature())
- {
- _malygos = creature;
- _malygos->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID);
- }
+ creature->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID);
}
void UpdateAI(uint32 /*diff*/)
@@ -1539,7 +1548,6 @@ public:
}
private:
- Creature* _malygos;
InstanceScript* _instance;
};
@@ -1559,6 +1567,7 @@ public:
{
npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature)
{
+ _summoner = NULL;
}
void IsSummonedBy(Unit* summoner) override
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index 1489b78159b..d8a5cfae60d 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
@@ -47,6 +47,8 @@ public:
platformGUID = 0;
exitPortalGUID = 0;
alexstraszaBunnyGUID = 0;
+ heartOfMagicGUID = 0;
+ giftBoxBunnyGUID = 0;
};
bool SetBossState(uint32 type, EncounterState state) override
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
index 019a85c1387..399f2eb8ac2 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
@@ -77,23 +77,28 @@ class boss_anomalus : public CreatureScript
{
boss_anomalusAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ Phase = 0;
+ uiSparkTimer = 5000;
+ uiChaoticRiftGUID = 0;
+ chaosTheory = true;
+ }
+
InstanceScript* instance;
uint8 Phase;
uint32 uiSparkTimer;
- uint32 uiCreateRiftTimer;
uint64 uiChaoticRiftGUID;
bool chaosTheory;
void Reset() override
{
- Phase = 0;
- uiSparkTimer = 5000;
- uiChaoticRiftGUID = 0;
- chaosTheory = true;
+ Initialize();
instance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED);
}
@@ -197,10 +202,17 @@ class npc_chaotic_rift : public CreatureScript
{
npc_chaotic_riftAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ uiChaoticEnergyBurstTimer = 1000;
+ uiSummonCrazedManaWraithTimer = 5000;
+ }
+
InstanceScript* instance;
uint32 uiChaoticEnergyBurstTimer;
@@ -208,8 +220,7 @@ class npc_chaotic_rift : public CreatureScript
void Reset() override
{
- uiChaoticEnergyBurstTimer = 1000;
- uiSummonCrazedManaWraithTimer = 5000;
+ Initialize();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
DoCast(me, SPELL_ARCANEFORM, false);
}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index bfe34ece6cf..7bc4174260b 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -68,9 +68,20 @@ public:
{
boss_keristraszaAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiCrystalfireBreathTimer = 14 * IN_MILLISECONDS;
+ uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30 * IN_MILLISECONDS, 11 * IN_MILLISECONDS);
+ uiTailSweepTimer = 5 * IN_MILLISECONDS;
+ bEnrage = false;
+
+ intenseCold = true;
+ }
+
InstanceScript* instance;
std::list<uint64> intenseColdList;
@@ -83,12 +94,7 @@ public:
void Reset() override
{
- uiCrystalfireBreathTimer = 14*IN_MILLISECONDS;
- uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30*IN_MILLISECONDS, 11*IN_MILLISECONDS);
- uiTailSweepTimer = 5*IN_MILLISECONDS;
- bEnrage = false;
-
- intenseCold = true;
+ Initialize();
intenseColdList.clear();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
index e42d3d2bcfc..c08fd97a76f 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
@@ -72,7 +72,32 @@ public:
{
boss_magus_telestraAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ bFireMagusDead = false;
+ bFrostMagusDead = false;
+ bArcaneMagusDead = false;
+ uiIsWaitingToAppearTimer = 0;
+ }
+
+ void Initialize()
+ {
+ Phase = 0;
+ //These times are probably wrong
+ uiIceNovaTimer = 7 * IN_MILLISECONDS;
+ uiFireBombTimer = 0;
+ uiGravityWellTimer = 15 * IN_MILLISECONDS;
+ uiCooldown = 0;
+
+ uiFireMagusGUID = 0;
+ uiFrostMagusGUID = 0;
+ uiArcaneMagusGUID = 0;
+
+ for (uint8 n = 0; n < 3; ++n)
+ time[n] = 0;
+
+ splitPersonality = 0;
+ bIsWaitingToAppear = false;
}
InstanceScript* instance;
@@ -98,22 +123,7 @@ public:
void Reset() override
{
- Phase = 0;
- //These times are probably wrong
- uiIceNovaTimer = 7*IN_MILLISECONDS;
- uiFireBombTimer = 0;
- uiGravityWellTimer = 15*IN_MILLISECONDS;
- uiCooldown = 0;
-
- uiFireMagusGUID = 0;
- uiFrostMagusGUID = 0;
- uiArcaneMagusGUID = 0;
-
- for (uint8 n = 0; n < 3; ++n)
- time[n] = 0;
-
- splitPersonality = 0;
- bIsWaitingToAppear = false;
+ Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetVisible(true);
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
index 222f0474c01..84523c1864d 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
@@ -68,12 +68,20 @@ public:
struct boss_ormorokAI : public BossAI
{
- boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) { }
+ boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ frenzy = false;
+ }
void Reset()
{
BossAI::Reset();
- frenzy = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
index 3539661ea19..ea23041da6f 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
@@ -57,7 +57,15 @@ class boss_drakos : public CreatureScript
struct boss_drakosAI : public BossAI
{
- boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS) { }
+ boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ postPull = false;
+ }
void Reset() override
{
@@ -67,7 +75,7 @@ class boss_drakos : public CreatureScript
events.ScheduleEvent(EVENT_STOMP, 17000);
events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000);
- postPull = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -150,7 +158,15 @@ class npc_unstable_sphere : public CreatureScript
struct npc_unstable_sphereAI : public ScriptedAI
{
- npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ pulseTimer = 3000;
+ }
void Reset() override
{
@@ -160,7 +176,7 @@ class npc_unstable_sphere : public CreatureScript
me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me);
me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me);
- pulseTimer = 3000;
+ Initialize();
me->DespawnOrUnsummon(19000);
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
index 3ae61bdd116..0dc05cb450d 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
@@ -85,16 +85,24 @@ class boss_eregos : public CreatureScript
struct boss_eregosAI : public BossAI
{
- boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS) { }
+ boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
_phase = PHASE_NORMAL;
_rubyVoid = true;
_emeraldVoid = true;
_amberVoid = true;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
DoAction(ACTION_SET_NORMAL_EVENTS);
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index c4e0986edd4..9dddf721d53 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
@@ -95,6 +95,7 @@ class boss_urom : public CreatureScript
{
boss_uromAI(Creature* creature) : BossAI(creature, DATA_UROM)
{
+ Initialize();
platform = 0;
for (uint8 i = 0; i < 3; ++i)
@@ -103,19 +104,13 @@ class boss_urom : public CreatureScript
std::random_shuffle(group, group + 3);
}
- void Reset() override
+ void Initialize()
{
- me->CastSpell(me, SPELL_EVOCATE);
-
- _Reset();
-
x = 0.0f;
y = 0.0f;
canCast = false;
canGoBack = false;
- me->GetMotionMaster()->MoveIdle();
-
teleportTimer = urand(30000, 35000);
arcaneExplosionTimer = 9000;
castArcaneExplosionTimer = 2000;
@@ -123,6 +118,15 @@ class boss_urom : public CreatureScript
timeBombTimer = urand(20000, 25000);
}
+ void Reset() override
+ {
+ me->CastSpell(me, SPELL_EVOCATE);
+
+ _Reset();
+
+ me->GetMotionMaster()->MoveIdle();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index d07d68f28c9..17508517f44 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -59,7 +59,16 @@ class boss_varos : public CreatureScript
struct boss_varosAI : public BossAI
{
- boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS) { }
+ boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ firstCoreEnergize = false;
+ coreEnergizeOrientation = 0.0f;
+ }
void InitializeAI() override
{
@@ -77,8 +86,7 @@ class boss_varos : public CreatureScript
// not sure if this is handled by a timer or hp percentage
events.ScheduleEvent(EVENT_CALL_AZURE, urand(15, 30) * IN_MILLISECONDS);
- firstCoreEnergize = false;
- coreEnergizeOrientation = 0.0f;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -170,12 +178,18 @@ class npc_azure_ring_captain : public CreatureScript
{
npc_azure_ring_captainAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
targetGUID = 0;
+ }
+
+ void Reset() override
+ {
+ Initialize();
me->SetWalk(true);
//! HACK: Creature's can't have MOVEMENTFLAG_FLYING
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 259d7faa6fe..8a0921b604b 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -232,13 +232,19 @@ class npc_ruby_emerald_amber_drake : public CreatureScript
{
npc_ruby_emerald_amber_drakeAI(Creature* creature) : VehicleAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ _healthWarning = true;
+ }
+
void Reset() override
{
_events.Reset();
- _healthWarning = true;
+ Initialize();
}
void IsSummonedBy(Unit* summoner) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
index 40fa5a5c934..29de693bf3a 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
@@ -106,12 +106,35 @@ public:
{
boss_bjarngrimAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
m_uiStance = STANCE_DEFENSIVE;
memset(&m_auiStormforgedLieutenantGUID, 0, sizeof(m_auiStormforgedLieutenantGUID));
canBuff = true;
}
+ void Initialize()
+ {
+ m_bIsChangingStance = false;
+
+ m_uiChargingStatus = 0;
+ m_uiCharge_Timer = 1000;
+
+ m_uiChangeStance_Timer = urand(20000, 25000);
+
+ m_uiReflection_Timer = 8000;
+ m_uiKnockAway_Timer = 20000;
+ m_uiPummel_Timer = 10000;
+ m_uiIronform_Timer = 25000;
+
+ m_uiIntercept_Timer = 5000;
+ m_uiWhirlwind_Timer = 10000;
+ m_uiCleave_Timer = 8000;
+
+ m_uiMortalStrike_Timer = 8000;
+ m_uiSlam_Timer = 10000;
+ }
+
InstanceScript* instance;
bool m_bIsChangingStance;
@@ -143,24 +166,7 @@ public:
if (!me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE))
me->AddAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE, me);
- m_bIsChangingStance = false;
-
- m_uiChargingStatus = 0;
- m_uiCharge_Timer = 1000;
-
- m_uiChangeStance_Timer = urand(20000, 25000);
-
- m_uiReflection_Timer = 8000;
- m_uiKnockAway_Timer = 20000;
- m_uiPummel_Timer = 10000;
- m_uiIronform_Timer = 25000;
-
- m_uiIntercept_Timer = 5000;
- m_uiWhirlwind_Timer = 10000;
- m_uiCleave_Timer = 8000;
-
- m_uiMortalStrike_Timer = 8000;
- m_uiSlam_Timer = 10000;
+ Initialize();
for (uint8 i = 0; i < 2; ++i)
{
@@ -393,9 +399,16 @@ public:
{
npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ m_uiArcWeld_Timer = urand(20000, 21000);
+ m_uiRenewSteel_Timer = urand(10000, 11000);
+ }
+
InstanceScript* instance;
uint32 m_uiArcWeld_Timer;
@@ -403,8 +416,7 @@ public:
void Reset() override
{
- m_uiArcWeld_Timer = urand(20000, 21000);
- m_uiRenewSteel_Timer = urand(10000, 11000);
+ Initialize();
}
void EnterCombat(Unit* who) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
index ae48dd7aa9a..ddd88681a05 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
@@ -76,9 +76,23 @@ public:
{
boss_ionarAI(Creature* creature) : ScriptedAI(creature), lSparkList(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bIsSplitPhase = true;
+ bHasDispersed = false;
+
+ uiSplitTimer = 25 * IN_MILLISECONDS;
+
+ uiStaticOverloadTimer = urand(5 * IN_MILLISECONDS, 6 * IN_MILLISECONDS);
+ uiBallLightningTimer = urand(10 * IN_MILLISECONDS, 11 * IN_MILLISECONDS);
+
+ uiDisperseHealth = 45 + urand(0, 10);
+ }
+
InstanceScript* instance;
SummonList lSparkList;
@@ -97,15 +111,7 @@ public:
{
lSparkList.DespawnAll();
- bIsSplitPhase = true;
- bHasDispersed = false;
-
- uiSplitTimer = 25*IN_MILLISECONDS;
-
- uiStaticOverloadTimer = urand(5*IN_MILLISECONDS, 6*IN_MILLISECONDS);
- uiBallLightningTimer = urand(10*IN_MILLISECONDS, 11*IN_MILLISECONDS);
-
- uiDisperseHealth = 45 + urand(0, 10);
+ Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
@@ -297,16 +303,22 @@ public:
{
npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiCheckTimer = 2 * IN_MILLISECONDS;
+ }
+
InstanceScript* instance;
uint32 uiCheckTimer;
void Reset() override
{
- uiCheckTimer = 2*IN_MILLISECONDS;
+ Initialize();
me->SetReactState(REACT_PASSIVE);
}
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
index 98d7d629756..fc29369c28f 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
@@ -74,9 +74,19 @@ public:
{
boss_lokenAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ m_uiArcLightning_Timer = 15000;
+ m_uiLightningNova_Timer = 20000;
+ m_uiResumePulsingShockwave_Timer = 1000;
+
+ m_uiHealthAmountModifier = 1;
+ }
+
InstanceScript* instance;
uint32 m_uiArcLightning_Timer;
@@ -87,11 +97,7 @@ public:
void Reset() override
{
- m_uiArcLightning_Timer = 15000;
- m_uiLightningNova_Timer = 20000;
- m_uiResumePulsingShockwave_Timer = 1000;
-
- m_uiHealthAmountModifier = 1;
+ Initialize();
instance->SetBossState(DATA_LOKEN, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
index 31805d3404f..4ca94f69c5b 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
@@ -78,9 +78,26 @@ public:
{
boss_volkhanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ m_bIsStriking = false;
+ m_bHasTemper = false;
+ m_bCanShatterGolem = false;
+
+ m_uiPause_Timer = 3500;
+ m_uiShatteringStomp_Timer = 0;
+ m_uiShatter_Timer = 5000;
+ m_uiDelay_Timer = 1000;
+ m_uiSummonPhase = 0;
+ GolemsShattered = 0;
+
+ m_uiHealthAmountModifier = 1;
+ }
+
InstanceScript* instance;
std::list<uint64> m_lGolemGUIDList;
@@ -100,18 +117,7 @@ public:
void Reset() override
{
- m_bIsStriking = false;
- m_bHasTemper = false;
- m_bCanShatterGolem = false;
-
- m_uiPause_Timer = 3500;
- m_uiShatteringStomp_Timer = 0;
- m_uiShatter_Timer = 5000;
- m_uiDelay_Timer = 1000;
- m_uiSummonPhase = 0;
- GolemsShattered = 0;
-
- m_uiHealthAmountModifier = 1;
+ Initialize();
DespawnGolem();
m_lGolemGUIDList.clear();
@@ -362,7 +368,19 @@ public:
struct npc_molten_golemAI : public ScriptedAI
{
- npc_molten_golemAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_molten_golemAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ m_bIsFrozen = false;
+
+ m_uiBlast_Timer = 20000;
+ m_uiDeathDelay_Timer = 0;
+ m_uiImmolation_Timer = 5000;
+ }
bool m_bIsFrozen;
@@ -372,11 +390,7 @@ public:
void Reset() override
{
- m_bIsFrozen = false;
-
- m_uiBlast_Timer = 20000;
- m_uiDeathDelay_Timer = 0;
- m_uiImmolation_Timer = 5000;
+ Initialize();
}
void AttackStart(Unit* who) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index 0337a603e3b..63000df133e 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
@@ -76,12 +76,20 @@ class boss_sjonnir : public CreatureScript
struct boss_sjonnirAI : public BossAI
{
- boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR) { }
+ boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ abuseTheOoze = 0;
+ }
void Reset() override
{
_Reset();
- abuseTheOoze = 0;
+ Initialize();
}
void EnterCombat(Unit* who) override
@@ -211,13 +219,21 @@ class npc_malformed_ooze : public CreatureScript
struct npc_malformed_oozeAI : public ScriptedAI
{
- npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
_mergeTimer = 10000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (_mergeTimer <= diff)
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
index 4ff0bd1e5cb..11f616e8550 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -138,10 +138,22 @@ public:
{
npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ uiKaddrakEncounterTimer = 1500;
+ uiMarnakEncounterTimer = 10000;
+ uiAbedneumEncounterTimer = 10000;
+
+ bKaddrakActivated = false;
+ bMarnakActivated = false;
+ bAbedneumActivated = false;
+ }
+
InstanceScript* instance;
uint32 uiKaddrakEncounterTimer;
@@ -156,13 +168,7 @@ public:
void Reset() override
{
- uiKaddrakEncounterTimer = 1500;
- uiMarnakEncounterTimer = 10000;
- uiAbedneumEncounterTimer = 10000;
-
- bKaddrakActivated = false;
- bMarnakActivated = false;
- bAbedneumActivated = false;
+ Initialize();
instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false);
instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false);
@@ -290,9 +296,20 @@ public:
{
npc_brann_hosAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bIsLowHP = false;
+ bIsBattle = false;
+ uiStep = 0;
+ uiPhaseTimer = 0;
+ uiControllerGUID = 0;
+ brannSparklinNews = true;
+ }
+
uint32 uiStep;
uint32 uiPhaseTimer;
@@ -309,12 +326,7 @@ public:
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
{
- bIsLowHP = false;
- bIsBattle = false;
- uiStep = 0;
- uiPhaseTimer = 0;
- uiControllerGUID = 0;
- brannSparklinNews = true;
+ Initialize();
DespawnDwarf();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 595dcecd554..3c073578d49 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -301,19 +301,25 @@ class boss_algalon_the_observer : public CreatureScript
{
boss_algalon_the_observerAI(Creature* creature) : BossAI(creature, BOSS_ALGALON)
{
+ Initialize();
_firstPull = true;
_fedOnTears = false;
}
- void Reset() override
+ void Initialize()
{
- _Reset();
- me->SetReactState(REACT_PASSIVE);
_phaseTwo = false;
_fightWon = false;
_hasYelled = false;
}
+ void Reset() override
+ {
+ _Reset();
+ me->SetReactState(REACT_PASSIVE);
+ Initialize();
+ }
+
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_UNIT)
@@ -715,13 +721,19 @@ class npc_living_constellation : public CreatureScript
{
npc_living_constellationAI(Creature* creature) : CreatureAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _isActive = false;
}
void Reset() override
{
_events.Reset();
_events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500);
- _isActive = false;
+ Initialize();
}
uint32 GetData(uint32 /*type*/) const override
@@ -858,6 +870,7 @@ class npc_brann_bronzebeard_algalon : public CreatureScript
{
npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature)
{
+ _currentPoint = 0;
}
void DoAction(int32 action) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
index 60698aac95e..80b3882593c 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
@@ -138,14 +138,22 @@ class boss_steelbreaker : public CreatureScript
struct boss_steelbreakerAI : public BossAI
{
- boss_steelbreakerAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { }
+ boss_steelbreakerAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ phase = 0;
+ }
uint32 phase;
void Reset() override
{
_Reset();
- phase = 0;
+ Initialize();
me->RemoveAllAuras();
}
@@ -275,14 +283,22 @@ class boss_runemaster_molgeim : public CreatureScript
struct boss_runemaster_molgeimAI : public BossAI
{
- boss_runemaster_molgeimAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { }
+ boss_runemaster_molgeimAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ phase = 0;
+ }
uint32 phase;
void Reset() override
{
_Reset();
- phase = 0;
+ Initialize();
me->RemoveAllAuras();
}
@@ -432,14 +448,22 @@ class boss_stormcaller_brundir : public CreatureScript
struct boss_stormcaller_brundirAI : public BossAI
{
- boss_stormcaller_brundirAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { }
+ boss_stormcaller_brundirAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ phase = 0;
+ }
uint32 phase;
void Reset() override
{
_Reset();
- phase = 0;
+ Initialize();
me->RemoveAllAuras();
me->SetDisableGravity(false);
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); // Should be interruptable unless overridden by spell (Overload)
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
index f0b8e123c63..34c5344e1cf 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
@@ -107,17 +107,23 @@ class boss_auriaya : public CreatureScript
{
boss_auriayaAI(Creature* creature) : BossAI(creature, BOSS_AURIAYA)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _Reset();
DefenderGUID = 0;
defenderLives = 8;
crazyCatLady = true;
nineLives = false;
}
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
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 071cf5bf14a..8091f77a531 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -226,14 +226,12 @@ class boss_flame_leviathan : public CreatureScript
{
boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN), vehicle(creature->GetVehicleKit())
{
+ Initialize();
+ _pursueTarget = 0;
}
- void InitializeAI() override
+ void Initialize()
{
- ASSERT(vehicle);
- if (!me->isDead())
- Reset();
-
ActiveTowersCount = 4;
Shutdown = 0;
ActiveTowers = false;
@@ -243,6 +241,15 @@ class boss_flame_leviathan : public CreatureScript
towerOfFrost = false;
Shutout = true;
Unbroken = true;
+ }
+
+ void InitializeAI() override
+ {
+ ASSERT(vehicle);
+ if (!me->isDead())
+ Reset();
+
+ Initialize();
DoCast(SPELL_INVIS_AND_STEALTH_DETECT);
@@ -634,13 +641,19 @@ class boss_flame_leviathan_defense_cannon : public CreatureScript
{
boss_flame_leviathan_defense_cannonAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ NapalmTimer = 5 * IN_MILLISECONDS;
}
uint32 NapalmTimer;
void Reset() override
{
- NapalmTimer = 5*IN_MILLISECONDS;
+ Initialize();
DoCast(me, AURA_STEALTH_DETECTION);
}
@@ -781,14 +794,20 @@ class npc_mechanolift : public CreatureScript
{
npc_mechanoliftAI(Creature* creature) : PassiveAI(creature)
{
+ Initialize();
ASSERT(me->GetVehicleKit());
}
+ void Initialize()
+ {
+ MoveTimer = 0;
+ }
+
uint32 MoveTimer;
void Reset() override
{
- MoveTimer = 0;
+ Initialize();
me->GetMotionMaster()->MoveRandom(50);
}
@@ -956,11 +975,17 @@ public:
{
npc_mimirons_infernoAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->CastSpell(me, AURA_DUMMY_YELLOW, true);
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ infernoTimer = 2000;
+ }
+
void WaypointReached(uint32 /*waypointId*/) override
{
@@ -968,7 +993,7 @@ public:
void Reset() override
{
- infernoTimer = 2000;
+ Initialize();
}
uint32 infernoTimer;
@@ -1047,14 +1072,20 @@ class npc_freyas_ward : public CreatureScript
{
npc_freyas_wardAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->CastSpell(me, AURA_DUMMY_GREEN, true);
}
+ void Initialize()
+ {
+ summonTimer = 5000;
+ }
+
uint32 summonTimer;
void Reset() override
{
- summonTimer = 5000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1090,14 +1121,20 @@ class npc_freya_ward_summon : public CreatureScript
{
npc_freya_ward_summonAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
creature->GetMotionMaster()->MoveRandom(100);
}
+ void Initialize()
+ {
+ lashTimer = 5000;
+ }
+
uint32 lashTimer;
void Reset() override
{
- lashTimer = 5000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1527,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/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 68bdbe0fdf3..ecebeb8d4e5 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -267,26 +267,16 @@ class boss_freya : public CreatureScript
struct boss_freyaAI : public BossAI
{
- boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA) { }
-
- uint64 ElementalGUID[3][2];
-
- uint32 deforestation[6][2];
- uint32 elementalTimer[2];
- uint32 diffTimer;
- uint8 trioWaveCount;
- uint8 trioWaveController;
- uint8 waveCount;
- uint8 elderCount;
- uint8 attunedToNature;
-
- bool checkElementalAlive[2];
- bool trioDefeated[2];
- bool random[3];
+ boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA)
+ {
+ Initialize();
+ memset(elementalTimer, 0, sizeof(elementalTimer));
+ diffTimer = 0;
+ attunedToNature = 0;
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
trioWaveCount = 0;
trioWaveController = 0;
waveCount = 0;
@@ -307,6 +297,27 @@ class boss_freya : public CreatureScript
random[n] = false;
}
+ uint64 ElementalGUID[3][2];
+
+ uint32 deforestation[6][2];
+ uint32 elementalTimer[2];
+ uint32 diffTimer;
+ uint8 trioWaveCount;
+ uint8 trioWaveController;
+ uint8 waveCount;
+ uint8 elderCount;
+ uint8 attunedToNature;
+
+ bool checkElementalAlive[2];
+ bool trioDefeated[2];
+ bool random[3];
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void KilledUnit(Unit* who) override
{
if (who->GetTypeId() == TYPEID_PLAYER)
@@ -689,8 +700,6 @@ class boss_elder_brightleaf : public CreatureScript
events.ScheduleEvent(EVENT_SOLAR_FLARE, urand(5000, 7000));
events.ScheduleEvent(EVENT_UNSTABLE_SUN_BEAM, urand(7000, 12000));
events.ScheduleEvent(EVENT_FLUX, 5000);
- elderCount = 0;
- lumberjack = false;
}
void KilledUnit(Unit* who) override
@@ -758,9 +767,6 @@ class boss_elder_brightleaf : public CreatureScript
}
}
- if (lumberjack)
- lumberjackTimer += diff;
-
DoMeleeAttackIfReady();
}
@@ -768,21 +774,12 @@ class boss_elder_brightleaf : public CreatureScript
{
switch (action)
{
- case ACTION_ELDER_DEATH:
- ++elderCount;
- lumberjack = true;
- break;
case ACTION_ELDER_FREYA_KILLED:
me->DespawnOrUnsummon(10000);
_JustDied();
break;
}
}
-
- private:
- uint32 lumberjackTimer;
- uint8 elderCount;
- bool lumberjack;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -810,8 +807,6 @@ class boss_elder_stonebark : public CreatureScript
events.ScheduleEvent(EVENT_TREMOR, urand(10000, 12000));
events.ScheduleEvent(EVENT_FISTS, urand(25000, 35000));
events.ScheduleEvent(EVENT_BARK, urand(37500, 40000));
- elderCount = 0;
- lumberjack = false;
}
void KilledUnit(Unit* who) override
@@ -885,9 +880,6 @@ class boss_elder_stonebark : public CreatureScript
}
}
- if (lumberjack)
- lumberjackTimer += diff;
-
DoMeleeAttackIfReady();
}
@@ -895,21 +887,12 @@ class boss_elder_stonebark : public CreatureScript
{
switch (action)
{
- case ACTION_ELDER_DEATH:
- ++elderCount;
- lumberjack = true;
- break;
case ACTION_ELDER_FREYA_KILLED:
me->DespawnOrUnsummon(10000);
_JustDied();
break;
}
}
-
- private:
- uint32 lumberjackTimer;
- uint8 elderCount;
- bool lumberjack;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -937,8 +920,6 @@ class boss_elder_ironbranch : public CreatureScript
events.ScheduleEvent(EVENT_IMPALE, urand(18000, 22000));
events.ScheduleEvent(EVENT_IRON_ROOTS, urand(12000, 17000));
events.ScheduleEvent(EVENT_THORN_SWARM, urand(7500, 12500));
- elderCount = 0;
- lumberjack = false;
}
void KilledUnit(Unit* who) override
@@ -999,9 +980,6 @@ class boss_elder_ironbranch : public CreatureScript
}
}
- if (lumberjack)
- lumberjackTimer += diff;
-
DoMeleeAttackIfReady();
}
@@ -1009,21 +987,12 @@ class boss_elder_ironbranch : public CreatureScript
{
switch (action)
{
- case ACTION_ELDER_DEATH:
- ++elderCount;
- lumberjack = true;
- break;
case ACTION_ELDER_FREYA_KILLED:
me->DespawnOrUnsummon(10000);
_JustDied();
break;
}
}
-
- private:
- uint32 lumberjackTimer;
- uint8 elderCount;
- bool lumberjack;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1041,15 +1010,21 @@ class npc_detonating_lasher : public CreatureScript
{
npc_detonating_lasherAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
}
- void Reset() override
+ void Initialize()
{
lashTimer = 5000;
changeTargetTimer = 7500;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -1099,16 +1074,24 @@ class npc_ancient_water_spirit : public CreatureScript
{
npc_ancient_water_spiritAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA)))
waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ else
+ waveCount = 0;
}
- void Reset() override
+ void Initialize()
{
tidalWaveTimer = 10000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -1159,17 +1142,25 @@ class npc_storm_lasher : public CreatureScript
{
npc_storm_lasherAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA)))
waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ else
+ waveCount = 0;
}
- void Reset() override
+ void Initialize()
{
lightningLashTimer = 10000;
stormboltTimer = 5000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -1229,6 +1220,8 @@ class npc_snaplasher : public CreatureScript
instance = me->GetInstanceScript();
if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA)))
waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ else
+ waveCount = 0;
}
void UpdateAI(uint32 /*diff*/) override
@@ -1271,12 +1264,18 @@ class npc_ancient_conservator : public CreatureScript
{
npc_ancient_conservatorAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
natureFuryTimer = 7500;
healthySporeTimer = 3500;
+ }
+
+ void Reset() override
+ {
+ Initialize();
SummonHealthySpores(2);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
index 196e410f239..5d4ddf1865c 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
@@ -105,6 +105,15 @@ class boss_general_vezax : public CreatureScript
{
boss_general_vezaxAI(Creature* creature) : BossAI(creature, BOSS_VEZAX)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ shadowDodger = true;
+ smellSaronite = true;
+ animusDead = false;
+ vaporCount = 0;
}
bool shadowDodger;
@@ -116,10 +125,7 @@ class boss_general_vezax : public CreatureScript
{
_Reset();
- shadowDodger = true;
- smellSaronite = true;
- animusDead = false;
- vaporCount = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
index a3d80beb546..42c0323a714 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
@@ -181,11 +181,18 @@ class npc_flash_freeze : public CreatureScript
{
npc_flash_freezeAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
}
+ void Initialize()
+ {
+ targetGUID = 0;
+ checkDespawnTimer = 1000;
+ }
+
InstanceScript* instance;
uint64 targetGUID;
@@ -193,8 +200,7 @@ class npc_flash_freeze : public CreatureScript
void Reset() override
{
- targetGUID = 0;
- checkDespawnTimer = 1000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -312,9 +318,19 @@ class boss_hodir : public CreatureScript
{
boss_hodirAI(Creature* creature) : BossAI(creature, BOSS_HODIR)
{
+ Initialize();
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ gettingColdInHereTimer = 0;
+ gettingColdInHere = false;
+ cheeseTheFreeze = false;
+ iHaveTheCoolestFriends = false;
+ iCouldSayThatThisCacheWasRare = false;
+ }
+
uint32 gettingColdInHereTimer;
bool gettingColdInHere;
@@ -324,11 +340,7 @@ class boss_hodir : public CreatureScript
void Reset() override
{
- gettingColdInHereTimer = 0;
- gettingColdInHere = false;
- cheeseTheFreeze = false;
- iHaveTheCoolestFriends = false;
- iCouldSayThatThisCacheWasRare = false;
+ Initialize();
_Reset();
me->SetReactState(REACT_PASSIVE);
@@ -526,16 +538,22 @@ class npc_icicle : public CreatureScript
{
npc_icicleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ icicleTimer = 2500;
+ }
+
uint32 icicleTimer;
void Reset() override
{
- icicleTimer = 2500;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -574,16 +592,22 @@ class npc_snowpacked_icicle : public CreatureScript
{
npc_snowpacked_icicleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ despawnTimer = 12000;
+ }
+
uint32 despawnTimer;
void Reset() override
{
- despawnTimer = 12000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
index 28a87b37f5b..f0f918f7e39 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
@@ -118,9 +118,17 @@ class boss_ignis : public CreatureScript
{
boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS), _vehicle(me->GetVehicleKit())
{
+ Initialize();
ASSERT(_vehicle);
}
+ void Initialize()
+ {
+ _slagPotGUID = 0;
+ _shattered = false;
+ _firstConstructKill = 0;
+ }
+
void Reset() override
{
_Reset();
@@ -140,9 +148,7 @@ class boss_ignis : public CreatureScript
events.ScheduleEvent(EVENT_CONSTRUCT, 15000);
events.ScheduleEvent(EVENT_END_POT, 40000);
events.ScheduleEvent(EVENT_BERSERK, 480000);
- _slagPotGUID = 0;
- _shattered = false;
- _firstConstructKill = 0;
+ Initialize();
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
}
@@ -298,14 +304,20 @@ class npc_iron_construct : public CreatureScript
{
npc_iron_constructAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
+ Initialize();
creature->SetReactState(REACT_PASSIVE);
}
- void Reset() override
+ void Initialize()
{
_brittled = false;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
if (me->HasAura(SPELL_BRITTLE) && damage >= 5000)
@@ -365,12 +377,19 @@ class npc_scorch_ground : public CreatureScript
{
npc_scorch_groundAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE |UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
creature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields
}
- void MoveInLineOfSight(Unit* who) override
+ void Initialize()
+ {
+ _heat = false;
+ _constructGUID = 0;
+ _heatTimer = 0;
+ }
+ void MoveInLineOfSight(Unit* who) override
{
if (!_heat)
{
@@ -387,10 +406,8 @@ class npc_scorch_ground : public CreatureScript
void Reset() override
{
- _heat = false;
+ Initialize();
DoCast(me, SPELL_GROUND);
- _constructGUID = 0;
- _heatTimer = 0;
}
void UpdateAI(uint32 uiDiff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index f5fe255fdf3..d53ac6d91d6 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -327,8 +327,19 @@ class boss_razorscale : public CreatureScript
{
boss_razorscaleAI(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE)
{
+ Initialize();
// Do not let Razorscale be affected by Battle Shout buff
me->ApplySpellImmune(0, IMMUNITY_ID, (SPELL_BATTLE_SHOUT), true);
+ FlyCount = 0;
+ EnrageTimer = 0;
+ Enraged = false;
+ phase = PHASE_GROUND;
+ }
+
+ void Initialize()
+ {
+ PermaGround = false;
+ HarpoonCounter = 0;
}
Phases phase;
@@ -345,8 +356,7 @@ class boss_razorscale : public CreatureScript
me->SetCanFly(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
- PermaGround = false;
- HarpoonCounter = 0;
+ Initialize();
if (Creature* commander = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXPEDITION_COMMANDER)))
commander->AI()->DoAction(ACTION_COMMANDER_RESET);
}
@@ -594,7 +604,16 @@ class npc_expedition_commander : public CreatureScript
{
npc_expedition_commanderAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
+ memset(Engineer, 0, sizeof(Engineer));
+ memset(Defender, 0, sizeof(Defender));
+ }
+
+ void Initialize()
+ {
+ AttackStartTimer = 0;
+ Phase = 0;
Greet = false;
}
@@ -604,14 +623,12 @@ class npc_expedition_commander : public CreatureScript
bool Greet;
uint32 AttackStartTimer;
uint8 Phase;
- Creature* Engineer[4];
- Creature* Defender[4];
+ uint64 Engineer[4];
+ uint64 Defender[4];
void Reset() override
{
- AttackStartTimer = 0;
- Phase = 0;
- Greet = false;
+ Initialize();
summons.clear();
}
@@ -659,31 +676,40 @@ class npc_expedition_commander : public CreatureScript
case 2:
for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
{
- Engineer[n] = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
- Engineer[n]->SetWalk(false);
- Engineer[n]->SetSpeed(MOVE_RUN, 0.5f);
- Engineer[n]->SetHomePosition(PosEngRepair[n]);
- Engineer[n]->GetMotionMaster()->MoveTargetedHome();
+ if (Creature* summonedEngineer = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
+ {
+ summonedEngineer->SetWalk(false);
+ summonedEngineer->SetSpeed(MOVE_RUN, 0.5f);
+ summonedEngineer->SetHomePosition(PosEngRepair[n]);
+ summonedEngineer->GetMotionMaster()->MoveTargetedHome();
+ Engineer[n] = summonedEngineer->GetGUID();
+ }
}
- Engineer[0]->AI()->Talk(SAY_AGGRO_3);
+ if (Creature* firstSummon = ObjectAccessor::GetCreature(*me, Engineer[0]))
+ firstSummon->AI()->Talk(SAY_AGGRO_3);
Phase = 3;
AttackStartTimer = 14000;
break;
case 3:
for (uint8 n = 0; n < 4; n++)
{
- Defender[n] = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
- Defender[n]->SetWalk(false);
- Defender[n]->SetHomePosition(PosDefCombat[n]);
- Defender[n]->GetMotionMaster()->MoveTargetedHome();
+ if (Creature* summonedDefender = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
+ {
+ summonedDefender->SetWalk(false);
+ summonedDefender->SetHomePosition(PosDefCombat[n]);
+ summonedDefender->GetMotionMaster()->MoveTargetedHome();
+ Defender[n] = summonedDefender->GetGUID();
+ }
}
Phase = 4;
break;
case 4:
for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
- Engineer[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
+ if (Creature* summonedEngineer = ObjectAccessor::GetCreature(*me, Engineer[n]))
+ summonedEngineer->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
for (uint8 n = 0; n < 4; ++n)
- Defender[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H);
+ if (Creature* summonedDefender = ObjectAccessor::GetCreature(*me, Defender[n]))
+ summonedDefender->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H);
Talk(SAY_AGGRO_2);
AttackStartTimer = 16000;
Phase = 5;
@@ -694,7 +720,8 @@ class npc_expedition_commander : public CreatureScript
Razorscale->AI()->DoAction(ACTION_EVENT_START);
me->SetInCombatWith(Razorscale);
}
- Engineer[0]->AI()->Talk(SAY_AGGRO_1);
+ if (Creature* firstEngineer = ObjectAccessor::GetCreature(*me, Engineer[0]))
+ firstEngineer->AI()->Talk(SAY_AGGRO_1);
Phase = 6;
break;
}
@@ -748,10 +775,20 @@ class npc_mole_machine_trigger : public CreatureScript
{
npc_mole_machine_triggerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED);
}
+ void Initialize()
+ {
+ SummonGobTimer = 2000;
+ SummonNpcTimer = 6000;
+ DissapearTimer = 10000;
+ GobSummoned = false;
+ NpcSummoned = false;
+ }
+
uint32 SummonGobTimer;
uint32 SummonNpcTimer;
uint32 DissapearTimer;
@@ -760,11 +797,7 @@ class npc_mole_machine_trigger : public CreatureScript
void Reset() override
{
- SummonGobTimer = 2000;
- SummonNpcTimer = 6000;
- DissapearTimer = 10000;
- GobSummoned = false;
- NpcSummoned = false;
+ Initialize();
}
void UpdateAI(uint32 Diff) override
@@ -851,15 +884,23 @@ class npc_darkrune_watcher : public CreatureScript
struct npc_darkrune_watcherAI : public ScriptedAI
{
- npc_darkrune_watcherAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_darkrune_watcherAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ChainTimer = urand(10000, 15000);
+ LightTimer = urand(1000, 3000);
+ }
uint32 ChainTimer;
uint32 LightTimer;
void Reset() override
{
- ChainTimer = urand(10000, 15000);
- LightTimer = urand(1000, 3000);
+ Initialize();
}
void UpdateAI(uint32 Diff) override
@@ -900,14 +941,22 @@ class npc_darkrune_guardian : public CreatureScript
struct npc_darkrune_guardianAI : public ScriptedAI
{
- npc_darkrune_guardianAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_darkrune_guardianAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ StormTimer = urand(3000, 6000);
+ killedByBreath = false;
+ }
uint32 StormTimer;
void Reset() override
{
- StormTimer = urand(3000, 6000);
- killedByBreath = false;
+ Initialize();
}
uint32 GetData(uint32 type) const override
@@ -955,7 +1004,17 @@ class npc_darkrune_sentinel : public CreatureScript
struct npc_darkrune_sentinelAI : public ScriptedAI
{
- npc_darkrune_sentinelAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_darkrune_sentinelAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ HeroicTimer = urand(4000, 8000);
+ WhirlTimer = urand(20000, 25000);
+ ShoutTimer = urand(15000, 30000);
+ }
uint32 HeroicTimer;
uint32 WhirlTimer;
@@ -963,9 +1022,7 @@ class npc_darkrune_sentinel : public CreatureScript
void Reset() override
{
- HeroicTimer = urand(4000, 8000);
- WhirlTimer = urand(20000, 25000);
- ShoutTimer = urand(15000, 30000);
+ Initialize();
}
void UpdateAI(uint32 Diff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index 1d2b1b24322..18b9a3040fe 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
@@ -196,6 +196,18 @@ class boss_xt002 : public CreatureScript
{
boss_xt002_AI(Creature* creature) : BossAI(creature, BOSS_XT002)
{
+ Initialize();
+ _transferHealth = 0;
+ }
+
+ void Initialize()
+ {
+ _healthRecovered = false;
+ _gravityBombCasualty = false;
+ _hardMode = false;
+
+ _phase = 1;
+ _heartExposed = 0;
}
void Reset() override
@@ -206,12 +218,7 @@ class boss_xt002 : public CreatureScript
me->SetReactState(REACT_AGGRESSIVE);
DoCast(me, SPELL_STAND);
- _healthRecovered = false;
- _gravityBombCasualty = false;
- _hardMode = false;
-
- _phase = 1;
- _heartExposed = 0;
+ Initialize();
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
}
@@ -390,8 +397,9 @@ class boss_xt002 : public CreatureScript
Talk(SAY_HEART_CLOSED);
Talk(EMOTE_HEART_CLOSED);
- DoCast(me, SPELL_STAND);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
+ DoCast(me, SPELL_STAND);
_phase = 1;
@@ -489,14 +497,20 @@ class npc_scrapbot : public CreatureScript
{
npc_scrapbotAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ _rangeCheckTimer = 500;
+ }
+
void Reset() override
{
me->SetReactState(REACT_PASSIVE);
- _rangeCheckTimer = 500;
+ Initialize();
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002)))
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
@@ -546,14 +560,20 @@ class npc_pummeller : public CreatureScript
{
npc_pummellerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
_arcingSmashTimer = TIMER_ARCING_SMASH;
_trampleTimer = TIMER_TRAMPLE;
_uppercutTimer = TIMER_UPPERCUT;
+ }
+
+ void Reset() override
+ {
+ Initialize();
if (Creature* xt002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002)))
{
@@ -647,12 +667,18 @@ class npc_boombot : public CreatureScript
{
npc_boombotAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
_boomed = false;
+ }
+
+ void Reset() override
+ {
+ Initialize();
DoCast(SPELL_AURA_BOOMBOT); // For achievement
@@ -726,12 +752,18 @@ class npc_life_spark : public CreatureScript
{
npc_life_sparkAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _shockTimer = 0; // first one is immediate.
}
void Reset() override
{
DoCast(me, SPELL_STATIC_CHARGED);
- _shockTimer = 0; // first one is immediate.
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1006,37 +1038,6 @@ class spell_xt002_submerged : public SpellScriptLoader
}
};
-class spell_xt002_stand : public SpellScriptLoader
-{
- public:
- spell_xt002_stand() : SpellScriptLoader("spell_xt002_stand") { }
-
- class spell_xt002_stand_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_xt002_stand_SpellScript);
-
- void HandleScript(SpellEffIndex /*eff*/)
- {
- Creature* target = GetHitCreature();
- if (!target)
- return;
-
- target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_xt002_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_xt002_stand_SpellScript();
- }
-};
-
class achievement_nerf_engineering : public AchievementCriteriaScript
{
public:
@@ -1095,7 +1096,6 @@ void AddSC_boss_xt002()
new spell_xt002_heart_overload_periodic();
new spell_xt002_tympanic_tantrum();
new spell_xt002_submerged();
- new spell_xt002_stand();
new achievement_nerf_engineering();
new achievement_heartbreaker();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index 2471b705b90..d3012dc99ba 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -427,9 +427,17 @@ class boss_voice_of_yogg_saron : public CreatureScript
{
boss_voice_of_yogg_saronAI(Creature* creature) : BossAI(creature, BOSS_YOGG_SARON)
{
+ Initialize();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ _guardiansCount = 0;
+ _guardianTimer = 20000;
+ _illusionShattered = false;
+ }
+
void MoveInLineOfSight(Unit* who) override
{
@@ -467,9 +475,7 @@ class boss_voice_of_yogg_saron : public CreatureScript
instance->SetData(DATA_DRIVE_ME_CRAZY, uint32(true));
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- _guardiansCount = 0;
- _guardianTimer = 20000;
- _illusionShattered = false;
+ Initialize();
bool clockwise = false;
std::list<TempSummon*> clouds;
@@ -1014,7 +1020,10 @@ class boss_brain_of_yogg_saron : public CreatureScript
struct boss_brain_of_yogg_saronAI : public PassiveAI
{
- boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature) { }
+ boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature)
+ {
+ _tentaclesKilled = 0;
+ }
void Reset() override
{
@@ -1953,7 +1962,7 @@ class spell_yogg_saron_target_selectors : public SpellScriptLoader // 63744,
class SanityReduction : public SpellScript
{
public:
- SanityReduction() : SpellScript() { }
+ SanityReduction() : SpellScript(), _stacks(0) { }
SanityReduction(uint8 stacks) : SpellScript(), _stacks(stacks) { }
void RemoveSanity(SpellEffIndex /*effIndex*/)
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index 7a1566df71d..ee52df58c80 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -264,6 +264,9 @@ class npc_annhylde_the_caller : public CreatureScript
{
npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature)
{
+ x = 0.f;
+ y = 0.f;
+ z = 0.f;
_instance = creature->GetInstanceScript();
}
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
index eb60444f9c2..6e0dbecafb4 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
@@ -115,7 +115,15 @@ class boss_keleseth : public CreatureScript
struct boss_kelesethAI : public BossAI
{
- boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) { }
+ boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ onTheRocks = true;
+ }
void Reset() override
{
@@ -124,7 +132,7 @@ class boss_keleseth : public CreatureScript
events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
- onTheRocks = true;
+ Initialize();
}
void EnterCombat(Unit* who) override
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index 245cf46336d..b3285bd492e 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -92,20 +92,11 @@ public:
{
boss_palehoofAI(Creature* creature) : BossAI(creature, DATA_GORTOK_PALEHOOF)
{
+ Initialize();
}
- uint32 uiArcingSmashTimer;
- uint32 uiImpaleTimer;
- uint32 uiWhiteringRoarTimer;
- uint32 uiWaitingTimer;
- Phase currentPhase;
- uint8 AddCount;
- Phase Sequence[4];
-
- void Reset() override
+ void Initialize()
{
- _Reset();
-
/// There is a good reason to store them like this, we are going to shuffle the order.
for (uint32 i = PHASE_FRENZIED_WORGEN; i < PHASE_GORTOK_PALEHOOF; ++i)
Sequence[i] = Phase(i);
@@ -117,11 +108,25 @@ public:
uiImpaleTimer = 12000;
uiWhiteringRoarTimer = 10000;
- me->GetMotionMaster()->MoveTargetedHome();
-
AddCount = 0;
currentPhase = PHASE_NONE;
+ }
+
+ uint32 uiArcingSmashTimer;
+ uint32 uiImpaleTimer;
+ uint32 uiWhiteringRoarTimer;
+ Phase currentPhase;
+ uint8 AddCount;
+ Phase Sequence[4];
+
+ void Reset() override
+ {
+ _Reset();
+
+ Initialize();
+
+ me->GetMotionMaster()->MoveTargetedHome();
for (uint8 i = DATA_FRENZIED_WORGEN; i <= DATA_FEROCIOUS_RHINO; ++i)
if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(i)))
@@ -263,9 +268,17 @@ public:
{
npc_ravenous_furbolgAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiChainLightingTimer = 5000;
+ uiCrazedTimer = 10000;
+ uiTerrifyingRoarTimer = 15000;
+ }
+
uint32 uiChainLightingTimer;
uint32 uiCrazedTimer;
uint32 uiTerrifyingRoarTimer;
@@ -274,9 +287,7 @@ public:
void Reset() override
{
- uiChainLightingTimer = 5000;
- uiCrazedTimer = 10000;
- uiTerrifyingRoarTimer = 15000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -371,9 +382,17 @@ public:
{
npc_frenzied_worgenAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiMortalWoundTimer = 5000;
+ uiEnrage1Timer = 15000;
+ uiEnrage2Timer = 10000;
+ }
+
uint32 uiMortalWoundTimer;
uint32 uiEnrage1Timer;
uint32 uiEnrage2Timer;
@@ -382,9 +401,7 @@ public:
void Reset() override
{
- uiMortalWoundTimer = 5000;
- uiEnrage1Timer = 15000;
- uiEnrage2Timer = 10000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -481,9 +498,17 @@ public:
{
npc_ferocious_rhinoAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiStompTimer = 10000;
+ uiGoreTimer = 15000;
+ uiGrievousWoundTimer = 20000;
+ }
+
uint32 uiStompTimer;
uint32 uiGoreTimer;
uint32 uiGrievousWoundTimer;
@@ -492,9 +517,7 @@ public:
void Reset() override
{
- uiStompTimer = 10000;
- uiGoreTimer = 15000;
- uiGrievousWoundTimer = 20000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -596,9 +619,17 @@ public:
{
npc_massive_jormungarAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiAcidSpitTimer = 3000;
+ uiAcidSplatterTimer = 12000;
+ uiPoisonBreathTimer = 10000;
+ }
+
uint32 uiAcidSpitTimer;
uint32 uiAcidSplatterTimer;
uint32 uiPoisonBreathTimer;
@@ -607,9 +638,7 @@ public:
void Reset() override
{
- uiAcidSpitTimer = 3000;
- uiAcidSplatterTimer = 12000;
- uiPoisonBreathTimer = 10000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -697,17 +726,23 @@ public:
{
npc_palehoof_orbAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ currentPhase = PHASE_NONE;
+ SummonTimer = 5000;
+ }
+
InstanceScript* instance;
uint32 SummonTimer;
Phase currentPhase;
void Reset() override
{
- currentPhase = PHASE_NONE;
- SummonTimer = 5000;
+ Initialize();
//! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->RemoveAurasDueToSpell(SPELL_ORB_VISUAL);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index ea44d76e7e6..af5dc4a4e03 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
@@ -169,8 +169,24 @@ public:
{
boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
m_uiGraufGUID = 0;
+ m_uiMovementTimer = 0;
+ m_uiSummonTimer = 0;
+ }
+
+ void Initialize()
+ {
+ m_uiCrushTimer = 8000;
+ m_uiPoisonedSpearTimer = 10000;
+ m_uiWhirlwindTimer = 20000;
+ m_uiMountTimer = 3000;
+ m_uiWaypointId = 0;
+ m_bSaidEmote = false;
+ m_uiSpellHitCount = 0;
+
+ Phase = SKADI;
}
InstanceScript* instance;
@@ -194,15 +210,7 @@ public:
{
triggersGUID.clear();
- m_uiCrushTimer = 8000;
- m_uiPoisonedSpearTimer = 10000;
- m_uiWhirlwindTimer = 20000;
- m_uiMountTimer = 3000;
- m_uiWaypointId = 0;
- m_bSaidEmote = false;
- m_uiSpellHitCount = 0;
-
- Phase = SKADI;
+ Initialize();
Summons.DespawnAll();
me->SetSpeed(MOVE_FLIGHT, 3.0f);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index 621ef20e7e4..6ace4eb61a1 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -137,13 +137,20 @@ class boss_svala : public CreatureScript
{
boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE)
{
+ Initialize();
_introCompleted = false;
}
+ void Initialize()
+ {
+ _arthasGUID = 0;
+ _sacrificed = false;
+ }
+
void Reset() override
{
_Reset();
- _sacrificed = false;
+
SetCombatMovement(true);
if (_introCompleted)
@@ -153,7 +160,7 @@ class boss_svala : public CreatureScript
me->SetDisableGravity(events.IsInPhase(NORMAL));
- _arthasGUID = 0;
+ Initialize();
instance->SetData64(DATA_SACRIFICED_PLAYER, 0);
}
@@ -398,17 +405,23 @@ class npc_ritual_channeler : public CreatureScript
{
npc_ritual_channelerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ paralyzeTimer = 1600;
+ }
+
InstanceScript* instance;
uint32 paralyzeTimer;
void Reset() override
{
- paralyzeTimer = 1600;
+ Initialize();
if (IsHeroic())
DoCast(me, SPELL_SHADOWS_IN_THE_DARK);
@@ -514,16 +527,24 @@ class npc_scourge_hulk : public CreatureScript
struct npc_scourge_hulkAI : public ScriptedAI
{
- npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ mightyBlow = urand(4000, 9000);
+ volatileInfection = urand(10000, 14000);
+ killedByRitualStrike = false;
+ }
uint32 mightyBlow;
uint32 volatileInfection;
void Reset() override
{
- mightyBlow = urand(4000, 9000);
- volatileInfection = urand(10000, 14000);
- killedByRitualStrike = false;
+ Initialize();
}
uint32 GetData(uint32 type) const override
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 01e09ca2f9a..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
{
- 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_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
+{
+ 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
@@ -102,84 +105,49 @@ 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;
}
}
- 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 Initialize()
+ {
+ kingsBane = true;
+ ActivedNumber = 0;
+ HealthAmountModifier = 1;
+ HealthAmountMultipler = DUNGEON_MODE(20, 25);
+ ActiveAncestorGUID = 0;
+ SpiritFountGUID = 0;
+ }
void Reset() override
{
_Reset();
- 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;
+ 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;
}
@@ -191,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;
}
}
@@ -361,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/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
index ea5c5b9ee48..8a88abb9d06 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
@@ -184,13 +184,19 @@ class npc_tempest_minion : public CreatureScript
{
npc_tempest_minionAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ OverchargedTimer = 0;
+ }
+
void Reset() override
{
events.Reset();
- OverchargedTimer = 0;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
index caba44a7100..36c952d14a1 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
@@ -185,14 +185,20 @@ public:
{
npc_frozen_orbAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
done = false;
killTimer = 60000; // if after this time there is no victim -> destroy!
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
DoZoneInCombat();
diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
index cca2b347af7..5857f695023 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
@@ -57,9 +57,19 @@ public:
{
boss_cyanigosaAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiArcaneVacuumTimer = 10000;
+ uiBlizzardTimer = 15000;
+ uiManaDestructionTimer = 30000;
+ uiTailSweepTimer = 20000;
+ uiUncontrollableEnergyTimer = 25000;
+ }
+
uint32 uiArcaneVacuumTimer;
uint32 uiBlizzardTimer;
uint32 uiManaDestructionTimer;
@@ -70,11 +80,7 @@ public:
void Reset() override
{
- uiArcaneVacuumTimer = 10000;
- uiBlizzardTimer = 15000;
- uiManaDestructionTimer = 30000;
- uiTailSweepTimer = 20000;
- uiUncontrollableEnergyTimer = 25000;
+ Initialize();
instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED);
}
diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
index b63709b34c8..6cc90bcd4ed 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
@@ -56,9 +56,19 @@ public:
{
boss_erekemAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiBloodlustTimer = 15000;
+ uiChainHealTimer = 0;
+ uiEarthShockTimer = urand(2000, 8000);
+ uiLightningBoltTimer = urand(5000, 10000);
+ uiEarthShieldTimer = 20000;
+ }
+
uint32 uiBloodlustTimer;
uint32 uiChainHealTimer;
uint32 uiEarthShockTimer;
@@ -69,11 +79,7 @@ public:
void Reset() override
{
- uiBloodlustTimer = 15000;
- uiChainHealTimer = 0;
- uiEarthShockTimer = urand(2000, 8000);
- uiLightningBoltTimer = urand(5000, 10000);
- uiEarthShieldTimer = 20000;
+ Initialize();
if (instance->GetData(DATA_WAVE_COUNT) == 6)
instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED);
else if (instance->GetData(DATA_WAVE_COUNT) == 12)
@@ -264,9 +270,17 @@ public:
{
npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiStrikeTimer = urand(4000, 8000);
+ uiHowlingScreechTimer = urand(8000, 13000);
+ uiGushingWoundTimer = urand(1000, 3000);
+ }
+
uint32 uiGushingWoundTimer;
uint32 uiHowlingScreechTimer;
uint32 uiStrikeTimer;
@@ -275,9 +289,7 @@ public:
void Reset() override
{
- uiStrikeTimer = urand(4000, 8000);
- uiHowlingScreechTimer = urand(8000, 13000);
- uiGushingWoundTimer = urand(1000, 3000);
+ Initialize();
}
void AttackStart(Unit* who) override
diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
index 4aede5e5f46..ba72f6f52ca 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
@@ -85,9 +85,19 @@ public:
{
boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bIsExploded = false;
+ bIsFrenzy = false;
+ dehydration = true;
+ uiBubbleCheckerTimer = 1000;
+ uiWaterBoltVolleyTimer = urand(10000, 15000);
+ }
+
bool bIsExploded;
bool bIsFrenzy;
bool dehydration;
@@ -101,11 +111,7 @@ public:
void Reset() override
{
- bIsExploded = false;
- bIsFrenzy = false;
- dehydration = true;
- uiBubbleCheckerTimer = 1000;
- uiWaterBoltVolleyTimer = urand(10000, 15000);
+ Initialize();
me->SetVisible(true);
DespawnWaterElements();
@@ -340,16 +346,22 @@ public:
{
npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiRangeCheck_Timer = 1000;
+ }
+
InstanceScript* instance;
uint32 uiRangeCheck_Timer;
void Reset() override
{
- uiRangeCheck_Timer = 1000;
+ Initialize();
DoCast(me, SPELL_WATER_GLOBULE);
}
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/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
index d9a66f7b420..8bc0ba1722a 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
@@ -39,7 +39,6 @@ enum Events
EVENT_DARK_SHELL
};
-
class boss_pandemonius : public CreatureScript
{
public:
@@ -81,7 +80,7 @@ public:
switch (eventId)
{
case EVENT_VOID_BLAST:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
{
DoCast(target, SPELL_VOID_BLAST);
++VoidBlastCounter;
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/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index bd16fe9edd2..15c660b4ad7 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -114,7 +114,6 @@ class boss_broggok : public CreatureScript
break;
}
}
-
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
index 82f101980fe..5baaebc0d7b 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
@@ -40,7 +40,6 @@ enum Says
enum Spells
{
SPELL_MORTAL_WOUND = 30641,
- H_SPELL_MORTAL_WOUND = 36814,
SPELL_SURGE = 34645,
SPELL_RETALIATION = 22857
};
@@ -78,7 +77,6 @@ class boss_watchkeeper_gargolmar : public CreatureScript
}
void MoveInLineOfSight(Unit* who) override
-
{
if (!me->GetVictim() && me->CanCreatureAttack(who))
{
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/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp
index 9a62cde005c..c2e7df19ca1 100644
--- a/src/server/scripts/Outland/zone_shattrath_city.cpp
+++ b/src/server/scripts/Outland/zone_shattrath_city.cpp
@@ -30,7 +30,6 @@ npc_shattrathflaskvendors
npc_zephyr
npc_kservant
npc_ishanah
-npc_khadgar
EndContentData */
#include "ScriptMgr.h"
@@ -469,73 +468,6 @@ public:
}
};
-/*######
-# npc_khadgar
-######*/
-
-#define KHADGAR_GOSSIP_1 "I've heard your name spoken only in whispers, mage. Who are you?"
-#define KHADGAR_GOSSIP_2 "Go on, please."
-#define KHADGAR_GOSSIP_3 "I see." //6th too this
-#define KHADGAR_GOSSIP_4 "What did you do then?"
-#define KHADGAR_GOSSIP_5 "What happened next?"
-#define KHADGAR_GOSSIP_7 "There was something else I wanted to ask you."
-
-class npc_khadgar : public CreatureScript
-{
-public:
- npc_khadgar() : CreatureScript("npc_khadgar") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->SEND_GOSSIP_MENU(9876, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- player->SEND_GOSSIP_MENU(9877, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- player->SEND_GOSSIP_MENU(9878, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- player->SEND_GOSSIP_MENU(9879, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
- player->SEND_GOSSIP_MENU(9880, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
- player->SEND_GOSSIP_MENU(9881, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(9243, creature->GetGUID());
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(10211) != QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(9243, creature->GetGUID());
-
- return true;
- }
-};
-
void AddSC_shattrath_city()
{
new npc_raliq_the_drunk();
@@ -544,5 +476,4 @@ void AddSC_shattrath_city()
new npc_zephyr();
new npc_kservant();
new npc_ishanah();
- new npc_khadgar();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index e198a6a0c61..e14a9934fac 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -3682,6 +3682,37 @@ class spell_gen_gm_freeze : public SpellScriptLoader
}
};
+class spell_gen_stand : public SpellScriptLoader
+{
+public:
+ spell_gen_stand() : SpellScriptLoader("spell_gen_stand") { }
+
+ class spell_gen_stand_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_stand_SpellScript);
+
+ void HandleScript(SpellEffIndex /*eff*/)
+ {
+ Creature* target = GetHitCreature();
+ if (!target)
+ return;
+
+ target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND);
+ target->HandleEmoteCommand(EMOTE_STATE_NONE);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_gen_stand_SpellScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -3763,4 +3794,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_whisper_gulch_yogg_saron_whisper();
new spell_gen_eject_all_passengers();
new spell_gen_gm_freeze();
+ new spell_gen_stand();
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index e135bb08e73..92eeef5e8a8 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -280,8 +280,8 @@ class spell_q11396_11399_force_shield_arcane_purple_x3 : public SpellScriptLoade
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
- target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- target->AddUnitState(UNIT_STATE_ROOT);
+ target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ target->AddUnitState(UNIT_STATE_ROOT);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
@@ -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();
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 944ebe27b7b..ff42743c496 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -33,7 +33,6 @@ npc_guardian 100% guardianAI used to prevent players from accessin
npc_garments_of_quests 80% NPC's related to all Garments of-quests 5621, 5624, 5625, 5648, 565
npc_injured_patient 100% patients for triage-quests (6622 and 6624)
npc_doctor 100% Gustaf Vanhowzen and Gregory Victor, quest 6622 and 6624 (Triage)
-npc_mount_vendor 100% Regular mount vendors all over the world. Display gossip if player doesn't meet the requirements to buy
npc_sayge 100% Darkmoon event fortune teller, buff player based on answers given
npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap
npc_shadowfiend 100% restore 5% of owner's mana when shadowfiend die from damage
@@ -1176,101 +1175,6 @@ public:
};
/*######
-## npc_mount_vendor
-######*/
-
-class npc_mount_vendor : public CreatureScript
-{
-public:
- npc_mount_vendor() : CreatureScript("npc_mount_vendor") { }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- bool canBuy = false;
- uint32 vendor = creature->GetEntry();
- uint8 race = player->getRace();
-
- switch (vendor)
- {
- case 384: //Katie Hunter
- case 1460: //Unger Statforth
- case 2357: //Merideth Carlson
- case 4885: //Gregor MacVince
- if (player->GetReputationRank(72) != REP_EXALTED && race != RACE_HUMAN)
- player->SEND_GOSSIP_MENU(5855, creature->GetGUID());
- else canBuy = true;
- break;
- case 1261: //Veron Amberstill
- if (player->GetReputationRank(47) != REP_EXALTED && race != RACE_DWARF)
- player->SEND_GOSSIP_MENU(5856, creature->GetGUID());
- else canBuy = true;
- break;
- case 3362: //Ogunaro Wolfrunner
- if (player->GetReputationRank(76) != REP_EXALTED && race != RACE_ORC)
- player->SEND_GOSSIP_MENU(5841, creature->GetGUID());
- else canBuy = true;
- break;
- case 3685: //Harb Clawhoof
- if (player->GetReputationRank(81) != REP_EXALTED && race != RACE_TAUREN)
- player->SEND_GOSSIP_MENU(5843, creature->GetGUID());
- else canBuy = true;
- break;
- case 4730: //Lelanai
- if (player->GetReputationRank(69) != REP_EXALTED && race != RACE_NIGHTELF)
- player->SEND_GOSSIP_MENU(5844, creature->GetGUID());
- else canBuy = true;
- break;
- case 4731: //Zachariah Post
- if (player->GetReputationRank(68) != REP_EXALTED && race != RACE_UNDEAD_PLAYER)
- player->SEND_GOSSIP_MENU(5840, creature->GetGUID());
- else canBuy = true;
- break;
- case 7952: //Zjolnir
- if (player->GetReputationRank(530) != REP_EXALTED && race != RACE_TROLL)
- player->SEND_GOSSIP_MENU(5842, creature->GetGUID());
- else canBuy = true;
- break;
- case 7955: //Milli Featherwhistle
- if (player->GetReputationRank(54) != REP_EXALTED && race != RACE_GNOME)
- player->SEND_GOSSIP_MENU(5857, creature->GetGUID());
- else canBuy = true;
- break;
- case 16264: //Winaestra
- if (player->GetReputationRank(911) != REP_EXALTED && race != RACE_BLOODELF)
- player->SEND_GOSSIP_MENU(10305, creature->GetGUID());
- else canBuy = true;
- break;
- case 17584: //Torallius the Pack Handler
- if (player->GetReputationRank(930) != REP_EXALTED && race != RACE_DRAENEI)
- player->SEND_GOSSIP_MENU(10239, creature->GetGUID());
- else canBuy = true;
- break;
- }
-
- if (canBuy)
- {
- if (creature->IsVendor())
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- }
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
-
- return true;
- }
-};
-
-
-/*######
## npc_sayge
######*/
@@ -2490,7 +2394,6 @@ void AddSC_npcs_special()
new npc_injured_patient();
new npc_garments_of_quests();
new npc_guardian();
- new npc_mount_vendor();
new npc_sayge();
new npc_steam_tonk();
new npc_tonk_mine();
diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h
index a8b688e6b26..c8f8e2dbd90 100644
--- a/src/server/shared/Networking/AsyncAcceptor.h
+++ b/src/server/shared/Networking/AsyncAcceptor.h
@@ -32,8 +32,6 @@ public:
_acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)),
_socket(ioService)
{
- boost::system::error_code error;
- _acceptor.non_blocking(true, error);
}
template <class T>
@@ -47,12 +45,13 @@ public:
{
try
{
- // this-> is required here to fix an segmentation fault in gcc 4.7.2 - reason is lambdas in a templated class
- mgrHandler(std::move(this->_socket));
+ _socket.non_blocking(true);
+
+ mgrHandler(std::move(_socket));
}
catch (boost::system::system_error const& err)
{
- TC_LOG_INFO("network", "Failed to retrieve client's remote address %s", err.what());
+ TC_LOG_INFO("network", "Failed to initialize client's socket %s", err.what());
}
}
diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h
index 2115bea3f47..2dcd4fbc161 100644
--- a/src/server/shared/Networking/MessageBuffer.h
+++ b/src/server/shared/Networking/MessageBuffer.h
@@ -81,7 +81,7 @@ public:
}
}
- void Write(void* data, std::size_t size)
+ void Write(void const* data, std::size_t size)
{
if (size)
{
diff --git a/src/server/shared/Networking/NetworkThread.h b/src/server/shared/Networking/NetworkThread.h
index 5ed7f25ed77..043aee56504 100644
--- a/src/server/shared/Networking/NetworkThread.h
+++ b/src/server/shared/Networking/NetworkThread.h
@@ -85,8 +85,8 @@ public:
}
protected:
- virtual void SocketAdded(std::shared_ptr<SocketType> sock) { }
- virtual void SocketRemoved(std::shared_ptr<SocketType> sock) { }
+ virtual void SocketAdded(std::shared_ptr<SocketType> /*sock*/) { }
+ virtual void SocketRemoved(std::shared_ptr<SocketType> /*sock*/) { }
void AddNewSockets()
{
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index 17f48343485..d1f143aeb1e 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -111,11 +111,12 @@ public:
void QueuePacket(MessageBuffer&& buffer, std::unique_lock<std::mutex>& guard)
{
-
_writeQueue.push(std::move(buffer));
#ifdef BOOST_ASIO_HAS_IOCP
AsyncProcessQueue(guard);
+#else
+ (void)guard;
#endif
}
diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h
index ed638ab89f3..dbe2b8ec902 100644
--- a/src/server/shared/Networking/SocketMgr.h
+++ b/src/server/shared/Networking/SocketMgr.h
@@ -60,7 +60,7 @@ public:
virtual void StopNetwork()
{
if (_threadCount != 0)
- for (size_t i = 0; i < _threadCount; ++i)
+ for (int32 i = 0; i < _threadCount; ++i)
_threads[i].Stop();
Wait();
@@ -69,7 +69,7 @@ public:
void Wait()
{
if (_threadCount != 0)
- for (size_t i = 0; i < _threadCount; ++i)
+ for (int32 i = 0; i < _threadCount; ++i)
_threads[i].Wait();
}
@@ -77,7 +77,7 @@ public:
{
size_t min = 0;
- for (size_t i = 1; i < _threadCount; ++i)
+ for (int32 i = 1; i < _threadCount; ++i)
if (_threads[i].GetConnectionCount() < _threads[min].GetConnectionCount())
min = i;
@@ -97,7 +97,7 @@ public:
int32 GetNetworkThreadCount() const { return _threadCount; }
protected:
- SocketMgr() : _threads(nullptr), _threadCount(1)
+ SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(1)
{
}