diff options
Diffstat (limited to 'src/server')
294 files changed, 3160 insertions, 3476 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a94b58868ee..ee8fee198bf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5846,40 +5846,38 @@ float Player::OCTRegenMPPerSpirit()      return regen;  } -void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply) +void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply)  { -    float oldRating = m_baseRatingValue[cr]; -    m_baseRatingValue[cr]+=(apply ? value : -value); +    float oldRating = m_baseRatingValue[combatRating]; +    m_baseRatingValue[combatRating] += (apply ? value : -value); +      // explicit affected values -    if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL) -    { -        float const mult = GetRatingMultiplier(cr); -        float const oldVal = oldRating * mult; -        float const newVal = m_baseRatingValue[cr] * mult; -        switch (cr) -        { -            case CR_HASTE_MELEE: -                ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false); -                ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false); -                ApplyAttackTimePercentMod(BASE_ATTACK, newVal, true); -                ApplyAttackTimePercentMod(OFF_ATTACK, newVal, true); +    float const multiplier = GetRatingMultiplier(combatRating); +    float const oldVal = oldRating * multiplier; +    float const newVal = m_baseRatingValue[combatRating] * multiplier; +    switch (combatRating) +    { +        case CR_HASTE_MELEE: +            ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false); +            ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false); +            ApplyAttackTimePercentMod(BASE_ATTACK, newVal, true); +            ApplyAttackTimePercentMod(OFF_ATTACK, newVal, true);                  if (getClass() == CLASS_DEATH_KNIGHT)		                      UpdateAllRunesRegen(); -                break; -            case CR_HASTE_RANGED: -                ApplyAttackTimePercentMod(RANGED_ATTACK, oldVal, false); -                ApplyAttackTimePercentMod(RANGED_ATTACK, newVal, true); -                break; -            case CR_HASTE_SPELL: -                ApplyCastTimePercentMod(oldVal, false); -                ApplyCastTimePercentMod(newVal, true); -                break; -            default: // shut up compiler warnings -                break; -        } +            break; +        case CR_HASTE_RANGED: +            ApplyAttackTimePercentMod(RANGED_ATTACK, oldVal, false); +            ApplyAttackTimePercentMod(RANGED_ATTACK, newVal, true); +            break; +        case CR_HASTE_SPELL: +            ApplyCastTimePercentMod(oldVal, false); +            ApplyCastTimePercentMod(newVal, true); +            break; +        default: +            break;      } -    UpdateRating(cr); +    UpdateRating(combatRating);  }  void Player::UpdateRating(CombatRating cr) @@ -27221,13 +27219,13 @@ void Player::SendItemRetrievalMail(uint32 itemEntry, uint32 count)      MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);      MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.      SQLTransaction trans = CharacterDatabase.BeginTransaction(); -     +      if (Item* item = Item::CreateItem(itemEntry, count, 0))      {          item->SaveToDB(trans);          draft.AddItem(item);      } -     +      draft.SendMailTo(trans, MailReceiver(this, GetGUIDLow()), sender);      CharacterDatabase.CommitTransaction(trans);  } diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index b0e0d60803b..ee428694beb 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -34,6 +34,7 @@  #include "GameObjectAI.h"  #include "SpellAuraEffects.h"  #include "Player.h" +#include "Config.h"  void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)  { @@ -481,6 +482,25 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)      // maybe should only remove one buff when there are multiple?      _player->RemoveOwnedAura(spellId, 0, 0, AURA_REMOVE_BY_CANCEL); + +    // If spell being removed is a resource tracker, see if player was tracking both (herbs / minerals) and remove the other +    if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES)) +    { +        Unit::AuraEffectList const& auraEffects = _player->GetAuraEffectsByType(SPELL_AURA_TRACK_RESOURCES); +        if (!auraEffects.empty()) +        { +            // Build list of spell IDs to cancel. Trying to cancel the aura while iterating +            //  over AuraEffectList caused "incompatible iterator" errors on second pass +            std::list<uint32> spellIDs; + +            for (Unit::AuraEffectList::const_iterator auraEffect = auraEffects.begin(); auraEffect != auraEffects.end(); auraEffect++) +                spellIDs.push_back((*auraEffect)->GetId()); + +            // Remove all auras related to resource tracking (only Herbs and Minerals in 3.3.5a) +            for (std::list<uint32>::iterator it = spellIDs.begin(); it != spellIDs.end(); it++) +                _player->RemoveOwnedAura(*it, 0, 0, AURA_REMOVE_BY_CANCEL); +        } +    }  }  void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket) diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 46e1352df3f..ec149c34431 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -43,16 +43,6 @@ void InstanceScript::SaveToDB()      CharacterDatabase.Execute(stmt);  } -void InstanceScript::HandleGameObject(uint64 GUID, bool open, GameObject* go) -{ -    if (!go) -        go = instance->GetGameObject(GUID); -    if (go) -        go->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); -    else -        TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed"); -} -  bool InstanceScript::IsEncounterInProgress() const  {      for (std::vector<BossInfo>::const_iterator itr = bosses.begin(); itr != bosses.end(); ++itr) @@ -62,6 +52,13 @@ bool InstanceScript::IsEncounterInProgress() const      return false;  } +void InstanceScript::SetHeaders(std::string const& dataHeaders) +{ +    for (char header : dataHeaders) +        if (isalpha(header)) +            headers.push_back(header); +} +  void InstanceScript::LoadMinionData(const MinionData* data)  {      while (data->entry) @@ -232,65 +229,140 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state)      return false;  } -std::string InstanceScript::LoadBossState(const char * data) +void InstanceScript::Load(char const* data)  {      if (!data) -        return NULL; +    { +        OUT_LOAD_INST_DATA_FAIL; +        return; +    } + +    OUT_LOAD_INST_DATA(data); +      std::istringstream loadStream(data); -    uint32 buff; + +    if (ReadSaveDataHeaders(loadStream)) +    { +        ReadSaveDataBossStates(loadStream); +        ReadSaveDataMore(loadStream); +    } +    else +        OUT_LOAD_INST_DATA_FAIL; + +    OUT_LOAD_INST_DATA_COMPLETE; +} + +bool InstanceScript::ReadSaveDataHeaders(std::istringstream& data) +{ +    for (char header : headers) +    { +        char buff; +        data >> buff; + +        if (header != buff) +            return false; +    } + +    return true; +} + +void InstanceScript::ReadSaveDataBossStates(std::istringstream& data) +{      uint32 bossId = 0;      for (std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i, ++bossId)      { -        loadStream >> buff; +        uint32 buff; +        data >> buff; +        if (buff == IN_PROGRESS || buff == SPECIAL) +            buff = NOT_STARTED; +          if (buff < TO_BE_DECIDED) -            SetBossState(bossId, (EncounterState)buff); +            SetBossState(bossId, EncounterState(buff));      } -    return loadStream.str();  } -std::string InstanceScript::GetBossSaveData() +std::string InstanceScript::GetSaveData()  { +    OUT_SAVE_INST_DATA; +      std::ostringstream saveStream; -    for (std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i) -        saveStream << (uint32)i->state << ' '; + +    WriteSaveDataHeaders(saveStream); +    WriteSaveDataBossStates(saveStream); +    WriteSaveDataMore(saveStream); + +    OUT_SAVE_INST_DATA_COMPLETE; +      return saveStream.str();  } -void InstanceScript::DoUseDoorOrButton(uint64 uiGuid, uint32 uiWithRestoreTime, bool bUseAlternativeState) +void InstanceScript::WriteSaveDataHeaders(std::ostringstream& data)  { -    if (!uiGuid) -        return; +    for (char header : headers) +        data << header << ' '; +} -    GameObject* go = instance->GetGameObject(uiGuid); +void InstanceScript::WriteSaveDataBossStates(std::ostringstream& data) +{ +    for (BossInfo const& bossInfo : bosses) +        data << uint32(bossInfo.state) << ' '; +} +void InstanceScript::HandleGameObject(uint64 guid, bool open, GameObject* go /*= nullptr*/) +{ +    if (!go) +        go = instance->GetGameObject(guid);      if (go) +        go->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); +    else +        TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed"); +} + +void InstanceScript::DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime /*= 0*/, bool useAlternativeState /*= false*/) +{ +    if (!guid) +        return; + +    if (GameObject* go = instance->GetGameObject(guid))      {          if (go->GetGoType() == GAMEOBJECT_TYPE_DOOR || go->GetGoType() == GAMEOBJECT_TYPE_BUTTON)          {              if (go->getLootState() == GO_READY) -                go->UseDoorOrButton(uiWithRestoreTime, bUseAlternativeState); +                go->UseDoorOrButton(withRestoreTime, useAlternativeState);              else if (go->getLootState() == GO_ACTIVATED)                  go->ResetDoorOrButton();          }          else -            TC_LOG_ERROR("misc", "SD2: Script call DoUseDoorOrButton, but gameobject entry %u is type %u.", go->GetEntry(), go->GetGoType()); +            TC_LOG_ERROR("scripts", "InstanceScript: DoUseDoorOrButton can't use gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType());      } +    else +        TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed");  } -void InstanceScript::DoRespawnGameObject(uint64 uiGuid, uint32 uiTimeToDespawn) +void InstanceScript::DoRespawnGameObject(uint64 guid, uint32 timeToDespawn /*= MINUTE*/)  { -    if (GameObject* go = instance->GetGameObject(uiGuid)) +    if (GameObject* go = instance->GetGameObject(guid))      { -        //not expect any of these should ever be handled -        if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE || go->GetGoType() == GAMEOBJECT_TYPE_DOOR || -            go->GetGoType() == GAMEOBJECT_TYPE_BUTTON || go->GetGoType() == GAMEOBJECT_TYPE_TRAP) -            return; +        switch (go->GetGoType()) +        { +            case GAMEOBJECT_TYPE_DOOR: +            case GAMEOBJECT_TYPE_BUTTON: +            case GAMEOBJECT_TYPE_TRAP: +            case GAMEOBJECT_TYPE_FISHINGNODE: +                // not expect any of these should ever be handled +                TC_LOG_ERROR("scripts", "InstanceScript: DoRespawnGameObject can't respawn gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType()); +                return; +            default: +                break; +        }          if (go->isSpawned())              return; -        go->SetRespawnTime(uiTimeToDespawn); +        go->SetRespawnTime(timeToDespawn);      } +    else +        TC_LOG_DEBUG("scripts", "InstanceScript: DoRespawnGameObject failed");  }  void InstanceScript::DoUpdateWorldState(uint32 uiStateId, uint32 uiStateData) diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 7e9be651e61..5451849506e 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -140,38 +140,38 @@ class InstanceScript : public ZoneScript          Map* instance; -        //On creation, NOT load. +        // On creation, NOT load.          virtual void Initialize() { } -        //On load -        virtual void Load(char const* data) { LoadBossState(data); } +        // On load +        virtual void Load(char const* data); -        //When save is needed, this function generates the data -        virtual std::string GetSaveData() { return GetBossSaveData(); } +        // When save is needed, this function generates the data +        virtual std::string GetSaveData();          void SaveToDB();          virtual void Update(uint32 /*diff*/) { } -        //Used by the map's CanEnter function. -        //This is to prevent players from entering during boss encounters. +        // Used by the map's CanEnter function. +        // This is to prevent players from entering during boss encounters.          virtual bool IsEncounterInProgress() const; -        //Called when a player successfully enters the instance. +        // Called when a player successfully enters the instance.          virtual void OnPlayerEnter(Player* /*player*/) { } -        //Handle open / close objects -        //use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts -        //use HandleGameObject(GUID, boolen, NULL); in any other script -        void HandleGameObject(uint64 guid, bool open, GameObject* go = NULL); +        // Handle open / close objects +        // * use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts +        // * use HandleGameObject(GUID, boolen, NULL); in any other script +        void HandleGameObject(uint64 guid, bool open, GameObject* go = nullptr); -        //change active state of doors or buttons +        // Change active state of doors or buttons          void DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime = 0, bool useAlternativeState = false); -        //Respawns a GO having negative spawntimesecs in gameobject-table +        // Respawns a GO having negative spawntimesecs in gameobject-table          void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn = MINUTE); -        //sends world state update to all players in instance +        // Sends world state update to all players in instance          void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue);          // Send Notify to all players in instance @@ -221,6 +221,7 @@ class InstanceScript : public ZoneScript          void UpdatePhasing();      protected: +        void SetHeaders(std::string const& dataHeaders);          void SetBossNumber(uint32 number) { bosses.resize(number); }          void LoadDoorData(DoorData const* data);          void LoadMinionData(MinionData const* data); @@ -231,9 +232,16 @@ class InstanceScript : public ZoneScript          void UpdateDoorState(GameObject* door);          void UpdateMinionState(Creature* minion, EncounterState state); -        std::string LoadBossState(char const* data); -        std::string GetBossSaveData(); +        // Instance Load and Save +        bool ReadSaveDataHeaders(std::istringstream& data); +        void ReadSaveDataBossStates(std::istringstream& data); +        virtual void ReadSaveDataMore(std::istringstream& /*data*/) { } +        void WriteSaveDataHeaders(std::ostringstream& data); +        void WriteSaveDataBossStates(std::ostringstream& data); +        virtual void WriteSaveDataMore(std::ostringstream& /*data*/) { } +      private: +        std::vector<char> headers;          std::vector<BossInfo> bosses;          DoorInfoMap doors;          MinionInfoMap minions; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 57fa39b8d8c..c8106952488 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -412,8 +412,8 @@ enum TrinityStrings      LANG_BANINFO_HISTORYENTRY           = 418,      LANG_BANINFO_INFINITE               = 419,      LANG_BANINFO_NEVER                  = 420, -    LANG_BANINFO_YES                    = 421, -    LANG_BANINFO_NO                     = 422, +    LANG_YES                            = 421, +    LANG_NO                             = 422,      LANG_BANINFO_IPENTRY                = 423,      LANG_BANLIST_NOIP                   = 424, @@ -1024,7 +1024,7 @@ enum TrinityStrings      LANG_BG_AV_START_TWO_MINUTES        = 1333,      // FREE IDS                           1334-1999 -    // Ticket Strings 2000-2029 +    // Ticket Strings 2000-2030      LANG_COMMAND_TICKETNEW              = 2000,      LANG_COMMAND_TICKETUPDATED          = 2001,      LANG_COMMAND_TICKETPLAYERABANDON    = 2002, @@ -1055,6 +1055,7 @@ enum TrinityStrings      LANG_COMMAND_TICKETPENDING          = 2027,      LANG_COMMAND_TICKETRESET            = 2028,      LANG_COMMAND_TICKETLISTRESPONSE     = 2029, +    LANG_COMMAND_TICKETCOMPLETED        = 2030,      // Trinity strings                    5000-9999      LANG_COMMAND_FREEZE                 = 5000, @@ -1088,16 +1089,37 @@ enum TrinityStrings      LANG_GOINFO_NAME                    = 5027,      LANG_GOINFO_LOOTID                  = 5028,      LANG_COMMAND_LOOKUP_MAX_RESULTS     = 5029, -    // unused                           = 5030, +    LANG_UNAUTHORIZED                   = 5030,      LANG_NPCINFO_AIINFO                 = 5031,      LANG_COMMAND_NO_BATTLEGROUND_FOUND  = 5032,      LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND = 5033,      LANG_COMMAND_NO_OUTDOOR_PVP_FORUND  = 5034, -    // unused                           = 5035, +    LANG_NO_REASON                      = 5035,      LANG_NPCINFO_EQUIPMENT              = 5036,      LANG_NPCINFO_MECHANIC_IMMUNE        = 5037,      LANG_NPCINFO_UNIT_FIELD_FLAGS       = 5038, -    // Room for more Trinity strings      5039-9999 +    LANG_CONSOLE                        = 5039, +    LANG_CHARACTER                      = 5040, +    LANG_PERMANENTLY                    = 5041, +    LANG_GPS_POSITION_OUTDOORS          = 5042, +    LANG_GPS_POSITION_INDOORS           = 5043, +    LANG_GPS_NO_VMAP                    = 5044, + +    // Instance commands +    LANG_COMMAND_LIST_BIND_INFO         = 5045, +    LANG_COMMAND_LIST_BIND_PLAYER_BINDS = 5046, +    LANG_COMMAND_LIST_BIND_GROUP_BINDS  = 5047, +    LANG_COMMAND_INST_UNBIND_UNBINDING  = 5048, +    LANG_COMMAND_INST_UNBIND_UNBOUND    = 5049, +    LANG_COMMAND_INST_STAT_LOADED_INST  = 5050, +    LANG_COMMAND_INST_STAT_PLAYERS_IN   = 5051, +    LANG_COMMAND_INST_STAT_SAVES        = 5052, +    LANG_COMMAND_INST_STAT_PLAYERSBOUND = 5053, +    LANG_COMMAND_INST_STAT_GROUPSBOUND  = 5054, +    LANG_NOT_DUNGEON                    = 5055, // Map is not a dungeon. +    LANG_NO_INSTANCE_DATA               = 5056, // Map has no instance data. + +    // Room for more Trinity strings      5057-9999      // Level requirement notifications      LANG_SAY_REQ                        = 6604, diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 3359d287b21..dadca633401 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -35,6 +35,7 @@  #include "ScriptMgr.h"  #include "SpellScript.h"  #include "Vehicle.h" +#include "Config.h"  AuraApplication::AuraApplication(Unit* target, Unit* caster, Aura* aura, uint8 effMask):  _target(target), _base(aura), _removeMode(AURA_REMOVE_NONE), _slot(MAX_AURAS), @@ -1613,6 +1614,15 @@ bool Aura::CanStackWith(Aura const* existingAura) const              return true;      } +    // Check for custom server setting to allow tracking both Herbs and Minerals +    // Note: The following are client limitations and cannot be coded for: +    //  * The minimap tracking icon will display whichever skill is activated second +    //  * The minimap tracking list will only show a check mark next to the last skill activated +    //    Sometimes this bugs out and doesn't switch the check mark. It has no effect on the actual tracking though. +    //  * The minimap dots are yellow for both resources +    if (m_spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES) && existingSpellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES)) +        return sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES); +      // check spell specific stack rules      if (m_spellInfo->IsAuraExclusiveBySpecificWith(existingSpellInfo)          || (sameCaster && m_spellInfo->IsAuraExclusiveBySpecificPerCasterWith(existingSpellInfo))) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 47556478465..9ff644a7616 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -6485,7 +6485,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo      // check for ignore LOS on the effect itself      if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS))          return true; -  +      // if spell is triggered, need to check for LOS disable on the aura triggering it and inherit that behaviour      if (IsTriggered() && m_triggeredByAuraSpell && (m_triggeredByAuraSpell->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_triggeredByAuraSpell->Id, NULL, SPELL_DISABLE_LOS)))          return true; diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index c6b1da46e6b..566033fb700 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -184,7 +184,7 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, bool detailed) c      return ss.str();  } -std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const +std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const  {      std::stringstream ss;      ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); @@ -197,6 +197,8 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szCl          ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, szUnassignedName);      if (szDeletedName)          ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, szDeletedName); +    if (szCompletedName) +        ss << handler.PGetParseString(LANG_COMMAND_TICKETCOMPLETED, szCompletedName);      return ss.str();  } diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h index 5ad44365e7f..8b1c8fbc0f9 100644 --- a/src/server/game/Tickets/TicketMgr.h +++ b/src/server/game/Tickets/TicketMgr.h @@ -142,7 +142,7 @@ public:      void TeleportTo(Player* player) const;      std::string FormatMessageString(ChatHandler& handler, bool detailed = false) const; -    std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const; +    std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const;      void SetChatLog(std::list<uint32> time, std::string const& log);      std::string const& GetChatLog() const { return _chatLog; } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index ab8a1acc5f4..0f896ecff5c 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1204,6 +1204,7 @@ void World::LoadConfigSettings(bool reload)      if (m_int_configs[CONFIG_PVP_TOKEN_COUNT] < 1)          m_int_configs[CONFIG_PVP_TOKEN_COUNT] = 1; +    m_bool_configs[CONFIG_ALLOW_TRACK_BOTH_RESOURCES] = sConfigMgr->GetBoolDefault("AllowTrackBothResources", false);      m_bool_configs[CONFIG_NO_RESET_TALENT_COST] = sConfigMgr->GetBoolDefault("NoResetTalentsCost", false);      m_bool_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowKickInWorld", false);      m_bool_configs[CONFIG_SHOW_MUTE_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowMuteInWorld", false); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 6523ade972a..e38f6bc47ff 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -164,6 +164,7 @@ enum WorldBoolConfigs      CONFIG_STATS_LIMITS_ENABLE,      CONFIG_INSTANCES_RESET_ANNOUNCE,      CONFIG_IP_BASED_ACTION_LOGGING, +    CONFIG_ALLOW_TRACK_BOTH_RESOURCES,      BOOL_CONFIG_VALUE_COUNT  }; diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 121da6489a3..880cf1eac1f 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -287,7 +287,7 @@ public:              bool permanent = (fields[1].GetUInt64() == uint64(0));              std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true);              handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY, -                fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_BANINFO_YES) : handler->GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString()); +                fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());          }          while (result->NextRow()); @@ -340,7 +340,7 @@ public:              bool permanent = (fields[1].GetUInt32() == uint32(0));              std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt32(), true);              handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY, -                fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_BANINFO_YES) : handler->GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString()); +                fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());          }          while (result->NextRow()); diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp index b8d69c250bb..464d58ad908 100644 --- a/src/server/scripts/Commands/cs_instance.cpp +++ b/src/server/scripts/Commands/cs_instance.cpp @@ -29,6 +29,7 @@ EndScriptData */  #include "InstanceScript.h"  #include "MapManager.h"  #include "Player.h" +#include "Language.h"  class instance_commandscript : public CommandScript  { @@ -81,11 +82,11 @@ public:              {                  InstanceSave* save = itr->second.save;                  std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL)); -                handler->PSendSysMessage("map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no",  save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); +                handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no",  save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());                  counter++;              }          } -        handler->PSendSysMessage("player binds: %d", counter); +        handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_PLAYER_BINDS, counter);          counter = 0;          if (Group* group = player->GetGroup()) @@ -97,12 +98,12 @@ public:                  {                      InstanceSave* save = itr->second.save;                      std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL)); -                    handler->PSendSysMessage("map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no",  save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); +                    handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());                      counter++;                  }              }          } -        handler->PSendSysMessage("group binds: %d", counter); +        handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_GROUP_BINDS, counter);          return true;      } @@ -140,7 +141,7 @@ public:                  if (itr->first != player->GetMapId() && (!MapId || MapId == itr->first) && (diff == -1 || diff == save->GetDifficulty()))                  {                      std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL)); -                    handler->PSendSysMessage("unbinding map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); +                    handler->PSendSysMessage(LANG_COMMAND_INST_UNBIND_UNBINDING, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());                      player->UnbindInstance(itr, Difficulty(i));                      counter++;                  } @@ -148,18 +149,18 @@ public:                      ++itr;              }          } -        handler->PSendSysMessage("instances unbound: %d", counter); +        handler->PSendSysMessage(LANG_COMMAND_INST_UNBIND_UNBOUND, counter);          return true;      }      static bool HandleInstanceStatsCommand(ChatHandler* handler, char const* /*args*/)      { -        handler->PSendSysMessage("instances loaded: %d", sMapMgr->GetNumInstances()); -        handler->PSendSysMessage("players in instances: %d", sMapMgr->GetNumPlayersInInstances()); -        handler->PSendSysMessage("instance saves: %d", sInstanceSaveMgr->GetNumInstanceSaves()); -        handler->PSendSysMessage("players bound: %d", sInstanceSaveMgr->GetNumBoundPlayersTotal()); -        handler->PSendSysMessage("groups bound: %d", sInstanceSaveMgr->GetNumBoundGroupsTotal()); +        handler->PSendSysMessage(LANG_COMMAND_INST_STAT_LOADED_INST, sMapMgr->GetNumInstances()); +        handler->PSendSysMessage(LANG_COMMAND_INST_STAT_PLAYERS_IN, sMapMgr->GetNumPlayersInInstances()); +        handler->PSendSysMessage(LANG_COMMAND_INST_STAT_SAVES, sInstanceSaveMgr->GetNumInstanceSaves()); +        handler->PSendSysMessage(LANG_COMMAND_INST_STAT_PLAYERSBOUND, sInstanceSaveMgr->GetNumBoundPlayersTotal()); +        handler->PSendSysMessage(LANG_COMMAND_INST_STAT_GROUPSBOUND, sInstanceSaveMgr->GetNumBoundGroupsTotal());          return true;      } @@ -170,14 +171,14 @@ public:          Map* map = player->GetMap();          if (!map->IsDungeon())          { -            handler->PSendSysMessage("Map is not a dungeon."); +            handler->PSendSysMessage(LANG_NOT_DUNGEON);              handler->SetSentErrorMessage(true);              return false;          }          if (!((InstanceMap*)map)->GetInstanceScript())          { -            handler->PSendSysMessage("Map has no instance data."); +            handler->PSendSysMessage(LANG_NO_INSTANCE_DATA);              handler->SetSentErrorMessage(true);              return false;          } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 9e134a2c9d8..5e8f159a8e1 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -191,17 +191,17 @@ public:          if (haveVMap)          {              if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ())) -                handler->PSendSysMessage("You are outdoors"); +                handler->PSendSysMessage(LANG_GPS_POSITION_OUTDOORS);              else -                handler->PSendSysMessage("You are indoors"); +                handler->PSendSysMessage(LANG_GPS_POSITION_INDOORS);          }          else -            handler->PSendSysMessage("no VMAP available for area info"); +            handler->PSendSysMessage(LANG_GPS_NO_VMAP);          handler->PSendSysMessage(LANG_MAP_POSITION, -            mapId, (mapEntry ? mapEntry->name : "<unknown>"), -            zoneId, (zoneEntry ? zoneEntry->area_name : "<unknown>"), -            areaId, (areaEntry ? areaEntry->area_name : "<unknown>"), +            mapId, (mapEntry ? mapEntry->name : handler->GetTrinityString(LANG_UNKNOWN)), +            zoneId, (zoneEntry ? zoneEntry->area_name : handler->GetTrinityString(LANG_UNKNOWN)), +            areaId, (areaEntry ? areaEntry->area_name : handler->GetTrinityString(LANG_UNKNOWN)),              object->GetPhaseMask(),              object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),              cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), @@ -809,7 +809,7 @@ public:          if (handler->HasLowerSecurity(target, 0))              return false; -        std::string kickReasonStr = "No reason"; +        std::string kickReasonStr = handler->GetTrinityString(LANG_NO_REASON);          if (*args != '\0')          {              char const* kickReason = strtok(NULL, "\r"); @@ -1442,22 +1442,22 @@ public:          std::string lastLogin         = handler->GetTrinityString(LANG_ERROR);          uint32 failedLogins           = 0;          uint32 latency                = 0; -        std::string OS                = "None"; +        std::string OS                = handler->GetTrinityString(LANG_UNKNOWN);          // Mute data print variables          int64 muteTime                = -1; -        std::string muteReason        = "unknown"; -        std::string muteBy            = "unknown"; +        std::string muteReason        = handler->GetTrinityString(LANG_NO_REASON); +        std::string muteBy            = handler->GetTrinityString(LANG_UNKNOWN);          // Ban data print variables          int64 banTime                 = -1; -        std::string banType           = "None"; -        std::string banReason         = "Unknown"; -        std::string bannedBy          = "Unknown"; +        std::string banType           = handler->GetTrinityString(LANG_UNKNOWN); +        std::string banReason         = handler->GetTrinityString(LANG_NO_REASON); +        std::string bannedBy          = handler->GetTrinityString(LANG_UNKNOWN);          // Character data print variables          uint8 raceid, classid           = 0; //RACE_NONE, CLASS_NONE -        std::string raceStr, classStr   = "None"; +        std::string raceStr, classStr   = handler->GetTrinityString(LANG_UNKNOWN);          uint8 gender                    = 0;          int8 locale                     = handler->GetSessionDbcLocale();          uint32 totalPlayerTime          = 0; @@ -1471,8 +1471,8 @@ public:          uint32 mapId;          uint32 areaId;          uint32 phase            = 0; -        std::string areaName    = "<unknown>"; -        std::string zoneName    = "<unknown>"; +        std::string areaName    = handler->GetTrinityString(LANG_UNKNOWN); +        std::string zoneName    = handler->GetTrinityString(LANG_UNKNOWN);          // Guild data print variables defined so that they exist, but are not necessarily used          uint32 guildId           = 0; @@ -1500,7 +1500,7 @@ public:              muteTime          = target->GetSession()->m_muteTime;              mapId             = target->GetMapId();              areaId            = target->GetAreaId(); -            alive             = target->IsAlive() ? "Yes" : "No"; +            alive             = target->IsAlive() ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO);              gender            = target->getGender();              phase             = target->GetPhaseMask();          } @@ -1533,9 +1533,9 @@ public:              uint32 playerFlags = fields[10].GetUInt32();              if (!health || playerFlags & PLAYER_FLAGS_GHOST) -                alive = "No"; +                alive = handler->GetTrinityString(LANG_NO);              else -                alive = "Yes"; +                alive = handler->GetTrinityString(LANG_YES);          }          // Query the prepared statement for login data @@ -1575,9 +1575,10 @@ public:              }              else              { -                eMail     = "Unauthorized"; -                lastIp    = "Unauthorized"; -                lastLogin = "Unauthorized"; +                eMail     = handler->GetTrinityString(LANG_UNAUTHORIZED); +                regMail   = handler->GetTrinityString(LANG_UNAUTHORIZED); +                lastIp    = handler->GetTrinityString(LANG_UNAUTHORIZED); +                lastLogin = handler->GetTrinityString(LANG_UNAUTHORIZED);              }              muteTime      = fields[6].GetUInt64();              muteReason    = fields[7].GetString(); @@ -1596,7 +1597,7 @@ public:          PreparedQueryResult result2 = LoginDatabase.Query(stmt2);          if (!result2)          { -            banType = "Character"; +            banType = handler->GetTrinityString(LANG_CHARACTER);              stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS);              stmt->setUInt32(0, lowguid);              result2 = CharacterDatabase.Query(stmt); @@ -1653,7 +1654,7 @@ public:          // Output III. LANG_PINFO_BANNED if ban exists and is applied          if (banTime >= 0) -            handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedBy.c_str()); +            handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : handler->GetTrinityString(LANG_PERMANENTLY), bannedBy.c_str());          // Output IV. LANG_PINFO_MUTED if mute is applied          if (muteTime > 0) @@ -1672,7 +1673,7 @@ public:          handler->PSendSysMessage(LANG_PINFO_ACC_REGMAILS, regMail.c_str(), eMail.c_str());          // Output IX. LANG_PINFO_ACC_IP -        handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No"); +        handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO));          // Output X. LANG_PINFO_CHR_LEVEL          if (level != sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) @@ -1711,7 +1712,7 @@ public:          }          if (target) -            handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name, (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>")); +            handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name, (!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)), (!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)));          // Output XVII. - XVIX. if they are not empty          if (!guildName.empty()) @@ -1791,7 +1792,7 @@ public:              return false;          char const* muteReason = strtok(NULL, "\r"); -        std::string muteReasonStr = "No reason"; +        std::string muteReasonStr = handler->GetTrinityString(LANG_NO_REASON);          if (muteReason != NULL)              muteReasonStr = muteReason; @@ -1819,7 +1820,7 @@ public:          if (handler->GetSession())              muteBy = handler->GetSession()->GetPlayerName();          else -            muteBy = "Console"; +            muteBy = handler->GetTrinityString(LANG_CONSOLE);          if (target)          { diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 14a68d1fdae..f828b66a93a 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -316,6 +316,9 @@ private:          if (!*args)              return false; +        if (strlen(args) > 255) +            return false; +          // #delay [#exit_code] [reason]          char* delayStr = strtok((char*)args, " ");          if (!delayStr || !isNumeric(delayStr)) @@ -323,10 +326,7 @@ private:          char* exitCodeStr = nullptr; -        if (strlen(args) > 255) -            return false; - -        char reason[255] = { 0 }; +        char reason[256] = { 0 };          while (char* nextToken = strtok(nullptr, " "))          { @@ -335,8 +335,11 @@ private:              else              {                  strcat(reason, nextToken); -                strcat(reason, " "); -                strcat(reason, strtok(nullptr, "\0")); +                if (char* remainingTokens = strtok(nullptr, "\0")) +                { +                    strcat(reason, " "); +                    strcat(reason, remainingTokens); +                }                  break;              }          } diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index a2f1c75106b..cbf0ae51a82 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -126,7 +126,7 @@ public:          ticket->SaveToDB(trans);          sTicketMgr->UpdateLastChange(); -        std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL); +        std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL, NULL);          handler->SendGlobalGMSysMessage(msg.c_str());          return true;      } @@ -156,7 +156,7 @@ public:          sTicketMgr->CloseTicket(ticket->GetId(), player ? player->GetGUID() : -1);          sTicketMgr->UpdateLastChange(); -        std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL); +        std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL, NULL);          handler->SendGlobalGMSysMessage(msg.c_str());          // Inform player, who submitted this ticket, that it is closed @@ -205,7 +205,7 @@ public:          ticket->SaveToDB(trans);          sTicketMgr->UpdateLastChange(); -        std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL); +        std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL, NULL);          msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName().c_str() : "Console", comment);          handler->SendGlobalGMSysMessage(msg.c_str()); @@ -239,6 +239,9 @@ public:          ticket->SetCompleted();          ticket->SaveToDB(trans); +        std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, +            NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console"); +        handler->SendGlobalGMSysMessage(msg.c_str());          sTicketMgr->UpdateLastChange();          return true;      } @@ -262,7 +265,7 @@ public:              return true;          } -        std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console"); +        std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL);          handler->SendGlobalGMSysMessage(msg.c_str());          sTicketMgr->RemoveTicket(ticket->GetId()); @@ -394,7 +397,7 @@ public:          sTicketMgr->UpdateLastChange();          std::string msg = ticket->FormatMessageString(*handler, NULL, assignedTo.c_str(), -            handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL); +            handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL, NULL);          handler->SendGlobalGMSysMessage(msg.c_str());          return true; diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 8bc969e9020..87272037755 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -23,19 +23,16 @@ enum Spells      SPELL_ARCANE_EXPLOSION                  = 46608,      SPELL_CONE_OF_COLD                      = 38384,      SPELL_FIREBALL                          = 46988, -    SPELL_FROSTBOLT                         = 46987 +    SPELL_FROSTBOLT                         = 46987, +    SPELL_SUMMON_WATER_ELEMENTAL            = 45067, +    SPELL_ICEBLOCK                          = 46604  }; -enum Yells +enum Texts  { -    YELL_AGGRO                              = 0, -    YELL_EVADE                              = 1, -    YELL_SALVATION                          = 2, -}; - -enum Creatures -{ -    NPC_WATER_ELEMENTAL                     = 25040 +    SAY_AGGRO                              = 0, +    SAY_EVADE                              = 1, +    SAY_SALVATION                          = 2,  };  enum Action @@ -43,64 +40,15 @@ enum Action      ACTION_BUFF_YELL                        = -30001 // shared from Battleground  }; -enum WaterElementalSpells +enum Events  { -    SPELL_WATERBOLT                         = 46983 -}; - -class npc_water_elemental : public CreatureScript -{ -public: -    npc_water_elemental() : CreatureScript("npc_water_elemental") { } - -    struct npc_water_elementalAI : public ScriptedAI -    { -        npc_water_elementalAI(Creature* creature) : ScriptedAI(creature) -        { -            waterBoltTimer = 3 * IN_MILLISECONDS; -            resetTimer = 5 * IN_MILLISECONDS; -            balindaGUID = 0; -        } - -        uint32 waterBoltTimer; -        uint64 balindaGUID; -        uint32 resetTimer; - -        void Reset() override -        { -            waterBoltTimer            = 3 * IN_MILLISECONDS; -            resetTimer                = 5 * IN_MILLISECONDS; -            balindaGUID = 0; -        } - -        void UpdateAI(uint32 diff) override -        { -            if (!UpdateVictim()) -                return; - -            if (waterBoltTimer < diff) -            { -                DoCastVictim(SPELL_WATERBOLT); -                waterBoltTimer = 5 * IN_MILLISECONDS; -            } else waterBoltTimer -= diff; - -            // check if creature is not outside of building -            if (resetTimer < diff) -            { -                if (Creature* pBalinda = ObjectAccessor::GetCreature(*me, balindaGUID)) -                    if (me->GetDistance2d(pBalinda->GetHomePosition().GetPositionX(), pBalinda->GetHomePosition().GetPositionY()) > 50) -                        EnterEvadeMode(); -                resetTimer = 5 * IN_MILLISECONDS; -            } else resetTimer -= diff; - -            DoMeleeAttackIfReady(); -        } -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_water_elementalAI(creature); -    } +    // Balinda +    EVENT_ARCANE_EXPLOSION = 1, +    EVENT_CONE_OF_COLD, +    EVENT_FIREBOLT, +    EVENT_FROSTBOLT, +    EVENT_SUMMON_WATER_ELEMENTAL, +    EVENT_CHECK_RESET,          // Checks if Balinda or the Water Elemental are outside of building.  };  class boss_balinda : public CreatureScript @@ -117,23 +65,10 @@ public:          void Initialize()          { -            arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); -            coneOfColdTimer = 8 * IN_MILLISECONDS; -            fireBoltTimer = 1 * IN_MILLISECONDS; -            frostboltTimer = 4 * IN_MILLISECONDS; -            resetTimer = 5 * IN_MILLISECONDS; -            waterElementalTimer = 0; +            WaterElementalGUID = 0; +            HasCastIceblock = false;          } -        uint32 arcaneExplosionTimer; -        uint32 coneOfColdTimer; -        uint32 fireBoltTimer; -        uint32 frostboltTimer; -        uint32 resetTimer; -        uint32 waterElementalTimer; - -        SummonList summons; -          void Reset() override          {              Initialize(); @@ -143,22 +78,28 @@ public:          void EnterCombat(Unit* /*who*/) override          { -            Talk(YELL_AGGRO); -        } - -        void JustRespawned() override -        { -            Reset(); +            Talk(SAY_AGGRO); +            events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); +            events.ScheduleEvent(EVENT_CONE_OF_COLD, 8 * IN_MILLISECONDS); +            events.ScheduleEvent(EVENT_FIREBOLT, 1 * IN_MILLISECONDS); +            events.ScheduleEvent(EVENT_FROSTBOLT, 4 * IN_MILLISECONDS); +            events.ScheduleEvent(EVENT_SUMMON_WATER_ELEMENTAL, 3 * IN_MILLISECONDS); +            events.ScheduleEvent(EVENT_CHECK_RESET, 5 * IN_MILLISECONDS);          }          void JustSummoned(Creature* summoned) override          { -            ENSURE_AI(npc_water_elemental::npc_water_elementalAI, summoned->AI())->balindaGUID = me->GetGUID();              summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));              summoned->setFaction(me->getFaction()); +            WaterElementalGUID = summoned->GetGUID();              summons.Summon(summoned);          } +        void SummonedCreatureDespawn(Creature* summoned) override +        { +            summons.Despawn(summoned); +        } +          void JustDied(Unit* /*killer*/) override          {              summons.DespawnAll(); @@ -167,7 +108,16 @@ public:          void DoAction(int32 actionId) override          {              if (actionId == ACTION_BUFF_YELL) -                Talk(YELL_AGGRO); +                Talk(SAY_AGGRO); +        } + +        void DamageTaken(Unit* /*attacker*/, uint32& damage) override +        { +            if (me->HealthBelowPctDamaged(40, damage) && !HasCastIceblock) +            { +                DoCast(SPELL_ICEBLOCK); +                HasCastIceblock = true; +            }          }          void UpdateAI(uint32 diff) override @@ -175,50 +125,60 @@ public:              if (!UpdateVictim())                  return; -            if (waterElementalTimer < diff) -            { -                if (summons.empty()) -                    me->SummonCreature(NPC_WATER_ELEMENTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45 * IN_MILLISECONDS); -                waterElementalTimer = 50 * IN_MILLISECONDS; -            } else waterElementalTimer -= diff; - -            if (arcaneExplosionTimer < diff) -            { -                DoCastVictim(SPELL_ARCANE_EXPLOSION); -                arcaneExplosionTimer =  urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); -            } else arcaneExplosionTimer -= diff; - -            if (coneOfColdTimer < diff) -            { -                DoCastVictim(SPELL_CONE_OF_COLD); -                coneOfColdTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); -            } else coneOfColdTimer -= diff; - -            if (fireBoltTimer < diff) -            { -                DoCastVictim(SPELL_FIREBALL); -                fireBoltTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); -            } else fireBoltTimer -= diff; +            events.Update(diff); -            if (frostboltTimer < diff) -            { -                DoCastVictim(SPELL_FROSTBOLT); -                frostboltTimer = urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS); -            } else frostboltTimer -= diff; +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; -            // check if creature is not outside of building -            if (resetTimer < diff) +            while (uint32 eventId = events.ExecuteEvent())              { -                if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50) +                switch (eventId)                  { -                    EnterEvadeMode(); -                    Talk(YELL_EVADE); +                    case EVENT_ARCANE_EXPLOSION: +                        DoCastVictim(SPELL_ARCANE_EXPLOSION); +                        events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); +                        break; +                    case EVENT_CONE_OF_COLD: +                        DoCastVictim(SPELL_CONE_OF_COLD); +                        events.ScheduleEvent(EVENT_CONE_OF_COLD, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); +                        break; +                    case EVENT_FIREBOLT: +                        DoCastVictim(SPELL_FIREBALL); +                        events.ScheduleEvent(EVENT_FIREBOLT, urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS)); +                        break; +                    case EVENT_FROSTBOLT: +                        DoCastVictim(SPELL_FROSTBOLT); +                        events.ScheduleEvent(EVENT_FROSTBOLT, urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS)); +                        break; +                    case EVENT_SUMMON_WATER_ELEMENTAL: +                        if (summons.empty()) +                            DoCast(SPELL_SUMMON_WATER_ELEMENTAL); +                        events.ScheduleEvent(EVENT_SUMMON_WATER_ELEMENTAL, 50 * IN_MILLISECONDS); +                        break; +                    case EVENT_CHECK_RESET: +                        if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50) +                        { +                            EnterEvadeMode(); +                            Talk(SAY_EVADE); +                        } +                        if (Creature* elemental = ObjectAccessor::GetCreature(*me, WaterElementalGUID)) +                            if (elemental->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50) +                                elemental->AI()->EnterEvadeMode(); +                        events.ScheduleEvent(EVENT_CHECK_RESET, 5 * IN_MILLISECONDS); +                        break; +                    default: +                        break;                  } -                resetTimer = 5 * IN_MILLISECONDS; -            } else resetTimer -= diff; +            }              DoMeleeAttackIfReady();          } +     +    private: +        EventMap events; +        SummonList summons; +        uint64 WaterElementalGUID; +        bool HasCastIceblock;      };      CreatureAI* GetAI(Creature* creature) const override @@ -230,5 +190,4 @@ public:  void AddSC_boss_balinda()  {      new boss_balinda; -    new npc_water_elemental;  } diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h index 22df3858c43..2ae40d1d39a 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h +++ b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h @@ -22,6 +22,7 @@  #include "Creature.h"  #include "ObjectMgr.h" +#define DataHeader "BH"  #define BHScriptName "instance_baradin_hold"  uint32 const EncounterCount = 3; diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp index f1fec5f1453..0f9102a2485 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -36,6 +36,7 @@ class instance_baradin_hold: public InstanceMapScript          {              instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -101,51 +102,6 @@ class instance_baradin_hold: public InstanceMapScript                  }              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "B H " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* in) override -            { -                if (!in) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(in); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(in); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'B' && dataHead2 == 'H') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 ArgalothGUID;              uint64 OccutharGUID; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h index ea3fd59490a..160c80fc4d1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h @@ -19,6 +19,8 @@  #ifndef DEF_BRD_H  #define DEF_BRD_H +#define DataHeader "BRD" +  enum FactionIds  {      FACTION_NEUTRAL            = 734, diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index f51a2a95c81..67219a2990a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -117,6 +117,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&encounter, 0, sizeof(encounter));              EmperorGUID = 0; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h index 2199e52129c..be8149fbdcc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h @@ -21,6 +21,7 @@  uint32 const EncounterCount         = 23;  #define BRSScriptName "instance_blackrock_spire" +#define DataHeader    "BRS"  enum DataTypes  { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index 555eac21c43..e95fb8da42e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -15,15 +15,14 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "ObjectMgr.h" -#include "ScriptMgr.h" -#include "ObjectDefines.h"  #include "Cell.h"  #include "CellImpl.h"  #include "GridNotifiers.h"  #include "GridNotifiersImpl.h"  #include "InstanceScript.h" +#include "Player.h"  #include "ScriptedCreature.h" +#include "ScriptMgr.h"  #include "blackrock_spire.h"  //uint32 const DragonspireRunes[7] = { GO_HALL_RUNE_1, GO_HALL_RUNE_2, GO_HALL_RUNE_3, GO_HALL_RUNE_4, GO_HALL_RUNE_5, GO_HALL_RUNE_6, GO_HALL_RUNE_7 }; @@ -51,6 +50,7 @@ public:      {          instance_blackrock_spireMapScript(InstanceMap* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);              SetBossNumber(EncounterCount);              HighlordOmokk             = 0;              ShadowHunterVoshgajin     = 0; @@ -502,50 +502,6 @@ public:              }          } -        std::string GetSaveData() override -        { -            OUT_SAVE_INST_DATA; - -            std::ostringstream saveStream; -            saveStream << "B S " << GetBossSaveData(); - -            OUT_SAVE_INST_DATA_COMPLETE; -            return saveStream.str(); -        } - -        void Load(const char* strIn) override -        { -            if (!strIn) -            { -                OUT_LOAD_INST_DATA_FAIL; -                return; -            } - -            OUT_LOAD_INST_DATA(strIn); - -            char dataHead1, dataHead2; - -            std::istringstream loadStream(strIn); -            loadStream >> dataHead1 >> dataHead2; - -            if (dataHead1 == 'B' && dataHead2 == 'S') -            { -                for (uint8 i = 0; i < EncounterCount; ++i) -                { -                    uint32 tmpState; -                    loadStream >> tmpState; -                    if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                        tmpState = NOT_STARTED; - -                    SetBossState(i, EncounterState(tmpState)); -                } -            } -            else -                OUT_LOAD_INST_DATA_FAIL; - -            OUT_LOAD_INST_DATA_COMPLETE; -        } -          protected:              EventMap Events;              uint64 HighlordOmokk; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index e07d1d987fc..1cf89a263ce 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -21,6 +21,7 @@  uint32 const EncounterCount     = 8;  #define BRLScriptName "instance_blackwing_lair" +#define DataHeader    "BWL"  enum BWLEncounter  { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 1a97f668558..9a6d0e9c224 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -75,6 +75,9 @@ public:          {              Initialize(); +            Breath1_Spell = 0; +            Breath2_Spell = 0; +              // Select the 2 breaths that we are going to use until despawned              // 5 possiblities for the first breath, 4 for the second, 20 total possiblites              // This way we don't end up casting 2 of the same breath diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index 8bd1ef26aec..8cb3c37a7a2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -56,6 +56,7 @@ public:      {          instance_blackwing_lair_InstanceMapScript(Map* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);              // Razorgore              EggCount = 0;              EggEvent = 0; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp index 7dee91bfb6f..800b6bb0edc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,19 +15,10 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Instance_Molten_Core -SD%Complete: 0 -SDComment: Place Holder -SDCategory: Molten Core -EndScriptData */ - -#include "ObjectMgr.h" -#include "ScriptMgr.h"  #include "InstanceScript.h" -#include "CreatureAI.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h"  #include "molten_core.h" -#include "TemporarySummon.h"  Position const SummonPositions[10] =  { @@ -53,30 +43,19 @@ class instance_molten_core : public InstanceMapScript          {              instance_molten_core_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(MAX_ENCOUNTER);                  _golemaggTheIncineratorGUID = 0;                  _majordomoExecutusGUID = 0;                  _cacheOfTheFirelordGUID = 0; -                _executusSchedule = NULL; -                _deadBossCount = 0; +                _executusSchedule = false;                  _ragnarosAddDeaths = 0; -                _isLoading = false; -                _summonedExecutus = false;              } -            ~instance_molten_core_InstanceMapScript() -            { -                delete _executusSchedule; -            } - -            void OnPlayerEnter(Player* /*player*/) +            void OnPlayerEnter(Player* /*player*/) override              {                  if (_executusSchedule) -                { -                    SummonMajordomoExecutus(*_executusSchedule); -                    delete _executusSchedule; -                    _executusSchedule = NULL; -                } +                    SummonMajordomoExecutus();              }              void OnCreatureCreate(Creature* creature) override @@ -141,19 +120,14 @@ class instance_molten_core : public InstanceMapScript                  return 0;              } -            bool SetBossState(uint32 bossId, EncounterState state) +            bool SetBossState(uint32 bossId, EncounterState state) override              {                  if (!InstanceScript::SetBossState(bossId, state))                      return false;                  if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS) -                    ++_deadBossCount; - -                if (_isLoading) -                    return true; - -                if (_deadBossCount == 8) -                    SummonMajordomoExecutus(false); +                    if (CheckMajordomoExecutus()) +                        SummonMajordomoExecutus();                  if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE)                      DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY); @@ -161,13 +135,13 @@ class instance_molten_core : public InstanceMapScript                  return true;              } -            void SummonMajordomoExecutus(bool done) +            void SummonMajordomoExecutus()              { -                if (_summonedExecutus) +                _executusSchedule = false; +                if (_majordomoExecutusGUID)                      return; -                _summonedExecutus = true; -                if (!done) +                if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)                  {                      instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]);                      instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]); @@ -180,76 +154,33 @@ class instance_molten_core : public InstanceMapScript                      instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]);                  }                  else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos)) -                        summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT); +                    summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);              } -            std::string GetSaveData() override +            bool CheckMajordomoExecutus() const              { -                OUT_SAVE_INST_DATA; +                if (GetBossState(BOSS_RAGNAROS) == DONE) +                    return false; -                std::ostringstream saveStream; -                saveStream << "M C " << GetBossSaveData(); +                for (uint8 i = 0; i < BOSS_MAJORDOMO_EXECUTUS; ++i) +                    if (GetBossState(i) != DONE) +                        return false; -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                return true;              } -            void Load(char const* data) +            void ReadSaveDataMore(std::istringstream& /*data*/) override              { -                if (!data) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                _isLoading = true; -                OUT_LOAD_INST_DATA(data); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(data); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'M' && dataHead2 == 'C') -                { -                    EncounterState states[MAX_ENCOUNTER]; -                    uint8 executusCounter = 0; - -                    // need 2 loops to check spawning executus/ragnaros -                    for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) -                            tmpState = NOT_STARTED; -                        states[i] = EncounterState(tmpState); - -                         if (tmpState == DONE && i < BOSS_MAJORDOMO_EXECUTUS) -                            ++executusCounter; -                   } - -                    if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE) -                        _executusSchedule = new bool(states[BOSS_MAJORDOMO_EXECUTUS] == DONE); - -                    for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) -                        SetBossState(i, states[i]); -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -                _isLoading = false; +                if (CheckMajordomoExecutus()) +                    _executusSchedule = true;              }          private:              uint64 _golemaggTheIncineratorGUID;              uint64 _majordomoExecutusGUID;              uint64 _cacheOfTheFirelordGUID; -            bool* _executusSchedule; -            uint8 _deadBossCount; +            bool  _executusSchedule;              uint8 _ragnarosAddDeaths; -            bool _isLoading; -            bool _summonedExecutus;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h index 39d6cf40a8a..af0e0a89e45 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h @@ -19,6 +19,8 @@  #ifndef DEF_MOLTEN_CORE_H  #define DEF_MOLTEN_CORE_H +#define DataHeader "MC" +  enum Encounters  {      BOSS_LUCIFRON                   = 0, diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h index c3b09c76c68..b1ff0e03ff0 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h @@ -18,6 +18,8 @@  #ifndef DEF_DEADMINES_H  #define DEF_DEADMINES_H +#define DataHeader "DM" +  enum CannonState  {      CANNON_NOT_USED, diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 2124e72d9ee..53e14b88050 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -74,6 +74,7 @@ class instance_deadmines : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  FactoryDoorGUID = 0;                  IronCladDoorGUID = 0;                  DefiasCannonGUID = 0; diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h index 096b8910d5a..adac26efff5 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h @@ -18,6 +18,8 @@  #ifndef DEF_GNOMEREGAN_H  #define DEF_GNOMEREGAN_H +#define DataHeader "GNO" +  enum GameObjectIds  {      GO_CAVE_IN_LEFT     = 146085, diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp index b35601fcc6c..f8e00fab682 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp @@ -36,6 +36,7 @@ public:      {          instance_gnomeregan_InstanceMapScript(Map* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);          }          uint32 m_auiEncounter[MAX_ENCOUNTER]; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 9084a6b0371..7ce11653567 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -81,6 +81,9 @@ public:              Initialize();              instance = creature->GetInstanceScript();              Intro = true; +            RainBones = false; +            Skeletons = false; +            FlyTimer = 0;          }          void Initialize() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index ce8223c90cf..7b51b61ba0a 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -1068,6 +1068,7 @@ public:              EntryYellTimer = 1000;              AggroYellTimer = 10000;              IsFakingDeath = false; +            ResurrectTimer = 0;          }          void Initialize() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp index 3300e92869b..8f6d142e22b 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp @@ -82,6 +82,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));              // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered. diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h index 3812e06b442..eec7e461e9b 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h @@ -19,6 +19,8 @@  #ifndef DEF_KARAZHAN_H  #define DEF_KARAZHAN_H +#define DataHeader "KZ" +  enum DataTypes  {      TYPE_ATTUMEN                    = 1, @@ -62,5 +64,4 @@ enum OperaEvents      EVENT_RAJ                       = 3  }; -#define ERROR_INST_DATA(a)          TC_LOG_ERROR("scripts", "Instance Data for Karazhan not set properly. Encounter for Creature Entry %u may not work properly.", a->GetEntry());  #endif diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index 65b3553fd87..01491c53f72 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -45,6 +45,7 @@ class instance_magisters_terrace : public InstanceMapScript          {              instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -161,48 +162,6 @@ class instance_magisters_terrace : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "M T " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; -                if (dataHead1 == 'M' && dataHead2 == 'T') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -              uint64 GetData64(uint32 type) const override              {                  switch (type) diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h index 8b8d7d5b875..142453c2502 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h @@ -19,6 +19,8 @@  #ifndef DEF_MAGISTERS_TERRACE_H  #define DEF_MAGISTERS_TERRACE_H +#define DataHeader "MT" +  uint32 const EncounterCount = 4;  enum DataTypes diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 03ca73fed1f..6c48ee7f348 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -412,7 +412,7 @@ class npc_eye_of_acherus : public CreatureScript              {                  if (movementType == WAYPOINT_MOTION_TYPE && pointId == POINT_EYE_MOVE_END - 1)                  { -                    me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);  +                    me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);                      me->RemoveAllAuras();                      if (Player* owner = me->GetCharmerOrOwner()->ToPlayer()) diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 307bcd5add6..0733640f4c3 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -391,6 +391,10 @@ public:              Initialize();              instance = creature->GetInstanceScript();              headGUID = 0; +            PlayerGUID = 0; +            id = 0; +            whirlwind = 0; +            wp_reached = false;          }          void Initialize() diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp index c05de1bb800..3e752858e63 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,13 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Interrogator_Vishas -SD%Complete: 100 -SDComment: -SDCategory: Scarlet Monastery -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "scarlet_monastery.h" @@ -38,94 +30,93 @@ enum Says  enum Spells  { -    SPELL_SHADOWWORDPAIN    = 2767 +    SPELL_SHADOW_WORD_PAIN  = 2767  }; -class boss_interrogator_vishas : public CreatureScript +enum Events  { -public: -    boss_interrogator_vishas() : CreatureScript("boss_interrogator_vishas") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return GetInstanceAI<boss_interrogator_vishasAI>(creature); -    } - -    struct boss_interrogator_vishasAI : public ScriptedAI -    { -        boss_interrogator_vishasAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -            instance = me->GetInstanceScript(); -        } - -        void Initialize() -        { -            ShadowWordPain_Timer = 5000; -            Yell60 = false; -            Yell30 = false; -        } - -        InstanceScript* instance; +    EVENT_SHADOW_WORD_PAIN  = 1 +}; -        bool Yell30; -        bool Yell60; -        uint32 ShadowWordPain_Timer; +class boss_interrogator_vishas : public CreatureScript +{ +    public: +        boss_interrogator_vishas() : CreatureScript("boss_interrogator_vishas") { } -        void Reset() override +        struct boss_interrogator_vishasAI : public BossAI          { -            Initialize(); -            instance->SetBossState(DATA_INTERROGATOR_VISHAS, NOT_STARTED); -        } +            boss_interrogator_vishasAI(Creature* creature) : BossAI(creature, DATA_INTERROGATOR_VISHAS) +            { +                Initialize(); +            } -        void EnterCombat(Unit* /*who*/) override -        { -            Talk(SAY_AGGRO); -            instance->SetBossState(DATA_INTERROGATOR_VISHAS, IN_PROGRESS); -        } +            void Initialize() +            { +                _yellCount = 0; +            } -        void KilledUnit(Unit* /*Victim*/) override -        { -            Talk(SAY_KILL); -        } +            void Reset() override +            { +                Initialize(); +                _Reset(); +            } -        void JustDied(Unit* /*killer*/) override -        { -            //Any other Actions to do with vorrel? setStandState? -            if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL))) -                vorrel->AI()->Talk(SAY_TRIGGER_VORREL); -            instance->SetBossState(DATA_INTERROGATOR_VISHAS, DONE); -        } +            void EnterCombat(Unit* /*who*/) override +            { +                Talk(SAY_AGGRO); +                _EnterCombat(); +                events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 5000); +            } -        void UpdateAI(uint32 diff) override -        { -            if (!UpdateVictim()) -                return; +            void KilledUnit(Unit* victim) override +            { +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_KILL); +            } -            //If we are low on hp Do sayings -            if (!Yell60 && !HealthAbovePct(60)) +            void JustDied(Unit* /*killer*/) override              { -                Talk(SAY_HEALTH1); -                Yell60 = true; +                _JustDied(); +                if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL))) +                    vorrel->AI()->Talk(SAY_TRIGGER_VORREL);              } -            if (!Yell30 && !HealthAbovePct(30)) +            void DamageTaken(Unit* /*attacker*/, uint32 &damage) override              { -                Talk(SAY_HEALTH2); -                Yell30 = true; +                if (me->HealthBelowPctDamaged(60, damage) && _yellCount < 1) +                { +                    Talk(SAY_HEALTH1); +                    ++_yellCount; +                } + +                if (me->HealthBelowPctDamaged(30, damage) && _yellCount < 2) +                { +                    Talk(SAY_HEALTH2); +                    ++_yellCount; +                }              } -            //ShadowWordPain_Timer -            if (ShadowWordPain_Timer <= diff) +            void ExecuteEvent(uint32 eventId) override              { -                DoCastVictim(SPELL_SHADOWWORDPAIN); -                ShadowWordPain_Timer = urand(5000, 15000); +                switch (eventId) +                { +                    case EVENT_SHADOW_WORD_PAIN: +                        DoCastVictim(SPELL_SHADOW_WORD_PAIN); +                        events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 15000)); +                        break; +                    default: +                        break; +                }              } -            else ShadowWordPain_Timer -= diff; -            DoMeleeAttackIfReady(); +        private: +            uint8 _yellCount; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetInstanceAI<boss_interrogator_vishasAI>(creature);          } -    };  };  void AddSC_boss_interrogator_vishas() diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp index dc65bd42bf4..3a79dac3a90 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp @@ -34,6 +34,7 @@ class instance_scarlet_monastery : public InstanceMapScript          {              instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -155,50 +156,6 @@ class instance_scarlet_monastery : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S M " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'M') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 PumpkinShrineGUID;              uint64 HorsemanGUID; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h index a74efba751f..af716b5f448 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h @@ -19,6 +19,8 @@  #define SCARLET_M_  #define SMScriptName "instance_scarlet_monastery" +#define DataHeader "SM" +  uint32 const EncounterCount = 10;  enum DataTypes diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 44885a01270..b218e3f2978 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -105,7 +105,7 @@ public:              DoMeleeAttackIfReady();          } -     +      private:          EventMap events;          SummonList Summons; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp index 3864c598459..099a69782b8 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,20 +15,31 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Kormok -SD%Complete: 100 -SDComment: -SDCategory: Scholomance -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "scholomance.h"  enum Spells  { -    SPELL_SHADOWBOLTVOLLEY      = 20741, -    SPELL_BONESHIELD            = 27688 +    SPELL_SHADOWBOLT_VOLLEY             = 20741, +    SPELL_BONE_SHIELD                   = 27688, + +    SPELL_SUMMON_BONE_MAGES             = 27695, + +    SPELL_SUMMON_BONE_MAGE_FRONT_LEFT   = 27696, +    SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT  = 27697, +    SPELL_SUMMON_BONE_MAGE_BACK_RIGHT   = 27698, +    SPELL_SUMMON_BONE_MAGE_BACK_LEFT    = 27699, + +    SPELL_SUMMON_BONE_MINIONS           = 27687 +}; + +enum Events +{ +    EVENT_SHADOWBOLT_VOLLEY = 1, +    EVENT_BONE_SHIELD, +    EVENT_SUMMON_MINIONS  };  class boss_kormok : public CreatureScript @@ -37,11 +47,6 @@ class boss_kormok : public CreatureScript  public:      boss_kormok() : CreatureScript("boss_kormok") { } -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new boss_kormokAI(creature); -    } -      struct boss_kormokAI : public ScriptedAI      {          boss_kormokAI(Creature* creature) : ScriptedAI(creature) @@ -51,38 +56,34 @@ public:          void Initialize()          { -            ShadowVolley_Timer = 10000; -            BoneShield_Timer = 2000; -            Minion_Timer = 15000; -            Mage_Timer = 0;              Mages = false;          } -        uint32 ShadowVolley_Timer; -        uint32 BoneShield_Timer; -        uint32 Minion_Timer; -        uint32 Mage_Timer; -        bool Mages; -          void Reset() override          {              Initialize(); +            events.Reset();          }          void EnterCombat(Unit* /*who*/) override          { +            events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10000); +            events.ScheduleEvent(EVENT_BONE_SHIELD, 2000); +            events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000);          } -        void SummonMinions(Unit* victim) +        void JustSummoned(Creature* summoned) override          { -            if (Creature* SummonedMinion = DoSpawnCreature(16119, float(irand(-7, 7)), float(irand(-7, 7)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000)) -                SummonedMinion->AI()->AttackStart(victim); +            summoned->AI()->AttackStart(me->GetVictim());          } -        void SummonMages(Unit* victim) +        void DamageTaken(Unit* /*attacker*/, uint32& damage) override          { -            if (Creature* SummonedMage = DoSpawnCreature(16120, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000)) -                SummonedMage->AI()->AttackStart(victim); +            if (me->HealthBelowPctDamaged(25, damage) && !Mages) +            { +                DoCast(SPELL_SUMMON_BONE_MAGES); +                Mages = true; +            }          }          void UpdateAI(uint32 diff) override @@ -90,48 +91,132 @@ public:              if (!UpdateVictim())                  return; -            //ShadowVolley_Timer -            if (ShadowVolley_Timer <= diff) -            { -                DoCastVictim(SPELL_SHADOWBOLTVOLLEY); -                ShadowVolley_Timer = 15000; -            } else ShadowVolley_Timer -= diff; +            events.Update(diff); + +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; -            //BoneShield_Timer -            if (BoneShield_Timer <= diff) +            while (uint32 eventId = events.ExecuteEvent())              { -                DoCastVictim(SPELL_BONESHIELD); -                BoneShield_Timer = 45000; -            } else BoneShield_Timer -= diff; +                switch (eventId) +                { +                    case EVENT_SHADOWBOLT_VOLLEY: +                        DoCastVictim(SPELL_SHADOWBOLT_VOLLEY); +                        events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 15000); +                        break; +                    case EVENT_BONE_SHIELD: +                        DoCastVictim(SPELL_BONE_SHIELD); +                        events.ScheduleEvent(EVENT_BONE_SHIELD, 45000); +                        break; +                    case EVENT_SUMMON_MINIONS: +                        DoCast(SPELL_SUMMON_BONE_MINIONS); +                        events.ScheduleEvent(EVENT_SUMMON_MINIONS, 12000); +                        break; +                    default: +                        break; +                } +            } + +            DoMeleeAttackIfReady(); +        } + +        private: +            EventMap events; +            bool Mages; +    }; + +    CreatureAI* GetAI(Creature* creature) const override +    { +        return new boss_kormokAI(creature); +    } +}; -            //Minion_Timer -            if (Minion_Timer <= diff) +uint32 const SummonMageSpells[4] = +{ +    SPELL_SUMMON_BONE_MAGE_FRONT_LEFT, +    SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT, +    SPELL_SUMMON_BONE_MAGE_BACK_RIGHT, +    SPELL_SUMMON_BONE_MAGE_BACK_LEFT, +}; + +// 27695 - Summon Bone Mages +class spell_kormok_summon_bone_mages : SpellScriptLoader +{ +    public: +        spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { } + +        class spell_kormok_summon_bone_magesSpellScript : public SpellScript +        { +            PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript); + +            bool Validate(SpellInfo const* /*spell*/) override              { -                //Cast -                SummonMinions(me->GetVictim()); -                SummonMinions(me->GetVictim()); -                SummonMinions(me->GetVictim()); -                SummonMinions(me->GetVictim()); +                for (uint32 i = 0; i < 4; ++i) +                    if (!sSpellMgr->GetSpellInfo(SummonMageSpells[i])) +                        return false; +                return true; +            } -                Minion_Timer = 12000; -            } else Minion_Timer -= diff; +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                for (uint32 i = 0; i < 2; ++i) +                    GetCaster()->CastSpell(GetCaster(), SummonMageSpells[urand(0, 3)], true); +            } -            //Summon 2 Bone Mages -            if (!Mages && HealthBelowPct(26)) +            void Register() override              { -                //Cast -                SummonMages(me->GetVictim()); -                SummonMages(me->GetVictim()); -                Mages = true; +                OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);              } +        }; -            DoMeleeAttackIfReady(); +        SpellScript* GetSpellScript() const override +        { +            return new spell_kormok_summon_bone_magesSpellScript(); +        } +}; + +// 27687 - Summon Bone Minions +class spell_kormok_summon_bone_minions : SpellScriptLoader +{ +    public: +       spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { } + +    class spell_kormok_summon_bone_minionsSpellScript : public SpellScript +    { +        PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript); + +        bool Validate(SpellInfo const* /*spell*/) override +        { +            if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_BONE_MINIONS)) +                return false; +            return true; +        } + +        void HandleScript(SpellEffIndex effIndex) +        { +            PreventHitDefaultEffect(effIndex); + +            // Possible spells to handle this not found. +            for (uint32 i = 0; i < 4; ++i) +                GetCaster()->SummonCreature(NPC_BONE_MINION, GetCaster()->GetPositionX() + float(irand(-7, 7)), GetCaster()->GetPositionY() + float(irand(-7, 7)), GetCaster()->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000); +        } + +        void Register() override +        { +            OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);          }      }; +    SpellScript* GetSpellScript() const override +    { +        return new spell_kormok_summon_bone_minionsSpellScript(); +    }  };  void AddSC_boss_kormok()  {      new boss_kormok(); +    new spell_kormok_summon_bone_mages(); +    new spell_kormok_summon_bone_minions();  } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp index 9351224863c..897799a708c 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,122 +15,108 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Ras_Frostwhisper -SD%Complete: 100 -SDComment: -SDCategory: Scholomance -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  enum Spells  {      SPELL_FROSTBOLT         = 21369, -    SPELL_ICEARMOR          = 18100, // This is actually a buff he gives himself +    SPELL_ICE_ARMOR         = 18100, // This is actually a buff he gives himself      SPELL_FREEZE            = 18763,      SPELL_FEAR              = 26070, -    SPELL_CHILLNOVA         = 18099, +    SPELL_CHILL_NOVA        = 18099,      SPELL_FROSTVOLLEY       = 8398  }; +enum Events +{ +    EVENT_FROSTBOLT = 1, +    EVENT_ICE_ARMOR, +    EVENT_FREEZE, +    EVENT_FEAR, +    EVENT_CHILL_NOVA, +    EVENT_FROSTVOLLEY +}; +  class boss_boss_ras_frostwhisper : public CreatureScript  {  public:      boss_boss_ras_frostwhisper() : CreatureScript("boss_boss_ras_frostwhisper") { } -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new boss_rasfrostAI(creature); -    } -      struct boss_rasfrostAI : public ScriptedAI      { -        boss_rasfrostAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } +        boss_rasfrostAI(Creature* creature) : ScriptedAI(creature) { } -        void Initialize() +        void Reset() override          { -            IceArmor_Timer = 2000; -            Frostbolt_Timer = 8000; -            ChillNova_Timer = 12000; -            Freeze_Timer = 18000; -            FrostVolley_Timer = 24000; -            Fear_Timer = 45000; +            events.Reset(); +            DoCast(me, SPELL_ICE_ARMOR);          } -        uint32 IceArmor_Timer; -        uint32 Frostbolt_Timer; -        uint32 Freeze_Timer; -        uint32 Fear_Timer; -        uint32 ChillNova_Timer; -        uint32 FrostVolley_Timer; - -        void Reset() override +        void EnterCombat(Unit* /*who*/) override          { -            Initialize(); - -            DoCast(me, SPELL_ICEARMOR, true); +            events.ScheduleEvent(EVENT_ICE_ARMOR, 2000); +            events.ScheduleEvent(EVENT_FROSTBOLT, 8000); +            events.ScheduleEvent(EVENT_CHILL_NOVA, 12000); +            events.ScheduleEvent(EVENT_FREEZE, 18000); +            events.ScheduleEvent(EVENT_FEAR, 45000);          } -        void EnterCombat(Unit* /*who*/) override { } -          void UpdateAI(uint32 diff) override          {              if (!UpdateVictim())                  return; -            //IceArmor_Timer -            if (IceArmor_Timer <= diff) -            { -                DoCast(me, SPELL_ICEARMOR); -                IceArmor_Timer = 180000; -            } else IceArmor_Timer -= diff; - -            //Frostbolt_Timer -            if (Frostbolt_Timer <= diff) -            { -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) -                    DoCast(target, SPELL_FROSTBOLT); - -                Frostbolt_Timer = 8000; -            } else Frostbolt_Timer -= diff; - -            //Freeze_Timer -            if (Freeze_Timer <= diff) -            { -                DoCastVictim(SPELL_FREEZE); -                Freeze_Timer = 24000; -            } else Freeze_Timer -= diff; - -            //Fear_Timer -            if (Fear_Timer <= diff) -            { -                DoCastVictim(SPELL_FEAR); -                Fear_Timer = 30000; -            } else Fear_Timer -= diff; +            events.Update(diff); -            //ChillNova_Timer -            if (ChillNova_Timer <= diff) -            { -                DoCastVictim(SPELL_CHILLNOVA); -                ChillNova_Timer = 14000; -            } else ChillNova_Timer -= diff; +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; -            //FrostVolley_Timer -            if (FrostVolley_Timer <= diff) +            while (uint32 eventId = events.ExecuteEvent())              { -                DoCastVictim(SPELL_FROSTVOLLEY); -                FrostVolley_Timer = 15000; -            } else FrostVolley_Timer -= diff; +                switch (eventId) +                { +                    case EVENT_ICE_ARMOR: +                        DoCast(me, SPELL_ICE_ARMOR); +                        events.ScheduleEvent(EVENT_ICE_ARMOR, 180000); +                        break; +                    case EVENT_FROSTBOLT: +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) +                            DoCast(target, SPELL_FROSTBOLT); +                        events.ScheduleEvent(EVENT_FROSTBOLT, 8000); +                        break; +                    case EVENT_FREEZE: +                        DoCastVictim(SPELL_FREEZE); +                        events.ScheduleEvent(EVENT_FREEZE, 24000); +                        break; +                    case EVENT_FEAR: +                        DoCastVictim(SPELL_FEAR); +                        events.ScheduleEvent(EVENT_FEAR, 30000); +                        break; +                    case EVENT_CHILL_NOVA: +                        DoCastVictim(SPELL_CHILL_NOVA); +                        events.ScheduleEvent(EVENT_CHILL_NOVA, 14000); +                        break; +                    case EVENT_FROSTVOLLEY: +                        DoCastVictim(SPELL_FROSTVOLLEY); +                        events.ScheduleEvent(EVENT_FROSTVOLLEY, 15000); +                        break; +                    default: +                        break; +                } +            }              DoMeleeAttackIfReady();          } + +        private: +            EventMap events;      }; +    CreatureAI* GetAI(Creature* creature) const override +    { +        return new boss_rasfrostAI(creature); +    }  };  void AddSC_boss_rasfrost() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index fba5f3faa14..792649f2998 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,103 +15,102 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Vectus -SD%Complete: 100 -SDComment: -SDCategory: Scholomance -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  enum Emotes  { -    EMOTE_FRENZY_KILL            = 0 +    EMOTE_FRENZY                 = 0  };  enum Spells  {      SPELL_FLAMESTRIKE            = 18399,      SPELL_BLAST_WAVE             = 16046, -    SPELL_FIRESHIELD             = 19626, +    SPELL_FIRE_SHIELD            = 19626,      SPELL_FRENZY                 = 8269  // 28371  }; +enum Events +{ +    EVENT_FIRE_SHIELD = 1, +    EVENT_BLAST_WAVE, +    EVENT_FRENZY +}; +  class boss_vectus : public CreatureScript  {  public:      boss_vectus() : CreatureScript("boss_vectus") { } -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new boss_vectusAI(creature); -    } -      struct boss_vectusAI : public ScriptedAI      { -        boss_vectusAI(Creature* creature) : ScriptedAI(creature) +        boss_vectusAI(Creature* creature) : ScriptedAI(creature) { } + +        void Reset() override          { -            Initialize(); +            events.Reset();          } -        void Initialize() +        void EnterCombat(Unit* /*who*/) override          { -            m_uiFireShield_Timer = 2000; -            m_uiBlastWave_Timer = 14000; -            m_uiFrenzy_Timer = 0; +            events.ScheduleEvent(EVENT_FIRE_SHIELD, 2000); +            events.ScheduleEvent(EVENT_BLAST_WAVE, 14000);          } -        uint32 m_uiFireShield_Timer; -        uint32 m_uiBlastWave_Timer; -        uint32 m_uiFrenzy_Timer; - -        void Reset() override +        void DamageTaken(Unit* /*attacker*/, uint32& damage) override          { -            Initialize(); +            if (me->HealthBelowPctDamaged(25, damage)) +            { +                DoCast(me, SPELL_FRENZY); +                Talk(EMOTE_FRENZY); +                events.ScheduleEvent(EVENT_FRENZY, 24000); +            }          } -        void UpdateAI(uint32 uiDiff) override +        void UpdateAI(uint32 diff) override          {              if (!UpdateVictim())                  return; -            //FireShield_Timer -            if (m_uiFireShield_Timer <= uiDiff) -            { -                DoCast(me, SPELL_FIRESHIELD); -                m_uiFireShield_Timer = 90000; -            } -            else -                m_uiFireShield_Timer -= uiDiff; +            events.Update(diff); -            //BlastWave_Timer -            if (m_uiBlastWave_Timer <= uiDiff) -            { -                DoCastVictim(SPELL_BLAST_WAVE); -                m_uiBlastWave_Timer = 12000; -            } -            else -                m_uiBlastWave_Timer -= uiDiff; +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; -            //Frenzy_Timer -            if (HealthBelowPct(25)) +            while (uint32 eventId = events.ExecuteEvent())              { -                if (m_uiFrenzy_Timer <= uiDiff) +                switch (eventId)                  { -                    DoCast(me, SPELL_FRENZY); -                    Talk(EMOTE_FRENZY_KILL); - -                    m_uiFrenzy_Timer = 24000; +                    case EVENT_FIRE_SHIELD: +                        DoCast(me, SPELL_FIRE_SHIELD); +                        events.ScheduleEvent(EVENT_FIRE_SHIELD, 90000); +                        break; +                    case EVENT_BLAST_WAVE: +                        DoCast(me, SPELL_BLAST_WAVE); +                        events.ScheduleEvent(EVENT_BLAST_WAVE, 12000); +                    case EVENT_FRENZY: +                        DoCast(me, SPELL_FRENZY); +                        Talk(EMOTE_FRENZY); +                        events.ScheduleEvent(EVENT_FRENZY, 24000); +                        break; +                    default: +                        break;                  } -                else -                    m_uiFrenzy_Timer -= uiDiff;              }              DoMeleeAttackIfReady();          } + +        private: +            EventMap events;      }; + +    CreatureAI* GetAI(Creature* creature) const override +    { +        return new boss_vectusAI(creature); +    }  };  void AddSC_boss_vectus() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp index 6bb8e301e86..f1959b6cf56 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp @@ -36,6 +36,7 @@ class instance_scholomance : public InstanceMapScript          {              instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  GateKirtonosGUID        = 0;                  GateGandlingGUID        = 0; @@ -168,49 +169,9 @@ class instance_scholomance : public InstanceMapScript                      instance->SummonCreature(NPC_DARKMASTER_GANDLING, GandlingLoc);              } -            std::string GetSaveData() override +            void ReadSaveDataMore(std::istringstream& /*data*/) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S O " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'O') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    CheckToSpawnGandling(); -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; +                CheckToSpawnGandling();              }          protected: diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h index 9eb7c5e8f86..30d0e978145 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h +++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h @@ -18,6 +18,8 @@  #ifndef DEF_SCHOLOMANCE_H  #define DEF_SCHOLOMANCE_H +#define DataHeader "SC" +  uint32 const EncounterCount             = 8;  enum DataTypes @@ -34,7 +36,8 @@ enum DataTypes  enum CreatureIds  { -    NPC_DARKMASTER_GANDLING             = 1853 +    NPC_DARKMASTER_GANDLING             = 1853, +    NPC_BONE_MINION                     = 16119  };  enum GameobjectIds diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp index c76637224ae..10c4aedf103 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp @@ -96,6 +96,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));              uiAshGUID = 0; diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h index 0b399dc4050..669dfc3975d 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h @@ -19,6 +19,8 @@  #ifndef DEF_SHADOWFANG_H  #define DEF_SHADOWFANG_H +#define DataHeader "SK" +  enum DataTypes  {      TYPE_FREE_NPC               = 1, diff --git a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp index ecdc66d3e0f..43ce4d05297 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp @@ -49,6 +49,7 @@ class instance_stratholme : public InstanceMapScript          {              instance_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);              }              uint32 EncounterState[MAX_ENCOUNTER]; diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 01ee7139ae5..889fbe8fdc9 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -81,38 +81,6 @@ public:  };  /*###### -## npc_freed_soul -######*/ -enum FreedSoul -{ -    SAY_ZAPPED = 0 -}; - -class npc_freed_soul : public CreatureScript -{ -public: -    npc_freed_soul() : CreatureScript("npc_freed_soul") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_freed_soulAI(creature); -    } - -    struct npc_freed_soulAI : public ScriptedAI -    { -        npc_freed_soulAI(Creature* creature) : ScriptedAI(creature) { } - -        void Reset() override -        { -            Talk(SAY_ZAPPED); -        } - -        void EnterCombat(Unit* /*who*/) override { } -    }; - -}; - -/*######  ## npc_restless_soul  ######*/ @@ -181,6 +149,9 @@ public:          void JustSummoned(Creature* summoned) override          {              summoned->CastSpell(summoned, SPELL_SOUL_FREED, false); +             +            if (Player* player = ObjectAccessor::GetPlayer(*me, Tagger)) +                summoned->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);          }          void JustDied(Unit* /*killer*/) override @@ -318,7 +289,6 @@ public:  void AddSC_stratholme()  {      new go_gauntlet_gate(); -    new npc_freed_soul();      new npc_restless_soul();      new npc_spectral_ghostly_citizen();  } diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h index 9e4c88f5856..687512ea92d 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h @@ -19,6 +19,8 @@  #ifndef DEF_STRATHOLME_H  #define DEF_STRATHOLME_H +#define DataHeader "STR" +  enum DataTypes  {      TYPE_BARON_RUN                      = 1, diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp index 789a5c3a874..ee16a662711 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp @@ -60,6 +60,7 @@ public:      {          instance_sunken_temple_InstanceMapScript(Map* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);          }          uint64 GOAtalaiStatue1; diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h index 394b1e3e8ae..bfd99e2afdd 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h @@ -19,6 +19,8 @@  #ifndef DEF_SUNKEN_TEMPLE_H  #define DEF_SUNKEN_TEMPLE_H +#define DataHeader "ST" +  #define TROLLBOSS1_DEATH 1  #define TROLLBOSS2_DEATH 2  #define TROLLBOSS3_DEATH 3 diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 5df2d683e21..79ebfa7b62b 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -503,6 +503,7 @@ public:          {              Initialize();              instance = creature->GetInstanceScript(); +            speechPhaseEnd = 0;              SetCombatMovement(false);          } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index ec0bae0f27f..823423fc3a8 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -301,10 +301,19 @@ public:      {          npc_muru_portalAI(Creature* creature) : ScriptedAI(creature), Summons(creature)          { +            Initialize();              SetCombatMovement(false);              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            SummonTimer = 5000; + +            InAction = false; +            SummonSentinel = false; +        } +          InstanceScript* instance;          SummonList Summons; @@ -316,10 +325,7 @@ public:          void Reset() override          { -            SummonTimer = 5000; - -            InAction = false; -            SummonSentinel = false; +            Initialize();              me->AddUnitState(UNIT_STATE_STUNNED); @@ -383,15 +389,23 @@ public:      struct npc_dark_fiendAI : public ScriptedAI      { -        npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature) { } +        npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            WaitTimer = 2000; +            InAction = false; +        }          uint32 WaitTimer;          bool InAction;          void Reset() override          { -            WaitTimer = 2000; -            InAction = false; +            Initialize();              me->AddUnitState(UNIT_STATE_STUNNED);          } @@ -444,15 +458,23 @@ public:      struct npc_void_sentinelAI : public ScriptedAI      { -        npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) { } +        npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            PulseTimer = 3000; +            VoidBlastTimer = 45000; //is this a correct timer? +        }          uint32 PulseTimer;          uint32 VoidBlastTimer;          void Reset() override          { -            PulseTimer = 3000; -            VoidBlastTimer = 45000; //is this a correct timer? +            Initialize();              float x, y, z, o;              me->GetHomePosition(x, y, z, o); @@ -502,9 +524,18 @@ public:      {          npc_blackholeAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            DespawnTimer = 15000; +            SpellTimer = 5000; +            Phase = 0; +            NeedForAHack = 0; +        } +          InstanceScript* instance;          uint32 DespawnTimer; @@ -514,10 +545,7 @@ public:          void Reset() override          { -            DespawnTimer = 15000; -            SpellTimer = 5000; -            Phase = 0; -            NeedForAHack = 0; +            Initialize();              me->AddUnitState(UNIT_STATE_STUNNED);              DoCastAOE(SPELL_BLACKHOLE_SPAWN, true); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp index 5a411d504aa..2066c4309b2 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp @@ -49,6 +49,7 @@ class instance_sunwell_plateau : public InstanceMapScript          {              instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -212,67 +213,24 @@ class instance_sunwell_plateau : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S P " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'P') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } - -            protected: -                uint64 KalecgosDragonGUID; -                uint64 KalecgosHumanGUID; -                uint64 SathrovarrGUID; -                uint64 BrutallusGUID; -                uint64 MadrigosaGUID; -                uint64 FelmystGUID; -                uint64 AlythessGUID; -                uint64 SacrolashGUID; -                uint64 MuruGUID; -                uint64 KilJaedenGUID; -                uint64 KilJaedenControllerGUID; -                uint64 AnveenaGUID; -                uint64 KalecgosKjGUID; -                uint32 SpectralPlayers; - -                uint32 SpectralRealmTimer; -                std::vector<uint64> SpectralRealmList; +        protected: +            uint64 KalecgosDragonGUID; +            uint64 KalecgosHumanGUID; +            uint64 SathrovarrGUID; +            uint64 BrutallusGUID; +            uint64 MadrigosaGUID; +            uint64 FelmystGUID; +            uint64 AlythessGUID; +            uint64 SacrolashGUID; +            uint64 MuruGUID; +            uint64 KilJaedenGUID; +            uint64 KilJaedenControllerGUID; +            uint64 AnveenaGUID; +            uint64 KalecgosKjGUID; +            uint32 SpectralPlayers; + +            uint32 SpectralRealmTimer; +            std::vector<uint64> SpectralRealmList;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h index d32cdb037b2..e6aed3eddf7 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h @@ -19,6 +19,7 @@  #define SUNWELL_PLATEAU_H  #define SunwellPlateauScriptName "instance_sunwell_plateau" +#define DataHeader "SWP"  uint32 const EncounterCount = 6; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 56c84677181..17a6440702e 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -49,6 +49,7 @@ class instance_uldaman : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));                  archaedasGUID = 0; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h index 6f17fae0162..8697172fcb9 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h @@ -19,6 +19,8 @@  #ifndef DEF_ULDAMAN_H  #define DEF_ULDAMAN_H +#define DataHeader "UD" +  #define MAX_ENCOUNTER                   3  enum DataTypes diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index d5cfb7b4851..11bf47c4cd1 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -29,6 +29,7 @@ class instance_zulaman : public InstanceMapScript          {              instance_zulaman_InstanceScript(InstanceMap* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  AkilzonGUID             = 0; @@ -266,60 +267,25 @@ class instance_zulaman : public InstanceMapScript                  }              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "Z A " << GetBossSaveData() << ZulAmanState -                    << ' ' << SpeedRunTimer << ' ' << ZulAmanBossCount; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                data << ZulAmanState  << ' ' +                     << SpeedRunTimer << ' ' +                     << ZulAmanBossCount;              } -            void Load(char const* str) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; +                data >> ZulAmanState; +                data >> SpeedRunTimer; +                data >> ZulAmanBossCount; -                if (dataHead1 == 'Z' && dataHead2 == 'A') +                if (ZulAmanState == IN_PROGRESS && SpeedRunTimer && SpeedRunTimer <= 15)                  { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    loadStream >> ZulAmanState; -                    loadStream >> SpeedRunTimer; -                    loadStream >> ZulAmanBossCount; - -                    if (ZulAmanState == IN_PROGRESS && SpeedRunTimer && SpeedRunTimer <= 15) -                    { -                        events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); -                        DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); -                        DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer); -                    } +                    events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); +                    DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); +                    DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer);                  } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE;              }          protected: diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h index a9a1aaecd05..820788c66ec 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h @@ -20,6 +20,7 @@  uint32 const EncounterCount = 6;  #define ZulAmanScriptName "instance_zulaman" +#define DataHeader "ZA"  enum DataTypes  { diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 1f65805ea71..581839315da 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -39,6 +39,7 @@ class instance_zulgurub : public InstanceMapScript          {              instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  venoxisGUID         = 0; @@ -197,50 +198,6 @@ class instance_zulgurub : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "Z G " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'Z' && dataHead2 == 'G') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:               uint64 venoxisGUID;               uint64 mandokirGUID; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 5fbd18b7590..bdb73a77997 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -19,6 +19,7 @@  #ifndef DEF_ZULGURUB_H  #define DEF_ZULGURUB_H +#define DataHeader "ZG"  #define ZGScriptName "instance_zulgurub"  uint32 const EncounterCount = 5; diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index dbcf5998bdb..d242d17806c 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -319,19 +319,24 @@ public:      struct npc_anchorite_truuenAI : public npc_escortAI      { -        npc_anchorite_truuenAI(Creature* creature) : npc_escortAI(creature) { } +        npc_anchorite_truuenAI(Creature* creature) : npc_escortAI(creature) +        { +            Initialize(); +            UghostGUID = 0; +        } + +        void Initialize() +        { +            m_uiChatTimer = 7000; +        }          uint32 m_uiChatTimer;          uint64 UghostGUID; -        uint64 TheldanisGUID; - -        Creature* Ughost; -        Creature* Theldanis;          void Reset() override          { -            m_uiChatTimer = 7000; +            Initialize();          }          void JustSummoned(Creature* summoned) override @@ -364,26 +369,25 @@ public:                      Talk(SAY_WP_2);                      break;                  case 21: -                    Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150); -                    if (Theldanis) +                    if (Creature* Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150))                          Theldanis->AI()->Talk(SAY_WP_3);                      break;                  case 23: -                    Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                    if (Ughost) +                    if (Creature* Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))                      { +                        UghostGUID = Ughost->GetGUID();                          Ughost->SetDisableGravity(true);                          Ughost->AI()->Talk(SAY_WP_4, me);                      }                      m_uiChatTimer = 4000;                      break;                  case 24: -                    if (Ughost) +                    if (Creature* Ughost = ObjectAccessor::GetCreature(*me, UghostGUID))                          Ughost->AI()->Talk(SAY_WP_5, me);                      m_uiChatTimer = 4000;                      break;                  case 25: -                    if (Ughost) +                    if (Creature* Ughost = ObjectAccessor::GetCreature(*me, UghostGUID))                          Ughost->AI()->Talk(SAY_WP_6, me);                      m_uiChatTimer = 4000;                      break; diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index e6c844b1b1e..94cea417b04 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -59,14 +59,22 @@ public:      struct npc_tapoke_slim_jahnAI : public npc_escortAI      { -        npc_tapoke_slim_jahnAI(Creature* creature) : npc_escortAI(creature) { } +        npc_tapoke_slim_jahnAI(Creature* creature) : npc_escortAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            IsFriendSummoned = false; +        }          bool IsFriendSummoned;          void Reset() override          {              if (!HasEscortState(STATE_ESCORT_ESCORTING)) -                IsFriendSummoned = false; +                Initialize();          }          void WaypointReached(uint32 waypointId) override diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index 25257848192..4bc0642e348 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -27,7 +27,7 @@ enum Orphans      ORPHAN_BLOOD_ELF                        = 22817,      ORPHAN_DRAENEI                          = 22818,      ORPHAN_HUMAN                            = 14305, -    ORPHAN_ORCISH                           = 14444, +    ORPHAN_ORCISH                           = 14444  };  enum Texts @@ -68,7 +68,7 @@ enum Texts      TEXT_ELDER_KEKEK_1                      = 1,      TEXT_ALEXSTRASZA_2                      = 2, -    TEXT_KRASUS_8                           = 8, +    TEXT_KRASUS_8                           = 8  };  enum Quests @@ -99,7 +99,7 @@ enum Quests      QUEST_NOW_WHEN_I_GROW_UP                = 11975,      QUEST_HOME_OF_THE_BEAR_MEN              = 13930,      QUEST_THE_DRAGON_QUEEN_ORACLE           = 13954, -    QUEST_THE_DRAGON_QUEEN_WOLVAR           = 13955, +    QUEST_THE_DRAGON_QUEEN_WOLVAR           = 13955  };  enum Areatriggers @@ -120,7 +120,7 @@ enum Areatriggers      NPC_SPOREGGAR_CW_TRIGGER                = 22829,      NPC_THRONE_OF_ELEMENTS_CW_TRIGGER       = 22839,      NPC_SILVERMOON_01_CW_TRIGGER            = 22866, -    NPC_KRASUS                              = 27990, +    NPC_KRASUS                              = 27990  };  enum Misc @@ -128,7 +128,7 @@ enum Misc      SPELL_SNOWBALL                          = 21343,      SPELL_ORPHAN_OUT                        = 58818, -    DISPLAY_INVISIBLE                       = 11686, +    DISPLAY_INVISIBLE                       = 11686  };  uint64 getOrphanGUID(Player* player, uint32 orphan) @@ -150,9 +150,12 @@ class npc_winterfin_playmate : public CreatureScript          struct npc_winterfin_playmateAI : public ScriptedAI          { -            npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature) { } +            npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  timer = 0;                  phase = 0; @@ -160,8 +163,12 @@ class npc_winterfin_playmate : public CreatureScript                  orphanGUID = 0;              } -            void MoveInLineOfSight(Unit* who) override +            void Reset() override +            { +                Initialize(); +            } +            void MoveInLineOfSight(Unit* who) override              {                  if (!phase && who && who->GetDistance2d(me) < 10.0f)                      if (Player* player = who->ToPlayer()) @@ -249,9 +256,12 @@ class npc_snowfall_glade_playmate : public CreatureScript          struct npc_snowfall_glade_playmateAI : public ScriptedAI          { -            npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature) { } +            npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  timer = 0;                  phase = 0; @@ -259,6 +269,11 @@ class npc_snowfall_glade_playmate : public CreatureScript                  orphanGUID = 0;              } +            void Reset() override +            { +                Initialize(); +            } +              void MoveInLineOfSight(Unit* who) override              { @@ -331,7 +346,7 @@ class npc_snowfall_glade_playmate : public CreatureScript              uint64 orphanGUID;          }; -        CreatureAI* GetAI(Creature* pCreature) const +        CreatureAI* GetAI(Creature* pCreature) const override          {              return new npc_snowfall_glade_playmateAI(pCreature);          } @@ -349,10 +364,11 @@ class npc_the_biggest_tree : public CreatureScript          {              npc_the_biggest_treeAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  me->SetDisplayId(DISPLAY_INVISIBLE);              } -            void Reset() override +            void Initialize()              {                  timer = 1000;                  phase = 0; @@ -360,8 +376,12 @@ class npc_the_biggest_tree : public CreatureScript                  orphanGUID = 0;              } -            void MoveInLineOfSight(Unit* who) override +            void Reset() override +            { +                Initialize(); +            } +            void MoveInLineOfSight(Unit* who) override              {                  if (!phase && who && who->GetDistance2d(me) < 10.0f)                      if (Player* player = who->ToPlayer()) @@ -437,9 +457,12 @@ class npc_high_oracle_soo_roo : public CreatureScript          struct npc_high_oracle_soo_rooAI : public ScriptedAI          { -            npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature) { } +            npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  timer = 0;                  phase = 0; @@ -447,6 +470,11 @@ class npc_high_oracle_soo_roo : public CreatureScript                  orphanGUID = 0;              } +            void Reset() override +            { +                Initialize(); +            } +              void MoveInLineOfSight(Unit* who) override              { @@ -526,9 +554,12 @@ class npc_elder_kekek : public CreatureScript          struct npc_elder_kekekAI : public ScriptedAI          { -            npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature) { } +            npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  timer = 0;                  phase = 0; @@ -536,8 +567,12 @@ class npc_elder_kekek : public CreatureScript                  orphanGUID = 0;              } -            void MoveInLineOfSight(Unit* who) override +            void Reset() override +            { +                Initialize(); +            } +            void MoveInLineOfSight(Unit* who) override              {                  if (!phase && who && who->GetDistance2d(me) < 10.0f)                      if (Player* player = who->ToPlayer()) @@ -615,9 +650,12 @@ class npc_the_etymidian : public CreatureScript          struct npc_the_etymidianAI : public ScriptedAI          { -            npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature) { } +            npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  timer = 0;                  phase = 0; @@ -625,8 +663,12 @@ class npc_the_etymidian : public CreatureScript                  orphanGUID = 0;              } -            void MoveInLineOfSight(Unit* who) override +            void Reset() override +            { +                Initialize(); +            } +            void MoveInLineOfSight(Unit* who) override              {                  if (!phase && who && who->GetDistance2d(me) < 10.0f)                      if (Player* player = who->ToPlayer()) @@ -711,9 +753,12 @@ class npc_alexstraza_the_lifebinder : public CreatureScript          struct npc_alexstraza_the_lifebinderAI : public ScriptedAI          { -            npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature) { } +            npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  timer = 0;                  phase = 0; @@ -721,6 +766,11 @@ class npc_alexstraza_the_lifebinder : public CreatureScript                  orphanGUID = 0;              } +            void Reset() override +            { +                Initialize(); +            } +              void SetData(uint32 type, uint32 data) override              {                  // Existing SmartAI @@ -739,7 +789,6 @@ class npc_alexstraza_the_lifebinder : public CreatureScript              }              void MoveInLineOfSight(Unit* who) override -              {                  if (!phase && who && who->GetDistance2d(me) < 10.0f)                      if (Player* player = who->ToPlayer()) @@ -871,7 +920,7 @@ class at_bring_your_orphan_to : public AreaTriggerScript      public:          at_bring_your_orphan_to() : AreaTriggerScript("at_bring_your_orphan_to") { } -        bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) +        bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) override          {              if (player->isDead() || !player->HasAura(SPELL_ORPHAN_OUT))                  return false; @@ -934,7 +983,6 @@ class npc_cw_area_trigger : public CreatureScript              }              void MoveInLineOfSight(Unit* who) override -              {                  if (who && me->GetDistance2d(who) < 20.0f)                      if (Player* player = who->ToPlayer()) @@ -1031,7 +1079,6 @@ class npc_grizzlemaw_cw_trigger : public CreatureScript              }              void MoveInLineOfSight(Unit* who) override -              {                  if (who && who->GetDistance2d(me) < 10.0f)                      if (Player* player = who->ToPlayer()) diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index e7beb4cf454..f8ba2ab6646 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -80,6 +80,7 @@ public:      {          npc_blackfathom_deeps_eventAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              if (creature->IsSummon())              {                  creature->SetHomePosition(HomePosition); @@ -89,6 +90,15 @@ public:              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            Flee = false; + +            ravageTimer = urand(5000, 8000); +            frostNovaTimer = urand(9000, 12000); +            frostBoltVolleyTimer = urand(2000, 4000); +        } +          InstanceScript* instance;          uint32 ravageTimer; @@ -99,11 +109,7 @@ public:          void Reset() override          { -            Flee = false; - -            ravageTimer           = urand(5000, 8000); -            frostNovaTimer        = urand(9000, 12000); -            frostBoltVolleyTimer  = urand(2000, 4000); +            Initialize();          }          void AttackPlayer() diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h index 07a388043a6..3ac99a32861 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h @@ -19,6 +19,8 @@  #ifndef BFD_H_  #define BFD_H_ +#define DataHeader "BFD" +  enum Data64  {      DATA_SHRINE1, diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp index f6c34c6b555..b510a84b949 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp @@ -38,11 +38,19 @@ public:      struct boss_aku_maiAI : public BossAI      { -        boss_aku_maiAI(Creature* creature) : BossAI(creature, TYPE_AKU_MAI) { } +        boss_aku_maiAI(Creature* creature) : BossAI(creature, TYPE_AKU_MAI) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          {              IsEnraged = false; +        } + +        void Reset() override +        { +            Initialize();              _Reset();          } diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp index 9e25de817fa..0eba1a14fa5 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp @@ -38,16 +38,22 @@ public:      {          boss_gelihastAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            netTimer = urand(2000, 4000); +        } +          uint32 netTimer;          InstanceScript* instance;          void Reset() override          { -            netTimer = urand(2000, 4000); +            Initialize();              instance->SetData(TYPE_GELIHAST, NOT_STARTED);          } diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp index 37fac0fa7de..d5860e4dbf7 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp @@ -43,9 +43,16 @@ public:      {          boss_kelrisAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            mindBlastTimer = urand(2000, 5000); +            sleepTimer = urand(9000, 12000); +        } +          uint32 mindBlastTimer;          uint32 sleepTimer; @@ -53,8 +60,7 @@ public:          void Reset() override          { -            mindBlastTimer = urand(2000, 5000); -            sleepTimer = urand(9000, 12000); +            Initialize();              instance->SetData(TYPE_KELRIS, NOT_STARTED);          } diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp index 940da4fcf52..28b414ba9ca 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp @@ -81,6 +81,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&encounter, 0, sizeof(encounter));              twilightLordKelrisGUID = 0; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 7aaa2239745..782632602b3 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -54,10 +54,20 @@ public:      {          boss_anetheronAI(Creature* creature) : hyjal_trashAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              go = false;          } +        void Initialize() +        { +            SwarmTimer = 45000; +            SleepTimer = 60000; +            AuraTimer = 5000; +            InfernoTimer = 45000; +            damageTaken = 0; +        } +          uint32 SwarmTimer;          uint32 SleepTimer;          uint32 AuraTimer; @@ -66,11 +76,7 @@ public:          void Reset() override          { -            damageTaken = 0; -            SwarmTimer = 45000; -            SleepTimer = 60000; -            AuraTimer = 5000; -            InfernoTimer = 45000; +            Initialize();              if (IsEvent)                  instance->SetData(DATA_ANETHERONEVENT, NOT_STARTED); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 576b3dbdb39..2885a838cee 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -90,7 +90,13 @@ public:      {          npc_ancient_wispAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript(); +        } + +        void Initialize() +        { +            CheckTimer = 1000;              ArchimondeGUID = 0;          } @@ -100,7 +106,7 @@ public:          void Reset() override          { -            CheckTimer = 1000; +            Initialize();              ArchimondeGUID = instance->GetData64(DATA_ARCHIMONDE); @@ -174,15 +180,23 @@ public:      struct npc_doomfire_targettingAI : public ScriptedAI      { -        npc_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature) { } +        npc_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            TargetGUID = 0; +            ChangeTargetTimer = 5000; +        }          uint64 TargetGUID;          uint32 ChangeTargetTimer;          void Reset() override          { -            TargetGUID = 0; -            ChangeTargetTimer = 5000; +            Initialize();          }          void MoveInLineOfSight(Unit* who) override @@ -244,9 +258,36 @@ public:      {          boss_archimondeAI(Creature* creature) : hyjal_trashAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            DoomfireSpiritGUID = 0; +            damageTaken = 0; +            WorldTreeGUID = 0; + +            DrainNordrassilTimer = 0; +            FearTimer = 42000; +            AirBurstTimer = 30000; +            GripOfTheLegionTimer = urand(5000, 25000); +            DoomfireTimer = 20000; +            SoulChargeTimer = urand(2000, 30000); +            SoulChargeCount = 0; +            MeleeRangeCheckTimer = 15000; +            HandOfDeathTimer = 2000; +            WispCount = 0;                                      // When ~30 wisps are summoned, Archimonde dies +            EnrageTimer = 600000;                               // 10 minutes +            CheckDistanceTimer = 30000;                         // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage +            SummonWispTimer = 0; + +            Enraged = false; +            BelowTenPercent = false; +            HasProtected = false; +            IsChanneling = false; +        } +          InstanceScript* instance;          uint64 DoomfireSpiritGUID; @@ -275,28 +316,7 @@ public:          {              instance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED); -            DoomfireSpiritGUID = 0; -            damageTaken = 0; -            WorldTreeGUID = 0; - -            DrainNordrassilTimer = 0; -            FearTimer = 42000; -            AirBurstTimer = 30000; -            GripOfTheLegionTimer = urand(5000, 25000); -            DoomfireTimer = 20000; -            SoulChargeTimer = urand(2000, 30000); -            SoulChargeCount = 0; -            MeleeRangeCheckTimer = 15000; -            HandOfDeathTimer = 2000; -            WispCount = 0;                                      // When ~30 wisps are summoned, Archimonde dies -            EnrageTimer = 600000;                               // 10 minutes -            CheckDistanceTimer = 30000;                         // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage -            SummonWispTimer = 0; - -            Enraged = false; -            BelowTenPercent = false; -            HasProtected = false; -            IsChanneling = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index 38e398f3d5b..7e50fd7b775 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -55,10 +55,22 @@ public:      {          boss_azgalorAI(Creature* creature) : hyjal_trashAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              go = false;          } +        void Initialize() +        { +            damageTaken = 0; +            RainTimer = 20000; +            DoomTimer = 50000; +            HowlTimer = 30000; +            CleaveTimer = 10000; +            EnrageTimer = 600000; +            enraged = false; +        } +          uint32 RainTimer;          uint32 DoomTimer;          uint32 HowlTimer; @@ -70,13 +82,7 @@ public:          void Reset() override          { -            damageTaken = 0; -            RainTimer = 20000; -            DoomTimer = 50000; -            HowlTimer = 30000; -            CleaveTimer = 10000; -            EnrageTimer = 600000; -            enraged = false; +            Initialize();              if (IsEvent)                  instance->SetData(DATA_AZGALOREVENT, NOT_STARTED); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index e08ac61bcde..dcad4480fde 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -56,10 +56,20 @@ public:      {          boss_kazrogalAI(Creature* creature) : hyjal_trashAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              go = false;          } +        void Initialize() +        { +            damageTaken = 0; +            CleaveTimer = 5000; +            WarStompTimer = 15000; +            MarkTimer = 45000; +            MarkTimerBase = 45000; +        } +          uint32 CleaveTimer;          uint32 WarStompTimer;          uint32 MarkTimer; @@ -68,11 +78,7 @@ public:          void Reset() override          { -            damageTaken = 0; -            CleaveTimer = 5000; -            WarStompTimer = 15000; -            MarkTimer = 45000; -            MarkTimerBase = 45000; +            Initialize();              if (IsEvent)                  instance->SetData(DATA_KAZROGALEVENT, NOT_STARTED); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp index c37b9d910e7..5ce9b30eb58 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -51,10 +51,20 @@ public:      {          boss_rage_winterchillAI(Creature* creature) : hyjal_trashAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              go = false;          } +        void Initialize() +        { +            damageTaken = 0; +            FrostArmorTimer = 37000; +            DecayTimer = 45000; +            NovaTimer = 15000; +            IceboltTimer = 10000; +        } +          uint32 FrostArmorTimer;          uint32 DecayTimer;          uint32 NovaTimer; @@ -63,11 +73,7 @@ public:          void Reset() override          { -            damageTaken = 0; -            FrostArmorTimer = 37000; -            DecayTimer = 45000; -            NovaTimer = 15000; -            IceboltTimer = 10000; +            Initialize();              if (IsEvent)                  instance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h index 7ea09d2cda1..c5f4d4ae679 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h @@ -19,7 +19,7 @@  #ifndef DEF_HYJAL_H  #define DEF_HYJAL_H -#define ERROR_INST_DATA     "TSCR: Instance data not set properly for Mount Hyjal. Encounters will be buggy." +#define DataHeader "HY"  uint32 const EncounterCount     = 5; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index b9c6025b91c..a7fa54b12e1 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -317,6 +317,7 @@ float HordeFirePos[65][8]=//spawn points for the fire visuals (GO) in the horde  hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me)  { +    Initialize();      instance = creature->GetInstanceScript();      VeinsSpawned[0] = false;      VeinsSpawned[1] = false; @@ -332,25 +333,15 @@ hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me)      InfernalPoint = 0;      RespawnTimer = 10000;      DoRespawn = false; -    DoHide = false;      MassTeleportTimer = 0;      DoMassTeleport = false; +    DummyGuid = 0;  } -void hyjalAI::JustSummoned(Creature* summoned) -{ -    Summons.Summon(summoned); -} - -void hyjalAI::SummonedCreatureDespawn(Creature* summoned) -{ -    Summons.Despawn(summoned); -} - -void hyjalAI::Reset() +void hyjalAI::Initialize()  {      IsDummy = false; -    me->setActive(true); +      // GUIDs      PlayerGUID = 0;      BossGUID[0] = 0; @@ -365,6 +356,39 @@ void hyjalAI::Reset()      WaveCount = 0;      EnemyCount = 0; +    //Bools +    EventBegun = false; +    FirstBossDead = false; +    SecondBossDead = false; +    Summon = false; +    bRetreat = false; +    Debug = false; + +    //Visibility +    DoHide = true; + +    //Initialize spells +    memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS); + +    Faction = 0; +} + +void hyjalAI::JustSummoned(Creature* summoned) +{ +    Summons.Summon(summoned); +} + +void hyjalAI::SummonedCreatureDespawn(Creature* summoned) +{ +    Summons.Despawn(summoned); +} + +void hyjalAI::Reset() +{ +    me->setActive(true); + +    Initialize(); +      // Set faction properly based on Creature entry      switch (me->GetEntry())      { @@ -382,20 +406,9 @@ void hyjalAI::Reset()              break;      } -    //Bools -    EventBegun = false; -    FirstBossDead = false; -    SecondBossDead = false; -    Summon = false; -    bRetreat = false; -    Debug = false; -      //Flags      me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); -    //Initialize spells -    memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS); -      //Reset Instance Data for trash count      if ((!instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == JAINA) || (instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == THRALL))      { @@ -405,9 +418,6 @@ void hyjalAI::Reset()          instance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0);          instance->SetData(DATA_RESET_TRASH_COUNT, 0);      } - -    //Visibility -    DoHide = true;  }  void hyjalAI::EnterEvadeMode() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h index c91414eba9d..43afc58879c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h @@ -119,6 +119,8 @@ struct hyjalAI : public npc_escortAI  {      hyjalAI(Creature* creature); +    void Initialize(); +      void Reset();                                           // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat      void EnterEvadeMode();                                  // Send creature back to spawn location and evade. diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 7537654c09c..8e1a78ea5f2 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -1135,9 +1135,15 @@ public:      {          npc_frost_wyrmAI(Creature* creature) : hyjal_trashAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              go = false; -            Reset(); +        } + +        void Initialize() +        { +            FrostBreathTimer = 5000; +            MoveTimer = 0;          }          bool go; @@ -1146,8 +1152,7 @@ public:          void Reset() override          { -            FrostBreathTimer = 5000; -            MoveTimer = 0; +            Initialize();              me->SetDisableGravity(true);          } @@ -1388,9 +1393,15 @@ public:      {          alliance_riflemanAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              SetCombatMovement(false);          } +        void Initialize() +        { +            ExplodeTimer = 5000 + rand32() % 5000; +        } +          uint32 ExplodeTimer;          void JustDied(Unit* /*killer*/) override @@ -1399,7 +1410,7 @@ public:          void Reset() override          { -            ExplodeTimer = 5000 + rand32() % 5000; +            Initialize();          }          void MoveInLineOfSight(Unit* who) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index b0a1856f45f..93252802522 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -60,6 +60,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));              m_uiAncientGemGUID.clear(); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp index 44e1067498d..0a666488e84 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp @@ -59,9 +59,20 @@ public:      {          boss_epochAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiStep = 1; +            uiStepTimer = 26000; +            uiCurseOfExertionTimer = 9300; +            uiTimeWarpTimer = 25300; +            uiTimeStopTimer = 21300; +            uiWoundingStrikeTimer = 5300; +        } +          uint8 uiStep;          uint32 uiStepTimer; @@ -74,12 +85,7 @@ public:          void Reset() override          { -            uiStep = 1; -            uiStepTimer = 26000; -            uiCurseOfExertionTimer = 9300; -            uiTimeWarpTimer = 25300; -            uiTimeStopTimer = 21300; -            uiWoundingStrikeTimer = 5300; +            Initialize();              instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED);          } 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 6d36a933687..d9356b724c0 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -73,7 +73,21 @@ public:      {          boss_mal_ganisAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript(); +            uiOutroStep = 0; +        } + +        void Initialize() +        { +            bYelled = false; +            bYelled2 = false; +            Phase = COMBAT; +            uiCarrionSwarmTimer = 6000; +            uiMindBlastTimer = 11000; +            uiVampiricTouchTimer = urand(10000, 15000); +            uiSleepTimer = urand(15000, 20000); +            uiOutroTimer = 1000;          }          uint32 uiCarrionSwarmTimer; @@ -93,16 +107,9 @@ public:          void Reset() override          { -             bYelled = false; -             bYelled2 = false; -             Phase = COMBAT; -             uiCarrionSwarmTimer = 6000; -             uiMindBlastTimer = 11000; -             uiVampiricTouchTimer = urand(10000, 15000); -             uiSleepTimer = urand(15000, 20000); -             uiOutroTimer = 1000; - -             instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED); +            Initialize(); + +            instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index 4c26b30947f..c961bf9b2c6 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -58,10 +58,18 @@ public:      {          boss_meathookAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              Talk(SAY_SPAWN);          } +        void Initialize() +        { +            uiChainTimer = urand(12000, 17000);   //seen on video 13, 17, 15, 12, 16 +            uiDiseaseTimer = urand(2000, 4000);   //approx 3s +            uiFrenzyTimer = urand(21000, 26000);  //made it up +        } +          uint32 uiChainTimer;          uint32 uiDiseaseTimer;          uint32 uiFrenzyTimer; @@ -70,9 +78,7 @@ public:          void Reset() override          { -            uiChainTimer = urand(12000, 17000);   //seen on video 13, 17, 15, 12, 16 -            uiDiseaseTimer = urand(2000, 4000);   //approx 3s -            uiFrenzyTimer = urand(21000, 26000);  //made it up +            Initialize();              instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED);          } 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 7c299b1feaa..1c35a38a5e3 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 @@ -63,10 +63,20 @@ public:      {          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; @@ -77,13 +87,9 @@ public:          void Reset() override          { -             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 +            Initialize(); -             instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED); +            instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index fd832051421..b8a9b295161 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -351,8 +351,37 @@ public:      {          npc_arthasAI(Creature* creature) : npc_escortAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript(); -            Reset(); +            bStepping = false; +            step = 0; +            gossipStep = 0; +            bossEvent = 0; +        } + +        void Initialize() +        { +            utherGUID = 0; +            jainaGUID = 0; + +            for (uint8 i = 0; i < 2; ++i) +                citymenGUID[i] = 0; + +            for (uint8 i = 0; i < ENCOUNTER_WAVES_MAX_SPAWNS; ++i) +                waveGUID[i] = 0; + +            for (uint8 i = 0; i < ENCOUNTER_DRACONIAN_NUMBER; ++i) +                infiniteDraconianGUID[i] = 0; + +            stalkerGUID = 0; +            bossGUID = 0; +            epochGUID = 0; +            malganisGUID = 0; +            infiniteGUID = 0; + +            phaseTimer = 1000; +            exorcismTimer = 7300; +            wave = 0;          }          InstanceScript* instance; @@ -361,7 +390,6 @@ public:          uint32 step;          uint32 phaseTimer;          uint32 gossipStep; -        uint32 playerFaction;          uint32 bossEvent;          uint32 wave; @@ -381,23 +409,7 @@ public:          void Reset() override          { -            utherGUID = 0; -            jainaGUID = 0; - -            for (uint8 i = 0; i < 2; ++i) -                citymenGUID[i] = 0; - -            for (uint8 i = 0; i < ENCOUNTER_WAVES_MAX_SPAWNS; ++i) -                waveGUID[i] = 0; - -            for (uint8 i = 0; i < ENCOUNTER_DRACONIAN_NUMBER; ++i) -                infiniteDraconianGUID[i] = 0; - -            stalkerGUID = 0; -            bossGUID = 0; -            epochGUID = 0; -            malganisGUID = 0; -            infiniteGUID = 0; +            Initialize();              instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED);              switch (instance->GetData(DATA_ARTHAS_EVENT)) @@ -410,9 +422,6 @@ public:                      gossipStep = 0;                      break;              } -            phaseTimer = 1000; -            exorcismTimer = 7300; -            wave = 0;          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h index 649d9dbf803..e7d1033e55f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h @@ -18,6 +18,8 @@  #ifndef DEF_CULLING_OF_STRATHOLME_H  #define DEF_CULLING_OF_STRATHOLME_H +#define DataHeader "CS" +  enum Data  {      DATA_MEATHOOK_EVENT, 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 503166e0b12..7af2b3f63aa 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 @@ -54,6 +54,7 @@ class instance_culling_of_stratholme : public InstanceMapScript          {              instance_culling_of_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  _arthasGUID = 0;                  _meathookGUID = 0;                  _salrammGUID = 0; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp index b63075b681a..611ef38d626 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -61,9 +61,20 @@ public:      {          boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            Holy_Light_Timer = urand(20000, 30000); +            Cleanse_Timer = 10000; +            HammerOfJustice_Timer = urand(20000, 35000); +            HolyShield_Timer = 240000; +            DevotionAura_Timer = 3000; +            Consecration_Timer = 8000; +        } +          InstanceScript* instance;          uint32 Holy_Light_Timer; @@ -75,12 +86,7 @@ public:          void Reset() override          { -            Holy_Light_Timer = urand(20000, 30000); -            Cleanse_Timer = 10000; -            HammerOfJustice_Timer = urand(20000, 35000); -            HolyShield_Timer = 240000; -            DevotionAura_Timer = 3000; -            Consecration_Timer = 8000; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp index e27dec09802..1916e184dbb 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp @@ -59,9 +59,18 @@ public:      {          boss_epoch_hunterAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            SandBreath_Timer = urand(8000, 16000); +            ImpendingDeath_Timer = urand(25000, 30000); +            WingBuffet_Timer = 35000; +            Mda_Timer = 40000; +        } +          InstanceScript* instance;          uint32 SandBreath_Timer; @@ -71,10 +80,7 @@ public:          void Reset() override          { -            SandBreath_Timer = urand(8000, 16000); -            ImpendingDeath_Timer = urand(25000, 30000); -            WingBuffet_Timer = 35000; -            Mda_Timer = 40000; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp index 2cf5169b530..8d23cf0a3e4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -114,7 +114,21 @@ public:      struct boss_lieutenant_drakeAI : public ScriptedAI      { -        boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature) { } +        boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            CanPatrol = true; +            wpId = 0; + +            Whirlwind_Timer = 20000; +            Fear_Timer = 30000; +            MortalStrike_Timer = 45000; +            ExplodingShout_Timer = 25000; +        }          bool CanPatrol;          uint32 wpId; @@ -126,13 +140,7 @@ public:          void Reset() override          { -            CanPatrol = true; -            wpId = 0; - -            Whirlwind_Timer = 20000; -            Fear_Timer = 30000; -            MortalStrike_Timer = 45000; -            ExplodingShout_Timer = 25000; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp index 6fc36663c2a..32062be6f3c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp @@ -64,6 +64,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));              mBarrelCount        = 0; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 1dc86cd4ad4..56e95fafece 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -276,11 +276,17 @@ public:      {          npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              HadMount = false;              me->setActive(true);          } +        void Initialize() +        { +            LowHp = false; +        } +          InstanceScript* instance;          bool LowHp; @@ -451,7 +457,7 @@ public:          void Reset() override          { -            LowHp = false; +            Initialize();              if (HadMount)                  DoMount(); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h index 57b0a1fce85..b8a0909e99e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h @@ -19,6 +19,8 @@  #ifndef DEF_OLD_HILLSBRAD_H  #define DEF_OLD_HILLSBRAD_H +#define DataHeader "OH" +  enum DataTypes  {      TYPE_BARREL_DIVERSION   = 1, diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp index 3e776a0c905..35497b1f9ce 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp @@ -94,6 +94,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              _medivhGUID         = 0;              Clear();          } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp index a1c4f057161..1fa104ada00 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -77,9 +77,19 @@ public:      {          npc_medivh_bmAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            SpellCorrupt_Timer = 0; +            Check_Timer = 0; +            Life75 = true; +            Life50 = true; +            Life25 = true; +        } +          InstanceScript* instance;          uint32 SpellCorrupt_Timer; @@ -91,11 +101,7 @@ public:          void Reset() override          { -            SpellCorrupt_Timer = 0; -            Check_Timer = 0; -            Life75 = true; -            Life50 = true; -            Life25 = true; +            Initialize();              if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)                  DoCast(me, SPELL_CHANNEL, true); @@ -265,23 +271,28 @@ public:      {          npc_time_riftAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            TimeRiftWave_Timer = 15000; +            mRiftWaveCount = 0; +            mWaveId = 0; +        } +          InstanceScript* instance;          uint32 TimeRiftWave_Timer;          uint8 mRiftWaveCount; -        uint8 mPortalCount;          uint8 mWaveId;          void Reset() override          { +            Initialize(); -            TimeRiftWave_Timer = 15000; -            mRiftWaveCount = 0; - -            mPortalCount = instance->GetData(DATA_PORTAL_COUNT); +            uint8 mPortalCount = instance->GetData(DATA_PORTAL_COUNT);              if (mPortalCount < 6)                  mWaveId = 0; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h index 25f10f22907..b236c5eaa6c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h @@ -19,6 +19,8 @@  #ifndef DEF_THEBLACKMORASS_H  #define DEF_THEBLACKMORASS_H +#define DataHeader "TBM" +  uint32 const EncounterCount             = 2;  enum DataTypes diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h index d02d244dfc6..b6387e40687 100644 --- a/src/server/scripts/Kalimdor/Firelands/firelands.h +++ b/src/server/scripts/Kalimdor/Firelands/firelands.h @@ -21,6 +21,7 @@  #include "Map.h"  #include "CreatureAI.h" +#define DataHeader "FL"  #define FirelandsScriptName "instance_firelands"  uint32 const EncounterCount = 7; diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp index f53a749c777..bca31964d24 100644 --- a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp +++ b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp @@ -28,10 +28,7 @@ class instance_firelands : public InstanceMapScript          {              instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map)              { -            } - -            void Initialize() override -            { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);              } diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h index 9c05ed49c05..0359b0fe85a 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -18,6 +18,7 @@  #ifndef HALLS_OF_ORIGINATION_H  #define HALLS_OF_ORIGINATION_H +#define DataHeader "HOO"  #define HoOScriptName "instance_halls_of_origination"  uint32 const EncounterCount = 12; diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp index a8c1c4f6108..3273d3d7850 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -53,6 +53,7 @@ class instance_halls_of_origination : public InstanceMapScript          {              instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  TempleGuardianAnhuurGUID = 0; @@ -211,50 +212,16 @@ class instance_halls_of_origination : public InstanceMapScript                  }              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "H O " << GetBossSaveData() << _deadElementals; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                data << _deadElementals;              } -            void Load(const char* str) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'H' && dataHead2 == 'O') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                    uint32 tmp; -                    loadStream >> tmp; -                    IncreaseDeadElementals(tmp); -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; +                uint32 deadElementals; +                data >> deadElementals; +                IncreaseDeadElementals(deadElementals);              }          protected: diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp index 15330643bd3..b8eb489461c 100644 --- a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp +++ b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp @@ -45,7 +45,17 @@ public:      struct celebras_the_cursedAI : public ScriptedAI      { -        celebras_the_cursedAI(Creature* creature) : ScriptedAI(creature) { } +        celebras_the_cursedAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            WrathTimer = 8000; +            EntanglingRootsTimer = 2000; +            CorruptForcesTimer = 30000; +        }          uint32 WrathTimer;          uint32 EntanglingRootsTimer; @@ -53,9 +63,7 @@ public:          void Reset() override          { -            WrathTimer = 8000; -            EntanglingRootsTimer = 2000; -            CorruptForcesTimer = 30000; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override { } diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp index 12016d2223a..59bcdc89171 100644 --- a/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp +++ b/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp @@ -45,7 +45,17 @@ public:      struct boss_landslideAI : public ScriptedAI      { -        boss_landslideAI(Creature* creature) : ScriptedAI(creature) { } +        boss_landslideAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            KnockAwayTimer = 8000; +            TrampleTimer = 2000; +            LandslideTimer = 0; +        }          uint32 KnockAwayTimer;          uint32 TrampleTimer; @@ -53,9 +63,7 @@ public:          void Reset() override          { -            KnockAwayTimer = 8000; -            TrampleTimer = 2000; -            LandslideTimer = 0; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp index 8c7197b2942..a7aa487db90 100644 --- a/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp +++ b/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp @@ -44,7 +44,19 @@ public:      struct boss_noxxionAI : public ScriptedAI      { -        boss_noxxionAI(Creature* creature) : ScriptedAI(creature) { } +        boss_noxxionAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            ToxicVolleyTimer = 7000; +            UppercutTimer = 16000; +            AddsTimer = 19000; +            InvisibleTimer = 15000;                            //Too much too low? +            Invisible = false; +        }          uint32 ToxicVolleyTimer;          uint32 UppercutTimer; @@ -54,11 +66,7 @@ public:          void Reset() override          { -            ToxicVolleyTimer = 7000; -            UppercutTimer = 16000; -            AddsTimer = 19000; -            InvisibleTimer = 15000;                            //Too much too low? -            Invisible = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override { } diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp index 0d48d8f43c6..a36e8f09d21 100644 --- a/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp +++ b/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp @@ -47,7 +47,18 @@ public:      struct boss_ptheradrasAI : public ScriptedAI      { -        boss_ptheradrasAI(Creature* creature) : ScriptedAI(creature) { } +        boss_ptheradrasAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            DustfieldTimer = 8000; +            BoulderTimer = 2000; +            ThrashTimer = 5000; +            RepulsiveGazeTimer = 23000; +        }          uint32 DustfieldTimer;          uint32 BoulderTimer; @@ -56,10 +67,7 @@ public:          void Reset() override          { -            DustfieldTimer = 8000; -            BoulderTimer = 2000; -            ThrashTimer = 5000; -            RepulsiveGazeTimer = 23000; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override { } diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index f04b5634616..347c87b160b 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -111,6 +111,7 @@ static OnyxMove MoveData[8]=  Position const MiddleRoomLocation = {-23.6155f, -215.357f, -55.7344f, 0.0f};  Position const Phase2Location = {-80.924f, -214.299f, -82.942f, 0.0f}; +Position const Phase2Floating = { -80.924f, -214.299f, -57.942f, 0.0f };  Position const SpawnLocations[3]=  { @@ -128,7 +129,7 @@ public:      struct boss_onyxiaAI : public BossAI      { -        boss_onyxiaAI(Creature* creature) : BossAI(creature, DATA_ONYXIA), Summons(me) +        boss_onyxiaAI(Creature* creature) : BossAI(creature, DATA_ONYXIA)          {              Reset();          } @@ -138,16 +139,16 @@ public:              if (!IsCombatMovementAllowed())                  SetCombatMovement(true); +            _Reset(); +              Phase = PHASE_START;              MovePoint = urand(0, 5);              PointData = GetMoveData(); -            Summons.DespawnAll();              SummonWhelpCount = 0;              IsMoving = false; -            instance->SetBossState(DATA_ONYXIA, NOT_STARTED);              instance->SetData(DATA_ONYXIA_PHASE, Phase); -            instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT,  ACHIEV_TIMED_START_EVENT); +            instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);          }          void EnterCombat(Unit* /*who*/) override @@ -155,20 +156,15 @@ public:              Talk(SAY_AGGRO);              me->SetInCombatWithZone(); -            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->SetBossState(DATA_ONYXIA, IN_PROGRESS); -            instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT,  ACHIEV_TIMED_START_EVENT); -        } +            events.Reset(); -        void JustDied(Unit* /*killer*/) override -        { -            instance->SetBossState(DATA_ONYXIA, DONE); +            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)); -            Summons.DespawnAll(); +            instance->SetBossState(DATA_ONYXIA, IN_PROGRESS); +            instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);          }          void JustSummoned(Creature* summoned) override @@ -186,13 +182,9 @@ public:                      summoned->setActive(true);                      break;              } -            Summons.Summon(summoned); +            summons.Summon(summoned);          } -        void SummonedCreatureDespawn(Creature* summon) override -        { -            Summons.Despawn(summon); -        }          void KilledUnit(Unit* /*victim*/) override          { @@ -231,22 +223,43 @@ public:                          }                          break;                      case 9: -                        me->GetMotionMaster()->MoveChase(me->GetVictim()); -                        events.ScheduleEvent(EVENT_BELLOWING_ROAR, 1000); +                        me->SetCanFly(false); +                        me->SetDisableGravity(false); +                        me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); +                        if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID))) +                            me->Kill(trigger); +                        me->SetReactState(REACT_AGGRESSIVE); +                        // tank selection based on phase one. If tank is not there i take nearest one +                        if (Unit* tank = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_TANK_GUID))) +                            me->GetMotionMaster()->MoveChase(tank); +                        else if (Unit* newtarget = SelectTarget(SELECT_TARGET_NEAREST, 0)) +                            me->GetMotionMaster()->MoveChase(newtarget); +                        events.ScheduleEvent(EVENT_BELLOWING_ROAR, 5000); +                        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(15000, 30000));                          break;                      case 10:                          me->SetCanFly(true); -                        me->GetMotionMaster()->MovePoint(11, Phase2Location.GetPositionX(), Phase2Location.GetPositionY(), Phase2Location.GetPositionZ()+25); +                        me->SetDisableGravity(true); +                        me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); +                        me->SetFacingTo(me->GetOrientation() + float(M_PI)); +                        if (Creature * trigger = me->SummonCreature(NPC_TRIGGER, MiddleRoomLocation, TEMPSUMMON_CORPSE_DESPAWN)) +                            instance->SetData64(DATA_TRIGGER_GUID, trigger->GetGUID()); +                        me->GetMotionMaster()->MoveTakeoff(11, Phase2Floating);                          me->SetSpeed(MOVE_FLIGHT, 1.0f);                          Talk(SAY_PHASE_2_TRANS);                          instance->SetData(DATA_ONYXIA_PHASE, Phase);                          events.ScheduleEvent(EVENT_WHELP_SPAWN, 5000);                          events.ScheduleEvent(EVENT_LAIR_GUARD, 15000); +                        events.ScheduleEvent(EVENT_DEEP_BREATH, 75000); +                        events.ScheduleEvent(EVENT_MOVEMENT, 10000); +                        events.ScheduleEvent(EVENT_FIREBALL, 18000);                          break;                      case 11:                          if (PointData)                              me->GetMotionMaster()->MovePoint(PointData->LocId, PointData->fX, PointData->fY, PointData->fZ); -                        me->GetMotionMaster()->Clear(false);                          me->GetMotionMaster()->MoveIdle();                          break;                      default: @@ -272,13 +285,13 @@ public:                  (Spell->Id >= 22267 && Spell->Id <= 22268)) &&                  (target->GetTypeId() == TYPEID_PLAYER))              { -                    instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL); +                instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL);              }          }          OnyxMove* GetMoveData()          { -            uint8 MaxCount = sizeof(MoveData)/sizeof(OnyxMove); +            uint8 MaxCount = sizeof(MoveData) / sizeof(OnyxMove);              for (uint8 i = 0; i < MaxCount; ++i)              { @@ -291,9 +304,9 @@ public:          void SetNextRandomPoint()          { -            uint8 MaxCount = sizeof(MoveData)/sizeof(OnyxMove); +            uint8 MaxCount = sizeof(MoveData) / sizeof(OnyxMove); -            uint8 iTemp = urand(0, MaxCount-1); +            uint8 iTemp = urand(0, MaxCount - 1);              if (iTemp >= MovePoint)                  ++iTemp; @@ -312,15 +325,13 @@ public:                  //Specific to PHASE_START || PHASE_END                  if (Phase == PHASE_START)                  { -                    if (HealthBelowPct(60)) +                    if (HealthBelowPct(65))                      {                          SetCombatMovement(false);                          Phase = PHASE_BREATH; -                        events.ScheduleEvent(EVENT_DEEP_BREATH, 85000); -                        events.ScheduleEvent(EVENT_MOVEMENT, 14000); -                        events.ScheduleEvent(EVENT_FIREBALL, 15000); -                        events.ScheduleEvent(EVENT_LAIR_GUARD, 60000); -                        events.ScheduleEvent(EVENT_WHELP_SPAWN, 60000); +                        instance->SetData64(DATA_TANK_GUID, me->GetVictim()->GetGUID()); +                        me->SetReactState(REACT_PASSIVE); +                        me->AttackStop();                          me->GetMotionMaster()->MovePoint(10, Phase2Location);                          return;                      } @@ -347,19 +358,19 @@ public:                          }                          case EVENT_FLAME_BREATH:   // Phase PHASE_START and PHASE_END                              DoCastVictim(SPELL_FLAME_BREATH); -                            events.ScheduleEvent(EVENT_FLAME_BREATH, urand (10000, 20000)); +                            events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));                              break;                          case EVENT_TAIL_SWEEP:     // Phase PHASE_START and PHASE_END                              DoCastAOE(SPELL_TAIL_SWEEP); -                            events.ScheduleEvent(EVENT_TAIL_SWEEP, urand (15000, 20000)); +                            events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));                              break;                          case EVENT_CLEAVE:         // Phase PHASE_START and PHASE_END                              DoCastVictim(SPELL_CLEAVE); -                            events.ScheduleEvent(EVENT_CLEAVE, urand (2000, 5000)); +                            events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));                              break;                          case EVENT_WING_BUFFET:    // Phase PHASE_START and PHASE_END                              DoCastVictim(SPELL_WING_BUFFET); -                            events.ScheduleEvent(EVENT_WING_BUFFET, urand (15000, 30000)); +                            events.ScheduleEvent(EVENT_WING_BUFFET, urand(15000, 30000));                              break;                          default:                              break; @@ -374,15 +385,18 @@ public:                      Phase = PHASE_END;                      instance->SetData(DATA_ONYXIA_PHASE, PHASE_END);                      Talk(SAY_PHASE_3_TRANS); -                      SetCombatMovement(true); -                    me->SetCanFly(false);                      IsMoving = false; -                    me->GetMotionMaster()->MovePoint(9, me->GetHomePosition()); +                    Position const pos = me->GetHomePosition(); +                    me->GetMotionMaster()->MovePoint(9, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + 12.0f);                      events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000);                      return;                  } +                if (!me->isMoving()) +                    if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID))) +                        me->SetFacingToObject(trigger); +                  events.Update(diff);                  while (uint32 eventId = events.ExecuteEvent()) @@ -398,8 +412,10 @@ public:                                  Talk(EMOTE_BREATH);                                  if (PointData) /// @todo: In what cases is this null? What should we do?                                      DoCast(me, PointData->SpellId); -                                events.ScheduleEvent(EVENT_DEEP_BREATH, 70000); +                                events.ScheduleEvent(EVENT_DEEP_BREATH, 75000);                              } +                            else +                                events.ScheduleEvent(EVENT_DEEP_BREATH, 1000);                              break;                          case EVENT_MOVEMENT:         // Phase PHASE_BREATH                              if (!IsMoving && !(me->HasUnitState(UNIT_STATE_CASTING))) @@ -414,18 +430,21 @@ public:                                  IsMoving = true;                                  events.ScheduleEvent(EVENT_MOVEMENT, 25000);                              } +                            else +                                events.ScheduleEvent(EVENT_MOVEMENT, 500);                              break;                          case EVENT_FIREBALL:         // Phase PHASE_BREATH -                            if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) +                            if (!IsMoving)                              {                                  if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))                                      DoCast(target, SPELL_FIREBALL); -                                  events.ScheduleEvent(EVENT_FIREBALL, 8000);                              } +                            else +                                events.ScheduleEvent(EVENT_FIREBALL, 1000);                              break;                          case EVENT_LAIR_GUARD:       // Phase PHASE_BREATH -                             me->SummonCreature(NPC_LAIRGUARD, SpawnLocations[2], TEMPSUMMON_CORPSE_DESPAWN); +                            me->SummonCreature(NPC_LAIRGUARD, SpawnLocations[2], TEMPSUMMON_CORPSE_DESPAWN);                              events.ScheduleEvent(EVENT_LAIR_GUARD, 30000);                              break;                          case EVENT_WHELP_SPAWN:      // Phase PHASE_BREATH @@ -437,7 +456,7 @@ public:                                  events.ScheduleEvent(EVENT_WHELP_SPAWN, 90000);                              }                              else -                            events.ScheduleEvent(EVENT_WHELP_SPAWN, 500); +                                events.ScheduleEvent(EVENT_WHELP_SPAWN, 500);                              break;                          default:                              break; @@ -447,7 +466,6 @@ public:          }          private: -            SummonList Summons;              OnyxMove* PointData;              uint8 Phase;              uint8 MovePoint; diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp index e6a08ade87f..61b57d181a3 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp @@ -50,9 +50,12 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              SetBossNumber(EncounterCount);              onyxiaGUID               = 0; +            triggerGUID              = 0; +            tankGUID                 = 0;              onyxiaLiftoffTimer       = 0;              manyWhelpsCounter        = 0;              eruptTimer               = 0; @@ -181,6 +184,12 @@ public:                      FloorEruptionGUIDQueue.push(data);                      eruptTimer = 2500;                      break; +                case DATA_TRIGGER_GUID: +                    triggerGUID = data; +                    break; +                case DATA_TANK_GUID: +                    tankGUID = data; +                    break;              }          } @@ -190,6 +199,13 @@ public:              {                  case NPC_ONYXIA:                      return onyxiaGUID; +                    break; +                case DATA_TRIGGER_GUID: +                    return triggerGUID; +                    break; +                case DATA_TANK_GUID: +                    return tankGUID; +                    break;              }              return 0; @@ -250,59 +266,17 @@ public:              return false;          } -        std::string GetSaveData() override -        { -            OUT_SAVE_INST_DATA; - -            std::ostringstream saveStream; -            saveStream << "O L " << GetBossSaveData(); - -            OUT_SAVE_INST_DATA_COMPLETE; -            return saveStream.str(); -        } - -        void Load(const char* strIn) override -        { -            if (!strIn) -            { -                OUT_LOAD_INST_DATA_FAIL; -                return; -            } - -            OUT_LOAD_INST_DATA(strIn); - -            char dataHead1, dataHead2; - -            std::istringstream loadStream(strIn); -            loadStream >> dataHead1 >> dataHead2; - -            if (dataHead1 == 'O' && dataHead2 == 'L') -            { -                for (uint8 i = 0; i < EncounterCount; ++i) -                { -                    uint32 tmpState; -                    loadStream >> tmpState; -                    if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                        tmpState = NOT_STARTED; - -                    SetBossState(i, EncounterState(tmpState)); -                } -            } -            else -                OUT_LOAD_INST_DATA_FAIL; - -            OUT_LOAD_INST_DATA_COMPLETE; -        } - -        protected: -            std::map<uint64, uint32> FloorEruptionGUID[2]; -            std::queue<uint64> FloorEruptionGUIDQueue; -            uint64 onyxiaGUID; -            uint32 onyxiaLiftoffTimer; -            uint32 manyWhelpsCounter; -            uint32 eruptTimer; -            bool   achievManyWhelpsHandleIt; -            bool   achievSheDeepBreathMore; +    protected: +        std::map<uint64, uint32> FloorEruptionGUID[2]; +        std::queue<uint64> FloorEruptionGUIDQueue; +        uint64 onyxiaGUID; +        uint64 triggerGUID; +        uint64 tankGUID; +        uint32 onyxiaLiftoffTimer; +        uint32 manyWhelpsCounter; +        uint32 eruptTimer; +        bool   achievManyWhelpsHandleIt; +        bool   achievSheDeepBreathMore;      };  }; diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h index cacbd8b2787..0c423f35de6 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h +++ b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h @@ -18,6 +18,8 @@  #ifndef DEF_ONYXIAS_LAIR_H  #define DEF_ONYXIAS_LAIR_H +#define DataHeader "OL" +  uint32 const EncounterCount     = 1;  enum DataTypes @@ -35,7 +37,9 @@ enum Data32  enum Data64  {      DATA_ONYXIA_GUID            = 0, -    DATA_FLOOR_ERUPTION_GUID    = 1 +    DATA_FLOOR_ERUPTION_GUID    = 1, +    DATA_TRIGGER_GUID           = 2, +    DATA_TANK_GUID              = 3  };  enum OnyxiaPhases @@ -49,7 +53,8 @@ enum CreatureIds  {      NPC_WHELP                   = 11262,      NPC_LAIRGUARD               = 36561, -    NPC_ONYXIA                  = 10184 +    NPC_ONYXIA                  = 10184, +    NPC_TRIGGER                 = 14495  };  enum GameObjectIds diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp index e0a30eba2c9..ba7934e18a3 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp @@ -50,14 +50,22 @@ public:      struct boss_amnennar_the_coldbringerAI : public BossAI      { -        boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER) { } +        boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          { -            _Reset();              hp60Spectrals = false;              hp30Spectrals = false; -            hp50          = false; +            hp50 = false; +        } + +        void Reset() override +        { +            _Reset(); +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp index f7f4b035614..ca5e6a9828c 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp @@ -53,6 +53,7 @@ public:      {          instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);              SetBossNumber(EncounterCount);          } @@ -167,62 +168,17 @@ public:                          }                          break;                  } -              } - -        } - -        std::string GetSaveData() override -        { -            OUT_SAVE_INST_DATA; - -            std::ostringstream saveStream; -            saveStream << "R D " << GetBossSaveData(); - -            OUT_SAVE_INST_DATA_COMPLETE; -            return saveStream.str(); -        } - -        void Load(const char* str) override -        { -            if (!str) -            { -                OUT_LOAD_INST_DATA_FAIL; -                return; -            } - -            OUT_LOAD_INST_DATA(str); - -            char dataHead1, dataHead2; - -            std::istringstream loadStream(str); -            loadStream >> dataHead1 >> dataHead2; - -            if (dataHead1 == 'R' && dataHead2 == 'D') -            { -                for (uint32 i = 0; i < EncounterCount; ++i) -                { -                    uint32 tmpState; -                    loadStream >> tmpState; -                    if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                        tmpState = NOT_STARTED; -                    SetBossState(i, EncounterState(tmpState)); -                } -            } -            else -                OUT_LOAD_INST_DATA_FAIL; - -            OUT_LOAD_INST_DATA_COMPLETE;          } -        protected: -            uint64 goGongGUID; -            uint16 gongWave; -            uint8  fiendsKilled; -            uint8  reaversKilled; -            uint8  summonLowRange; -            uint8  summonHighRange; -            uint32 summonCreature; +    protected: +        uint64 goGongGUID; +        uint16 gongWave; +        uint8  fiendsKilled; +        uint8  reaversKilled; +        uint8  summonLowRange; +        uint8  summonHighRange; +        uint32 summonCreature;      };      InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h index a9a5a82f127..d77c48b8af0 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h @@ -19,6 +19,7 @@  #define DEF_RAZORFEN_DOWNS_H  #define RFDScriptName "instance_razorfen_downs" +#define DataHeader "RFD"  uint32 const EncounterCount = 5; diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp index 705b0231e82..6f9ba0afa7b 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp @@ -49,6 +49,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              WardKeeperDeath = 0;              DoorWardGUID = 0;          } diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h index 236d06fee52..6d960d6146d 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h @@ -19,5 +19,7 @@  #ifndef DEF_RAZORFEN_KRAUL_H  #define DEF_RAZORFEN_KRAUL_H +#define DataHeader "RFK" +  #define EVENT_WARD_KEEPER 1  #endif diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp index 162ce9b5359..19cc5316fa4 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp @@ -80,13 +80,19 @@ class boss_ayamiss : public CreatureScript          {              boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS)              { +                Initialize();              } -            void Reset() override +            void Initialize()              { -                _Reset();                  _phase = PHASE_AIR;                  _enraged = false; +            } + +            void Reset() override +            { +                _Reset(); +                Initialize();                  SetCombatMovement(false);              } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp index ac490b1440d..cf6703a01f5 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp @@ -69,6 +69,7 @@ class boss_buru : public CreatureScript          {              boss_buruAI(Creature* creature) : BossAI(creature, DATA_BURU)              { +                _phase = 0;              }              void EnterEvadeMode() override diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp index f0e582dee95..adb6723d2af 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp @@ -53,12 +53,18 @@ class boss_kurinnaxx : public CreatureScript          {              boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX)              { +                Initialize(); +            } + +            void Initialize() +            { +                _enraged = false;              }              void Reset() override              {                  _Reset(); -                _enraged = false; +                Initialize();                  events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000);                  events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000));                  events.ScheduleEvent(EVENT_TRASH, 1000); diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index e123a84f88e..65de64fe6c5 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -60,13 +60,19 @@ class boss_moam : public CreatureScript          {              boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM)              { +                Initialize(); +            } + +            void Initialize() +            { +                _isStonePhase = false;              }              void Reset() override              {                  _Reset();                  me->SetPower(POWER_MANA, 0); -                _isStonePhase = false; +                Initialize();                  events.ScheduleEvent(EVENT_STONE_PHASE, 90000);                  //events.ScheduleEvent(EVENT_WIDE_SLASH, 11000);              } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 256f76337b4..0180bbeddac 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -88,9 +88,17 @@ class boss_ossirian : public CreatureScript          {              boss_ossirianAI(Creature* creature) : BossAI(creature, DATA_OSSIRIAN)              { +                Initialize();                  SaidIntro = false;              } +            void Initialize() +            { +                CrystalIterator = 0; +                TriggerGUID = 0; +                CrystalGUID = 0; +            } +              uint64 TriggerGUID;              uint64 CrystalGUID;              uint8 CrystalIterator; @@ -99,9 +107,7 @@ class boss_ossirian : public CreatureScript              void Reset() override              {                  _Reset(); -                CrystalIterator = 0; -                TriggerGUID = 0; -                CrystalGUID = 0; +                Initialize();              }              void SpellHit(Unit* caster, SpellInfo const* spell) override diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp index 0bb35f3842a..8369c343de4 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp @@ -65,12 +65,18 @@ class boss_rajaxx : public CreatureScript          {              boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX)              { +                Initialize(); +            } + +            void Initialize() +            { +                enraged = false;              }              void Reset() override              {                  _Reset(); -                enraged = false; +                Initialize();                  events.ScheduleEvent(EVENT_DISARM, 10000);                  events.ScheduleEvent(EVENT_THUNDERCRASH, 12000);              } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp index 3da7e5b833f..1b62527dab7 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp @@ -28,6 +28,7 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript          {              instance_ruins_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(NUM_ENCOUNTER);                  _kurinaxxGUID   = 0; @@ -101,49 +102,6 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "R A" << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* data) -            { -                if (!data) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(data); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(data); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'R' && dataHead2 == 'A') -                { -                    for (uint8 i = 0; i < NUM_ENCOUNTER; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          private:              uint64 _kurinaxxGUID;              uint64 _rajaxxGUID; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h index 8d32bd61740..34c678474ec 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h @@ -18,6 +18,8 @@  #ifndef DEF_RUINS_OF_AHNQIRAJ_H  #define DEF_RUINS_OF_AHNQIRAJ_H +#define DataHeader "AQR" +  enum DataTypes  {      DATA_KURINNAXX          = 0, diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 189cb7854ad..be103541989 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -55,9 +55,20 @@ public:      {          boss_kriAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            Cleave_Timer = urand(4000, 8000); +            ToxicVolley_Timer = urand(6000, 12000); +            Check_Timer = 2000; + +            VemDead = false; +            Death = false; +        } +          InstanceScript* instance;          uint32 Cleave_Timer; @@ -69,12 +80,7 @@ public:          void Reset() override          { -            Cleave_Timer = urand(4000, 8000); -            ToxicVolley_Timer = urand(6000, 12000); -            Check_Timer = 2000; - -            VemDead = false; -            Death = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override @@ -148,9 +154,19 @@ public:      {          boss_vemAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            Charge_Timer = urand(15000, 27000); +            KnockBack_Timer = urand(8000, 20000); +            Enrage_Timer = 120000; + +            Enraged = false; +        } +          InstanceScript* instance;          uint32 Charge_Timer; @@ -161,11 +177,7 @@ public:          void Reset() override          { -            Charge_Timer = urand(15000, 27000); -            KnockBack_Timer = urand(8000, 20000); -            Enrage_Timer = 120000; - -            Enraged = false; +            Initialize();          }          void JustDied(Unit* /*killer*/) override @@ -237,9 +249,19 @@ public:      {          boss_yaujAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            Heal_Timer = urand(25000, 40000); +            Fear_Timer = urand(12000, 24000); +            Check_Timer = 2000; + +            VemDead = false; +        } +          InstanceScript* instance;          uint32 Heal_Timer; @@ -250,11 +272,7 @@ public:          void Reset() override          { -            Heal_Timer = urand(25000, 40000); -            Fear_Timer = urand(12000, 24000); -            Check_Timer = 2000; - -            VemDead = false; +            Initialize();          }          void JustDied(Unit* /*killer*/) override diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 2cfd977fe99..c9795133d14 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -160,11 +160,29 @@ public:      {          eye_of_cthunAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              SetCombatMovement(false);          } +        void Initialize() +        { +            //Phase information +            PhaseTimer = 50000;                                 //First dark glare in 50 seconds + +            //Eye beam phase 50 seconds +            BeamTimer = 3000; +            EyeTentacleTimer = 45000;                           //Always spawns 5 seconds before Dark Beam +            ClawTentacleTimer = 12500;                          //4 per Eye beam phase (unsure if they spawn during Dark beam) + +            //Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks) +            DarkGlareTick = 0; +            DarkGlareTickTimer = 1000; +            DarkGlareAngle = 0; +            ClockWise = false; +        } +          InstanceScript* instance;          //Global variables @@ -183,19 +201,7 @@ public:          void Reset() override          { -            //Phase information -            PhaseTimer = 50000;                                 //First dark glare in 50 seconds - -            //Eye beam phase 50 seconds -            BeamTimer = 3000; -            EyeTentacleTimer = 45000;                           //Always spawns 5 seconds before Dark Beam -            ClawTentacleTimer = 12500;                          //4 per Eye beam phase (unsure if they spawn during Dark beam) - -            //Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks) -            DarkGlareTick = 0; -            DarkGlareTickTimer = 1000; -            DarkGlareAngle = 0; -            ClockWise = false; +            Initialize();              //Reset flags              me->RemoveAurasDueToSpell(SPELL_RED_COLORATION); @@ -454,11 +460,34 @@ public:      {          cthunAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              SetCombatMovement(false);              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            //One random wisper every 90 - 300 seconds +            WisperTimer = 90000; + +            //Phase information +            PhaseTimer = 10000;                                 //Emerge in 10 seconds + +            //No hold player for transition +            HoldPlayer = 0; + +            //Body Phase +            EyeTentacleTimer = 30000; +            FleshTentaclesKilled = 0; +            GiantClawTentacleTimer = 15000;                     //15 seconds into body phase (1 min repeat) +            GiantEyeTentacleTimer = 45000;                      //15 seconds into body phase (1 min repeat) +            StomachAcidTimer = 4000;                            //Every 4 seconds +            StomachEnterTimer = 10000;                          //Every 10 seconds +            StomachEnterVisTimer = 0;                           //Always 3.5 seconds after Stomach Enter Timer +            StomachEnterTarget = 0;                             //Target to be teleported to stomach +        } +          InstanceScript* instance;          //Out of combat whisper timer @@ -487,24 +516,7 @@ public:          void Reset() override          { -            //One random wisper every 90 - 300 seconds -            WisperTimer = 90000; - -            //Phase information -            PhaseTimer = 10000;                                 //Emerge in 10 seconds - -            //No hold player for transition -            HoldPlayer = 0; - -            //Body Phase -            EyeTentacleTimer = 30000; -            FleshTentaclesKilled = 0; -            GiantClawTentacleTimer = 15000;                     //15 seconds into body phase (1 min repeat) -            GiantEyeTentacleTimer = 45000;                      //15 seconds into body phase (1 min repeat) -            StomachAcidTimer = 4000;                            //Every 4 seconds -            StomachEnterTimer = 10000;                          //Every 10 seconds -            StomachEnterVisTimer = 0;                           //Always 3.5 seconds after Stomach Enter Timer -            StomachEnterTarget = 0;                             //Target to be teleported to stomach +            Initialize();              //Clear players in stomach and outside              Stomach_Map.clear(); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp index 5947c9860ec..b916f93aef7 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp @@ -53,23 +53,25 @@ public:      struct boss_fankrissAI : public ScriptedAI      { -        boss_fankrissAI(Creature* creature) : ScriptedAI(creature) { } +        boss_fankrissAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            MortalWound_Timer = urand(10000, 15000); +            SpawnHatchlings_Timer = urand(6000, 12000); +            SpawnSpawns_Timer = urand(15000, 45000); +        }          uint32 MortalWound_Timer;          uint32 SpawnHatchlings_Timer;          uint32 SpawnSpawns_Timer; -        int Rand; -        float RandX; -        float RandY; - -        Creature* Hatchling; -        Creature* Spawn;          void Reset() override          { -            MortalWound_Timer = urand(10000, 15000); -            SpawnHatchlings_Timer = urand(6000, 12000); -            SpawnSpawns_Timer = urand(15000, 45000); +            Initialize();          }          void SummonSpawn(Unit* victim) @@ -77,7 +79,10 @@ public:              if (!victim)                  return; -            Rand = 10 + (rand32() % 10); +            int Rand = 10 + (rand32() % 10); +            float RandX = 0.f; +            float RandY = 0.f; +              switch (rand32() % 2)              {                  case 0: RandX = 0.0f - Rand; break; @@ -91,7 +96,7 @@ public:                  case 1: RandY = 0.0f + Rand; break;              }              Rand = 0; -            Spawn = DoSpawnCreature(15630, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); +            Creature* Spawn = DoSpawnCreature(15630, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);              if (Spawn)                  Spawn->AI()->AttackStart(victim);          } @@ -147,6 +152,7 @@ public:                          if (DoGetThreat(target))                              DoModifyThreatPercent(target, -100); +                        Creature* Hatchling = nullptr;                          switch (urand(0, 2))                          {                              case 0: @@ -166,7 +172,7 @@ public:                                  break;                              case 1:                                  DoTeleportPlayer(target, -7990.135354f, 1155.1907f, -78.849319f, 2.608f); -                                Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); +                                Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);                                  if (Hatchling)                                      Hatchling->AI()->AttackStart(target);                                  Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); @@ -181,7 +187,7 @@ public:                                  break;                              case 2:                                  DoTeleportPlayer(target, -8159.7753f, 1127.9064f, -76.868660f, 0.675f); -                                Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); +                                Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);                                  if (Hatchling)                                      Hatchling->AI()->AttackStart(target);                                  Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index 5cc1670d8fb..b5512f29589 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -51,7 +51,23 @@ public:      struct boss_huhuranAI : public ScriptedAI      { -        boss_huhuranAI(Creature* creature) : ScriptedAI(creature) { } +        boss_huhuranAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            Frenzy_Timer = urand(25000, 35000); +            Wyvern_Timer = urand(18000, 28000); +            Spit_Timer = 8000; +            PoisonBolt_Timer = 4000; +            NoxiousPoison_Timer = urand(10000, 20000); +            FrenzyBack_Timer = 15000; + +            Frenzy = false; +            Berserk = false; +        }          uint32 Frenzy_Timer;          uint32 Wyvern_Timer; @@ -65,15 +81,7 @@ public:          void Reset() override          { -            Frenzy_Timer = urand(25000, 35000); -            Wyvern_Timer = urand(18000, 28000); -            Spit_Timer = 8000; -            PoisonBolt_Timer = 4000; -            NoxiousPoison_Timer = urand(10000, 20000); -            FrenzyBack_Timer = 15000; - -            Frenzy = false; -            Berserk = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index 26866de9aa8..092d7ed2a3b 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -48,7 +48,23 @@ public:      struct boss_ouroAI : public ScriptedAI      { -        boss_ouroAI(Creature* creature) : ScriptedAI(creature) { } +        boss_ouroAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            Sweep_Timer = urand(5000, 10000); +            SandBlast_Timer = urand(20000, 35000); +            Submerge_Timer = urand(90000, 150000); +            Back_Timer = urand(30000, 45000); +            ChangeTarget_Timer = urand(5000, 8000); +            Spawn_Timer = urand(10000, 20000); + +            Enrage = false; +            Submerged = false; +        }          uint32 Sweep_Timer;          uint32 SandBlast_Timer; @@ -62,15 +78,7 @@ public:          void Reset() override          { -            Sweep_Timer = urand(5000, 10000); -            SandBlast_Timer = urand(20000, 35000); -            Submerge_Timer = urand(90000, 150000); -            Back_Timer = urand(30000, 45000); -            ChangeTarget_Timer = urand(5000, 8000); -            Spawn_Timer = urand(10000, 20000); - -            Enrage = false; -            Submerged = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp index e9eb9d58ca8..b73a79506a9 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp @@ -53,7 +53,25 @@ public:      struct boss_sarturaAI : public ScriptedAI      { -        boss_sarturaAI(Creature* creature) : ScriptedAI(creature) { } +        boss_sarturaAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            WhirlWind_Timer = 30000; +            WhirlWindRandom_Timer = urand(3000, 7000); +            WhirlWindEnd_Timer = 15000; +            AggroReset_Timer = urand(45000, 55000); +            AggroResetEnd_Timer = 5000; +            EnrageHard_Timer = 10 * 60000; + +            WhirlWind = false; +            AggroReset = false; +            Enraged = false; +            EnragedHard = false; +        }          uint32 WhirlWind_Timer;          uint32 WhirlWindRandom_Timer; @@ -69,18 +87,7 @@ public:          void Reset() override          { -            WhirlWind_Timer = 30000; -            WhirlWindRandom_Timer = urand(3000, 7000); -            WhirlWindEnd_Timer = 15000; -            AggroReset_Timer = urand(45000, 55000); -            AggroResetEnd_Timer = 5000; -            EnrageHard_Timer = 10*60000; - -            WhirlWind = false; -            AggroReset = false; -            Enraged = false; -            EnragedHard = false; - +            Initialize();          }          void EnterCombat(Unit* /*who*/) override @@ -196,7 +203,23 @@ public:      struct npc_sartura_royal_guardAI : public ScriptedAI      { -        npc_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature) { } +        npc_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            WhirlWind_Timer = 30000; +            WhirlWindRandom_Timer = urand(3000, 7000); +            WhirlWindEnd_Timer = 15000; +            AggroReset_Timer = urand(45000, 55000); +            AggroResetEnd_Timer = 5000; +            KnockBack_Timer = 10000; + +            WhirlWind = false; +            AggroReset = false; +        }          uint32 WhirlWind_Timer;          uint32 WhirlWindRandom_Timer; @@ -210,15 +233,7 @@ public:          void Reset() override          { -            WhirlWind_Timer = 30000; -            WhirlWindRandom_Timer = urand(3000, 7000); -            WhirlWindEnd_Timer = 15000; -            AggroReset_Timer = urand(45000, 55000); -            AggroResetEnd_Timer = 5000; -            KnockBack_Timer = 10000; - -            WhirlWind = false; -            AggroReset = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp index 51384cc117d..62de8fbd607 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp @@ -55,12 +55,20 @@ class boss_skeram : public CreatureScript          struct boss_skeramAI : public BossAI          { -            boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) { } +            boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              {                  _flag = 0;                  _hpct = 75.0f; +            } + +            void Reset() override +            { +                Initialize();                  me->SetVisible(true);              } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 3e02406b93d..e65dbacc1f2 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -69,9 +69,24 @@ struct boss_twinemperorsAI : public ScriptedAI  {      boss_twinemperorsAI(Creature* creature): ScriptedAI(creature)      { +        Initialize();          instance = creature->GetInstanceScript();      } +    void Initialize() +    { +        Heal_Timer = 0;                                     // first heal immediately when they get close together +        Teleport_Timer = TELEPORTTIME; +        AfterTeleport = false; +        tspellcast = false; +        AfterTeleportTimer = 0; +        Abuse_Bug_Timer = urand(10000, 17000); +        BugsTimer = 2000; + +        DontYellWhenDead = false; +        EnrageTimer = 15 * 60000; +    } +      InstanceScript* instance;      uint32 Heal_Timer; @@ -89,16 +104,8 @@ struct boss_twinemperorsAI : public ScriptedAI      void TwinReset()      { -        Heal_Timer = 0;                                     // first heal immediately when they get close together -        Teleport_Timer = TELEPORTTIME; -        AfterTeleport = false; -        tspellcast = false; -        AfterTeleportTimer = 0; -        Abuse_Bug_Timer = urand(10000, 17000); -        BugsTimer = 2000; +        Initialize();          me->ClearUnitState(UNIT_STATE_STUNNED); -        DontYellWhenDead = false; -        EnrageTimer = 15*60000;      }      Creature* GetOtherBoss() @@ -394,24 +401,26 @@ public:      struct boss_veknilashAI : public boss_twinemperorsAI      {          bool IAmVeklor() {return false;} -        boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature) { } +        boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            UpperCut_Timer = urand(14000, 29000); +            UnbalancingStrike_Timer = urand(8000, 18000); +            Scarabs_Timer = urand(7000, 14000); +        }          uint32 UpperCut_Timer;          uint32 UnbalancingStrike_Timer;          uint32 Scarabs_Timer; -        int Rand; -        int RandX; -        int RandY; - -        Creature* Summoned;          void Reset() override          {              TwinReset(); -            UpperCut_Timer = urand(14000, 29000); -            UnbalancingStrike_Timer = urand(8000, 18000); -            Scarabs_Timer = urand(7000, 14000); - +            Initialize();                                                                  //Added. Can be removed if its included in DB.              me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);          } @@ -480,25 +489,28 @@ public:      struct boss_veklorAI : public boss_twinemperorsAI      {          bool IAmVeklor() {return true;} -        boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature) { } +        boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            ShadowBolt_Timer = 0; +            Blizzard_Timer = urand(15000, 20000); +            ArcaneBurst_Timer = 1000; +            Scorpions_Timer = urand(7000, 14000); +        }          uint32 ShadowBolt_Timer;          uint32 Blizzard_Timer;          uint32 ArcaneBurst_Timer;          uint32 Scorpions_Timer; -        int Rand; -        int RandX; -        int RandY; - -        Creature* Summoned;          void Reset() override          {              TwinReset(); -            ShadowBolt_Timer = 0; -            Blizzard_Timer = urand(15000, 20000); -            ArcaneBurst_Timer = 1000; -            Scorpions_Timer = urand(7000, 14000); +            Initialize();              //Added. Can be removed if its included in DB.              me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index a9ec3007e5d..7f223f21269 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -91,15 +91,23 @@ class boss_viscidus : public CreatureScript          struct boss_viscidusAI : public BossAI          { -            boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS) { } +            boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              { -                _Reset();                  _hitcounter = 0;                  _phase = PHASE_FROST;              } +            void Reset() override +            { +                _Reset(); +                Initialize(); +            } +              void DamageTaken(Unit* attacker, uint32& /*damage*/) override              {                  if (_phase != PHASE_MELEE) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp index 5780da5e759..e6d9bd86a4d 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp @@ -58,6 +58,7 @@ class instance_temple_of_ahnqiraj : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  IsBossDied[0] = false;                  IsBossDied[1] = false;                  IsBossDied[2] = false; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp index a0d57481c75..b8f6c0ed80e 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp @@ -92,8 +92,15 @@ public:          aqsentinelAI(Creature* creature) : ScriptedAI(creature)          { -            ClearBuddyList(); +            Initialize();              abselected = 0;                                     // just initialization of variable +            ability = 0; +        } + +        void Initialize() +        { +            ClearBuddyList(); +            gatherOthersWhenAggro = true;          }          uint64 NearbyGUID[3]; @@ -183,8 +190,8 @@ public:          void GetOtherSentinels(Unit* who)          { -            bool *chosenAbilities = new bool[9]; -            memset(chosenAbilities, 0, 9*sizeof(bool)); +            bool chosenAbilities[9]; +            memset(chosenAbilities, 0, sizeof(chosenAbilities));              selectAbility(pickAbilityRandom(chosenAbilities));              ClearBuddyList(); @@ -207,8 +214,6 @@ public:                  DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/              SendMyListToBuddies();              CallBuddiesToAttack(who); - -            delete[] chosenAbilities;          }          bool gatherOthersWhenAggro; @@ -228,8 +233,7 @@ public:                      }                  }              } -            ClearBuddyList(); -            gatherOthersWhenAggro = true; +            Initialize();          }          void GainSentinelAbility(uint32 id) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h index fc858ced774..99ce6e738e8 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h @@ -19,6 +19,8 @@  #ifndef DEF_TEMPLE_OF_AHNQIRAJ_H  #define DEF_TEMPLE_OF_AHNQIRAJ_H +#define DataHeader "AQT" +  enum DataTypes  {      DATA_SKERAM             = 1, diff --git a/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp index 9b8397ec6cd..bb2fc8bca20 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp @@ -50,6 +50,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));              yelled = false; diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h index c331d5f43c1..87577f9abaf 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h @@ -19,6 +19,8 @@  #ifndef DEF_WAILING_CAVERNS_H  #define DEF_WAILING_CAVERNS_H +#define DataHeader "WC" +  enum DataTypes  {      TYPE_LORD_COBRAHN         = 1, diff --git a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp index f0035cc921c..4a2425d879f 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp @@ -59,16 +59,24 @@ public:      struct boss_zum_rahAI : public BossAI      { -        boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH) { } +        boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          { -            me->setFaction(ZUMRAH_FRIENDLY_FACTION); // areatrigger sets faction to enemy              _ward80 = false;              _ward40 = false;              _heal30 = false;          } +        void Reset() override +        { +            me->setFaction(ZUMRAH_FRIENDLY_FACTION); // areatrigger sets faction to enemy +            Initialize(); +        } +          void EnterCombat(Unit* /*who*/) override          {              Talk(SAY_SANCT_INVADE); diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp index 8139f45bf46..83f1724130c 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp @@ -126,6 +126,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              GahzRillaEncounter = NOT_STARTED;              ZumrahGUID = 0;              BlyGUID = 0; diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index 7c02ecdb8f2..47d269a00ff 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -104,8 +104,17 @@ public:      {          npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              postGossipStep = 0; +            Text_Timer = 0; +            PlayerGUID = 0; +        } + +        void Initialize() +        { +            ShieldBash_Timer = 5000; +            Revenge_Timer = 8000;          }          InstanceScript* instance; @@ -118,8 +127,7 @@ public:          void Reset() override          { -            ShieldBash_Timer = 5000; -            Revenge_Timer = 8000; +            Initialize();              me->setFaction(FACTION_FRIENDLY);          } diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h index 0d16c1d1ddd..3e742db02c0 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h @@ -5,6 +5,8 @@  #ifndef DEF_ZF_H  #define DEF_ZF_H +#define DataHeader "ZF" +  enum zfEntries  {      ENTRY_ZUM_RAH       = 7271, diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index 2b8dbdaab6c..500739b9404 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -61,13 +61,21 @@ public:      struct npc_torekAI : public npc_escortAI      { -        npc_torekAI(Creature* creature) : npc_escortAI(creature) { } +        npc_torekAI(Creature* creature) : npc_escortAI(creature) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          { -            rend_Timer        = 5000; +            rend_Timer = 5000;              thunderclap_Timer = 8000; -            _completed        = false; +            _completed = false; +        } + +        void Reset() override +        { +            Initialize();          }          void EnterCombat(Unit* /*who*/) override { } @@ -298,15 +306,23 @@ public:      struct npc_muglashAI : public npc_escortAI      { -        npc_muglashAI(Creature* creature) : npc_escortAI(creature) { } +        npc_muglashAI(Creature* creature) : npc_escortAI(creature) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          {              eventTimer = 10000;              waveId = 0;              _isBrazierExtinguished = false;          } +        void Reset() override +        { +            Initialize(); +        } +          void EnterCombat(Unit* /*who*/) override          {              if (Player* player = GetPlayerForEscort()) diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 9d906acb312..7974e1c0347 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -60,7 +60,21 @@ public:      struct npc_draenei_survivorAI : public ScriptedAI      { -        npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature) { } +        npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            pCaster = 0; + +            SayThanksTimer = 0; +            RunAwayTimer = 0; +            SayHelpTimer = 10000; + +            CanSayHelp = true; +        }          uint64 pCaster; @@ -72,13 +86,7 @@ public:          void Reset() override          { -            pCaster = 0; - -            SayThanksTimer = 0; -            RunAwayTimer = 0; -            SayHelpTimer = 10000; - -            CanSayHelp = true; +            Initialize();              DoCast(me, SPELL_IRRIDATION, true); @@ -192,22 +200,28 @@ public:      {          npc_engineer_spark_overgrindAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              NormFaction = creature->getFaction();              NpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); +        } -            if (creature->GetAreaId() == AREA_COVE || creature->GetAreaId() == AREA_ISLE) +        void Initialize() +        { +            DynamiteTimer = 8000; +            EmoteTimer = urand(120000, 150000); + +            if (me->GetAreaId() == AREA_COVE || me->GetAreaId() == AREA_ISLE)                  IsTreeEvent = true; +            else +                IsTreeEvent = false;          }          void Reset() override          { -            DynamiteTimer = 8000; -            EmoteTimer = urand(120000, 150000); +            Initialize();              me->setFaction(NormFaction);              me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags); - -            IsTreeEvent = false;          }          void EnterCombat(Unit* who) override @@ -409,7 +423,18 @@ public:      struct npc_geezleAI : public ScriptedAI      { -        npc_geezleAI(Creature* creature) : ScriptedAI(creature) { } +        npc_geezleAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            SparkGUID = 0; +            Step = 0; +            EventStarted = false; +            SayTimer = 0; +        }          uint64 SparkGUID; @@ -420,8 +445,7 @@ public:          void Reset() override          { -            SparkGUID = 0; -            Step = 0; +            Initialize();              StartEvent();          } @@ -581,15 +605,23 @@ public:      struct npc_death_ravagerAI : public ScriptedAI      { -        npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature){ } +        npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            RendTimer = 30000; +            EnragingBiteTimer = 20000; +        }          uint32 RendTimer;          uint32 EnragingBiteTimer;          void Reset() override          { -            RendTimer = 30000; -            EnragingBiteTimer = 20000; +            Initialize();              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);              me->SetReactState(REACT_PASSIVE); @@ -647,7 +679,16 @@ class npc_stillpine_capitive : public CreatureScript          struct npc_stillpine_capitiveAI : public ScriptedAI          { -            npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature) { } +            npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +            } + +            void Initialize() +            { +                _playerGUID = 0; +                _movementComplete = false; +            }              void Reset() override              { @@ -657,8 +698,7 @@ class npc_stillpine_capitive : public CreatureScript                      cage->SetGoState(GO_STATE_READY);                  }                  _events.Reset(); -                _player = NULL; -                _movementComplete = false; +                Initialize();              }              void StartMoving(Player* owner) @@ -666,7 +706,7 @@ class npc_stillpine_capitive : public CreatureScript                  if (owner)                  {                      Talk(CAPITIVE_SAY, owner); -                    _player = owner; +                    _playerGUID = owner->GetGUID();                  }                  Position pos = me->GetNearPosition(3.0f, 0.0f);                  me->GetMotionMaster()->MovePoint(POINT_INIT, pos); @@ -677,7 +717,7 @@ class npc_stillpine_capitive : public CreatureScript                  if (type != POINT_MOTION_TYPE || id != POINT_INIT)                      return; -                if (_player) +                if (Player* _player = ObjectAccessor::GetPlayer(*me, _playerGUID))                      _player->KilledMonsterCredit(me->GetEntry(), me->GetGUID());                  _movementComplete = true; @@ -696,7 +736,7 @@ class npc_stillpine_capitive : public CreatureScript              }          private: -            Player* _player; +            uint64 _playerGUID;              EventMap _events;              bool _movementComplete;          }; diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index ca4bafdd453..e677bd24e4a 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -50,7 +50,17 @@ public:      struct npc_lazy_peonAI : public ScriptedAI      { -        npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature) { } +        npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            PlayerGUID = 0; +            RebuffTimer = 0; +            work = false; +        }          uint64 PlayerGUID; @@ -59,9 +69,7 @@ public:          void Reset() override          { -            PlayerGUID = 0; -            RebuffTimer = 0; -            work = false; +            Initialize();          }          void MovementInform(uint32 /*type*/, uint32 id) diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp index 23def62047d..0ad44c29b13 100644 --- a/src/server/scripts/Kalimdor/zone_mulgore.cpp +++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp @@ -61,7 +61,19 @@ public:      struct npc_kyle_frenziedAI : public ScriptedAI      { -        npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) { } +        npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            EventActive = false; +            IsMovingToLunch = false; +            PlayerGUID = 0; +            EventTimer = 5000; +            EventPhase = 0; +        }          bool EventActive;          bool IsMovingToLunch; @@ -71,11 +83,7 @@ public:          void Reset() override          { -            EventActive = false; -            IsMovingToLunch = false; -            PlayerGUID = 0; -            EventTimer = 5000; -            EventPhase = 0; +            Initialize();              if (me->GetEntry() == NPC_KYLE_FRIENDLY)                  me->UpdateEntry(NPC_KYLE_FRENZIED); diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 98256006fd3..e6e03d923c9 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -422,7 +422,23 @@ public:      struct npc_anachronos_the_ancientAI : public ScriptedAI      { -        npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature) { } +        npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            AnimationTimer = 1500; +            AnimationCount = 0; +            AnachronosQuestTriggerGUID = 0; +            MerithraGUID = 0; +            ArygosGUID = 0; +            CaelestraszGUID = 0; +            FandralGUID = 0; +            PlayerGUID = 0; +            eventEnd = false; +        }          uint32 AnimationTimer;          uint8 AnimationCount; @@ -437,15 +453,7 @@ public:          void Reset() override          { -            AnimationTimer = 1500; -            AnimationCount = 0; -            AnachronosQuestTriggerGUID = 0; -            MerithraGUID = 0; -            ArygosGUID = 0; -            CaelestraszGUID = 0; -            FandralGUID = 0; -            PlayerGUID = 0; -            eventEnd = false; +            Initialize();              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);          } @@ -750,7 +758,22 @@ public:      struct npc_qiraj_war_spawnAI : public ScriptedAI      { -        npc_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature) { } +        npc_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +            SpellTimer1 = 0; +            SpellTimer2 = 0; +            SpellTimer3 = 0; +            SpellTimer4 = 0; +        } + +        void Initialize() +        { +            MobGUID = 0; +            PlayerGUID = 0; +            Timers = false; +            hasTarget = false; +        }          uint64 MobGUID;          uint64 PlayerGUID; @@ -760,10 +783,7 @@ public:          void Reset() override          { -            MobGUID = 0; -            PlayerGUID = 0; -            Timers = false; -            hasTarget = false; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override { } @@ -863,7 +883,24 @@ public:      struct npc_anachronos_quest_triggerAI : public ScriptedAI      { -        npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature) { } +        npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            PlayerGUID = 0; + +            WaveTimer = 2000; +            AnnounceTimer = 1000; +            LiveCount = 0; +            WaveCount = 0; + +            EventStarted = false; +            Announced = false; +            Failed = false; +        }          uint64 PlayerGUID; @@ -879,16 +916,7 @@ public:          void Reset() override          { -            PlayerGUID = 0; - -            WaveTimer = 2000; -            AnnounceTimer = 1000; -            LiveCount = 0; -            WaveCount = 0; - -            EventStarted = false; -            Announced = false; -            Failed = false; +            Initialize();              me->SetVisible(false);          } diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index af0bfdd982d..6c0151ff931 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -61,7 +61,21 @@ public:      struct npc_aquementasAI : public ScriptedAI      { -        npc_aquementasAI(Creature* creature) : ScriptedAI(creature) { } +        npc_aquementasAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            SendItemTimer = 0; +            SwitchFactionTimer = 10000; + +            isFriendly = true; + +            AquaJetTimer = 5000; +            FrostShockTimer = 1000; +        }          uint32 SendItemTimer;          uint32 SwitchFactionTimer; @@ -72,13 +86,8 @@ public:          void Reset() override          { -            SendItemTimer = 0; -            SwitchFactionTimer = 10000; +            Initialize();              me->setFaction(35); -            isFriendly = true; - -            AquaJetTimer = 5000; -            FrostShockTimer = 1000;          }          void SendItem(Unit* receiver) @@ -458,7 +467,19 @@ public:      struct npc_toogaAI : public FollowerAI      { -        npc_toogaAI(Creature* creature) : FollowerAI(creature) { } +        npc_toogaAI(Creature* creature) : FollowerAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            CheckSpeechTimer = 2500; +            PostEventTimer = 1000; +            PhasePostEvent = 0; + +            TortaGUID = 0; +        }          uint32 CheckSpeechTimer;          uint32 PostEventTimer; @@ -468,11 +489,7 @@ public:          void Reset() override          { -            CheckSpeechTimer = 2500; -            PostEventTimer = 1000; -            PhasePostEvent = 0; - -            TortaGUID = 0; +            Initialize();          }          void MoveInLineOfSight(Unit* who) diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index a8b5428e499..ff507f32bae 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -195,9 +195,17 @@ public:      {          npc_taskmaster_fizzuleAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              factionNorm = creature->getFaction();          } +        void Initialize() +        { +            IsFriend = false; +            ResetTimer = 120000; +            FlareCount = 0; +        } +          uint32 factionNorm;          bool IsFriend;          uint32 ResetTimer; @@ -205,9 +213,7 @@ public:          void Reset() override          { -            IsFriend = false; -            ResetTimer = 120000; -            FlareCount = 0; +            Initialize();              me->setFaction(factionNorm);          } @@ -309,20 +315,12 @@ public:      struct npc_twiggy_flatheadAI : public ScriptedAI      { -        npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature) { } - -        bool EventInProgress; -        bool EventGrate; -        bool EventBigWill; -        bool ChallengerDown[6]; -        uint8 Wave; -        uint32 WaveTimer; -        uint32 ChallengerChecker; -        uint64 PlayerGUID; -        uint64 AffrayChallenger[6]; -        uint64 BigWill; +        npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          {              EventInProgress = false;              EventGrate = false; @@ -340,6 +338,22 @@ public:              BigWill = 0;          } +        bool EventInProgress; +        bool EventGrate; +        bool EventBigWill; +        bool ChallengerDown[6]; +        uint8 Wave; +        uint32 WaveTimer; +        uint32 ChallengerChecker; +        uint64 PlayerGUID; +        uint64 AffrayChallenger[6]; +        uint64 BigWill; + +        void Reset() override +        { +            Initialize(); +        } +          void MoveInLineOfSight(Unit* who) override          {              if (!who || !who->IsAlive() || EventInProgress) diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp index ea76dac829a..1c04a6e32dd 100644 --- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp @@ -55,7 +55,19 @@ public:      struct npc_cairne_bloodhoofAI : public ScriptedAI      { -        npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) { } +        npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            BerserkerChargeTimer = 30000; +            CleaveTimer = 5000; +            MortalStrikeTimer = 10000; +            ThunderclapTimer = 15000; +            UppercutTimer = 10000; +        }          uint32 BerserkerChargeTimer;          uint32 CleaveTimer; @@ -65,11 +77,7 @@ public:          void Reset() override          { -            BerserkerChargeTimer = 30000; -            CleaveTimer = 5000; -            MortalStrikeTimer = 10000; -            ThunderclapTimer = 15000; -            UppercutTimer = 10000; +            Initialize();          }          void EnterCombat(Unit* /*who*/) override { } diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index 11b720ad8d5..58d9b115398 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -317,7 +317,17 @@ public:          npc_ranshallaAI(Creature* creature) : npc_escortAI(creature),              DialogueHelper(introDialogue)          { -            Reset(); +            Initialize(); +            _firstPriestessGUID = 0; +            _secondPriestessGUID = 0; +            _guardEluneGUID = 0; +            _voiceEluneGUID = 0; +            _altarGUID = 0; +        } + +        void Initialize() +        { +            _delayTimer = 0;          }          uint32 _delayTimer; @@ -330,7 +340,7 @@ public:          void Reset() override          { -            _delayTimer = 0; +            Initialize();          }          // Called when the player activates the torch / altar diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h index 3830ba3c8aa..0dc2d68319d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h @@ -19,6 +19,7 @@  #define AHNKAHET_H_  #define AhnKahetScriptName "instance_ahnkahet" +#define DataHeader         "AK"  uint32 const EncounterCount = 5; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp index d4dc5efb6d5..79449723a16 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp @@ -61,15 +61,23 @@ class boss_elder_nadox : public CreatureScript          struct boss_elder_nadoxAI : public BossAI          { -            boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) { } +            boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) +            { +                Initialize(); +            } -            void Reset() override +            void Initialize()              { -                _Reset();                  GuardianSummoned = false;                  GuardianDied = false;              } +            void Reset() override +            { +                _Reset(); +                Initialize(); +            } +              void EnterCombat(Unit* /*who*/) override              {                  _EnterCombat(); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index 4b352b98af2..592d69c5c76 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -63,9 +63,19 @@ public:      {          boss_volazjAI(Creature* creature) : ScriptedAI(creature), Summons(me)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiMindFlayTimer = 8 * IN_MILLISECONDS; +            uiShadowBoltVolleyTimer = 5 * IN_MILLISECONDS; +            uiShiverTimer = 15 * IN_MILLISECONDS; +            // Used for Insanity handling +            insanityHandled = 0; +        } +          InstanceScript* instance;          uint32 uiMindFlayTimer; @@ -152,9 +162,7 @@ public:          void Reset() override          { -            uiMindFlayTimer = 8*IN_MILLISECONDS; -            uiShadowBoltVolleyTimer = 5*IN_MILLISECONDS; -            uiShiverTimer = 15*IN_MILLISECONDS; +            Initialize();              instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED);              instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); @@ -164,9 +172,6 @@ public:              for (uint32 i = 173; i <= 177; ++i)                  me->SetInPhase(i, true, true); -            // Used for Insanity handling -            insanityHandled = 0; -              ResetPlayersPhase();              // Cleanup diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index 905761ce359..7ae8730d57b 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -64,11 +64,27 @@ public:      {          boss_jedoga_shadowseekerAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              bFirstTime = true;              bPreDone = false;          } +        void Initialize() +        { +            uiOpFerTimer = urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); + +            uiCycloneTimer = 3 * IN_MILLISECONDS; +            uiBoltTimer = 7 * IN_MILLISECONDS; +            uiThunderTimer = 12 * IN_MILLISECONDS; + +            bOpFerok = false; +            bOpFerokFail = false; +            bOnGround = false; +            bCanDown = false; +            volunteerWork = true; +        } +          InstanceScript* instance;          uint32 uiOpFerTimer; @@ -86,17 +102,7 @@ public:          void Reset() override          { -            uiOpFerTimer = urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS); - -            uiCycloneTimer = 3*IN_MILLISECONDS; -            uiBoltTimer = 7*IN_MILLISECONDS; -            uiThunderTimer = 12*IN_MILLISECONDS; - -            bOpFerok = false; -            bOpFerokFail = false; -            bOnGround = false; -            bCanDown = false; -            volunteerWork = true; +            Initialize();              if (!bFirstTime)                  instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL); @@ -331,9 +337,16 @@ public:      {          npc_jedoga_initiandAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            bWalking = false; +            bCheckTimer = 2 * IN_MILLISECONDS; +        } +          InstanceScript* instance;          uint32 bCheckTimer; @@ -342,8 +355,7 @@ public:          void Reset() override          { -            bWalking = false; -            bCheckTimer = 2*IN_MILLISECONDS; +            Initialize();              if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)              { diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp index bf7b4355ea6..7c9ed240959 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp @@ -35,6 +35,7 @@ class instance_ahnkahet : public InstanceMapScript          {              instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -258,50 +259,15 @@ class instance_ahnkahet : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "A K " << GetBossSaveData() << SpheresState[0] << ' ' << SpheresState[1]; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                data << SpheresState[0] << ' ' << SpheresState[1];              } -            void Load(char const* str) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'A' && dataHead2 == 'K') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    loadStream >> SpheresState[0]; -                    loadStream >> SpheresState[1]; -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; +                data >> SpheresState[0]; +                data >> SpheresState[1];              }          protected: @@ -317,7 +283,7 @@ class instance_ahnkahet : public InstanceMapScript              std::set<uint64> InitiandGUIDs; -            uint8 SpheresState[2]; +            uint32 SpheresState[2];              uint8 SwitchTrigger;          }; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index 674e5cf36bb..c274b283c1d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -19,6 +19,7 @@  #define AZJOL_NERUB_H_  #define AzjolNerubScriptName "instance_azjol_nerub" +#define DataHeader           "AN"  uint32 const EncounterCount = 3; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index bf5855c3318..49d0840f08a 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -87,7 +87,29 @@ public:      {          boss_anub_arakAI(Creature* creature) : ScriptedAI(creature), Summons(me)          { +            Initialize();              instance = creature->GetInstanceScript(); +            GuardianSummoned = false; +            VenomancerSummoned = false; +            DatterSummoned = false; +            UndergroundTimer = 0; +            VenomancerTimer = 0; +            DatterTimer = 0; +            DelayTimer = 0; +            ImpaleTarget = 0; +        } + +        void Initialize() +        { +            CarrionBeetlesTimer = 8 * IN_MILLISECONDS; +            LeechingSwarmTimer = 20 * IN_MILLISECONDS; +            ImpaleTimer = 9 * IN_MILLISECONDS; +            PoundTimer = 15 * IN_MILLISECONDS; + +            Phase = PHASE_MELEE; +            UndergroundPhase = 0; +            Channeling = false; +            ImpalePhase = IMPALE_PHASE_TARGET;          }          InstanceScript* instance; @@ -101,7 +123,6 @@ public:          uint32 CarrionBeetlesTimer;          uint32 LeechingSwarmTimer;          uint32 PoundTimer; -        uint32 SubmergeTimer;          uint32 UndergroundTimer;          uint32 VenomancerTimer;          uint32 DatterTimer; @@ -115,15 +136,7 @@ public:          void Reset() override          { -            CarrionBeetlesTimer = 8*IN_MILLISECONDS; -            LeechingSwarmTimer = 20*IN_MILLISECONDS; -            ImpaleTimer = 9*IN_MILLISECONDS; -            PoundTimer = 15*IN_MILLISECONDS; - -            Phase = PHASE_MELEE; -            UndergroundPhase = 0; -            Channeling = false; -            ImpalePhase = IMPALE_PHASE_TARGET; +            Initialize();              me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);              me->RemoveAura(SPELL_SUBMERGE); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 10d34be46b6..f8c5c63cf91 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -54,11 +54,22 @@ public:      {          boss_hadronoxAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              fMaxDistance = 50.0f;              bFirstTime = true;          } +        void Initialize() +        { +            uiAcidTimer = urand(10 * IN_MILLISECONDS, 14 * IN_MILLISECONDS); +            uiLeechTimer = urand(3 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); +            uiPierceTimer = urand(1 * IN_MILLISECONDS, 3 * IN_MILLISECONDS); +            uiGrabTimer = urand(15 * IN_MILLISECONDS, 19 * IN_MILLISECONDS); +            uiDoorsTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); +            uiCheckDistanceTimer = 2 * IN_MILLISECONDS; +        } +          InstanceScript* instance;          uint32 uiAcidTimer; @@ -77,12 +88,7 @@ public:              me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 9.0f);              me->SetFloatValue(UNIT_FIELD_COMBATREACH, 9.0f); -            uiAcidTimer = urand(10*IN_MILLISECONDS, 14*IN_MILLISECONDS); -            uiLeechTimer = urand(3*IN_MILLISECONDS, 9*IN_MILLISECONDS); -            uiPierceTimer = urand(1*IN_MILLISECONDS, 3*IN_MILLISECONDS); -            uiGrabTimer = urand(15*IN_MILLISECONDS, 19*IN_MILLISECONDS); -            uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS); -            uiCheckDistanceTimer = 2*IN_MILLISECONDS; +            Initialize();              if (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime)                  instance->SetBossState(DATA_HADRONOX, FAIL); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 106d7e54150..1ae68f5a33e 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -37,6 +37,7 @@ class instance_azjol_nerub : public InstanceMapScript          {              instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -128,49 +129,6 @@ class instance_azjol_nerub : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "A N " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'A' && dataHead2 == 'N') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 KrikthirGUID;              uint64 HadronoxGUID; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 4c3ca322574..77ced6acef1 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -130,14 +130,22 @@ public:      struct boss_sartharionAI : public BossAI      { -        boss_sartharionAI(Creature* creature) : BossAI(creature, DATA_SARTHARION) { } +        boss_sartharionAI(Creature* creature) : BossAI(creature, DATA_SARTHARION) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          { -            _isBerserk     = false; +            _isBerserk = false;              _isSoftEnraged = false;              _isHardEnraged = false; -            drakeCount     = 0; +            drakeCount = 0; +        } + +        void Reset() override +        { +            Initialize();              if (me->HasAura(SPELL_TWILIGHT_REVENGE))                  me->RemoveAurasDueToSpell(SPELL_TWILIGHT_REVENGE); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp index 0d07a9fde50..5e4a31d6b5e 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp @@ -34,6 +34,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              sartharionGUID = 0;              tenebronGUID   = 0;              shadronGUID    = 0; @@ -98,49 +99,6 @@ public:              return 0;          } -        std::string GetSaveData() override -        { -            OUT_SAVE_INST_DATA; - -            std::ostringstream saveStream; -            saveStream << "O S " << GetBossSaveData(); - -            OUT_SAVE_INST_DATA_COMPLETE; -            return saveStream.str(); -        } - -        void Load(const char* str) override -        { -            if (!str) -            { -                OUT_LOAD_INST_DATA_FAIL; -                return; -            } - -            OUT_LOAD_INST_DATA(str); - -            char dataHead1, dataHead2; - -            std::istringstream loadStream(str); -            loadStream >> dataHead1 >> dataHead2; - -            if (dataHead1 == 'O' && dataHead2 == 'S') -            { -                for (uint32 i = 0; i < EncounterCount; ++i) -                { -                    uint32 tmpState; -                    loadStream >> tmpState; -                    if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                        tmpState = NOT_STARTED; -                    SetBossState(i, EncounterState(tmpState)); -                } -            } -            else -                OUT_LOAD_INST_DATA_FAIL; - -            OUT_LOAD_INST_DATA_COMPLETE; -        } -      protected:          uint64 sartharionGUID;          uint64 tenebronGUID; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp index 0a712b69771..58d7c6141b4 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp @@ -161,19 +161,25 @@ struct dummy_dragonAI : public ScriptedAI  {      dummy_dragonAI(Creature* creature) : ScriptedAI(creature)      { +        Initialize();          instance = creature->GetInstanceScript();      } +    void Initialize() +    { +        waypointId = 0; +        portalRespawnTime = 30000; +        _canMoveFree = false; +        _canLoot = true; +    } +      void Reset() override      {          if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))              me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);          events.Reset(); -        waypointId = 0; -        portalRespawnTime = 30000; -        _canMoveFree = false; -        _canLoot = true; +        Initialize();      }      void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h index f26ad3a45ed..341a5686e58 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h @@ -19,6 +19,7 @@  #define OBSIDIAN_SANCTUM_H_  #define OSScriptName "instance_obsidian_sanctum" +#define DataHeader "OS"  uint32 const EncounterCount = 5; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 69605574f86..4e02b3ad2e8 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -15,9 +15,9 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "ObjectMgr.h" -#include "ScriptMgr.h"  #include "ScriptedCreature.h" +#include "ScriptMgr.h" +#include "SpellScript.h"  #include "SpellAuraEffects.h"  #include "ruby_sanctum.h" @@ -73,15 +73,21 @@ class boss_baltharus_the_warborn : public CreatureScript          {              boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN)              { +                Initialize();                  _introDone = false;              } +            void Initialize() +            { +                _cloneCount = RAID_MODE<uint8>(1, 2, 2, 2); +            } +              void Reset() override              {                  _Reset();                  events.SetPhase(PHASE_INTRO);                  events.ScheduleEvent(EVENT_OOC_CHANNEL, 0, 0, PHASE_INTRO); -                _cloneCount = RAID_MODE<uint8>(1, 2, 2, 2); +                Initialize();                  instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetMaxHealth());              } @@ -245,7 +251,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript              void DamageTaken(Unit* /*attacker*/, uint32& damage) override              {                  // Setting DATA_BALTHARUS_SHARED_HEALTH to 0 when killed would bug the boss. -                if (_instance && me->GetHealth() > damage) +                if (me->GetHealth() > damage)                      _instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage);              } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index b5c20e95278..e41ea8de38b 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -204,12 +204,18 @@ class npc_onyx_flamecaller : public CreatureScript          {              npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript())              { +                Initialize();                  npc_escortAI::SetDespawnAtEnd(false);              } -            void Reset() override +            void Initialize()              {                  _lavaGoutCount = 0; +            } + +            void Reset() override +            { +                Initialize();                  me->setActive(true);                  AddWaypoints();                  Start(true, true); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index a6743811b34..833e3e23fe1 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -595,16 +595,22 @@ class npc_halion_controller : public CreatureScript              npc_halion_controllerAI(Creature* creature) : ScriptedAI(creature),                  _instance(creature->GetInstanceScript()), _summons(me)              { +                Initialize();                  me->SetPhaseMask(me->GetPhaseMask() | 0x20, true);              } -            void Reset() override +            void Initialize()              { -                _summons.DespawnAll(); -                _events.Reset();                  _materialCorporealityValue = 5;                  _materialDamageTaken = 0;                  _twilightDamageTaken = 0; +            } + +            void Reset() override +            { +                _summons.DespawnAll(); +                _events.Reset(); +                Initialize();                  DoCast(me, SPELL_CLEAR_DEBUFFS);              } @@ -1207,13 +1213,22 @@ class npc_living_ember : public CreatureScript          struct npc_living_emberAI : public ScriptedAI          { -            npc_living_emberAI(Creature* creature) : ScriptedAI(creature) { } +            npc_living_emberAI(Creature* creature) : ScriptedAI(creature) +            { +                Initialize(); +                _enrageTimer = 0; +            } -            void Reset() override +            void Initialize()              {                  _hasEnraged = false;              } +            void Reset() override +            { +                Initialize(); +            } +              void EnterCombat(Unit* /*who*/) override              {                  _enrageTimer = 20000; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp index 199337b0631..696d8e0f2a3 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp @@ -17,6 +17,7 @@  #include "ScriptMgr.h"  #include "ScriptedCreature.h" +#include "SpellScript.h"  #include "ruby_sanctum.h"  enum Texts diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp index eed8168eff8..be756a8ab36 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp @@ -15,12 +15,13 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "ScriptMgr.h"  #include "InstanceScript.h" -#include "ruby_sanctum.h"  #include "Player.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h"  #include "TemporarySummon.h"  #include "WorldPacket.h" +#include "ruby_sanctum.h"  DoorData const doorData[] =  { @@ -37,6 +38,7 @@ class instance_ruby_sanctum : public InstanceMapScript          {              instance_ruby_sanctum_InstanceMapScript(InstanceMap* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  BaltharusTheWarbornGUID  = 0; @@ -52,6 +54,7 @@ class instance_ruby_sanctum : public InstanceMapScript                  BaltharusSharedHealth    = 0;                  FlameWallsGUID           = 0;                  FlameRingGUID            = 0; +                TwilightFlameRingGUID    = 0;                  memset(ZarithrianSpawnStalkerGUID, 0, 2 * sizeof(uint64));                  memset(BurningTreeGUID, 0, 4 * sizeof(uint64)); @@ -294,17 +297,6 @@ class instance_ruby_sanctum : public InstanceMapScript                  return BaltharusSharedHealth;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "R S " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } -              void FillInitialWorldStates(WorldPacket& data) override              {                  data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50); @@ -312,39 +304,6 @@ class instance_ruby_sanctum : public InstanceMapScript                  data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0);              } -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'R' && dataHead2 == 'S') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 BaltharusTheWarbornGUID;              uint64 GeneralZarithrianGUID; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h index 016d541cec9..055e04a1328 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h @@ -18,12 +18,9 @@  #ifndef RUBY_SANCTUM_H_  #define RUBY_SANCTUM_H_ -#include "SpellScript.h" -#include "Map.h" -#include "Creature.h" -#include "GameObjectAI.h" -  #define RSScriptName "instance_ruby_sanctum" +#define DataHeader "RS" +  uint32 const EncounterCount = 4;  Position const HalionControllerSpawnPos = {3156.037f, 533.2656f, 72.97205f, 0.0f}; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 7e9e351ae9c..f2d2c3e3d5b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -156,11 +156,22 @@ public:      {          boss_eadricAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              creature->SetReactState(REACT_PASSIVE);              creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);          } +        void Initialize() +        { +            uiVenganceTimer = 10000; +            uiRadianceTimer = 16000; +            uiHammerJusticeTimer = 25000; +            uiResetTimer = 5000; + +            bDone = false; +        } +          InstanceScript* instance;          uint32 uiVenganceTimer; @@ -172,12 +183,7 @@ public:          void Reset() override          { -            uiVenganceTimer = 10000; -            uiRadianceTimer = 16000; -            uiHammerJusticeTimer = 25000; -            uiResetTimer = 5000; - -            bDone = false; +            Initialize();          }          void DamageTaken(Unit* /*done_by*/, uint32 &damage) override @@ -260,6 +266,7 @@ public:      {          boss_paletressAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              MemoryGUID = 0; @@ -268,6 +275,18 @@ public:              creature->RestoreFaction();          } +        void Initialize() +        { +            uiHolyFireTimer = urand(9000, 12000); +            uiHolySmiteTimer = urand(5000, 7000); +            uiRenewTimer = urand(2000, 5000); + +            uiResetTimer = 7000; + +            bHealth = false; +            bDone = false; +        } +          InstanceScript* instance;          uint64 MemoryGUID; @@ -283,14 +302,7 @@ public:          {              me->RemoveAllAuras(); -            uiHolyFireTimer     = urand(9000, 12000); -            uiHolySmiteTimer    = urand(5000, 7000); -            uiRenewTimer        = urand(2000, 5000); - -            uiResetTimer        = 7000; - -            bHealth = false; -            bDone = false; +            Initialize();              if (Creature* pMemory = ObjectAccessor::GetCreature(*me, MemoryGUID))                  if (pMemory->IsAlive()) @@ -415,7 +427,17 @@ public:      struct npc_memoryAI : public ScriptedAI      { -        npc_memoryAI(Creature* creature) : ScriptedAI(creature) { } +        npc_memoryAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            uiOldWoundsTimer = 12000; +            uiShadowPastTimer = 5000; +            uiWakingNightmare = 7000; +        }          uint32 uiOldWoundsTimer;          uint32 uiShadowPastTimer; @@ -423,9 +445,7 @@ public:          void Reset() override          { -            uiOldWoundsTimer = 12000; -            uiShadowPastTimer = 5000; -            uiWakingNightmare = 7000; +            Initialize();          }          void UpdateAI(uint32 uiDiff) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index a8aff70b034..e342b3bbfb1 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -83,9 +83,31 @@ public:      {          boss_black_knightAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            bEventInProgress = false; +            bEvent = false; +            bSummonArmy = false; +            bDeathArmyDone = false; + +            uiPhase = PHASE_UNDEAD; + +            uiIcyTouchTimer = urand(5000, 9000); +            uiPlagueStrikeTimer = urand(10000, 13000); +            uiDeathRespiteTimer = urand(15000, 16000); +            uiObliterateTimer = urand(17000, 19000); +            uiDesecration = urand(15000, 16000); +            uiDeathArmyCheckTimer = 7000; +            uiResurrectTimer = 4000; +            uiGhoulExplodeTimer = 8000; +            uiDeathBiteTimer = urand(2000, 4000); +            uiMarkedDeathTimer = urand(5000, 7000); +        } +          InstanceScript* instance;          std::list<uint64> SummonList; @@ -114,23 +136,7 @@ public:              me->SetDisplayId(me->GetNativeDisplayId());              me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED); -            bEventInProgress = false; -            bEvent = false; -            bSummonArmy = false; -            bDeathArmyDone = false; - -            uiPhase = PHASE_UNDEAD; - -            uiIcyTouchTimer = urand(5000, 9000); -            uiPlagueStrikeTimer = urand(10000, 13000); -            uiDeathRespiteTimer = urand(15000, 16000); -            uiObliterateTimer = urand(17000, 19000); -            uiDesecration = urand(15000, 16000); -            uiDeathArmyCheckTimer = 7000; -            uiResurrectTimer = 4000; -            uiGhoulExplodeTimer = 8000; -            uiDeathBiteTimer = urand(2000, 4000); -            uiMarkedDeathTimer = urand(5000, 7000); +            Initialize();          }          void RemoveSummons() @@ -310,13 +316,21 @@ public:      struct npc_risen_ghoulAI : public ScriptedAI      { -        npc_risen_ghoulAI(Creature* creature) : ScriptedAI(creature) { } +        npc_risen_ghoulAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } + +        void Initialize() +        { +            uiAttackTimer = 3500; +        }          uint32 uiAttackTimer;          void Reset() override          { -            uiAttackTimer = 3500; +            Initialize();          }          void UpdateAI(uint32 uiDiff) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 23753278e27..a0cb4ca6d6f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -155,12 +155,20 @@ public:      {          generic_vehicleAI_toc5AI(Creature* creature) : npc_escortAI(creature)          { +            Initialize();              SetDespawnAtEnd(false);              uiWaypointPath = 0;              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiChargeTimer = 5000; +            uiShieldBreakerTimer = 8000; +            uiBuffTimer = urand(30000, 60000); +        } +          InstanceScript* instance;          uint32 uiChargeTimer; @@ -171,9 +179,7 @@ public:          void Reset() override          { -            uiChargeTimer = 5000; -            uiShieldBreakerTimer = 8000; -            uiBuffTimer = urand(30000, 60000); +            Initialize();          }          void SetData(uint32 uiType, uint32 /*uiData*/) override @@ -311,6 +317,7 @@ public:      {          boss_warrior_toc5AI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              bDone = false; @@ -324,6 +331,13 @@ public:              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);          } +        void Initialize() +        { +            uiBladeStormTimer = urand(15000, 20000); +            uiInterceptTimer = 7000; +            uiMortalStrikeTimer = urand(8000, 12000); +        } +          InstanceScript* instance;          uint8 uiPhase; @@ -339,9 +353,7 @@ public:          void Reset() override          { -            uiBladeStormTimer = urand(15000, 20000); -            uiInterceptTimer  = 7000; -            uiMortalStrikeTimer = urand(8000, 12000); +            Initialize();          }          void JustReachedHome() override @@ -443,6 +455,7 @@ public:      {          boss_mage_toc5AI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              bDone = false; @@ -456,6 +469,14 @@ public:              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);          } +        void Initialize() +        { +            uiFireBallTimer = 5000; +            uiPolymorphTimer = 8000; +            uiBlastWaveTimer = 12000; +            uiHasteTimer = 22000; +        } +          InstanceScript* instance;          uint8 uiPhase; @@ -471,10 +492,7 @@ public:          void Reset() override          { -            uiFireBallTimer = 5000; -            uiPolymorphTimer  = 8000; -            uiBlastWaveTimer = 12000; -            uiHasteTimer = 22000; +            Initialize();          }          void JustReachedHome() override @@ -580,6 +598,7 @@ public:      {          boss_shaman_toc5AI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              bDone = false; @@ -593,6 +612,14 @@ public:              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);          } +        void Initialize() +        { +            uiChainLightningTimer = 16000; +            uiHealingWaveTimer = 12000; +            uiEartShieldTimer = urand(30000, 35000); +            uiHexMendingTimer = urand(20000, 25000); +        } +          InstanceScript* instance;          uint8 uiPhase; @@ -608,10 +635,7 @@ public:          void Reset() override          { -            uiChainLightningTimer = 16000; -            uiHealingWaveTimer = 12000; -            uiEartShieldTimer = urand(30000, 35000); -            uiHexMendingTimer = urand(20000, 25000); +            Initialize();          }          void EnterCombat(Unit* who) override @@ -725,6 +749,7 @@ public:      {          boss_hunter_toc5AI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              bDone = false; @@ -738,6 +763,17 @@ public:              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);          } +        void Initialize() +        { +            uiShootTimer = 12000; +            uiMultiShotTimer = 0; +            uiLightningArrowsTimer = 7000; + +            uiTargetGUID = 0; + +            bShoot = false; +        } +          InstanceScript* instance;          uint8 uiPhase; @@ -755,13 +791,7 @@ public:          void Reset() override          { -            uiShootTimer = 12000; -            uiMultiShotTimer = 0; -            uiLightningArrowsTimer = 7000; - -            uiTargetGUID = 0; - -            bShoot = false; +            Initialize();          }          void JustReachedHome() override @@ -879,6 +909,7 @@ public:      {          boss_rouge_toc5AI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();              bDone = false; @@ -892,6 +923,13 @@ public:              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);          } +        void Initialize() +        { +            uiEviscerateTimer = 8000; +            uiFanKivesTimer = 14000; +            uiPosionBottleTimer = 19000; +        } +          InstanceScript* instance;          uint8 uiPhase; @@ -905,9 +943,7 @@ public:          void Reset() override          { -            uiEviscerateTimer = 8000; -            uiFanKivesTimer   = 14000; -            uiPosionBottleTimer = 19000; +            Initialize();          }          void JustReachedHome() override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp index 5209e8b2f94..021947db0f7 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp @@ -68,6 +68,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              uiMovementDone = 0;              uiGrandChampionsDeaths = 0;              uiArgentSoldierDeaths = 0; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index e0930a1ae2e..e073d08ef1d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -115,8 +115,6 @@ public:          uint64 uiVehicle2GUID;          uint64 uiVehicle3GUID; -        uint64 uiGrandChampionBoss1; -          std::list<uint64> Champion1List;          std::list<uint64> Champion2List;          std::list<uint64> Champion3List; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h index 2b69fcbcc08..4e3979dd0f9 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h @@ -19,6 +19,8 @@  #ifndef DEF_TOC_H  #define DEF_TOC_H +#define DataHeader "TC" +  enum Data  {      BOSS_GRAND_CHAMPIONS, diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 7af55ec37ea..2f29e03a2f2 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -166,6 +166,13 @@ class boss_anubarak_trial : public CreatureScript          {              boss_anubarak_trialAI(Creature* creature) : BossAI(creature, BOSS_ANUBARAK)              { +                Initialize(); +            } + +            void Initialize() +            { +                _intro = true; +                _reachedPhase3 = false;              }              void Reset() override @@ -183,8 +190,7 @@ class boss_anubarak_trial : public CreatureScript                  if (!IsHeroic())                      events.ScheduleEvent(EVENT_SUMMON_FROST_SPHERE, 20*IN_MILLISECONDS); -                _intro = true; -                _reachedPhase3 = false; +                Initialize();                  me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);                  // clean up spawned Frost Spheres                  std::list<Creature*> FrostSphereList; @@ -436,13 +442,19 @@ class npc_swarm_scarab : public CreatureScript          {              npc_swarm_scarabAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  _instance = creature->GetInstanceScript();              } +            void Initialize() +            { +                _determinationTimer = urand(5 * IN_MILLISECONDS, 60 * IN_MILLISECONDS); +            } +              void Reset() override              {                  me->SetCorpseDelay(0); -                _determinationTimer = urand(5*IN_MILLISECONDS, 60*IN_MILLISECONDS); +                Initialize();                  DoCast(me, SPELL_ACID_MANDIBLE);                  me->SetInCombatWithZone();                  if (me->IsInCombat()) @@ -508,13 +520,19 @@ class npc_nerubian_burrower : public CreatureScript          {              npc_nerubian_burrowerAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  _instance = creature->GetInstanceScript();              } +            void Initialize() +            { +                _submergeTimer = 30 * IN_MILLISECONDS; +            } +              void Reset() override              {                  me->SetCorpseDelay(10); -                _submergeTimer = 30*IN_MILLISECONDS; +                Initialize();                  DoCast(me, SPELL_EXPOSE_WEAKNESS);                  DoCast(me, SPELL_SPIDER_FRENZY);                  DoCast(me, SPELL_AWAKENED); @@ -669,12 +687,18 @@ class npc_anubarak_spike : public CreatureScript          {              npc_anubarak_spikeAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();              } -            void Reset() override +            void Initialize()              {                  _phase = PHASE_NO_MOVEMENT;                  _phaseSwitchTimer = 1; +            } + +            void Reset() override +            { +                Initialize();                  // make sure the spike has everyone on threat list                  me->SetInCombatWithZone();              } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 0a43c01081f..3d59f24b6dd 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -348,10 +348,11 @@ class boss_toc_champion_controller : public CreatureScript          {              boss_toc_champion_controllerAI(Creature* creature) : ScriptedAI(creature), _summons(me)              { +                Initialize();                  _instance = creature->GetInstanceScript();              } -            void Reset() override +            void Initialize()              {                  _championsNotStarted = 0;                  _championsFailed = 0; @@ -359,6 +360,11 @@ class boss_toc_champion_controller : public CreatureScript                  _inProgress = false;              } +            void Reset() override +            { +                Initialize(); +            } +              std::vector<uint32> SelectChampions(Team playerTeam)              {                  std::vector<uint32> vHealersEntries; @@ -1908,7 +1914,17 @@ class npc_toc_enh_shaman : public CreatureScript          struct npc_toc_enh_shamanAI : public boss_faction_championsAI          { -            npc_toc_enh_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { } +            npc_toc_enh_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) +            { +                Initialize(); +            } + +            void Initialize() +            { +                _totemCount = 0; +                _totemOldCenterX = me->GetPositionX(); +                _totemOldCenterY = me->GetPositionY(); +            }              void Reset() override              { @@ -1920,9 +1936,7 @@ class npc_toc_enh_shaman : public CreatureScript                  events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1*IN_MILLISECONDS);                  events.ScheduleEvent(EVENT_WINDFURY, urand(20*IN_MILLISECONDS, 50*IN_MILLISECONDS)); -                _totemCount = 0; -                _totemOldCenterX = me->GetPositionX(); -                _totemOldCenterY = me->GetPositionY(); +                Initialize();                  SetEquipmentSlots(false, 51803, 48013, EQUIP_NO_CHANGE);                  summons.DespawnAll();              } @@ -2192,12 +2206,20 @@ class npc_toc_pet_hunter : public CreatureScript          struct npc_toc_pet_hunterAI : public boss_faction_championsAI          { -            npc_toc_pet_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) { } +            npc_toc_pet_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) +            { +                Initialize(); +            } + +            void Initialize() +            { +                _clawTimer = urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS); +            }              void Reset() override              {                  boss_faction_championsAI::Reset(); -                _clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS); +                Initialize();              }              void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index c0f7b2f1856..a8a370076a8 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -315,12 +315,18 @@ class npc_fel_infernal : public CreatureScript          {              npc_fel_infernalAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  _instance = creature->GetInstanceScript();              } +            void Initialize() +            { +                _felStreakTimer = 30 * IN_MILLISECONDS; +            } +              void Reset() override              { -                _felStreakTimer = 30*IN_MILLISECONDS; +                Initialize();                  me->SetInCombatWithZone();              } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 9e75bef9735..f4112b7a43b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -492,6 +492,18 @@ struct boss_jormungarAI : public BossAI  {      boss_jormungarAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)      { +        OtherWormEntry = 0; +        ModelStationary = 0; +        ModelMobile = 0; + +        BiteSpell = 0; +        SpewSpell = 0; +        SpitSpell = 0; +        SpraySpell = 0; + +        Phase = PHASE_MOBILE; +        Enraged = false; +        WasMobile = false;      }      void Reset() override @@ -780,12 +792,18 @@ class npc_slime_pool : public CreatureScript          {              npc_slime_poolAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  _instance = creature->GetInstanceScript();              } -            void Reset() override +            void Initialize()              {                  _cast = false; +            } + +            void Reset() override +            { +                Initialize();                  me->SetReactState(REACT_PASSIVE);              } @@ -851,14 +869,11 @@ class boss_icehowl : public CreatureScript          {              boss_icehowlAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)              { +                Initialize();              } -            void Reset() override +            void Initialize()              { -                events.ScheduleEvent(EVENT_FEROCIOUS_BUTT, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS)); -                events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS)); -                events.ScheduleEvent(EVENT_WHIRL, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS)); -                events.ScheduleEvent(EVENT_MASSIVE_CRASH, 30*IN_MILLISECONDS);                  _movementStarted = false;                  _movementFinish = false;                  _trampleCast = false; @@ -869,6 +884,15 @@ class boss_icehowl : public CreatureScript                  _stage = 0;              } +            void Reset() override +            { +                events.ScheduleEvent(EVENT_FEROCIOUS_BUTT, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS)); +                events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS)); +                events.ScheduleEvent(EVENT_WHIRL, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS)); +                events.ScheduleEvent(EVENT_MASSIVE_CRASH, 30*IN_MILLISECONDS); +                Initialize(); +            } +              void JustDied(Unit* /*killer*/) override              {                  _JustDied(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 68de65f9f7b..1118c1ec27b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -143,6 +143,33 @@ struct boss_twin_baseAI : public BossAI  {      boss_twin_baseAI(Creature* creature) : BossAI(creature, BOSS_VALKIRIES)      { +        Initialize(); +        AuraState = AURA_STATE_NONE; + +        Stage = 0; + +        Weapon = 0; + +        VortexEmote = 0; +        SisterNpcId = 0; +        MyEmphatySpellId = 0; +        OtherEssenceSpellId = 0; +        SurgeSpellId = 0; +        VortexSpellId = 0; +        ShieldSpellId = 0; +        TwinPactSpellId = 0; +        SpikeSpellId = 0; +        TouchSpellId = 0; +    } + +    void Initialize() +    { +        IsBerserk = false; + +        SpecialAbilityTimer = 1 * MINUTE*IN_MILLISECONDS; +        SpikeTimer = 20 * IN_MILLISECONDS; +        TouchTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); +        BerserkTimer = IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS;      }      void Reset() override @@ -153,12 +180,7 @@ struct boss_twin_baseAI : public BossAI          /* Uncomment this once that they are floating above the ground          me->SetLevitate(true);          me->SetFlying(true); */ -        IsBerserk = false; - -        SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS; -        SpikeTimer = 20*IN_MILLISECONDS; -        TouchTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS); -        BerserkTimer = IsHeroic() ? 6*MINUTE*IN_MILLISECONDS : 10*MINUTE*IN_MILLISECONDS; +        Initialize();          summons.DespawnAll();      } @@ -524,6 +546,12 @@ struct npc_unleashed_ballAI : public ScriptedAI  {      npc_unleashed_ballAI(Creature* creature) : ScriptedAI(creature)      { +        Initialize(); +    } + +    void Initialize() +    { +        RangeCheckTimer = 0.5*IN_MILLISECONDS;      }      void MoveToNextPoint() @@ -548,7 +576,7 @@ struct npc_unleashed_ballAI : public ScriptedAI          me->SetCanFly(true);          SetCombatMovement(false);          MoveToNextPoint(); -        RangeCheckTimer = 0.5*IN_MILLISECONDS; +        Initialize();      }      void MovementInform(uint32 uiType, uint32 uiId) override 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 7cab84ee4a7..3b919a778b3 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 @@ -33,6 +33,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  SetBossNumber(MAX_ENCOUNTERS);                  TrialCounter = 50;                  EventStage = 0; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 11548ba4b1c..7829d1be627 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -240,7 +240,6 @@ class boss_lich_king_toc : public CreatureScript              void Reset() override              { -                _updateTimer = 0;                  me->SetReactState(REACT_PASSIVE);                  if (Creature* summoned = me->SummonCreature(NPC_TRIGGER, ToCCommonLoc[2].GetPositionX(), ToCCommonLoc[2].GetPositionY(), ToCCommonLoc[2].GetPositionZ(), 5, TEMPSUMMON_TIMED_DESPAWN, 1*MINUTE*IN_MILLISECONDS))                  { @@ -278,7 +277,7 @@ class boss_lich_king_toc : public CreatureScript                  if (_instance->GetData(TYPE_EVENT_NPC) != NPC_LICH_KING)                      return; -                _updateTimer = _instance->GetData(TYPE_EVENT_TIMER); +                uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);                  if (_updateTimer <= uiDiff)                  {                      switch (_instance->GetData(TYPE_EVENT)) @@ -352,7 +351,6 @@ class boss_lich_king_toc : public CreatureScript              private:                  InstanceScript* _instance; -                uint32 _updateTimer;          };          CreatureAI* GetAI(Creature* creature) const override @@ -370,7 +368,14 @@ class npc_fizzlebang_toc : public CreatureScript          {              npc_fizzlebang_tocAI(Creature* creature) : ScriptedAI(creature), _summons(me)              { +                Initialize();                  _instance = me->GetInstanceScript(); +                _triggerGUID = 0; +            } + +            void Initialize() +            { +                _portalGUID = 0;              }              void JustDied(Unit* killer) override @@ -388,7 +393,7 @@ class npc_fizzlebang_toc : public CreatureScript              void Reset() override              {                  me->SetWalk(true); -                _portalGUID = 0; +                Initialize();                  me->GetMotionMaster()->MovePoint(1, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY()-60, ToCCommonLoc[10].GetPositionZ());              } @@ -423,7 +428,7 @@ class npc_fizzlebang_toc : public CreatureScript                  if (_instance->GetData(TYPE_EVENT_NPC) != NPC_FIZZLEBANG)                      return; -                _updateTimer = _instance->GetData(TYPE_EVENT_TIMER); +                uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);                  if (_updateTimer <= uiDiff)                  {                      switch (_instance->GetData(TYPE_EVENT)) @@ -521,7 +526,6 @@ class npc_fizzlebang_toc : public CreatureScript              private:                  InstanceScript* _instance;                  SummonList _summons; -                uint32 _updateTimer;                  uint64 _portalGUID;                  uint64 _triggerGUID;          }; @@ -556,7 +560,7 @@ class npc_tirion_toc : public CreatureScript                  if (_instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION)                      return; -                _updateTimer = _instance->GetData(TYPE_EVENT_TIMER); +                uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);                  if (_updateTimer <= uiDiff)                  {                      switch (_instance->GetData(TYPE_EVENT)) @@ -811,7 +815,6 @@ class npc_tirion_toc : public CreatureScript              }              private:                  InstanceScript* _instance; -                uint32 _updateTimer;          };          CreatureAI* GetAI(Creature* creature) const override @@ -844,7 +847,7 @@ class npc_garrosh_toc : public CreatureScript                  if (_instance->GetData(TYPE_EVENT_NPC) != NPC_GARROSH)                      return; -                _updateTimer = _instance->GetData(TYPE_EVENT_TIMER); +                uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);                  if (_updateTimer <= uiDiff)                  {                      switch (_instance->GetData(TYPE_EVENT)) @@ -895,7 +898,6 @@ class npc_garrosh_toc : public CreatureScript              }              private:                  InstanceScript* _instance; -                uint32 _updateTimer;          };          CreatureAI* GetAI(Creature* creature) const override @@ -928,7 +930,7 @@ class npc_varian_toc : public CreatureScript                  if (_instance->GetData(TYPE_EVENT_NPC) != NPC_VARIAN)                      return; -                _updateTimer = _instance->GetData(TYPE_EVENT_TIMER); +                uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);                  if (_updateTimer <= uiDiff)                  {                      switch (_instance->GetData(TYPE_EVENT)) @@ -979,7 +981,6 @@ class npc_varian_toc : public CreatureScript              }              private:                  InstanceScript* _instance; -                uint32 _updateTimer;          };          CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index dc0f390f8e0..cf08fb75228 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -5,6 +5,8 @@  #ifndef DEF_CRUSADER_H  #define DEF_CRUSADER_H +#define DataHeader "TCR" +  enum DataTypes  {      BOSS_BEASTS                 = 0, diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp index a1690598532..694e502e508 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp @@ -58,10 +58,19 @@ class boss_king_dred : public CreatureScript          struct boss_king_dredAI : public BossAI          { -            boss_king_dredAI(Creature* creature) : BossAI(creature, DATA_KING_DRED) { } +            boss_king_dredAI(Creature* creature) : BossAI(creature, DATA_KING_DRED) +            { +                Initialize(); +            } + +            void Initialize() +            { +                raptorsKilled = 0; +            }              void Reset() override              { +                Initialize();                  _Reset();              } @@ -166,16 +175,22 @@ class npc_drakkari_gutripper : public CreatureScript          {              npc_drakkari_gutripperAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  instance = me->GetInstanceScript();              } +            void Initialize() +            { +                GutRipTimer = urand(10000, 15000); +            } +              InstanceScript* instance;              uint32 GutRipTimer;              void Reset() override              { -                GutRipTimer = urand(10000, 15000); +                Initialize();              }              void UpdateAI(uint32 diff) override @@ -216,16 +231,22 @@ class npc_drakkari_scytheclaw : public CreatureScript          {              npc_drakkari_scytheclawAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  instance = me->GetInstanceScript();              } +            void Initialize() +            { +                uiRendTimer = urand(10000, 15000); +            } +              InstanceScript* instance;              uint32 uiRendTimer;              void Reset() override              { -                uiRendTimer = urand(10000, 15000); +                Initialize();              }              void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 4e9462a447f..6b26143745b 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -80,14 +80,23 @@ public:      struct boss_novosAI : public BossAI      { -        boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) { } +        boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) +        { +            Initialize(); +            _bubbled = false; +        } + +        void Initialize() +        { +            _ohNovos = true; +            _crystalHandlerCount = 0; +        }          void Reset() override          {              _Reset(); -            _ohNovos = true; -            _crystalHandlerCount = 0; +            Initialize();              SetCrystalsStatus(false);              SetSummonerStatus(false);              SetBubbled(false); @@ -280,15 +289,23 @@ public:      struct npc_crystal_channel_targetAI : public ScriptedAI      { -        npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature) { } +        npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature) +        { +            Initialize(); +        } -        void Reset() override +        void Initialize()          {              _spell = 0;              _timer = 0;              _temp = 0;          } +        void Reset() override +        { +            Initialize(); +        } +          void UpdateAI(uint32 diff) override          {              if (_spell) diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index 13d968d9e06..a8f083c97ee 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -73,12 +73,20 @@ class boss_trollgore : public CreatureScript          struct boss_trollgoreAI : public BossAI          { -            boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) { } +            boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) +            { +                Initialize(); +            } + +            void Initialize() +            { +                _consumptionJunction = true; +            }              void Reset() override              {                  _Reset(); -                _consumptionJunction = true; +                Initialize();              }              void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h index b5e7be25d73..fd260e2c5ba 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h +++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h @@ -19,6 +19,7 @@  #define DRAK_THARON_KEEP_H_  #define DrakTharonKeepScriptName "instance_drak_tharon_keep" +#define DataHeader               "DTK"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index d7c21991ca0..30b473b6ebc 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -29,6 +29,7 @@ class instance_drak_tharon_keep : public InstanceMapScript          {              instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  TrollgoreGUID       = 0; @@ -159,49 +160,6 @@ class instance_drak_tharon_keep : public InstanceMapScript                          novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "D K " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'D' && dataHead2 == 'K') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 TrollgoreGUID;              uint64 NovosGUID; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index fe98f005bca..670591a058c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -71,14 +71,6 @@ class boss_bronjahm : public CreatureScript                  DoCast(me, SPELL_SOULSTORM_CHANNEL, true);              } -            void InitializeAI() override -            { -                if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(FoSScriptName)) -                    me->IsAIEnabled = false; -                else if (!me->isDead()) -                    Reset(); -            } -              void Reset() override              {                  events.Reset(); @@ -188,7 +180,7 @@ class boss_bronjahm : public CreatureScript          CreatureAI* GetAI(Creature* creature) const override          { -            return GetInstanceAI<boss_bronjahmAI>(creature); +            return GetInstanceAI<boss_bronjahmAI>(creature, FoSScriptName);          }  }; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index a048abd6554..4b4fd398e72 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -130,14 +130,15 @@ class boss_devourer_of_souls : public CreatureScript          {              boss_devourer_of_soulsAI(Creature* creature) : BossAI(creature, DATA_DEVOURER_EVENT)              { +                Initialize(); +                beamAngle = 0.f; +                beamAngleDiff = 0.f; +                wailingSoulTick = 0;              } -            void InitializeAI() override +            void Initialize()              { -                if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(FoSScriptName)) -                    me->IsAIEnabled = false; -                else if (!me->isDead()) -                    Reset(); +                threeFaced = true;              }              void Reset() override @@ -149,7 +150,7 @@ class boss_devourer_of_souls : public CreatureScript                  events.Reset();                  summons.DespawnAll(); -                threeFaced = true; +                Initialize();                  instance->SetData(DATA_DEVOURER_EVENT, NOT_STARTED);              } @@ -345,7 +346,7 @@ class boss_devourer_of_souls : public CreatureScript          CreatureAI* GetAI(Creature* creature) const override          { -            return GetInstanceAI<boss_devourer_of_soulsAI>(creature); +            return GetInstanceAI<boss_devourer_of_soulsAI>(creature, FoSScriptName);          }  }; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index fc9a786aab9..7a36dfe7fae 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -80,10 +80,16 @@ public:      {          npc_sylvanas_fosAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = me->GetInstanceScript();              me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);          } +        void Initialize() +        { +            phase = PHASE_NORMAL; +        } +          InstanceScript* instance;          EventMap events; @@ -92,7 +98,7 @@ public:          void Reset() override          {              events.Reset(); -            phase = PHASE_NORMAL; +            Initialize();          }          void DoAction(int32 actionId) override @@ -203,10 +209,16 @@ public:      {          npc_jaina_fosAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = me->GetInstanceScript();              me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);          } +        void Initialize() +        { +            phase = PHASE_NORMAL; +        } +          InstanceScript* instance;          EventMap events; @@ -215,7 +227,7 @@ public:          void Reset() override          {              events.Reset(); -            phase = PHASE_NORMAL; +            Initialize();          }          void DoAction(int32 actionId) override diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h index 14220e26cdd..34340ae3018 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h @@ -19,6 +19,7 @@  #define DEF_FORGE_OF_SOULS_H  #define FoSScriptName "instance_forge_of_souls" +#define DataHeader    "FOS"  enum Data  { diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp index 964787777a7..f3034fa0796 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp @@ -36,6 +36,7 @@ class instance_forge_of_souls : public InstanceMapScript          {              instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(MAX_ENCOUNTER);                  bronjahm = 0;                  devourerOfSouls = 0; @@ -110,47 +111,6 @@ class instance_forge_of_souls : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "F S " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* in) override -            { -                if (!in) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(in); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(in); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'F' && dataHead2 == 'S') -                { -                    for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } else OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          private:              uint64 bronjahm;              uint64 devourerOfSouls; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index a5577b6a0ea..a014be4369e 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -55,12 +55,20 @@ class boss_falric : public CreatureScript          struct boss_falricAI : public boss_horAI          { -            boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC) { } +            boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC) +            { +                Initialize(); +            } + +            void Initialize() +            { +                _hopelessnessCount = 0; +            }              void Reset() override              {                  boss_horAI::Reset(); -                _hopelessnessCount = 0; +                Initialize();              }              void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h index a05035f7b44..578cf4f84fa 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h @@ -19,6 +19,7 @@  #define HALLS_OF_REFLECTION_H_  #define HoRScriptName "instance_halls_of_reflection" +#define DataHeader    "HOR"  uint32 const EncounterCount = 3; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index b17a5dbc8f5..f73181ba1f3 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -82,6 +82,7 @@ class instance_halls_of_reflection : public InstanceMapScript          {              instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  JainaOrSylvanasIntroGUID  = 0; @@ -709,61 +710,25 @@ class instance_halls_of_reflection : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "H R " << GetBossSaveData() << _introState << ' ' << _frostswornGeneralState; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                data << _introState << ' ' << _frostswornGeneralState;              } -            void Load(char const* in) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!in) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(in); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(in); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'H' && dataHead2 == 'R') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    uint32 temp = 0; -                    loadStream >> temp; -                    if (temp == DONE) -                        SetData(DATA_INTRO_EVENT, DONE); -                    else -                        SetData(DATA_INTRO_EVENT, NOT_STARTED); - -                    loadStream >> temp; -                    if (temp == DONE) -                        SetData(DATA_FROSTSWORN_GENERAL, DONE); -                    else -                        SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED); -                } +                uint32 temp = 0; +                data >> temp; +                if (temp == DONE) +                    SetData(DATA_INTRO_EVENT, DONE);                  else -                    OUT_LOAD_INST_DATA_FAIL; +                    SetData(DATA_INTRO_EVENT, NOT_STARTED); -                OUT_LOAD_INST_DATA_COMPLETE; +                data >> temp; +                if (temp == DONE) +                    SetData(DATA_FROSTSWORN_GENERAL, DONE); +                else +                    SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED);              }          private: diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 783f9e245c8..62a6ac41074 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -82,14 +82,22 @@ class boss_garfrost : public CreatureScript          struct boss_garfrostAI : public BossAI          { -            boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST) { } +            boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST) +            { +                Initialize(); +            } + +            void Initialize() +            { +                _permafrostStack = 0; +            }              void Reset() override              {                  _Reset();                  events.SetPhase(PHASE_ONE);                  SetEquipmentSlots(true); -                _permafrostStack = 0; +                Initialize();              }              void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 3f8e1cc6ee0..5b147344a59 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -140,6 +140,7 @@ class boss_ick : public CreatureScript              boss_ickAI(Creature* creature) : BossAI(creature, DATA_ICK), _vehicle(creature->GetVehicleKit())              {                  ASSERT(_vehicle); +                _tempThreat = 0;              }              void Reset() override @@ -286,14 +287,20 @@ class boss_krick : public CreatureScript          {              boss_krickAI(Creature* creature) : ScriptedAI(creature), _instanceScript(creature->GetInstanceScript()), _summons(creature)              { +                Initialize();              } -            void Reset() override +            void Initialize()              { -                _events.Reset();                  _phase = PHASE_COMBAT;                  _outroNpcGUID = 0;                  _tyrannusGUID = 0; +            } + +            void Reset() override +            { +                _events.Reset(); +                Initialize();                  me->SetReactState(REACT_PASSIVE);                  me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index c4f46136bd9..f392b21b173 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -293,14 +293,20 @@ class boss_rimefang : public CreatureScript              boss_rimefangAI(Creature* creature) : ScriptedAI(creature), _vehicle(creature->GetVehicleKit())              {                  ASSERT(_vehicle); +                Initialize(); +            } + +            void Initialize() +            { +                _currentWaypoint = 0; +                _hoarfrostTargetGUID = 0;              }              void Reset() override              {                  _events.Reset();                  _events.SetPhase(PHASE_NONE); -                _currentWaypoint = 0; -                _hoarfrostTargetGUID = 0; +                Initialize();                  me->SetCanFly(true);                  me->SetReactState(REACT_PASSIVE);                  me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp index c2df16f03e1..d829b98f926 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp @@ -41,6 +41,7 @@ class instance_pit_of_saron : public InstanceMapScript          {              instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(Doors);                  _garfrostGUID = 0; @@ -51,6 +52,7 @@ class instance_pit_of_saron : public InstanceMapScript                  _jainaOrSylvanas1GUID = 0;                  _jainaOrSylvanas2GUID = 0;                  _teamInInstance = 0; +                _tyrannusEventGUID = 0;              }              void OnPlayerEnter(Player* player) override @@ -264,50 +266,6 @@ class instance_pit_of_saron : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "P S " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* in) override -            { -                if (!in) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(in); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(in); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'P' && dataHead2 == 'S') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          private:              uint64 _garfrostGUID;              uint64 _krickGUID; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 7bd9325dd97..4d2ebd44db8 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -113,13 +113,19 @@ class npc_iceborn_protodrake : public CreatureScript              npc_iceborn_protodrakeAI(Creature* creature) : ScriptedAI(creature), _vehicle(creature->GetVehicleKit())              {                  ASSERT(_vehicle); +                Initialize();              } -            void Reset() override +            void Initialize()              {                  _frostBreathCooldown = 5000;              } +            void Reset() override +            { +                Initialize(); +            } +              void EnterCombat(Unit* /*who*/) override              {                  _vehicle->RemoveAllPassengers(); @@ -161,13 +167,19 @@ class npc_geist_ambusher : public CreatureScript          {              npc_geist_ambusherAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();              } -            void Reset() override +            void Initialize()              {                  _leapingFaceMaulCooldown = 9000;              } +            void Reset() override +            { +                Initialize(); +            } +              void EnterCombat(Unit* who) override              {                  if (who->GetTypeId() != TYPEID_PLAYER) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h index 2a2f6a25741..4f06c6b2a26 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h @@ -19,6 +19,7 @@  #define PIT_OF_SARON_H_  #define PoSScriptName "instance_pit_of_saron" +#define DataHeader "POS"  uint32 const EncounterCount = 3; diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 68929d2aa01..001f19679c4 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -82,14 +82,14 @@ class boss_drakkari_colossus : public CreatureScript          {              boss_drakkari_colossusAI(Creature* creature) : BossAI(creature, DATA_DRAKKARI_COLOSSUS_EVENT)              { +                Initialize();                  me->SetReactState(REACT_PASSIVE);                  introDone = false;              } -            void InitializeAI() override +            void Initialize()              { -                if (!me->isDead()) -                    Reset(); +                phase = COLOSSUS_PHASE_NORMAL;              }              void Reset() override @@ -106,7 +106,7 @@ class boss_drakkari_colossus : public CreatureScript                  //events.Reset(); -> done in _Reset();                  events.ScheduleEvent(EVENT_MIGHTY_BLOW, urand(10000, 30000)); -                phase = COLOSSUS_PHASE_NORMAL; +                Initialize();                  // Note: This should not be called, but before use SetBossState function we should use BossAI                  //        in all the bosses of the instance @@ -393,13 +393,19 @@ public:      {          npc_living_mojoAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            mojoWaveTimer = 2 * IN_MILLISECONDS; +            mojoPuddleTimer = 7 * IN_MILLISECONDS; +        } +          void Reset() override          { -            mojoWaveTimer = 2*IN_MILLISECONDS; -            mojoPuddleTimer = 7*IN_MILLISECONDS; +            Initialize();          }          void MoveMojos(Creature* boss) diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp index 8e0ff54e161..0783a79b381 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp @@ -44,9 +44,20 @@ public:      {          boss_eckAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiBerserkTimer = urand(60 * IN_MILLISECONDS, 90 * IN_MILLISECONDS); //60-90 secs according to wowwiki +            uiBiteTimer = 5 * IN_MILLISECONDS; +            uiSpitTimer = 10 * IN_MILLISECONDS; +            uiSpringTimer = 8 * IN_MILLISECONDS; + +            bBerserk = false; +        } +          uint32 uiBerserkTimer;          uint32 uiBiteTimer;          uint32 uiSpitTimer; @@ -58,12 +69,7 @@ public:          void Reset() override          { -            uiBerserkTimer = urand(60*IN_MILLISECONDS, 90*IN_MILLISECONDS); //60-90 secs according to wowwiki -            uiBiteTimer = 5*IN_MILLISECONDS; -            uiSpitTimer = 10*IN_MILLISECONDS; -            uiSpringTimer = 8*IN_MILLISECONDS; - -            bBerserk = false; +            Initialize();              instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED);          } diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index f1c246dbbea..22e7ac280fd 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -77,9 +77,26 @@ public:      {          boss_gal_darahAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiStampedeTimer = 10 * IN_MILLISECONDS; +            uiWhirlingSlashTimer = 21 * IN_MILLISECONDS; +            uiPunctureTimer = 10 * IN_MILLISECONDS; +            uiEnrageTimer = 15 * IN_MILLISECONDS; +            uiImpalingChargeTimer = 21 * IN_MILLISECONDS; +            uiStompTimer = 25 * IN_MILLISECONDS; +            uiTransformationTimer = 9 * IN_MILLISECONDS; +            uiPhaseCounter = 0; + +            shareTheLove = 0; +            bStartOfTransformation = true; +            Phase = TROLL; +        } +          uint32 uiStampedeTimer;          uint32 uiWhirlingSlashTimer;          uint32 uiPunctureTimer; @@ -100,21 +117,9 @@ public:          void Reset() override          { -            uiStampedeTimer = 10*IN_MILLISECONDS; -            uiWhirlingSlashTimer = 21*IN_MILLISECONDS; -            uiPunctureTimer = 10*IN_MILLISECONDS; -            uiEnrageTimer = 15*IN_MILLISECONDS; -            uiImpalingChargeTimer = 21*IN_MILLISECONDS; -            uiStompTimer = 25*IN_MILLISECONDS; -            uiTransformationTimer = 9*IN_MILLISECONDS; -            uiPhaseCounter = 0; +            Initialize();              impaledList.clear(); -            shareTheLove = 0; - -            bStartOfTransformation = true; - -            Phase = TROLL;              me->SetDisplayId(DISPLAY_TROLL); diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp index 7645d984aac..255a5ece261 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp @@ -61,9 +61,19 @@ public:      {          boss_moorabiAI(Creature* creature) : ScriptedAI(creature)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiGroundTremorTimer = 18 * IN_MILLISECONDS; +            uiNumblingShoutTimer = 10 * IN_MILLISECONDS; +            uiDeterminedStabTimer = 20 * IN_MILLISECONDS; +            uiTransformationTImer = 12 * IN_MILLISECONDS; +            bPhase = false; +        } +          InstanceScript* instance;          bool bPhase; @@ -75,11 +85,7 @@ public:          void Reset() override          { -            uiGroundTremorTimer = 18*IN_MILLISECONDS; -            uiNumblingShoutTimer =  10*IN_MILLISECONDS; -            uiDeterminedStabTimer = 20*IN_MILLISECONDS; -            uiTransformationTImer = 12*IN_MILLISECONDS; -            bPhase = false; +            Initialize();              instance->SetData(DATA_MOORABI_EVENT, NOT_STARTED);          } diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 98c8481b5ae..5db49415604 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -83,9 +83,19 @@ public:      {          boss_slad_ranAI(Creature* creature) : ScriptedAI(creature), lSummons(me)          { +            Initialize();              instance = creature->GetInstanceScript();          } +        void Initialize() +        { +            uiPoisonNovaTimer = 10 * IN_MILLISECONDS; +            uiPowerfullBiteTimer = 3 * IN_MILLISECONDS; +            uiVenomBoltTimer = 15 * IN_MILLISECONDS; +            uiSpawnTimer = 5 * IN_MILLISECONDS; +            uiPhase = 0; +        } +          uint32 uiPoisonNovaTimer;          uint32 uiPowerfullBiteTimer;          uint32 uiVenomBoltTimer; @@ -100,11 +110,7 @@ public:          void Reset() override          { -            uiPoisonNovaTimer = 10*IN_MILLISECONDS; -            uiPowerfullBiteTimer = 3*IN_MILLISECONDS; -            uiVenomBoltTimer = 15*IN_MILLISECONDS; -            uiSpawnTimer = 5*IN_MILLISECONDS; -            uiPhase = 0; +            Initialize();              lWrappedPlayers.clear();              lSummons.DespawnAll(); diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h index 4cdbec3c157..8f269705a45 100644 --- a/src/server/scripts/Northrend/Gundrak/gundrak.h +++ b/src/server/scripts/Northrend/Gundrak/gundrak.h @@ -18,6 +18,8 @@  #ifndef DEF_GUNDRAK_H  #define DEF_GUNDRAK_H +#define DataHeader "GD" +  enum Data  {      DATA_SLAD_RAN_EVENT, diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index 273cc4361af..e5efdad27f3 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -45,6 +45,7 @@ public:      {          instance_gundrak_InstanceMapScript(Map* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);              isHeroic = map->IsHeroic();          } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index a9088207ebe..3aebed81f0b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -182,14 +182,20 @@ class boss_blood_council_controller : public CreatureScript          {              boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL)              { +                Initialize(); +            } + +            void Initialize() +            { +                _invocationStage = 0; +                _resetCounter = 0;              }              void Reset() override              {                  events.Reset();                  me->SetReactState(REACT_PASSIVE); -                _invocationStage = 0; -                _resetCounter = 0; +                Initialize();                  instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED);              } @@ -1142,6 +1148,7 @@ class npc_ball_of_flame : public CreatureScript              npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())              {                  _despawnTimer = 0; +                _chaseGUID = 0;              }              void Reset() override @@ -1224,7 +1231,12 @@ class npc_kinetic_bomb : public CreatureScript          struct npc_kinetic_bombAI : public ScriptedAI          { -            npc_kinetic_bombAI(Creature* creature) : ScriptedAI(creature) { } +            npc_kinetic_bombAI(Creature* creature) : ScriptedAI(creature) +            { +                _x = 0.f; +                _y = 0.f; +                _groundZ = 0.f; +            }              void Reset() override              { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 104a8357917..29d50f1db2a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -143,6 +143,14 @@ class boss_blood_queen_lana_thel : public CreatureScript          {              boss_blood_queen_lana_thelAI(Creature* creature) : BossAI(creature, DATA_BLOOD_QUEEN_LANA_THEL)              { +                Initialize(); +            } + +            void Initialize() +            { +                _offtankGUID = 0; +                _creditBloodQuickening = false; +                _killMinchar = false;              }              void Reset() override @@ -157,10 +165,8 @@ class boss_blood_queen_lana_thel : public CreatureScript                  events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL);                  events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0));                  CleanAuras(); -                _offtankGUID = 0;                  _vampires.clear(); -                _creditBloodQuickening = false; -                _killMinchar = false; +                Initialize();              }              void EnterCombat(Unit* who) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 5ef84c7bb40..4b9308fc12d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -249,18 +249,24 @@ class boss_deathbringer_saurfang : public CreatureScript          {              boss_deathbringer_saurfangAI(Creature* creature) : BossAI(creature, DATA_DEATHBRINGER_SAURFANG)              { +                Initialize();                  ASSERT(creature->GetVehicleKit()); // we dont actually use it, just check if exists                  _introDone = false;                  _fallenChampionCastCount = 0;              } +            void Initialize() +            { +                _frenzied = false; +                _dead = false; +            } +              void Reset() override              {                  _Reset();                  me->SetReactState(REACT_DEFENSIVE);                  events.SetPhase(PHASE_COMBAT); -                _frenzied = false; -                _dead = false; +                Initialize();                  me->SetPower(POWER_ENERGY, 0);                  DoCast(me, SPELL_ZERO_POWER, true);                  DoCast(me, SPELL_BLOOD_LINK, true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index a60d2cfd823..6cc86ff0096 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -218,6 +218,14 @@ class boss_lady_deathwhisper : public CreatureScript              boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER),                  _dominateMindCount(RAID_MODE<uint8>(0, 1, 1, 3)), _introDone(false)              { +                Initialize(); +            } + +            void Initialize() +            { +                _waveCounter = 0; +                _nextVengefulShadeTargetGUID = 0; +                _darnavanGUID = 0;              }              void Reset() override @@ -225,9 +233,7 @@ class boss_lady_deathwhisper : public CreatureScript                  _Reset();                  me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));                  events.SetPhase(PHASE_ONE); -                _waveCounter = 0; -                _nextVengefulShadeTargetGUID = 0; -                _darnavanGUID = 0; +                Initialize();                  DoCast(me, SPELL_SHADOW_CHANNELING);                  me->RemoveAurasDueToSpell(SPELL_BERSERK);                  me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); @@ -837,6 +843,13 @@ class npc_darnavan : public CreatureScript          {              npc_darnavanAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize(); +            } + +            void Initialize() +            { +                _canCharge = true; +                _canShatter = true;              }              void Reset() override @@ -846,8 +859,7 @@ class npc_darnavan : public CreatureScript                  _events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(20000, 25000));                  _events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(25000, 30000));                  _events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(5000, 8000)); -                _canCharge = true; -                _canShatter = true; +                Initialize();              }              void JustDied(Unit* killer) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 9d24ad062df..b7bf27177ea 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -133,6 +133,7 @@ class boss_lord_marrowgar : public CreatureScript                  _coldflameLastPos.Relocate(creature);                  _introDone = false;                  _boneSlice = false; +                _coldflameTarget = 0;              }              void Reset() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 11f20129b3e..c1a13c90780 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -223,6 +223,7 @@ class boss_professor_putricide : public CreatureScript                  _baseSpeed(creature->GetSpeedRate(MOVE_RUN)), _experimentState(EXPERIMENT_STATE_OOZE)              {                  _phase = PHASE_NONE; +                _oozeFloodStage = 0;              }              void Reset() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 76c5a93f9c5..3b65c10aaa9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -221,6 +221,14 @@ class boss_sindragosa : public CreatureScript          {              boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false)              { +                Initialize(); +            } + +            void Initialize() +            { +                _mysticBuffetStack = 0; +                _isInAirPhase = false; +                _isThirdPhase = false;              }              void Reset() override @@ -235,9 +243,7 @@ class boss_sindragosa : public CreatureScript                  events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(9000, 14000), EVENT_GROUP_LAND_PHASE);                  events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE);                  events.ScheduleEvent(EVENT_AIR_PHASE, 50000); -                _mysticBuffetStack = 0; -                _isInAirPhase = false; -                _isThirdPhase = false; +                Initialize();                  if (!_summoned)                  { @@ -558,6 +564,7 @@ class npc_ice_tomb : public CreatureScript              npc_ice_tombAI(Creature* creature) : ScriptedAI(creature)              {                  _trappedPlayerGUID = 0; +                _existenceCheckTimer = 0;                  SetCombatMovement(false);              } @@ -765,6 +772,12 @@ class npc_rimefang : public CreatureScript          {              npc_rimefangAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false)              { +                Initialize(); +            } + +            void Initialize() +            { +                _icyBlastCounter = 0;              }              void InitializeAI() override @@ -783,7 +796,7 @@ class npc_rimefang : public CreatureScript                  _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000));                  _events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000));                  me->SetReactState(REACT_DEFENSIVE); -                _icyBlastCounter = 0; +                Initialize();                  if (!_summoned)                  { @@ -922,7 +935,14 @@ class npc_sindragosa_trash : public CreatureScript          {              npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature)              { +                Initialize();                  _instance = creature->GetInstanceScript(); +                _frostwyrmId = 0; +            } + +            void Initialize() +            { +                _isTaunted = false;              }              void InitializeAI() override @@ -946,7 +966,7 @@ class npc_sindragosa_trash : public CreatureScript                      _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(8000, 10000));                  } -                _isTaunted = false; +                Initialize();              }              void JustRespawned() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 55c1003ff0c..50e98422481 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -483,6 +483,13 @@ class boss_the_lich_king : public CreatureScript          {              boss_the_lich_kingAI(Creature* creature) : BossAI(creature, DATA_THE_LICH_KING)              { +                Initialize(); +            } + +            void Initialize() +            { +                _necroticPlagueStack = 0; +                _vileSpiritExplosions = 0;              }              void Reset() override @@ -490,8 +497,7 @@ class boss_the_lich_king : public CreatureScript                  _Reset();                  me->SetReactState(REACT_PASSIVE);                  events.SetPhase(PHASE_INTRO); -                _necroticPlagueStack = 0; -                _vileSpiritExplosions = 0; +                Initialize();                  SetEquipmentSlots(true);              } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 68344593434..6d297252dcb 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -282,6 +282,17 @@ class boss_valithria_dreamwalker : public CreatureScript              boss_valithria_dreamwalkerAI(Creature* creature) : ScriptedAI(creature),                  _instance(creature->GetInstanceScript()), _portalCount(RAID_MODE<uint32>(3, 8, 3, 8))              { +                Initialize(); +                _spawnHealth = me->GetHealth(); +            } + +            void Initialize() +            { +                _missedPortals = 0; +                _under25PercentTalkDone = false; +                _over75PercentTalkDone = false; +                _justDied = false; +                _done = false;              }              void InitializeAI() override @@ -305,11 +316,7 @@ class boss_valithria_dreamwalker : public CreatureScript                  // Glyph of Dispel Magic - not a percent heal by effect, its cast with custom basepoints                  me->ApplySpellImmune(0, IMMUNITY_ID, 56131, true);                  _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); -                _missedPortals = 0; -                _under25PercentTalkDone = false; -                _over75PercentTalkDone = false; -                _justDied = false; -                _done = false; +                Initialize();              }              void AttackStart(Unit* /*target*/) override @@ -680,6 +687,12 @@ class npc_risen_archmage : public CreatureScript              npc_risen_archmageAI(Creature* creature) : ScriptedAI(creature),                  _instance(creature->GetInstanceScript())              { +                Initialize(); +            } + +            void Initialize() +            { +                _canCallEnterCombat = true;              }              bool CanAIAttack(Unit const* target) const override @@ -693,7 +706,7 @@ class npc_risen_archmage : public CreatureScript                  _events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, urand(5000, 15000));                  _events.ScheduleEvent(EVENT_MANA_VOID, urand(20000, 25000));                  _events.ScheduleEvent(EVENT_COLUMN_OF_FROST, urand(10000, 20000)); -                _canCallEnterCombat = true; +                Initialize();              }              void EnterCombat(Unit* /*target*/) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index e85ddc21dda..e403e37835c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -385,17 +385,23 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript          {              npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())              { +                Initialize();              } -            void Reset() override +            void Initialize()              { -                _events.Reset();                  _theLichKing = 0;                  _bolvarFordragon = 0;                  _factionNPC = 0;                  _damnedKills = 0;              } +            void Reset() override +            { +                _events.Reset(); +                Initialize(); +            } +              // IMPORTANT NOTE: This is triggered from per-GUID scripts              // of The Damned SAI              void SetData(uint32 type, uint32 data) override @@ -939,11 +945,18 @@ class npc_crok_scourgebane : public CreatureScript                  _instance(creature->GetInstanceScript()), _respawnTime(creature->GetRespawnDelay()),                  _corpseDelay(creature->GetCorpseDelay())              { +                Initialize();                  SetDespawnAtEnd(false);                  SetDespawnAtFar(false);                  _isEventActive = false;                  _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE; +                _currentWPid = 0; +            } + +            void Initialize() +            {                  _didUnderTenPercentText = false; +                _wipeCheckTimer = 1000;              }              void Reset() override @@ -952,8 +965,7 @@ class npc_crok_scourgebane : public CreatureScript                  _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, urand(7500, 12500));                  _events.ScheduleEvent(EVENT_DEATH_STRIKE, urand(25000, 30000));                  me->SetReactState(REACT_DEFENSIVE); -                _didUnderTenPercentText = false; -                _wipeCheckTimer = 1000; +                Initialize();              }              void DoAction(int32 action) override @@ -1647,12 +1659,18 @@ class npc_impaling_spear : public CreatureScript          {              npc_impaling_spearAI(Creature* creature) : CreatureAI(creature)              { +                Initialize(); +            } + +            void Initialize() +            { +                _vehicleCheckTimer = 500;              }              void Reset() override              {                  me->SetReactState(REACT_PASSIVE); -                _vehicleCheckTimer = 500; +                Initialize();              }              void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index fbd3a715fb8..5d2aa9ca02f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -19,11 +19,9 @@  #define ICECROWN_CITADEL_H_  #include "SpellScript.h" -#include "Map.h" -#include "Creature.h" -#include "SpellMgr.h"  #define ICCScriptName "instance_icecrown_citadel" +#define DataHeader    "IC"  uint32 const EncounterCount = 13;  uint32 const WeeklyNPCs = 9; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 469bfc1d310..af07375e14c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -15,12 +15,12 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ +#include "InstanceScript.h" +#include "Player.h"  #include "ScriptedGossip.h"  #include "ScriptMgr.h" -#include "InstanceScript.h" -#include "icecrown_citadel.h"  #include "Spell.h" -#include "Player.h" +#include "icecrown_citadel.h"  #define GOSSIP_SENDER_ICC_PORT 631 diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 86e4efc5db7..2e566915922 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -115,6 +115,7 @@ class instance_icecrown_citadel : public InstanceMapScript          {              instance_icecrown_citadel_InstanceMapScript(InstanceMap* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  TeamInInstance = 0; @@ -173,6 +174,9 @@ class instance_icecrown_citadel : public InstanceMapScript                  UpperSpireTeleporterActiveState = NOT_STARTED;                  BloodQuickeningState = NOT_STARTED;                  BloodQuickeningMinutes = 0; +                FrozenBolvarGUID = 0; +                PillarsChainedGUID = 0; +                PillarsUnchainedGUID = 0;              }              // A function to help reduce the number of lines for teleporter management. @@ -1320,64 +1324,32 @@ class instance_icecrown_citadel : public InstanceMapScript                  }              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' ' -                    << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << UpperSpireTeleporterActiveState; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                data << HeroicAttempts << ' ' +                    << ColdflameJetsState << ' ' +                    << BloodQuickeningState << ' ' +                    << BloodQuickeningMinutes << ' ' +                    << UpperSpireTeleporterActiveState;              } -            void Load(const char* str) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } +                data >> HeroicAttempts; -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'I' && dataHead2 == 'C') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    loadStream >> HeroicAttempts; - -                    uint32 temp = 0; -                    loadStream >> temp; -                    if (temp == IN_PROGRESS) -                        ColdflameJetsState = NOT_STARTED; -                    else -                        ColdflameJetsState = temp ? DONE : NOT_STARTED; - -                    loadStream >> temp; -                    BloodQuickeningState = temp ? DONE : NOT_STARTED;   // DONE means finished (not success/fail) -                    loadStream >> BloodQuickeningMinutes; - -                    loadStream >> temp; -                    UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED; -                } +                uint32 temp = 0; +                data >> temp; +                if (temp == IN_PROGRESS) +                    ColdflameJetsState = NOT_STARTED;                  else -                    OUT_LOAD_INST_DATA_FAIL; +                    ColdflameJetsState = temp ? DONE : NOT_STARTED; + +                data >> temp; +                BloodQuickeningState = temp ? DONE : NOT_STARTED;   // DONE means finished (not success/fail) +                data >> BloodQuickeningMinutes; -                OUT_LOAD_INST_DATA_COMPLETE; +                data >> temp; +                UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED;              }              void Update(uint32 diff) override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 676e4134f11..35402771494 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -62,7 +62,15 @@ public:      struct boss_anubrekhanAI : public BossAI      { -        boss_anubrekhanAI(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN) { } +        boss_anubrekhanAI(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN) +        { +            Initialize(); +        } + +        void Initialize() +        { +            hasTaunted = false; +        }          bool hasTaunted; @@ -70,7 +78,7 @@ public:          {              _Reset(); -            hasTaunted = false; +            Initialize();              if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)              { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index e2ff68ab851..a8de1418cc4 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -96,12 +96,25 @@ public:      {          boss_four_horsemenAI(Creature* creature) : BossAI(creature, BOSS_HORSEMEN)          { +            Initialize();              id = Horsemen(0);              for (uint8 i = 0; i < 4; ++i)                  if (me->GetEntry() == NPC_HORSEMEN[i])                      id = Horsemen(i);              caster = (id == HORSEMEN_LADY || id == HORSEMEN_SIR); +        } + +        void Initialize() +        { +            uiEventStarterGUID = 0; +            nextWP = 0; +            punishTimer = 2000; +            nextMovementStarted = false; +            movementCompleted = false; +            movementStarted = false; +            encounterActionAttack = false;              encounterActionReset = false; +            doDelayPunish = false;          }          Horsemen id; @@ -124,15 +137,7 @@ public:              instance->SetData(DATA_HORSEMEN0 + id, NOT_STARTED);              me->SetReactState(REACT_AGGRESSIVE); -            uiEventStarterGUID = 0; -            nextWP = 0; -            punishTimer = 2000; -            nextMovementStarted = false; -            movementCompleted = false; -            movementStarted = false; -            encounterActionAttack = false; -            encounterActionReset = false; -            doDelayPunish = false; +            Initialize();              _Reset();          } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 648fc3c87d2..de9d85db70b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -162,7 +162,18 @@ class boss_gothik : public CreatureScript          struct boss_gothikAI : public BossAI          { -            boss_gothikAI(Creature* creature) : BossAI(creature, BOSS_GOTHIK) { } +            boss_gothikAI(Creature* creature) : BossAI(creature, BOSS_GOTHIK) +            { +                Initialize(); +                waveCount = 0; +            } + +            void Initialize() +            { +                mergedSides = false; +                phaseTwo = false; +                thirtyPercentReached = false; +            }              uint32 waveCount;              typedef std::vector<Creature*> TriggerVct; @@ -182,9 +193,7 @@ class boss_gothik : public CreatureScript                  me->SetReactState(REACT_PASSIVE);                  instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE);                  _Reset(); -                mergedSides = false; -                phaseTwo = false; -                thirtyPercentReached = false; +                Initialize();              }              void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 648da29ca66..2d0e8a6d2b2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -66,7 +66,13 @@ public:      struct boss_heiganAI : public BossAI      { -        boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN) { } +        boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN) +        { +            eruptSection = 0; +            eruptDirection = false; +            safetyDance = false; +            phase = PHASE_FIGHT; +        }          uint32 eruptSection;          bool eruptDirection; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index f010192f6f1..80bf7e39ad3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -263,9 +263,20 @@ public:      {          boss_kelthuzadAI(Creature* creature) : BossAI(creature, BOSS_KELTHUZAD), spawns(creature)          { +            Initialize();              uiFaction = me->getFaction();          } +        void Initialize() +        { +            nGuardiansOfIcecrownCount = 0; +            uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3 + +            Phase = 0; +            nAbomination = 0; +            nWeaver = 0; +        } +          uint32 Phase;          uint32 uiGuardiansOfIcecrownTimer;          uint32 uiFaction; @@ -315,12 +326,7 @@ public:                          portal->ResetDoorOrButton();              } -            nGuardiansOfIcecrownCount = 0; -            uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3 - -            Phase = 0; -            nAbomination = 0; -            nWeaver = 0; +            Initialize();          }          void KilledUnit(Unit* /*victim*/) override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index 9987802a165..736941949d1 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -60,15 +60,21 @@ class boss_loatheb : public CreatureScript          {              boss_loathebAI(Creature* creature) : BossAI(creature, BOSS_LOATHEB)              { +                Initialize();              } -            void Reset() override +            void Initialize()              { -                _Reset();                  _doomCounter = 0;                  _sporeLoserData = true;              } +            void Reset() override +            { +                _Reset(); +                Initialize(); +            } +              void EnterCombat(Unit* /*who*/) override              {                  _EnterCombat(); diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index e8ed181da5a..173b6e2d094 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -107,6 +107,7 @@ class instance_naxxramas : public InstanceMapScript          {              instance_naxxramas_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  LoadMinionData(minionData); @@ -427,50 +428,6 @@ class instance_naxxramas : public InstanceMapScript                  return false;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "N X " << GetBossSaveData() << playerDied; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* strIn) override -            { -                if (!strIn) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(strIn); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(strIn); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'N' && dataHead2 == 'X') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    loadStream >> playerDied; -                } - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              /* The Arachnid Quarter */              // Grand Widow Faerlina diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index b6e87504c77..8325271a403 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -18,6 +18,8 @@  #ifndef DEF_NAXXRAMAS_H  #define DEF_NAXXRAMAS_H +#define DataHeader "NAX" +  uint32 const EncounterCount     = 15;  enum Encounter diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h index f94acf5d772..ef7dd743515 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h @@ -18,6 +18,8 @@  #ifndef DEF_EYE_OF_ETERNITY_H  #define DEF_EYE_OF_ETERNITY_H +#define DataHeader "EOE" +  enum InstanceData  {      DATA_MALYGOS_EVENT, diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index 4fa80c7bac2..a4cb6e5be5b 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -35,6 +35,7 @@ public:      {          instance_eye_of_eternity_InstanceMapScript(Map* map) : InstanceScript(map)          { +            SetHeaders(DataHeader);              SetBossNumber(MAX_ENCOUNTER);              vortexTriggers.clear(); @@ -277,65 +278,23 @@ public:              return 0;          } -        std::string GetSaveData() override -        { -            OUT_SAVE_INST_DATA; - -            std::ostringstream saveStream; -            saveStream << "E E " << GetBossSaveData(); - -            OUT_SAVE_INST_DATA_COMPLETE; -            return saveStream.str(); -        } - -        void Load(const char* str) override -        { -            if (!str) -            { -                OUT_LOAD_INST_DATA_FAIL; -                return; -            } - -            OUT_LOAD_INST_DATA(str); - -            char dataHead1, dataHead2; - -            std::istringstream loadStream(str); -            loadStream >> dataHead1 >> dataHead2; - -            if (dataHead1 == 'E' && dataHead2 == 'E') -            { -                for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) -                { -                    uint32 tmpState; -                    loadStream >> tmpState; -                    if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                        tmpState = NOT_STARTED; -                    SetBossState(i, EncounterState(tmpState)); -                } - -            } else OUT_LOAD_INST_DATA_FAIL; - -            OUT_LOAD_INST_DATA_COMPLETE; -        } - -        private: -            std::list<uint64> vortexTriggers; -            std::list<uint64> portalTriggers; -            uint64 malygosGUID; -            uint64 irisGUID; -            uint64 lastPortalGUID; -            uint64 platformGUID; -            uint64 exitPortalGUID; -            uint64 heartOfMagicGUID; -            uint64 alexstraszaBunnyGUID; -            uint64 giftBoxBunnyGUID; -            Position focusingIrisPosition; -            Position exitPortalPosition; +    private: +        std::list<uint64> vortexTriggers; +        std::list<uint64> portalTriggers; +        uint64 malygosGUID; +        uint64 irisGUID; +        uint64 lastPortalGUID; +        uint64 platformGUID; +        uint64 exitPortalGUID; +        uint64 heartOfMagicGUID; +        uint64 alexstraszaBunnyGUID; +        uint64 giftBoxBunnyGUID; +        Position focusingIrisPosition; +        Position exitPortalPosition;      };  };  void AddSC_instance_eye_of_eternity()  { -   new instance_eye_of_eternity(); +    new instance_eye_of_eternity();  } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp index f2118932d61..663f4bca6ac 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp @@ -55,6 +55,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));              Anomalus = 0; diff --git a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h index e9be1a32c2a..c9f5d44c932 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h +++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h @@ -18,6 +18,8 @@  #ifndef DEF_NEXUS_H  #define DEF_NEXUS_H +#define DataHeader "NEX" +  enum DataTypes  {      DATA_MAGUS_TELESTRA_EVENT, diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index d78a07f5c2b..83093234093 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -40,6 +40,7 @@ class instance_oculus : public InstanceMapScript          {              instance_oculus_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -286,49 +287,6 @@ class instance_oculus : public InstanceMapScript                          gwhelp->SetPhaseMask(1, true);              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "T O " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'T' && dataHead2 == 'O') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 DrakosGUID;              uint64 VarosGUID; diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h index f54b1c067f0..268cdb54e3e 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h @@ -19,6 +19,7 @@  #define OCULUS_H_  #define OculusScriptName "instance_oculus" +#define DataHeader "OC"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h index cef99ce7abd..5dd2e48898b 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h @@ -19,6 +19,7 @@  #define HALLS_OF_LIGHTNING_H_  #define HoLScriptName "instance_halls_of_lightning" +#define DataHeader    "HOL"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 2f5273f0296..0f44f935d24 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -36,6 +36,7 @@ class instance_halls_of_lightning : public InstanceMapScript          {              instance_halls_of_lightning_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -136,49 +137,6 @@ class instance_halls_of_lightning : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "H L " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'H' && dataHead2 == 'L') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 GeneralBjarngrimGUID;              uint64 VolkhanGUID; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h index 3690557d91b..253fbc43a5d 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h @@ -19,6 +19,7 @@  #define HALLS_OF_STONE_H_  #define HoSScriptName "instance_halls_of_stone" +#define DataHeader    "HOS"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index 0c9492c87c0..b7aa606aeeb 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -15,11 +15,11 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "ScriptMgr.h"  #include "InstanceScript.h" +#include "Player.h" +#include "ScriptMgr.h"  #include "WorldSession.h"  #include "halls_of_stone.h" -#include <Player.h>  DoorData const doorData[] =  { @@ -36,6 +36,7 @@ class instance_halls_of_stone : public InstanceMapScript          {              instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -203,49 +204,6 @@ class instance_halls_of_stone : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "H S " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'H' && dataHead2 == 'S') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 KrystallusGUID;              uint64 MaidenOfGriefGUID; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index a074ce28181..56f5c19c574 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -123,6 +123,7 @@ class instance_ulduar : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  SetBossNumber(MAX_ENCOUNTER);                  LoadDoorData(doorData);                  LoadMinionData(minionData); @@ -1033,84 +1034,50 @@ class instance_ulduar : public InstanceMapScript                  return false;              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "U U " << GetBossSaveData() << GetData(DATA_COLOSSUS) << ' ' << _algalonTimer << ' ' << (_algalonSummoned ? 1 : 0); +                data << GetData(DATA_COLOSSUS) << ' ' << _algalonTimer << ' ' << uint32(_algalonSummoned ? 1 : 0);                  for (uint8 i = 0; i < 4; ++i) -                    saveStream << ' ' << (KeeperGUIDs[i] ? 1 : 0); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                    data << ' ' << uint32(KeeperGUIDs[i] ? 1 : 0);              } -            void Load(char const* strIn) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!strIn) +                uint32 tempState; +                data >> tempState; +                if (tempState == IN_PROGRESS || tempState > SPECIAL) +                    tempState = NOT_STARTED; +                SetData(DATA_COLOSSUS, tempState); + +                data >> _algalonTimer; +                data >> tempState; +                _algalonSummoned = tempState != 0; +                if (_algalonSummoned && GetBossState(BOSS_ALGALON) != DONE)                  { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(strIn); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(strIn); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'U' && dataHead2 == 'U') -                { -                    for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    uint32 tempState; -                    loadStream >> tempState; -                    if (tempState == IN_PROGRESS || tempState > SPECIAL) -                        tempState = NOT_STARTED; -                    SetData(DATA_COLOSSUS, tempState); - -                    loadStream >> _algalonTimer; -                    loadStream >> tempState; -                    _algalonSummoned = tempState != 0; -                    if (_algalonSummoned && GetBossState(BOSS_ALGALON) != DONE) -                    { -                        _summonAlgalon = true; -                        if (_algalonTimer && _algalonTimer <= 60) -                        { -                            _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000); -                            DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 1); -                            DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, _algalonTimer); -                        } -                    } - -                    for (uint8 i = 0; i < 4; ++i) +                    _summonAlgalon = true; +                    if (_algalonTimer && _algalonTimer <= 60)                      { -                        loadStream >> tempState; -                         _summonYSKeeper[i] = tempState != 0; +                        _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000); +                        DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 1); +                        DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, _algalonTimer);                      } +                } -                    if (GetBossState(BOSS_FREYA) == DONE && !_summonYSKeeper[0]) -                        _summonObservationRingKeeper[0] = true; -                    if (GetBossState(BOSS_HODIR) == DONE && !_summonYSKeeper[1]) -                        _summonObservationRingKeeper[1] = true; -                    if (GetBossState(BOSS_THORIM) == DONE && !_summonYSKeeper[2]) -                        _summonObservationRingKeeper[2] = true; -                    if (GetBossState(BOSS_MIMIRON) == DONE && !_summonYSKeeper[3]) -                        _summonObservationRingKeeper[3] = true; +                for (uint8 i = 0; i < 4; ++i) +                { +                    data >> tempState; +                    _summonYSKeeper[i] = tempState != 0;                  } -                OUT_LOAD_INST_DATA_COMPLETE; +                if (GetBossState(BOSS_FREYA) == DONE && !_summonYSKeeper[0]) +                    _summonObservationRingKeeper[0] = true; +                if (GetBossState(BOSS_HODIR) == DONE && !_summonYSKeeper[1]) +                    _summonObservationRingKeeper[1] = true; +                if (GetBossState(BOSS_THORIM) == DONE && !_summonYSKeeper[2]) +                    _summonObservationRingKeeper[2] = true; +                if (GetBossState(BOSS_MIMIRON) == DONE && !_summonYSKeeper[3]) +                    _summonObservationRingKeeper[3] = true;              }              void Update(uint32 diff) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index 5dfc2b54f6e..9b95d7cf7b8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -19,6 +19,7 @@  #define DEF_ULDUAR_H  #define UlduarScriptName "instance_ulduar" +#define DataHeader "UU"  extern Position const ObservationRingKeepersPos[4];  extern Position const YSKeepersPos[4]; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp index 69229be1771..78df568d144 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp @@ -41,6 +41,7 @@ class instance_utgarde_keep : public InstanceMapScript          {              instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  LoadMinionData(minionData); @@ -191,53 +192,16 @@ class instance_utgarde_keep : public InstanceMapScript                  }              } -            std::string GetSaveData() override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "U K " << GetBossSaveData(); -                  for (uint8 i = 0; i < 3; ++i) -                    saveStream << Forges[i].Event << ' '; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); +                    data << Forges[i].Event << ' ';              } -            void Load(char const* str) override +            void ReadSaveDataMore(std::istringstream& data) override              { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'U' && dataHead2 == 'K') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } - -                    for (uint8 i = 0; i < 3; ++i) -                         loadStream >> Forges[i].Event; -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; +                for (uint8 i = 0; i < 3; ++i) +                    data >> Forges[i].Event;              }          protected: diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h index 240cb8c65db..751239755cf 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h @@ -19,6 +19,7 @@  #define UTGARDE_KEEP_H_  #define UKScriptName "instance_utgarde_keep" +#define DataHeader "UK"  uint32 const EncounterCount = 3; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp index 6eea38c32a3..1bc3f20c3fe 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp @@ -35,6 +35,7 @@ class instance_utgarde_pinnacle : public InstanceMapScript          {              instance_utgarde_pinnacle_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -181,49 +182,6 @@ class instance_utgarde_pinnacle : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "U P " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'U' && dataHead2 == 'P') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 SvalaSorrowgraveGUID;              uint64 GortokPalehoofGUID; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h index 99acef0b2b3..cccfcede80b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h @@ -19,6 +19,7 @@  #define UTGARDE_PINNACLE_H_  #define UPScriptName "instance_utgarde_pinnacle" +#define DataHeader "UP"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp index 1f5b16f1a46..959c8b7724d 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp @@ -35,6 +35,7 @@ class instance_vault_of_archavon : public InstanceMapScript          {              instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  EmalonGUID      = 0; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h index 4a8d52ac306..d321a7b8347 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h +++ b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h @@ -18,6 +18,8 @@  #ifndef DEF_ARCHAVON_H  #define DEF_ARCHAVON_H +#define DataHeader "VA" +  uint32 const EncounterCount = 4;  enum Data diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index c799a2f1813..9c81e664fd4 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -170,6 +170,7 @@ public:          void Initialize() override          { +            SetHeaders(DataHeader);              uiMoragg = 0;              uiErekem = 0;              uiIchoron = 0; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 96691f5e662..205fbec2487 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -18,6 +18,8 @@  #ifndef DEF_VIOLET_HOLD_H  #define DEF_VIOLET_HOLD_H +#define DataHeader "VIO" +  enum Data  {      DATA_1ST_BOSS_EVENT, diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h index d741044eea7..c07c8365c2f 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h @@ -19,6 +19,7 @@  #define AUCHENAI_CRYPTS_H_  #define ACScriptName "instance_auchenai_crypts" +#define DataHeader   "AC"  uint32 const EncounterCount = 2; diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp index 4b8a764fa03..33c9aab0cf9 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp @@ -28,6 +28,7 @@ class instance_auchenai_crypts : public InstanceMapScript          {              instance_auchenai_crypts_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);              }          }; diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp index f7f901a9349..8cb7630e60e 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,27 +15,28 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Pandemonius -SD%Complete: 75 -SDComment: Not known how void blast is done (amount of rapid cast seems to be related to players in party). All mobs remaining in surrounding area should aggro when engaged. -SDCategory: Auchindoun, Mana Tombs -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h" +#include "mana_tombs.h" -enum Pandemonius +enum Texts  {      SAY_AGGRO                       = 0,      SAY_KILL                        = 1,      SAY_DEATH                       = 2, -    EMOTE_DARK_SHELL                = 3, +    EMOTE_DARK_SHELL                = 3 +}; + +enum Spells +{ +    SPELL_VOID_BLAST = 32325, +    SPELL_DARK_SHELL = 32358 +}; -    SPELL_VOID_BLAST                = 32325, -    H_SPELL_VOID_BLAST              = 38760, -    SPELL_DARK_SHELL                = 32358, -    H_SPELL_DARK_SHELL              = 38759 +enum Events +{ +    EVENT_VOID_BLAST = 1, +    EVENT_DARK_SHELL  };  class boss_pandemonius : public CreatureScript @@ -44,26 +44,17 @@ class boss_pandemonius : public CreatureScript  public:      boss_pandemonius() : CreatureScript("boss_pandemonius") { } -    CreatureAI* GetAI(Creature* creature) const override +    struct boss_pandemoniusAI : public BossAI      { -        return new boss_pandemoniusAI(creature); -    } - -    struct boss_pandemoniusAI : public ScriptedAI -    { -        boss_pandemoniusAI(Creature* creature) : ScriptedAI(creature) +        boss_pandemoniusAI(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS)          { +            VoidBlastCounter = 0;          } -        uint32 VoidBlast_Timer; -        uint32 DarkShell_Timer; -        uint32 VoidBlast_Counter; -          void Reset() override          { -            VoidBlast_Timer = 8000 + rand32() % 15000; -            DarkShell_Timer = 20000; -            VoidBlast_Counter = 0; +            _Reset(); +            VoidBlastCounter = 0;          }          void JustDied(Unit* /*killer*/) override @@ -78,48 +69,54 @@ public:          void EnterCombat(Unit* /*who*/) override          { +            _EnterCombat();              Talk(SAY_AGGRO); +            events.ScheduleEvent(EVENT_DARK_SHELL, 20000); +            events.ScheduleEvent(EVENT_VOID_BLAST, urand(8000, 23000));          } -        void UpdateAI(uint32 diff) override +        void ExecuteEvent(uint32 eventId) override          { -            if (!UpdateVictim()) -                return; - -            if (VoidBlast_Timer <= diff) -            { -                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                { -                    DoCast(target, SPELL_VOID_BLAST); -                    VoidBlast_Timer = 500; -                    ++VoidBlast_Counter; -                } - -                if (VoidBlast_Counter == 5) -                { -                    VoidBlast_Timer = 15000 + rand32() % 10000; -                    VoidBlast_Counter = 0; -                } -            } else VoidBlast_Timer -= diff; - -            if (!VoidBlast_Counter) +            switch (eventId)              { -                if (DarkShell_Timer <= diff) -                { +                case EVENT_VOID_BLAST: +                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) +                    { +                        DoCast(target, SPELL_VOID_BLAST); +                        ++VoidBlastCounter; +                    } + +                    if (VoidBlastCounter == 5) +                    { +                        VoidBlastCounter = 0; +                        events.ScheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000)); +                    } +                    else +                    { +                        events.ScheduleEvent(EVENT_VOID_BLAST, 500); +                        events.DelayEvents(EVENT_DARK_SHELL, 500); +                    } +                    break; +                case EVENT_DARK_SHELL:                      if (me->IsNonMeleeSpellCast(false))                          me->InterruptNonMeleeSpells(true); -                      Talk(EMOTE_DARK_SHELL); -                      DoCast(me, SPELL_DARK_SHELL); -                    DarkShell_Timer = 20000; -                } else DarkShell_Timer -= diff; +                    events.ScheduleEvent(EVENT_DARK_SHELL, 20000); +                    break; +                default: +                    break;              } - -            DoMeleeAttackIfReady();          } + +        private: +            uint32 VoidBlastCounter;      }; +    CreatureAI* GetAI(Creature* creature) const override +    { +        return GetManaTombsAI<boss_pandemoniusAI>(creature); +    }  };  void AddSC_boss_pandemonius() diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp index 48bea45a95b..4629aadb2bd 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp @@ -28,6 +28,7 @@ class instance_mana_tombs : public InstanceMapScript          {              instance_mana_tombs_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);              }          }; diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h index 89eefa19d6a..7dd9e96a75e 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h @@ -19,6 +19,7 @@  #define MANA_TOMBS_H_  #define MTScriptName "instance_mana_tombs" +#define DataHeader "MT"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp index 308e5e80105..53fbf8f0cf7 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp @@ -34,6 +34,7 @@ class instance_sethekk_halls : public InstanceMapScript          {              instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);              } @@ -60,49 +61,6 @@ class instance_sethekk_halls : public InstanceMapScript                   if (go->GetEntry() == GO_IKISS_DOOR)                       AddDoor(go, false);              } - -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S H " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'H') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            }          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h index aeca1b88fcd..4b6bfab46cb 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h @@ -19,6 +19,7 @@  #define SETHEKK_HALLS_H_  #define SHScriptName "instance_sethekk_halls" +#define DataHeader "SH"  uint32 const EncounterCount             = 3; diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp index 4df80a0e15b..9bd985130a9 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp @@ -36,6 +36,7 @@ class instance_shadow_labyrinth : public InstanceMapScript          {              instance_shadow_labyrinth_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -134,49 +135,6 @@ class instance_shadow_labyrinth : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S L " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'L') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 AmbassadorHellmawGUID;              uint64 GrandmasterVorpilGUID; diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h index d7ef52cc7a7..1fa70298d41 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h @@ -19,6 +19,7 @@  #define SHADOW_LABYRINTH_H_  #define SLScriptName "instance_shadow_labyrinth" +#define DataHeader "SL"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index c03c8b97d20..bbad9ff7651 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -19,6 +19,7 @@  #define BLACK_TEMPLE_H_  #define BTScriptName "instance_black_temple" +#define DataHeader   "BT"  uint32 const EncounterCount         = 9; diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index 6c3e820e10f..60162188f7e 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -204,7 +204,7 @@ public:                              default:                                  break;                          } -                         +                          ++BeamCount;                          uint32 Beam = CurrentBeam;                          if (BeamCount > 3) @@ -265,7 +265,7 @@ public:                      break;              }          } -     +      private:          uint64 TargetGUID[3];          uint32 BeamCount; diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 6425675219f..c998bfed2dc 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,13 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Warlord_Najentus -SD%Complete: 95 -SDComment: -SDCategory: Black Temple -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "black_temple.h" @@ -187,7 +179,7 @@ public:                      break;              }          } -     +      private:          uint64 SpineTargetGUID;      }; diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index 5b91367a9c9..55ad45597ea 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -44,6 +44,7 @@ class instance_black_temple : public InstanceMapScript          {              instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -202,49 +203,6 @@ class instance_black_temple : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "B T " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'B' && dataHead2 == 'T') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 NajentusGUID;              uint64 SupremusGUID; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index bc557d97ef5..a3577f40d68 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -87,6 +87,7 @@ class instance_serpent_shrine : public InstanceMapScript          {              instance_serpentshrine_cavern_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);              }              void Initialize() override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h index f7f3bc9c24b..660ec6bfb3d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h @@ -19,6 +19,8 @@  #ifndef DEF_SERPENT_SHRINE_H  #define DEF_SERPENT_SHRINE_H +#define DataHeader "SS" +  enum WaterEventState  {      WATERSTATE_NONE     = 0, diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp index 19e8c5187ba..40bc8dd69d7 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp @@ -55,6 +55,7 @@ class instance_steam_vault : public InstanceMapScript          {              instance_steam_vault_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  ThespiaGUID          = 0; @@ -156,56 +157,13 @@ class instance_steam_vault : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S V " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'V') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } - -            protected: -                uint64 ThespiaGUID; -                uint64 MekgineerGUID; -                uint64 KalithreshGUID; +        protected: +            uint64 ThespiaGUID; +            uint64 MekgineerGUID; +            uint64 KalithreshGUID; -                uint64 MainChambersDoorGUID; -                uint8 DistillerState; +            uint64 MainChambersDoorGUID; +            uint8 DistillerState;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h index e1761c80769..58f71b047ef 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h @@ -19,6 +19,7 @@  #define DEF_STEAM_VAULT_H  #define SteamVaultScriptName "instance_steam_vault" +#define DataHeader "SV"  uint32 const EncounterCount = 3; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h index 101268727b0..3130737eed5 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h @@ -21,6 +21,7 @@  uint32 const EncounterCount               = 3;  #define SPScriptName "instance_the_slave_pens" +#define DataHeader "SP"  enum DataTypes  { diff --git a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h index 81644a01567..288601c4584 100644 --- a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h +++ b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h @@ -19,6 +19,7 @@  #define GRUULS_LAIR_H_  #define GLScriptName "instance_gruuls_lair" +#define DataHeader   "GL"  uint32 const EncounterCount = 2; diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp index ae3971a943e..3337ce47fd6 100644 --- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp +++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp @@ -44,6 +44,7 @@ class instance_gruuls_lair : public InstanceMapScript          {              instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);                  LoadMinionData(minionData); @@ -123,49 +124,6 @@ class instance_gruuls_lair : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "G L " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'G' && dataHead2 == 'L') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 MaulgarGUID;          }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h index 51c5a5221ea..8bcfdf5558f 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h @@ -19,6 +19,8 @@  #define BLOOD_FURNACE_H_  #define BFScriptName "instance_blood_furnace" +#define DataHeader   "BF" +  uint32 const EncounterCount = 3;  enum DataTypes diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 880efd0cfaf..bd16fe9edd2 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,13 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Broggok -SD%Complete: 70 -SDComment: pre-event not made -SDCategory: Hellfire Citadel, Blood Furnace -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "SpellScript.h" diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index 4f1200be37b..d88594d9c1e 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -40,6 +40,7 @@ class instance_blood_furnace : public InstanceMapScript          {              instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -322,49 +323,6 @@ class instance_blood_furnace : public InstanceMapScript                      }              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "B F " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'B' && dataHead2 == 'F') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 TheMakerGUID;              uint64 BroggokGUID; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h index 61252d16527..df34ab5fafb 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h @@ -19,6 +19,8 @@  #ifndef DEF_RAMPARTS_H  #define DEF_RAMPARTS_H +#define DataHeader "HR" +  uint32 const EncounterCount       = 4;  enum DataTypes diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp index 9a0e7c22308..c8ffc7d495a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp @@ -38,6 +38,7 @@ class instance_ramparts : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  felIronChestGUID = 0;              } @@ -72,53 +73,9 @@ class instance_ramparts : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "H R " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* strIn) override -            { -                if (!strIn) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(strIn); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(strIn); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'H' && dataHead2 == 'R') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } - -            protected: -                uint64 felIronChestGUID; -                bool spawned; +        protected: +            uint64 felIronChestGUID; +            bool spawned;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override 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 71d9203fcac..ae5ad009942 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -68,6 +68,7 @@ class instance_magtheridons_lair : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));                  MagtheridonGUID = 0; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h index d3921a8709b..159962475ca 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h @@ -19,6 +19,8 @@  #ifndef DEF_MAGTHERIDONS_LAIR_H  #define DEF_MAGTHERIDONS_LAIR_H +#define DataHeader "ML" +  enum DataTypes  {      DATA_MAGTHERIDON_EVENT         = 1, diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index a220f26e18b..8ee63ff03a2 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -43,6 +43,7 @@ class instance_shattered_halls : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  nethekurseGUID      = 0;                  nethekurseDoor1GUID = 0; @@ -114,53 +115,10 @@ class instance_shattered_halls : public InstanceMapScript                  return 0;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "S H " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* strIn) override -            { -                if (!strIn) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(strIn); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(strIn); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'S' && dataHead2 == 'H') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } - -            protected: -                uint64 nethekurseGUID; -                uint64 nethekurseDoor1GUID; -                uint64 nethekurseDoor2GUID; +        protected: +            uint64 nethekurseGUID; +            uint64 nethekurseDoor1GUID; +            uint64 nethekurseDoor2GUID;          };  }; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h index 10e944d5bc4..d0490676bdd 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h @@ -19,6 +19,8 @@  #ifndef DEF_SHATTERED_H  #define DEF_SHATTERED_H +#define DataHeader "SH" +  uint32 const EncounterCount          = 3;  enum DataTypes diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp index 0da16967a49..07cbd68f741 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp @@ -62,6 +62,7 @@ class instance_the_eye : public InstanceMapScript              void Initialize() override              { +                SetHeaders(DataHeader);                  memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));                  ThaladredTheDarkener = 0; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h index 52061a54591..6b1cd89abf6 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h +++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h @@ -19,6 +19,8 @@  #ifndef DEF_THE_EYE_H  #define DEF_THE_EYE_H +#define DataHeader "TE" +  enum DataTypes  {      DATA_ALAREVENT                      = 1, diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp index 4dddee83459..c620a17f7b6 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp @@ -37,6 +37,7 @@ class instance_mechanar : public InstanceMapScript          {              instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData);              } @@ -88,49 +89,6 @@ class instance_mechanar : public InstanceMapScript                  return true;              } - -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "M C " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(const char* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'M' && dataHead2 == 'C') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            }          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h index 34346e163c7..0d823dac325 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h @@ -18,6 +18,8 @@  #ifndef DEF_MECHANAR_H  #define DEF_MECHANAR_H +#define DataHeader "MR" +  uint32 const EncounterCount             = 5;  enum DataTypes diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h index 889a900653f..5b1695f4cfb 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h @@ -19,6 +19,7 @@  #define ARCATRAZ_H  #define ArcatrazScriptName "instance_arcatraz" +#define DataHeader         "AZ"  uint32 const EncounterCount = 4; diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp index a6d0b348984..b092243637b 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp @@ -35,6 +35,7 @@ class instance_arcatraz : public InstanceMapScript          {              instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); @@ -191,49 +192,6 @@ class instance_arcatraz : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "A Z " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'A' && dataHead2 == 'Z') -                { -                    for (uint32 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 DalliahGUID;              uint64 SoccothratesGUID; diff --git a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp index f8929f7e42a..eb46211fa59 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp @@ -28,6 +28,7 @@ class instance_the_botanica : public InstanceMapScript          {              instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map)              { +                SetHeaders(DataHeader);                  CommanderSarannisGUID       = 0;                  HighBotanistFreywinnGUID    = 0;                  ThorngrinTheTenderGUID      = 0; @@ -100,50 +101,6 @@ class instance_the_botanica : public InstanceMapScript                  return true;              } -            std::string GetSaveData() override -            { -                OUT_SAVE_INST_DATA; - -                std::ostringstream saveStream; -                saveStream << "B O " << GetBossSaveData(); - -                OUT_SAVE_INST_DATA_COMPLETE; -                return saveStream.str(); -            } - -            void Load(char const* str) override -            { -                if (!str) -                { -                    OUT_LOAD_INST_DATA_FAIL; -                    return; -                } - -                OUT_LOAD_INST_DATA(str); - -                char dataHead1, dataHead2; - -                std::istringstream loadStream(str); -                loadStream >> dataHead1 >> dataHead2; - -                if (dataHead1 == 'B' && dataHead2 == 'O') -                { -                    for (uint8 i = 0; i < EncounterCount; ++i) -                    { -                        uint32 tmpState; -                        loadStream >> tmpState; -                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) -                            tmpState = NOT_STARTED; - -                        SetBossState(i, EncounterState(tmpState)); -                    } -                } -                else -                    OUT_LOAD_INST_DATA_FAIL; - -                OUT_LOAD_INST_DATA_COMPLETE; -            } -          protected:              uint64 CommanderSarannisGUID;              uint64 HighBotanistFreywinnGUID; diff --git a/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h index ed0d6b0c98a..68d869520ce 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h +++ b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h @@ -19,6 +19,8 @@  #ifndef DEF_THE_BOTANICA_H  #define DEF_THE_BOTANICA_H +#define DataHeader "BC" +  uint32 const EncounterCount = 5;  enum DataTypes diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 08999d3454b..4c80218b4ac 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -2415,7 +2415,7 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader                  // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated)                  // Not when player already has equal or higher rep with this faction -                if (player->GetReputationMgr().GetReputation(factionEntry) <= repChange) +                if (player->GetReputationMgr().GetReputation(factionEntry) < repChange)                      player->GetReputationMgr().SetReputation(factionEntry, repChange);                  // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 23e373312cb..a00c9465a05 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -587,7 +587,7 @@ class boss_taerar : public CreatureScript              void Reset() override              {                  me->RemoveAurasDueToSpell(SPELL_SHADE); -                 +                  Initialize();                  emerald_dragonAI::Reset(); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index f5301fe5cac..1fdd314a9ed 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -36,7 +36,6 @@ go_jotunheim_cage  go_table_theka  go_soulwell  go_bashir_crystalforge -go_ethereal_teleport_pad  go_soulwell  go_dragonflayer_cage  go_tadpole_cage @@ -841,32 +840,6 @@ public:  };  /*###### -## go_ethereal_teleport_pad -######*/ - -enum EtherealTeleportPad -{ -    NPC_IMAGE_WIND_TRADER               = 20518, -    ITEM_TELEPORTER_POWER_PACK          = 28969, -}; - -class go_ethereal_teleport_pad : public GameObjectScript -{ -public: -    go_ethereal_teleport_pad() : GameObjectScript("go_ethereal_teleport_pad") { } - -    bool OnGossipHello(Player* player, GameObject* go) override -    { -        if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK)) -            return false; - -        go->SummonCreature(NPC_IMAGE_WIND_TRADER, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - -        return true; -    } -}; - -/*######  ## go_soulwell  ######*/ @@ -1263,7 +1236,6 @@ void AddSC_go_scripts()      new go_jotunheim_cage();      new go_table_theka();      new go_inconspicuous_landmark(); -    new go_ethereal_teleport_pad();      new go_soulwell();      new go_tadpole_cage();      new go_dragonflayer_cage(); diff --git a/src/server/shared/Database/Field.h b/src/server/shared/Database/Field.h index 5f427a5871b..2e888be5ed3 100644 --- a/src/server/shared/Database/Field.h +++ b/src/server/shared/Database/Field.h @@ -50,7 +50,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<uint8*>(data.value); -            return static_cast<uint8>(atol((char*)data.value)); +            return static_cast<uint8>(strtoul((char*)data.value, nullptr, 10));          }          int8 GetInt8() const @@ -68,7 +68,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<int8*>(data.value); -            return static_cast<int8>(atol((char*)data.value)); +            return static_cast<int8>(strtol((char*)data.value, NULL, 10));          }          uint16 GetUInt16() const @@ -86,7 +86,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<uint16*>(data.value); -            return static_cast<uint16>(atol((char*)data.value)); +            return static_cast<uint16>(strtoul((char*)data.value, nullptr, 10));          }          int16 GetInt16() const @@ -104,7 +104,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<int16*>(data.value); -            return static_cast<int16>(atol((char*)data.value)); +            return static_cast<int16>(strtol((char*)data.value, NULL, 10));          }          uint32 GetUInt32() const @@ -122,7 +122,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<uint32*>(data.value); -            return static_cast<uint32>(atol((char*)data.value)); +            return static_cast<uint32>(strtoul((char*)data.value, nullptr, 10));          }          int32 GetInt32() const @@ -140,7 +140,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<int32*>(data.value); -            return static_cast<int32>(atol((char*)data.value)); +            return static_cast<int32>(strtol((char*)data.value, NULL, 10));          }          uint64 GetUInt64() const @@ -158,7 +158,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<uint64*>(data.value); -            return static_cast<uint64>(atol((char*)data.value)); +            return static_cast<uint64>(strtoull((char*)data.value, nullptr, 10));          }          int64 GetInt64() const @@ -176,7 +176,7 @@ class Field              if (data.raw)                  return *reinterpret_cast<int64*>(data.value); -            return static_cast<int64>(strtol((char*)data.value, NULL, 10)); +            return static_cast<int64>(strtoll((char*)data.value, NULL, 10));          }          float GetFloat() const diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 14ac9a34cf5..c301d66de34 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2400,6 +2400,20 @@ CharDelete.KeepDays = 30  ###################################################################################################  # CUSTOM SERVER OPTIONS  # +#     AllowTrackBothResources +#        Description: Allows players to track herbs and minerals at the same time (if they have the skills) +#        Default: 0 (do not allow) +#                 1 (allow) +# +#        Note: The following are client limitations and cannot be coded for: +#           * The minimap tracking icon will display whichever skill is activated second +#           * The minimap tracking list will only show a check mark next to the last skill activated (sometimes this +#              bugs out and doesn't switch the check mark. It has no effect on the actual tracking though). +#           * The minimap dots are yellow for both resources + +AllowTrackBothResources = 0 + +#  #    PlayerStart.AllReputation  #        Description: Players will start with most of the high level reputations that are needed  #                     for items, mounts etc. @@ -2598,11 +2612,7 @@ UI.ShowQuestLevelsInDialogs = 0  #  ################################################################################################### -################################### -# Auction House Bot Configuration # -################################### - -################################################################################################################### +###################################################################################################  # AUCTION HOUSE BOT SETTINGS  #  #    AuctionHouseBot.Update.Interval @@ -2825,7 +2835,10 @@ AuctionHouseBot.Class.Key = 1  AuctionHouseBot.Class.Misc = 5  AuctionHouseBot.Class.Glyph = 3 -################################################################################################################### +# +################################################################################################### + +###################################################################################################  #  # AHBot ITEM FINE TUNING  #    The following are usefull for limiting what character levels can @@ -2897,9 +2910,9 @@ AuctionHouseBot.forceIncludeItems = ""  AuctionHouseBot.forceExcludeItems = ""  # -################################################################################################################### +################################################################################################### -################################################################################################################### +###################################################################################################  #    AHBot Buyer config  #  #    AuctionHouseBot.Buyer.Enabled @@ -2947,7 +2960,7 @@ AuctionHouseBot.Buyer.Horde.Chance.Ratio = 3  AuctionHouseBot.Buyer.Neutral.Chance.Ratio = 3  # -################################################################################################################### +###################################################################################################  ###################################################################################################  #  LOGGING SYSTEM SETTINGS @@ -3103,6 +3116,7 @@ Log.Async.Enable = 0  #                     1 - (Enabled)  Allow.IP.Based.Action.Logging = 0 +  #  ###################################################################################################  | 
