diff options
Diffstat (limited to 'src')
96 files changed, 1548 insertions, 1215 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 3a0d18a0d9e..75fedb5bb57 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; @@ -229,7 +209,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); } @@ -759,7 +739,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()); @@ -1002,7 +982,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 2574933eb28..90e8d8de672 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 020ff3d397c..88c0035d21d 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); } @@ -1831,3 +1831,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 71bc0be6adb..ab411e3cfc6 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -467,6 +467,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 93ab422d34b..71ab2abeba8 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1898,16 +1898,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); @@ -1918,149 +1908,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 b23ea4d8dfa..fcbb89408d0 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -627,15 +627,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); @@ -658,9 +649,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 5488f454113..1df449d50c9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20530,27 +20530,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); @@ -20560,40 +20560,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, ObjectGuid 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) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 92639c0589d..bb3fccaf35e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1213,13 +1213,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, ObjectGuid 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 e6dc745d4a7..0431a2b2c42 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; } @@ -15494,11 +15495,18 @@ 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)) + SetFeared(false); CastStop(); break; case UNIT_STATE_ROOT: if (!HasUnitState(UNIT_STATE_STUNNED)) + { SetRooted(true); + if (HasUnitState(UNIT_STATE_FLEEING)) + SetFeared(false); + } break; case UNIT_STATE_CONFUSED: if (!HasUnitState(UNIT_STATE_STUNNED)) @@ -15558,16 +15566,17 @@ void Unit::SetControlled(bool apply, UnitState state) ClearUnitState(state); - if (HasUnitState(UNIT_STATE_STUNNED)) + // Unit States might have been already cleared but auras still present. I need to check with HasAuraType + if (HasAuraType(SPELL_AURA_MOD_STUN)) SetStunned(true); else { - if (HasUnitState(UNIT_STATE_ROOT)) + if (HasAuraType(SPELL_AURA_MOD_ROOT)) SetRooted(true); - if (HasUnitState(UNIT_STATE_CONFUSED)) + if (HasAuraType(SPELL_AURA_MOD_CONFUSE)) SetConfused(true); - else if (HasUnitState(UNIT_STATE_FLEEING)) + else if (HasAuraType(SPELL_AURA_MOD_FEAR)) SetFeared(true); } } @@ -17831,3 +17840,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 3ffab32492f..d5ecc219be6 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1618,6 +1618,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); @@ -2159,6 +2160,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 80b12c6e92c..4625a05ffdf 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -4600,18 +4600,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; } @@ -8633,33 +8627,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(); @@ -8795,23 +8762,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 3960a7b4aed..a26e2959769 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/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index df43db28b73..b33f2364683 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 cb6ca112718..e4e1c9988f1 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -299,7 +299,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, true)) + if (_player->CanTakeQuest(nextQuest, false)) { if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) _player->AddQuestAndCheckCompletion(nextQuest, object); @@ -321,7 +321,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, true)) + if (_player->CanTakeQuest(nextQuest, false)) { if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) _player->AddQuestAndCheckCompletion(nextQuest, object); 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 e7a5fb77c6a..db7c26fe5cb 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: - { - ObjectGuid targetGUID = target ? target->GetGUID() : ObjectGuid::Empty; - if (!targetGUID || !targetGUID.IsPlayer()) - 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) { - ObjectGuid targetGUID = target ? target->GetGUID() : ObjectGuid::Empty; - 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 || !targetGUID.IsPlayer()) - 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 || !targetGUID.IsPlayer()) - 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/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index c9e108af8a2..8cd1cb38fcd 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3797,7 +3797,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 @@ -3808,7 +3808,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 @@ -5781,14 +5781,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; @@ -5802,9 +5806,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 4a7742aed5b..a34362ddacc 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 31ceeaf460d..8e720e9faba 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 5f3f82cf1db..5f4c8d0dfd4 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; + } ObjectGuid receiver_guid(HIGHGUID_PLAYER, uint32(atol(receiver_str))); @@ -1313,14 +1328,18 @@ public: if (handler->HasLowerSecurity(receiver, ObjectGuid::Empty)) 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 bb5b6554ebc..9b2667148a6 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/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 4b899235dd1..d7667b37e87 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 { @@ -93,9 +92,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: @@ -106,8 +105,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; @@ -162,7 +161,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); } } @@ -171,7 +170,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); } } @@ -230,13 +229,6 @@ class instance_deadmines : public InstanceMapScript return ObjectGuid::Empty; } - - 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 dc160c4167d..159035c6eb3 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 347cd2cfab2..58165df48ef 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; } @@ -668,14 +668,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; @@ -733,7 +733,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_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index dcb212eead8..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); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index c8354bde428..f88c9c6159e 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -766,7 +766,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 c33ad16f265..55f7af71253 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 cea11ab043e..b725712d473 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 9c9d3cb6a5f..a4745eade7d 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -944,7 +944,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 9cb75ec9807..55860d98cc5 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: @@ -173,15 +172,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_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp index c78ae136b70..3f74ed2eb88 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -229,7 +229,7 @@ public: void JustDied(Unit* /*killer*/) override { instance->SetBossState(DATA_MAL_GANIS, DONE); - DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT); + DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT, true); // give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc DoCastAOE(SPELL_KILL_CREDIT); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index 143f901ec0b..10ee66c86d0 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -70,6 +70,7 @@ class boss_meathook : public CreatureScript 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)); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp index 6925badf272..1d2ed933243 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp @@ -15,14 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* Script Data Start -SDName: Boss salramm -SDAuthor: Tartalo -SD%Complete: 80 -SDComment: @todo Intro -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "culling_of_stratholme.h" @@ -31,9 +23,7 @@ enum Spells { SPELL_CURSE_OF_TWISTED_FLESH = 58845, SPELL_EXPLODE_GHOUL = 52480, - H_SPELL_EXPLODE_GHOUL = 58825, SPELL_SHADOW_BOLT = 57725, - H_SPELL_SHADOW_BOLT = 58828, SPELL_STEAL_FLESH = 52708, SPELL_SUMMON_GHOULS = 52451 }; @@ -49,114 +39,89 @@ enum Yells SAY_SUMMON_GHOULS = 6 }; -class boss_salramm : public CreatureScript +enum Events { -public: - boss_salramm() : CreatureScript("boss_salramm") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_salrammAI>(creature); - } - - struct boss_salrammAI : public ScriptedAI - { - boss_salrammAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - Talk(SAY_SPAWN); - } - - void Initialize() - { - uiCurseFleshTimer = 30000; //30s DBM - uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls - uiShadowBoltTimer = urand(8000, 12000); // approx 10s - uiStealFleshTimer = 12345; - uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro - } - - uint32 uiCurseFleshTimer; - uint32 uiExplodeGhoulTimer; - uint32 uiShadowBoltTimer; - uint32 uiStealFleshTimer; - uint32 uiSummonGhoulsTimer; - - InstanceScript* instance; - - void Reset() override - { - Initialize(); - - instance->SetBossState(DATA_SALRAMM, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); + EVENT_CURSE_FLESH = 1, + EVENT_EXPLODE_GHOUL, + EVENT_SHADOW_BOLT, + EVENT_STEAL_FLESH, + EVENT_SUMMON_GHOULS +}; - instance->SetBossState(DATA_SALRAMM, IN_PROGRESS); - } +class boss_salramm : public CreatureScript +{ + public: + boss_salramm() : CreatureScript("boss_salramm") { } - void UpdateAI(uint32 diff) override + struct boss_salrammAI : public BossAI { - //Return since we have no target - if (!UpdateVictim()) - return; - - //Curse of twisted flesh timer - if (uiCurseFleshTimer <= diff) + boss_salrammAI(Creature* creature) : BossAI(creature, DATA_SALRAMM) { - DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH); - uiCurseFleshTimer = 37000; - } else uiCurseFleshTimer -= diff; + Talk(SAY_SPAWN); + } - //Shadow bolt timer - if (uiShadowBoltTimer <= diff) + void EnterCombat(Unit* /*who*/) override { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHADOW_BOLT); - uiShadowBoltTimer = urand(8000, 12000); - } else uiShadowBoltTimer -= diff; + Talk(SAY_AGGRO); + _EnterCombat(); - //Steal Flesh timer - if (uiStealFleshTimer <= diff) - { - Talk(SAY_STEAL_FLESH); - if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(random_pTarget, SPELL_STEAL_FLESH); - uiStealFleshTimer = 10000; - } else uiStealFleshTimer -= diff; + events.ScheduleEvent(EVENT_CURSE_FLESH, 30000); + events.ScheduleEvent(EVENT_SUMMON_GHOULS, urand(19000, 24000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000)); + events.ScheduleEvent(EVENT_STEAL_FLESH, 12345); /// @todo: adjust timer + } - //Summon ghouls timer - if (uiSummonGhoulsTimer <= diff) + void ExecuteEvent(uint32 eventId) override { - Talk(SAY_SUMMON_GHOULS); - if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(random_pTarget, SPELL_SUMMON_GHOULS); - uiSummonGhoulsTimer = 10000; - } else uiSummonGhoulsTimer -= diff; - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); + switch (eventId) + { + case EVENT_CURSE_FLESH: + DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH); + events.ScheduleEvent(EVENT_CURSE_FLESH, 37000); + break; + case EVENT_SUMMON_GHOULS: + Talk(SAY_SUMMON_GHOULS); + DoCast(me, SPELL_SUMMON_GHOULS); + events.ScheduleEvent(EVENT_SUMMON_GHOULS, 10000); + events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 6000); + break; + case EVENT_SHADOW_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_SHADOW_BOLT); + events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000)); + break; + case EVENT_STEAL_FLESH: + Talk(SAY_STEAL_FLESH); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + DoCast(target, SPELL_STEAL_FLESH); + events.ScheduleEvent(EVENT_STEAL_FLESH, 12345); + break; + case EVENT_EXPLODE_GHOUL: + Talk(SAY_EXPLODE_GHOUL); + DoCast(me, SPELL_EXPLODE_GHOUL, true); + break; + default: + break; + } + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } - instance->SetBossState(DATA_SALRAMM, DONE); - } + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + }; - void KilledUnit(Unit* victim) override + CreatureAI* GetAI(Creature* creature) const override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + return GetInstanceAI<boss_salrammAI>(creature); } - }; - }; void AddSC_boss_salramm() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp index e20e976b4b9..ae0fa2aa564 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 @@ -63,6 +63,7 @@ class instance_culling_of_stratholme : public InstanceMapScript _crateCount = 0; _eventTimer = 0; + _infiniteCouterState = NOT_STARTED; } void FillInitialWorldStates(WorldPacket& data) override diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index eec2a590bd4..5c083e43d3d 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/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 9839eb3d952..30d831da30c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -150,6 +150,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript break; case NPC_ANUBARAK: AnubarakGUID = creature->GetGUID(); + creature->SetRespawnDelay(7 * DAY); break; default: break; 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 10b74ca938d..aa284f1aaee 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 ec38332613d..97c7d7c4052 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 32c7fa048dc..650777a8815 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->GetGuidData(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->GetGuidData(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 6dcdd05048a..4151c4a85a7 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -112,6 +112,10 @@ class instance_naxxramas : public InstanceMapScript LoadDoorData(doorData); LoadMinionData(minionData); + minHorsemenDiedTime = 0; + maxHorsemenDiedTime = 0; + AbominationCount = 0; + playerDied = 0; } @@ -430,7 +434,6 @@ class instance_naxxramas : public InstanceMapScript ObjectGuid BaronGUID; ObjectGuid SirGUID; ObjectGuid HorsemenChestGUID; - ObjectGuid 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 856a16fd4dd..5862453731e 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.Clear(); @@ -367,6 +364,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); @@ -1175,17 +1181,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 @@ -1509,10 +1521,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*/) @@ -1541,7 +1550,6 @@ public: } private: - Creature* _malygos; InstanceScript* _instance; }; @@ -1561,6 +1569,7 @@ public: { npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature) { + _summoner = NULL; } void IsSummonedBy(Unit* summoner) override diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index fde19c124bf..ed08296acd8 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.Clear(); + chaosTheory = true; + } + InstanceScript* instance; uint8 Phase; uint32 uiSparkTimer; - uint32 uiCreateRiftTimer; ObjectGuid uiChaoticRiftGUID; bool chaosTheory; void Reset() override { - Phase = 0; - uiSparkTimer = 5000; - uiChaoticRiftGUID.Clear(); - 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 d6afab7c3fd..6b3df5ef665 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; GuidList 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 6f42237e34a..8c58a65cdbe 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.Clear(); + uiFrostMagusGUID.Clear(); + uiArcaneMagusGUID.Clear(); + + 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.Clear(); - uiFrostMagusGUID.Clear(); - uiArcaneMagusGUID.Clear(); - - 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 70371e17074..0119b81796e 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.Clear(); + } + + 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 b4a95239df2..b5079d8cf4f 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -106,11 +106,34 @@ public: { boss_bjarngrimAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); m_uiStance = STANCE_DEFENSIVE; 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; @@ -142,24 +165,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 932a8e7b691..274fbed0fc9 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 c377de38372..d63d5e87923 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; GuidList 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 4e01cefaaaa..ac3df1e49aa 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 2c7bdf3465b..f98a6e40a07 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->GetGuidData(DATA_GO_KADDRAK), false); instance->HandleGameObject(instance->GetGuidData(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.Clear(); + 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.Clear(); - 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 18b3723307e..bd5b61e227f 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 fd424ad971b..bb7a8592e04 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 1245a232ae6..b84ba45951e 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.Clear(); 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 52cf017eb8e..959cb73a996 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,11 @@ class boss_flame_leviathan : public CreatureScript { boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN), vehicle(creature->GetVehicleKit()) { + Initialize(); } - void InitializeAI() override + void Initialize() { - ASSERT(vehicle); - if (!me->isDead()) - Reset(); - ActiveTowersCount = 4; Shutdown = 0; ActiveTowers = false; @@ -243,6 +240,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 +640,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 +793,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 +974,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 +992,7 @@ public: void Reset() override { - infernoTimer = 2000; + Initialize(); } uint32 infernoTimer; @@ -1047,14 +1071,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 +1120,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 +1563,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 b3755672790..93fee8d1964 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -266,26 +266,16 @@ class boss_freya : public CreatureScript struct boss_freyaAI : public BossAI { - boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA) { } - - ObjectGuid 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; @@ -306,6 +296,27 @@ class boss_freya : public CreatureScript random[n] = false; } + ObjectGuid 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) @@ -688,8 +699,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 @@ -757,9 +766,6 @@ class boss_elder_brightleaf : public CreatureScript } } - if (lumberjack) - lumberjackTimer += diff; - DoMeleeAttackIfReady(); } @@ -767,21 +773,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 @@ -809,8 +806,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 @@ -884,9 +879,6 @@ class boss_elder_stonebark : public CreatureScript } } - if (lumberjack) - lumberjackTimer += diff; - DoMeleeAttackIfReady(); } @@ -894,21 +886,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 @@ -936,8 +919,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 @@ -998,9 +979,6 @@ class boss_elder_ironbranch : public CreatureScript } } - if (lumberjack) - lumberjackTimer += diff; - DoMeleeAttackIfReady(); } @@ -1008,21 +986,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 @@ -1040,15 +1009,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()) @@ -1098,16 +1073,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->GetGuidData(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()) @@ -1158,17 +1141,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->GetGuidData(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()) @@ -1228,6 +1219,8 @@ class npc_snaplasher : public CreatureScript instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_FREYA))) waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + else + waveCount = 0; } void UpdateAI(uint32 /*diff*/) override @@ -1270,12 +1263,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 1b456815ec7..9cb5e71b471 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 7eb6c72feab..f1cfea0e58f 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.Clear(); + checkDespawnTimer = 1000; + } + InstanceScript* instance; ObjectGuid targetGUID; @@ -193,8 +200,7 @@ class npc_flash_freeze : public CreatureScript void Reset() override { - targetGUID.Clear(); - checkDespawnTimer = 1000; + Initialize(); } void UpdateAI(uint32 diff) override @@ -311,9 +317,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; @@ -323,11 +339,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); @@ -525,16 +537,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 @@ -573,16 +591,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 e91e6ab4c5f..d4fbf959c53 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.Clear(); + _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.Clear(); - _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,10 +377,18 @@ 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 Initialize() + { + _heat = false; + _constructGUID.Clear(); + _heatTimer = 0; + } + void MoveInLineOfSight(Unit* who) override { if (!_heat) @@ -386,10 +406,8 @@ class npc_scorch_ground : public CreatureScript void Reset() override { - _heat = false; + Initialize(); DoCast(me, SPELL_GROUND); - _constructGUID.Clear(); - _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 9dff8025f7a..cad6b045120 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->GetGuidData(DATA_EXPEDITION_COMMANDER))) commander->AI()->DoAction(ACTION_COMMANDER_RESET); } @@ -594,7 +604,14 @@ class npc_expedition_commander : public CreatureScript { npc_expedition_commanderAI(Creature* creature) : ScriptedAI(creature), summons(creature) { + Initialize(); instance = me->GetInstanceScript(); + } + + void Initialize() + { + AttackStartTimer = 0; + Phase = 0; Greet = false; } @@ -604,14 +621,12 @@ class npc_expedition_commander : public CreatureScript bool Greet; uint32 AttackStartTimer; uint8 Phase; - Creature* Engineer[4]; - Creature* Defender[4]; + ObjectGuid Engineer[4]; + ObjectGuid Defender[4]; void Reset() override { - AttackStartTimer = 0; - Phase = 0; - Greet = false; + Initialize(); summons.DespawnAll(); } @@ -659,31 +674,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 +718,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 +773,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 +795,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 +882,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 +939,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 +1002,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 +1020,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 cfc9b0f5cdc..2032c7b861d 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->GetGuidData(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->GetGuidData(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 9cbd7be8059..391aebf9229 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 8861b0a1332..c08e1934552 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 01532daf0cd..02cf5ade52a 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 b8ad5d07bcb..061499f2025 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->GetGuidData(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 fb40f794fd5..5d6a2416d73 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -169,7 +169,23 @@ public: { boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me) { + Initialize(); instance = creature->GetInstanceScript(); + 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; @@ -190,15 +206,7 @@ public: void Reset() override { - 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 d69f0885f58..bf9d9eaa43b 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.Clear(); + _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.Clear(); + Initialize(); instance->SetGuidData(DATA_SACRIFICED_PLAYER, ObjectGuid::Empty); } @@ -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 9521d0cf4cf..c4312e08704 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; - - ObjectGuid m_uiActivedCreatureGUID; - ObjectGuid m_uiOrbGUID; + void Initialize() + { + kingsBane = true; + ActivedNumber = 0; + HealthAmountModifier = 1; + HealthAmountMultipler = DUNGEON_MODE(20, 25); + ActiveAncestorGUID.Clear(); + SpiritFountGUID.Clear(); + } 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.Clear(); - m_uiOrbGUID.Clear(); + 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(ObjectGuid& m_uiCreatureGUID) + void DespawnBoatGhosts(ObjectGuid& 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.Clear(); + CreatureGUID.Clear(); } + + private: + bool kingsBane; // Achievement King's Bane + uint8 ActiveOrder[4]; + uint8 ActivedNumber; + uint32 HealthAmountModifier; + uint32 HealthAmountMultipler; + ObjectGuid ActiveAncestorGUID; + ObjectGuid 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 1118af13777..bacb63b73bc 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 9f9d5104d7d..a7895b8d506 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 87d34efe74f..bbb8c758bb1 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 d556d19f670..50a65920876 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 203bf6f1be6..53fe1500624 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -977,15 +977,15 @@ public: void HandleScript(SpellEffIndex /*effIndex*/) { - if (Player* player = GetHitUnit()->ToPlayer()) + if (Unit* target = GetHitUnit()) { switch (GetSpellInfo()->Id) { case SPELL_CORRECT_TRACKS: - player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_CORRECT_TRACKS), LANG_UNIVERSAL, player); + target->Say(SAY_CORRECT_TRACKS, target); break; case SPELL_INCORRECT_TRACKS: - player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_INCORRECT_TRACKS), LANG_UNIVERSAL, player); + target->Say(SAY_INCORRECT_TRACKS, target); break; default: break; diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 3f08ecad7b7..4ec6aed9655 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 @@ -604,7 +602,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 } @@ -760,7 +758,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 83b8b1847b5..05db2c12b90 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -278,7 +278,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/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 7951e25d675..db0159d1a2d 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -176,7 +176,7 @@ class instance_magtheridons_lair : public InstanceMapScript Creature* Magtheridon = instance->GetCreature(MagtheridonGUID); if (Magtheridon && Magtheridon->IsAlive()) { - Magtheridon->MonsterTextEmote(EMOTE_BONDS_WEAKEN, NULL); + Magtheridon->TextEmote(EMOTE_BONDS_WEAKEN); CageTimer = 120000; } HandleGameObject(DoorGUID, false); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e96e325b933..e5ef3d5b7b7 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 28a16e2f1d3..00ce2cb280e 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/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 6aa7974b1c1..dfff60a380b 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -116,7 +116,7 @@ public: #ifdef BOOST_ASIO_HAS_IOCP AsyncProcessQueue(guard); #else - (void)guard; + (void)guard; #endif } @@ -148,7 +148,7 @@ protected: return true; _isWritingAsync = true; - + #ifdef BOOST_ASIO_HAS_IOCP MessageBuffer& buffer = _writeQueue.front(); _socket.async_write_some(boost::asio::buffer(buffer.GetReadPointer(), buffer.GetActiveSize()), std::bind(&Socket<T>::WriteHandler, diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h index 47bd7794a4c..dbe2b8ec902 100644 --- a/src/server/shared/Networking/SocketMgr.h +++ b/src/server/shared/Networking/SocketMgr.h @@ -97,7 +97,7 @@ public: int32 GetNetworkThreadCount() const { return _threadCount; } protected: - SocketMgr() : _threads(nullptr), _threadCount(1) + SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(1) { } |