diff options
Diffstat (limited to 'src')
295 files changed, 3161 insertions, 3477 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 + # ################################################################################################### diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index 1d4a9c060ea..d0a09271210 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -145,7 +145,7 @@ Vec3D fixCoordSystem2(Vec3D v) } ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) - : scale(0), flags(0) + : id(0), scale(0), flags(0) { float ff[3]; f.read(&id, 4); |