diff --git a/ScriptMgr.cpp b/ScriptMgr.cpp index 6f658c9..261f200 100644 --- a/ScriptMgr.cpp +++ b/ScriptMgr.cpp @@ -131,7 +131,7 @@ void InitScriptLibrary() LoadDatabase(); outstring_log("SD2: Loading C++ scripts"); - barGoLink bar(1); + BarGoLink bar(1); bar.step(); outstring_log(""); @@ -157,6 +157,13 @@ void InitScriptLibrary() //********************************* //*** Functions used globally *** +/** + * Function that does script text + * + * @param iTextEntry Entry of the text, stored in SD2-database + * @param pSource Source of the text + * @param pTarget Can be NULL (depending on CHAT_TYPE of iTextEntry). Possible target for the text + */ void DoScriptText(int32 iTextEntry, WorldObject* pSource, Unit* pTarget) { if (!pSource) @@ -240,6 +247,66 @@ void DoScriptText(int32 iTextEntry, WorldObject* pSource, Unit* pTarget) } } +/** + * Function that either simulates or does script text for a map + * + * @param iTextEntry Entry of the text, stored in SD2-database, only type CHAT_TYPE_ZONE_YELL supported + * @param uiCreatureEntry Id of the creature of whom saying will be simulated + * @param pMap Given Map on which the map-wide text is displayed + * @param pCreatureSource Can be NULL. If pointer to Creature is given, then the creature does the map-wide text + * @param pTarget Can be NULL. Possible target for the text + */ +void DoOrSimulateScriptTextForMap(int32 iTextEntry, uint32 uiCreatureEntry, Map* pMap, Creature* pCreatureSource /*=NULL*/, Unit* pTarget /*=NULL*/) +{ + if (!pMap) + { + error_log("SD2: DoOrSimulateScriptTextForMap entry %i, invalid Map pointer.", iTextEntry); + return; + } + + if (iTextEntry >= 0) + { + error_log("SD2: DoOrSimulateScriptTextForMap with source entry %u for map %u attempts to process text entry %i, but text entry must be negative.", uiCreatureEntry, pMap->GetId(), iTextEntry); + return; + } + + CreatureInfo const* pInfo = GetCreatureTemplateStore(uiCreatureEntry); + if (!pInfo) + { + error_log("SD2: DoOrSimulateScriptTextForMap has invalid source entry %u for map %u.", uiCreatureEntry, pMap->GetId()); + return; + } + + const StringTextData* pData = pSystemMgr.GetTextData(iTextEntry); + + if (!pData) + { + error_log("SD2: DoOrSimulateScriptTextForMap with source entry %u for map %u could not find text entry %i.", uiCreatureEntry, pMap->GetId(), iTextEntry); + return; + } + + debug_log("SD2: DoOrSimulateScriptTextForMap: text entry=%i, Sound=%u, Type=%u, Language=%u, Emote=%u", + iTextEntry, pData->uiSoundId, pData->uiType, pData->uiLanguage, pData->uiEmote); + + if (pData->uiSoundId) + { + if (GetSoundEntriesStore()->LookupEntry(pData->uiSoundId)) + pMap->PlayDirectSoundToMap(pData->uiSoundId); + else + error_log("SD2: DoOrSimulateScriptTextForMap entry %i tried to process invalid sound id %u.", iTextEntry, pData->uiSoundId); + } + + if (pData->uiType == CHAT_TYPE_ZONE_YELL) + { + if (pCreatureSource) // If provided pointer for sayer, use direct version + pMap->MonsterYellToMap(pCreatureSource->GetObjectGuid(), iTextEntry, pData->uiLanguage, pTarget); + else // Simulate yell + pMap->MonsterYellToMap(pInfo, iTextEntry, pData->uiLanguage, pTarget); + } + else + error_log("SD2: DoSimulateScriptTextForMap entry %i has not supported chat type %u.", iTextEntry, pData->uiType); +} + //********************************* //*** Functions used internally *** @@ -274,30 +341,30 @@ bool GossipHello(Player* pPlayer, Creature* pCreature) if (!pCreature) return false; - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->pGossipHello) + if (!pTempScript || !pTempScript->pGossipHello) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pGossipHello(pPlayer, pCreature); + return pTempScript->pGossipHello(pPlayer, pCreature); } MANGOS_DLL_EXPORT -bool GOGossipHello(Player *pPlayer, GameObject *pGo) +bool GOGossipHello(Player* pPlayer, GameObject* pGo) { if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pGossipHelloGO) + if (!pTempScript || !pTempScript->pGossipHelloGO) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pGossipHelloGO(pPlayer, pGo); + return pTempScript->pGossipHelloGO(pPlayer, pGo); } MANGOS_DLL_EXPORT @@ -308,34 +375,34 @@ bool GossipSelect(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 if (!pCreature) return false; - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->pGossipSelect) + if (!pTempScript || !pTempScript->pGossipSelect) return false; // pPlayer->PlayerTalkClass->ClearMenus(); // this expression is wrong, where 'return false' from script's GossipSelect // not return menu ID (cleared in this string) and not allow to work with database-based menus - return tmpscript->pGossipSelect(pPlayer, pCreature, uiSender, uiAction); + return pTempScript->pGossipSelect(pPlayer, pCreature, uiSender, uiAction); } MANGOS_DLL_EXPORT -bool GOGossipSelect(Player *pPlayer, GameObject *pGo, uint32 sender, uint32 action) +bool GOGossipSelect(Player* pPlayer, GameObject* pGo, uint32 uiSender, uint32 uiAction) { - debug_log("SD2: GO Gossip selection, sender: %u, action: %u", sender, action); + debug_log("SD2: GO Gossip selection, sender: %u, action: %u", uiSender, uiAction); if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pGossipSelectGO) + if (!pTempScript || !pTempScript->pGossipSelectGO) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pGossipSelectGO(pPlayer, pGo, sender, action); + return pTempScript->pGossipSelectGO(pPlayer, pGo, uiSender, uiAction); } MANGOS_DLL_EXPORT @@ -346,32 +413,32 @@ bool GossipSelectWithCode(Player* pPlayer, Creature* pCreature, uint32 uiSender, if (!pCreature) return false; - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->pGossipSelectWithCode) + if (!pTempScript || !pTempScript->pGossipSelectWithCode) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pGossipSelectWithCode(pPlayer, pCreature, uiSender, uiAction, sCode); + return pTempScript->pGossipSelectWithCode(pPlayer, pCreature, uiSender, uiAction, sCode); } MANGOS_DLL_EXPORT -bool GOGossipSelectWithCode(Player *pPlayer, GameObject *pGo, uint32 sender, uint32 action, const char* sCode) +bool GOGossipSelectWithCode(Player* pPlayer, GameObject* pGo, uint32 uiSender, uint32 uiAction, const char* sCode) { - debug_log("SD2: GO Gossip selection with code, sender: %u, action: %u", sender, action); + debug_log("SD2: GO Gossip selection with code, sender: %u, action: %u", uiSender, uiAction); if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pGossipSelectGOWithCode) + if (!pTempScript || !pTempScript->pGossipSelectGOWithCode) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pGossipSelectGOWithCode(pPlayer, pGo, sender, action, sCode); + return pTempScript->pGossipSelectGOWithCode(pPlayer, pGo, uiSender, uiAction, sCode); } MANGOS_DLL_EXPORT @@ -380,14 +447,14 @@ bool QuestAccept(Player* pPlayer, Creature* pCreature, const Quest* pQuest) if (!pCreature) return false; - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->pQuestAcceptNPC) + if (!pTempScript || !pTempScript->pQuestAcceptNPC) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pQuestAcceptNPC(pPlayer, pCreature, pQuest); + return pTempScript->pQuestAcceptNPC(pPlayer, pCreature, pQuest); } MANGOS_DLL_EXPORT @@ -396,27 +463,27 @@ bool QuestRewarded(Player* pPlayer, Creature* pCreature, Quest const* pQuest) if (!pCreature) return false; - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->pQuestRewardedNPC) + if (!pTempScript || !pTempScript->pQuestRewardedNPC) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pQuestRewardedNPC(pPlayer, pCreature, pQuest); + return pTempScript->pQuestRewardedNPC(pPlayer, pCreature, pQuest); } MANGOS_DLL_EXPORT uint32 GetNPCDialogStatus(Player* pPlayer, Creature* pCreature) { - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->pDialogStatusNPC) + if (!pTempScript || !pTempScript->pDialogStatusNPC) return 100; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pDialogStatusNPC(pPlayer, pCreature); + return pTempScript->pDialogStatusNPC(pPlayer, pCreature); } MANGOS_DLL_EXPORT @@ -425,14 +492,14 @@ uint32 GetGODialogStatus(Player* pPlayer, GameObject* pGo) if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pDialogStatusGO) + if (!pTempScript || !pTempScript->pDialogStatusGO) return 100; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pDialogStatusGO(pPlayer, pGo); + return pTempScript->pDialogStatusGO(pPlayer, pGo); } MANGOS_DLL_EXPORT @@ -441,14 +508,14 @@ bool ItemQuestAccept(Player* pPlayer, Item* pItem, Quest const* pQuest) if (!pItem) return false; - Script *tmpscript = m_scripts[pItem->GetProto()->ScriptId]; + Script* pTempScript = m_scripts[pItem->GetProto()->ScriptId]; - if (!tmpscript || !tmpscript->pQuestAcceptItem) + if (!pTempScript || !pTempScript->pQuestAcceptItem) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pQuestAcceptItem(pPlayer, pItem, pQuest); + return pTempScript->pQuestAcceptItem(pPlayer, pItem, pQuest); } MANGOS_DLL_EXPORT @@ -457,12 +524,12 @@ bool GOUse(Player* pPlayer, GameObject* pGo) if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pGOUse) + if (!pTempScript || !pTempScript->pGOUse) return false; - return tmpscript->pGOUse(pPlayer, pGo); + return pTempScript->pGOUse(pPlayer, pGo); } MANGOS_DLL_EXPORT @@ -471,14 +538,14 @@ bool GOQuestAccept(Player* pPlayer, GameObject* pGo, const Quest* pQuest) if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pQuestAcceptGO) + if (!pTempScript || !pTempScript->pQuestAcceptGO) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pQuestAcceptGO(pPlayer, pGo, pQuest); + return pTempScript->pQuestAcceptGO(pPlayer, pGo, pQuest); } MANGOS_DLL_EXPORT @@ -487,37 +554,37 @@ bool GOQuestRewarded(Player* pPlayer, GameObject* pGo, Quest const* pQuest) if (!pGo) return false; - Script *tmpscript = m_scripts[pGo->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pGo->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pQuestRewardedGO) + if (!pTempScript || !pTempScript->pQuestRewardedGO) return false; pPlayer->PlayerTalkClass->ClearMenus(); - return tmpscript->pQuestRewardedGO(pPlayer, pGo, pQuest); + return pTempScript->pQuestRewardedGO(pPlayer, pGo, pQuest); } MANGOS_DLL_EXPORT bool AreaTrigger(Player* pPlayer, AreaTriggerEntry const* atEntry) { - Script *tmpscript = m_scripts[GetAreaTriggerScriptId(atEntry->id)]; + Script* pTempScript = m_scripts[GetAreaTriggerScriptId(atEntry->id)]; - if (!tmpscript || !tmpscript->pAreaTrigger) + if (!pTempScript || !pTempScript->pAreaTrigger) return false; - return tmpscript->pAreaTrigger(pPlayer, atEntry); + return pTempScript->pAreaTrigger(pPlayer, atEntry); } MANGOS_DLL_EXPORT bool ProcessEvent(uint32 uiEventId, Object* pSource, Object* pTarget, bool bIsStart) { - Script *tmpscript = m_scripts[GetEventIdScriptId(uiEventId)]; + Script* pTempScript = m_scripts[GetEventIdScriptId(uiEventId)]; - if (!tmpscript || !tmpscript->pProcessEventId) + if (!pTempScript || !pTempScript->pProcessEventId) return false; // bIsStart may be false, when event is from taxi node events (arrival=false, departure=true) - return tmpscript->pProcessEventId(uiEventId, pSource, pTarget, bIsStart); + return pTempScript->pProcessEventId(uiEventId, pSource, pTarget, bIsStart); } MANGOS_DLL_EXPORT @@ -526,12 +593,12 @@ CreatureAI* GetCreatureAI(Creature* pCreature) if (!pCreature) return false; - Script *tmpscript = m_scripts[pCreature->GetScriptId()]; + Script* pTempScript = m_scripts[pCreature->GetScriptId()]; - if (!tmpscript || !tmpscript->GetAI) + if (!pTempScript || !pTempScript->GetAI) return NULL; - return tmpscript->GetAI(pCreature); + return pTempScript->GetAI(pCreature); } MANGOS_DLL_EXPORT @@ -540,12 +607,12 @@ bool ItemUse(Player* pPlayer, Item* pItem, SpellCastTargets const& targets) if (!pItem) return false; - Script *tmpscript = m_scripts[pItem->GetProto()->ScriptId]; + Script* pTempScript = m_scripts[pItem->GetProto()->ScriptId]; - if (!tmpscript || !tmpscript->pItemUse) + if (!pTempScript || !pTempScript->pItemUse) return false; - return tmpscript->pItemUse(pPlayer, pItem, targets); + return pTempScript->pItemUse(pPlayer, pItem, targets); } MANGOS_DLL_EXPORT @@ -554,12 +621,12 @@ bool EffectDummyCreature(Unit* pCaster, uint32 spellId, SpellEffectIndex effInde if (!pTarget) return false; - Script *tmpscript = m_scripts[pTarget->GetScriptId()]; + Script* pTempScript = m_scripts[pTarget->GetScriptId()]; - if (!tmpscript || !tmpscript->pEffectDummyNPC) + if (!pTempScript || !pTempScript->pEffectDummyNPC) return false; - return tmpscript->pEffectDummyNPC(pCaster, spellId, effIndex, pTarget); + return pTempScript->pEffectDummyNPC(pCaster, spellId, effIndex, pTarget); } MANGOS_DLL_EXPORT @@ -568,12 +635,12 @@ bool EffectDummyGameObject(Unit* pCaster, uint32 spellId, SpellEffectIndex effIn if (!pTarget) return false; - Script *tmpscript = m_scripts[pTarget->GetGOInfo()->ScriptId]; + Script* pTempScript = m_scripts[pTarget->GetGOInfo()->ScriptId]; - if (!tmpscript || !tmpscript->pEffectDummyGO) + if (!pTempScript || !pTempScript->pEffectDummyGO) return false; - return tmpscript->pEffectDummyGO(pCaster, spellId, effIndex, pTarget); + return pTempScript->pEffectDummyGO(pCaster, spellId, effIndex, pTarget); } MANGOS_DLL_EXPORT @@ -582,34 +649,34 @@ bool EffectDummyItem(Unit* pCaster, uint32 spellId, SpellEffectIndex effIndex, I if (!pTarget) return false; - Script *tmpscript = m_scripts[pTarget->GetProto()->ScriptId]; + Script* pTempScript = m_scripts[pTarget->GetProto()->ScriptId]; - if (!tmpscript || !tmpscript->pEffectDummyItem) + if (!pTempScript || !pTempScript->pEffectDummyItem) return false; - return tmpscript->pEffectDummyItem(pCaster, spellId, effIndex, pTarget); + return pTempScript->pEffectDummyItem(pCaster, spellId, effIndex, pTarget); } MANGOS_DLL_EXPORT -bool AuraDummy(Aura const* pAura, bool apply) +bool AuraDummy(Aura const* pAura, bool bApply) { - Script *tmpscript = m_scripts[((Creature*)pAura->GetTarget())->GetScriptId()]; + Script* pTempScript = m_scripts[((Creature*)pAura->GetTarget())->GetScriptId()]; - if (!tmpscript || !tmpscript->pEffectAuraDummy) + if (!pTempScript || !pTempScript->pEffectAuraDummy) return false; - return tmpscript->pEffectAuraDummy(pAura, apply); + return pTempScript->pEffectAuraDummy(pAura, bApply); } MANGOS_DLL_EXPORT InstanceData* CreateInstanceData(Map* pMap) { - Script *tmpscript = m_scripts[pMap->GetScriptId()]; + Script* pTempScript = m_scripts[pMap->GetScriptId()]; - if (!tmpscript || !tmpscript->GetInstanceData) + if (!pTempScript || !pTempScript->GetInstanceData) return NULL; - return tmpscript->GetInstanceData(pMap); + return pTempScript->GetInstanceData(pMap); } Script* GetScriptByName(std::string scriptName) diff --git a/ScriptMgr.h b/ScriptMgr.h index 97bdba9..d0f3170 100644 --- a/ScriptMgr.h +++ b/ScriptMgr.h @@ -22,6 +22,7 @@ class Unit; class WorldObject; class Aura; class Object; +class ObjectGuid; // ********************************************************* // ************** Some defines used globally *************** @@ -30,10 +31,11 @@ class Object; #define VISIBLE_RANGE (166.0f) // MAX visible range (size of grid) #define DEFAULT_TEXT "" -// Some typedefs for storing GUIDs -typedef std::list GUIDList; -typedef std::set GUIDSet; -typedef std::vector GUIDVector; +// Some typedefs for storing Guids +typedef std::list GUIDList; +typedef std::set GUIDSet; +typedef std::vector GUIDVector; +typedef std::map EntryGuidMap; /* Escort Factions * TODO: find better namings and definitions. @@ -112,6 +114,7 @@ struct Script // Generic scripting text function void DoScriptText(int32 iTextEntry, WorldObject* pSource, Unit* pTarget = NULL); +void DoOrSimulateScriptTextForMap(int32 iTextEntry, uint32 uiCreatureEntry, Map* pMap, Creature* pCreatureSource = NULL, Unit* pTarget = NULL); //DB query QueryResult* strSD2Pquery(char*); diff --git a/VC100/100ScriptDev2.vcxproj b/VC100/100ScriptDev2.vcxproj index d81041e..d6e0df8 100644 --- a/VC100/100ScriptDev2.vcxproj +++ b/VC100/100ScriptDev2.vcxproj @@ -441,7 +441,7 @@ - + @@ -707,7 +707,7 @@ - + @@ -720,13 +720,14 @@ - + + Create diff --git a/VC100/100ScriptDev2.vcxproj.filters b/VC100/100ScriptDev2.vcxproj.filters index 2062b8d..d0b576c 100644 --- a/VC100/100ScriptDev2.vcxproj.filters +++ b/VC100/100ScriptDev2.vcxproj.filters @@ -298,9 +298,6 @@ {e35abead-2389-4eb9-88bd-70e6fe5636b5} - - {569ce85f-1d25-427e-bf22-a4590ecf37ee} - @@ -996,7 +993,7 @@ scripts\kalimdor\razorfen_kraul - + scripts\kalimdor\razorfen_kraul @@ -1767,7 +1764,7 @@ scripts\outland\tempest_keep\botanica - + scripts\outland\tempest_keep\the_eye @@ -1806,7 +1803,7 @@ scripts\world - + scripts\world @@ -1839,37 +1836,13 @@ system + + + + + + - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\custom - - - scripts\northrend\ulduar\ulduar - - - scripts\northrend\ulduar\ulduar - - - scripts\northrend\ulduar\ulduar - @@ -2116,30 +2089,16 @@ system + + + + + + + - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - - - scripts\outdoor_pvp - diff --git a/VC90/90ScriptDev2.vcproj b/VC90/90ScriptDev2.vcproj index 9d5aca5..e53d3b6 100644 --- a/VC90/90ScriptDev2.vcproj +++ b/VC90/90ScriptDev2.vcproj @@ -3063,6 +3063,10 @@ RelativePath="..\scripts\world\npcs_special.cpp" > + + diff --git a/base/BSW_ai.cpp b/base/BSW_ai.cpp index 22a2900..a3f47d7 100644 --- a/base/BSW_ai.cpp +++ b/base/BSW_ai.cpp @@ -487,7 +487,7 @@ void BSWScriptedAI::_fillEmptyDataField() { if (m_BSWRecords[i].m_uiSpellEntry[j] == 0) { - SpellEntry const* spell = GetSpellEntryByDifficulty(m_BSWRecords[i].m_uiSpellEntry[0],(Difficulty)j); + SpellEntry const* spell = GetSpellEntryByDifficulty(m_BSWRecords[i].m_uiSpellEntry[0],(Difficulty)j,true); if (spell) m_BSWRecords[i].m_uiSpellEntry[j] = spell->Id; else m_BSWRecords[i].m_uiSpellEntry[j] = m_BSWRecords[i].m_uiSpellEntry[j-1]; @@ -620,7 +620,7 @@ bool BSWScriptedAI::_doRemove(uint32 SpellID, Unit* pTarget, uint8 index) } else if (_auraCount(SpellID,pTarget,(SpellEffectIndex)index) > 1) { - if (SpellAuraHolder* holder = pTarget->GetSpellAuraHolder(SpellID, pTarget->GetGUID())) + if (SpellAuraHolder* holder = pTarget->GetSpellAuraHolder(SpellID, pTarget->GetObjectGuid())) { if (holder->ModStackAmount(-1)) { @@ -733,7 +733,7 @@ bool BSWScriptedAI::_doAura(uint32 SpellID, Unit* pTarget, SpellEffectIndex inde bool addedToExisting = true; - SpellAuraHolder* holder = pTarget->GetSpellAuraHolder(SpellID, pTarget->GetGUID()); + SpellAuraHolder* holder = pTarget->GetSpellAuraHolder(SpellID, pTarget->GetObjectGuid()); Aura* aura = NULL; @@ -775,7 +775,7 @@ bool BSWScriptedAI::_doAura(uint32 SpellID, Unit* pTarget, SpellEffectIndex inde return false; }; -CanCastResult BSWScriptedAI::_DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32 uiCastFlags, uint64 uiOriginalCasterGUID) +CanCastResult BSWScriptedAI::_DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32 uiCastFlags, ObjectGuid uiOriginalCasterGUID) { if (!pTarget || !pTarget->IsInWorld() || !pTarget->IsInMap(m_creature)|| !pTarget->isAlive()) return CAST_FAIL_OTHER; diff --git a/base/BSW_ai.h b/base/BSW_ai.h index 4566603..c9f2c57 100644 --- a/base/BSW_ai.h +++ b/base/BSW_ai.h @@ -259,7 +259,7 @@ struct MANGOS_DLL_DECL BSWScriptedAI : public ScriptedAI bool _QuerySpellPeriod(uint8 m_uiSpellIdx, uint32 diff, bool ignorecast = false); - CanCastResult _DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32 uiCastFlags = 0, uint64 uiOriginalCasterGUID = 0); + CanCastResult _DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32 uiCastFlags = 0, ObjectGuid uiOriginalCasterGUID = ObjectGuid()); bool _doRemove(uint8 m_uiSpellIdx, Unit* pTarget = NULL, uint8 index = EFFECT_INDEX_ALL); diff --git a/base/BSW_instance.cpp b/base/BSW_instance.cpp index 23e7959..8eed586 100644 --- a/base/BSW_instance.cpp +++ b/base/BSW_instance.cpp @@ -13,7 +13,6 @@ BSWScriptedInstance::BSWScriptedInstance(Map* pMap) : ScriptedInstance(pMap) m_auiCreatureID = 0; m_auiEventLock = false; m_pMap = pMap; - m_objectGuidMap.clear(); }; BSWScriptedInstance::~BSWScriptedInstance() @@ -37,9 +36,9 @@ void BSWScriptedInstance::DoCompleteAchievement(uint32 uiAchievmentId) debug_log("BSW: DoCompleteAchievement attempt set data, but no players in map."); } -void BSWScriptedInstance::DoOpenDoor(uint64 guid) +void BSWScriptedInstance::DoOpenDoor(ObjectGuid guid) { - if (!guid) + if (guid.IsEmpty()) return; GameObject* pGo = instance->GetGameObject(guid); @@ -47,12 +46,12 @@ void BSWScriptedInstance::DoOpenDoor(uint64 guid) if (pGo) pGo->SetGoState(GO_STATE_ACTIVE); else - debug_log("BSW: DoOpenDoor attempt set data to object %u, but no this object", guid); + debug_log("BSW: DoOpenDoor attempt set data to object %u, but no this object", guid.GetCounter()); } -void BSWScriptedInstance::DoCloseDoor(uint64 guid) +void BSWScriptedInstance::DoCloseDoor(ObjectGuid guid) { - if (!guid) + if (guid.IsEmpty()) return; GameObject* pGo = instance->GetGameObject(guid); @@ -60,33 +59,31 @@ void BSWScriptedInstance::DoCloseDoor(uint64 guid) if (pGo) pGo->SetGoState(GO_STATE_READY); else - debug_log("BSW: DoCloseDoor attempt set data to object %u, but no this object", guid); + debug_log("BSW: DoCloseDoor attempt set data to object %u, but no this object", guid.GetCounter()); } -void BSWScriptedInstance::DoOpenDoor(ObjectGuid guid) +void BSWScriptedInstance::DoOpenDoor(uint32 entry) { - if (guid.IsEmpty()) - return; - - GameObject* pGo = instance->GetGameObject(guid); - - if (pGo) - pGo->SetGoState(GO_STATE_ACTIVE); + EntryGuidMap::iterator find = m_mGoEntryGuidStore.find(entry); + if (find != m_mGoEntryGuidStore.end()) + { + ObjectGuid guid = find->second; + DoOpenDoor(guid); + } else - debug_log("BSW: DoOpenDoor attempt set data to object %u, but no this object", guid); + debug_log("BSW: Script call DoOpenDoor (by Entry), but no gameobject of entry %u was created yet, or it was not stored by script for map %u.", entry, instance->GetId()); } -void BSWScriptedInstance::DoCloseDoor(ObjectGuid guid) +void BSWScriptedInstance::DoCloseDoor(uint32 entry) { - if (guid.IsEmpty()) - return; - - GameObject* pGo = instance->GetGameObject(guid); - - if (pGo) - pGo->SetGoState(GO_STATE_READY); + EntryGuidMap::iterator find = m_mGoEntryGuidStore.find(entry); + if (find != m_mGoEntryGuidStore.end()) + { + ObjectGuid guid = find->second; + DoCloseDoor(guid); + } else - debug_log("BSW: DoCloseDoor attempt set data to object %u, but no this object", guid); + debug_log("BSW: Script call DoCloseDoor (by Entry), but no gameobject of entry %u was created yet, or it was not stored by script for map %u.", entry, instance->GetId()); } uint32 BSWScriptedInstance::GetEvent(uint32 creatureID) @@ -129,35 +126,6 @@ bool BSWScriptedInstance::GetEventTimer(uint32 creatureID, const uint32 diff) } } -void BSWScriptedInstance::SetObject(Object* object) -{ - if (!object) - return; - - m_objectGuidMap.insert(std::make_pair(object->GetEntry(), object->GetObjectGuid())); - -} - -ObjectGuid const& BSWScriptedInstance::GetInstanceObjectGuid(uint32 entry) -{ - std::map::const_iterator itr = m_objectGuidMap.find(entry); - - if (itr != m_objectGuidMap.end()) - return itr->second; - else - return ObjectGuid(); - -} - -uint64 BSWScriptedInstance::GetInstanceObjectGUID(uint32 entry) -{ - ObjectGuid guid = GetInstanceObjectGuid(entry); - if (guid.IsEmpty()) - return 0; - else - return guid.GetRawValue(); -} - void BSWScriptedInstance::SetCriteriaState(uint32 criteria_id, bool state, Player* player) { if (!criteria_id) diff --git a/base/BSW_instance.h b/base/BSW_instance.h index 3402ff3..9c8f85e 100644 --- a/base/BSW_instance.h +++ b/base/BSW_instance.h @@ -16,17 +16,11 @@ class MANGOS_DLL_DECL BSWScriptedInstance : public ScriptedInstance //sends completed achievments to all players in instance void DoCompleteAchievement(uint32 uiAchievmentId); - void DoOpenDoor(uint64 guid); - void DoCloseDoor(uint64 guid); void DoOpenDoor(ObjectGuid guid); void DoCloseDoor(ObjectGuid guid); - uint64 GetInstanceObjectGUID(uint32 entry); - ObjectGuid const& GetInstanceObjectGuid(uint32 entry); - void SetObject(Object* object); - void SetInstanceObject(GameObject* go) { if (go) SetObject((Object*)go); }; - void SetInstanceUnit(Unit* unit) { if (unit) SetObject((Object*)unit); }; - void SetInstanceCreature(Creature* creature) { if (creature) SetObject((Object*)creature); }; + void DoOpenDoor(uint32 entry); + void DoCloseDoor(uint32 entry); void SetCriteriaState(uint32 criteria_id, bool state = true, Player* player = NULL); bool GetCriteriaState(uint32 criteria_id, Player const* player = NULL); @@ -41,7 +35,7 @@ class MANGOS_DLL_DECL BSWScriptedInstance : public ScriptedInstance uint32 m_auiEventTimer; bool m_auiEventLock; Map* m_pMap; - std::map m_objectGuidMap; + std::map m_groupCriteriaMap; std::multimap m_personalCriteriaMap; diff --git a/base/escort_ai.cpp b/base/escort_ai.cpp index cdd1551..e7471fa 100644 --- a/base/escort_ai.cpp +++ b/base/escort_ai.cpp @@ -32,6 +32,27 @@ npc_escortAI::npc_escortAI(Creature* pCreature) : ScriptedAI(pCreature), m_bCanReturnToStart(false) {} +void npc_escortAI::GetAIInformation(ChatHandler& reader) +{ + std::ostringstream oss; + + oss << "EscortAI "; + if (m_playerGuid) + oss << "started for " << m_playerGuid.GetString() << " "; + if (m_pQuestForEscort) + oss << "started with quest " << m_pQuestForEscort->GetQuestId(); + + if (HasEscortState(STATE_ESCORT_ESCORTING)) + { + oss << "\nEscortFlags: Escorting" << (HasEscortState(STATE_ESCORT_RETURNING) ? ", Returning" : "") << (HasEscortState(STATE_ESCORT_PAUSED) ? ", Paused" : ""); + + if (CurrentWP != WaypointList.end()) + oss << "\nNext Waypoint Id = " << CurrentWP->uiId << " Position: " << CurrentWP->fX << " " << CurrentWP->fY << " " << CurrentWP->fZ; + } + + reader.PSendSysMessage(oss.str().c_str()); +} + bool npc_escortAI::IsVisible(Unit* pWho) const { if (!pWho) @@ -149,7 +170,7 @@ void npc_escortAI::MoveInLineOfSight(Unit* pWho) void npc_escortAI::JustDied(Unit* pKiller) { - if (!HasEscortState(STATE_ESCORT_ESCORTING) || m_playerGuid.IsEmpty() || !m_pQuestForEscort) + if (!HasEscortState(STATE_ESCORT_ESCORTING) || !m_playerGuid || !m_pQuestForEscort) return; if (Player* pPlayer = GetPlayerForEscort()) @@ -295,7 +316,7 @@ void npc_escortAI::UpdateAI(const uint32 uiDiff) } //Check if player or any member of his group is within range - if (HasEscortState(STATE_ESCORT_ESCORTING) && !m_playerGuid.IsEmpty() && !m_creature->getVictim() && !HasEscortState(STATE_ESCORT_RETURNING)) + if (HasEscortState(STATE_ESCORT_ESCORTING) && m_playerGuid && !m_creature->getVictim() && !HasEscortState(STATE_ESCORT_RETURNING)) { if (m_uiPlayerCheckTimer < uiDiff) { diff --git a/base/escort_ai.h b/base/escort_ai.h index ca49cf8..165d99d 100644 --- a/base/escort_ai.h +++ b/base/escort_ai.h @@ -36,6 +36,8 @@ struct MANGOS_DLL_DECL npc_escortAI : public ScriptedAI explicit npc_escortAI(Creature* pCreature); ~npc_escortAI() {} + void GetAIInformation(ChatHandler& reader); + virtual void Aggro(Unit*); virtual void Reset() = 0; diff --git a/base/follower_ai.cpp b/base/follower_ai.cpp index a624836..2413617 100644 --- a/base/follower_ai.cpp +++ b/base/follower_ai.cpp @@ -121,7 +121,7 @@ void FollowerAI::MoveInLineOfSight(Unit* pWho) void FollowerAI::JustDied(Unit* pKiller) { - if (!HasFollowState(STATE_FOLLOW_INPROGRESS) || m_leaderGuid.IsEmpty() || !m_pQuestForFollow) + if (!HasFollowState(STATE_FOLLOW_INPROGRESS) || !m_leaderGuid || !m_pQuestForFollow) return; //TODO: need a better check for quests with time limit. diff --git a/base/guard_ai.h b/base/guard_ai.h index 9438225..b3bd682 100644 --- a/base/guard_ai.h +++ b/base/guard_ai.h @@ -30,20 +30,19 @@ struct MANGOS_DLL_DECL guardAI : public ScriptedAI explicit guardAI(Creature* pCreature); ~guardAI() {} - uint32 m_uiGlobalCooldown; //This variable acts like the global cooldown that players have (1.5 seconds) - uint32 m_uiBuffTimer; //This variable keeps track of buffs + uint32 m_uiGlobalCooldown; // This variable acts like the global cooldown that players have (1.5 seconds) + uint32 m_uiBuffTimer; // This variable keeps track of buffs - void Reset(); + void Reset(); - void Aggro(Unit *pWho); + void Aggro(Unit *pWho); - void JustDied(Unit *pKiller); + void JustDied(Unit *pKiller); - void UpdateAI(const uint32 uiDiff); - - //common used for guards in main cities - void DoReplyToTextEmote(uint32 uiTextEmote); + void UpdateAI(const uint32 uiDiff); + // Commonly used for guards in main cities + void DoReplyToTextEmote(uint32 uiTextEmote); }; struct MANGOS_DLL_DECL guardAI_orgrimmar : public guardAI diff --git a/include/sc_creature.cpp b/include/sc_creature.cpp index c0db3cf..16c6770 100644 --- a/include/sc_creature.cpp +++ b/include/sc_creature.cpp @@ -20,6 +20,11 @@ ScriptedAI::ScriptedAI(Creature* pCreature) : CreatureAI(pCreature), m_uiEvadeCheckCooldown(2500) {} +void ScriptedAI::GetAIInformation(ChatHandler& reader) +{ + reader.PSendSysMessage("ScriptedAI, combat movement is %s", reader.GetOnOffStr(m_bCombatMovement)); +} + bool ScriptedAI::IsVisible(Unit* pWho) const { if (!pWho) @@ -182,7 +187,7 @@ SpellEntry const* ScriptedAI::SelectSpell(Unit* pTarget, int32 uiSchool, int32 u //Check if each spell is viable(set it to null if not) for (uint8 i = 0; i < 4; ++i) { - pTempSpell = GetSpellStore()->LookupEntry(m_creature->m_spells[i]); + pTempSpell = GetSpellStore()->LookupEntry(m_creature->GetSpell(i)); //This spell doesn't exist if (!pTempSpell) @@ -190,11 +195,11 @@ SpellEntry const* ScriptedAI::SelectSpell(Unit* pTarget, int32 uiSchool, int32 u // Targets and Effects checked first as most used restrictions //Check the spell targets if specified - if (selectTargets && !(SpellSummary[m_creature->m_spells[i]].Targets & (1 << (selectTargets-1)))) + if (selectTargets && !(SpellSummary[m_creature->GetSpell(i)].Targets & (1 << (selectTargets-1)))) continue; //Check the type of spell if we are looking for a specific spell type - if (selectEffects && !(SpellSummary[m_creature->m_spells[i]].Effects & (1 << (selectEffects-1)))) + if (selectEffects && !(SpellSummary[m_creature->GetSpell(i)].Effects & (1 << (selectEffects-1)))) continue; //Check for school if specified @@ -522,6 +527,11 @@ bool ScriptedAI::EnterEvadeIfOutOfCombatArea(const uint32 uiDiff) return true; } +void Scripted_NoMovementAI::GetAIInformation(ChatHandler& reader) +{ + reader.PSendSysMessage("Subclass of Scripted_NoMovementAI"); +} + void Scripted_NoMovementAI::AttackStart(Unit* pWho) { if (pWho && m_creature->Attack(pWho, true)) diff --git a/include/sc_creature.h b/include/sc_creature.h index 733895a..b63560d 100644 --- a/include/sc_creature.h +++ b/include/sc_creature.h @@ -7,6 +7,7 @@ #include "CreatureAI.h" #include "Creature.h" +#include "Chat.h" //Spell targets used by SelectSpell enum SelectTarget @@ -48,6 +49,8 @@ struct MANGOS_DLL_DECL ScriptedAI : public CreatureAI //CreatureAI Functions //************* + void GetAIInformation(ChatHandler& reader); + //Called if IsVisible(Unit *who) is true at each *who move void MoveInLineOfSight(Unit*); @@ -176,6 +179,8 @@ struct MANGOS_DLL_DECL Scripted_NoMovementAI : public ScriptedAI { Scripted_NoMovementAI(Creature* pCreature) : ScriptedAI(pCreature) {} + void GetAIInformation(ChatHandler& reader); + //Called at each attack of m_creature by any victim void AttackStart(Unit*); }; diff --git a/include/sc_gossip.h b/include/sc_gossip.h index 1d966cd..f9b863f 100644 --- a/include/sc_gossip.h +++ b/include/sc_gossip.h @@ -140,8 +140,8 @@ extern uint32 GetSkillLevel(Player* pPlayer, uint32 uiSkill); #define ADD_GOSSIP_ITEM_ID(uiIcon, iTextId, uiSender, uiOptionId) PlayerTalkClass->GetGossipMenu().AddMenuItem(uiIcon, iTextId, uiSender, uiOptionId, 0, 0) #define ADD_GOSSIP_ITEM_EXTENDED(uiIcon, chrText, uiSender, uiOptionId, chrBoxMessage, uiBoxMoney, bCode) PlayerTalkClass->GetGossipMenu().AddMenuItem(uiIcon, chrText, uiSender, uiOptionId, chrBoxMessage, uiBoxMoney, bCode) -// This fuction Sends the current menu to show to client, uiTextId - NPCTEXTID(uint32) , uiGuid - npc guid(uint64) -#define SEND_GOSSIP_MENU(uiTextId, uiGuid) PlayerTalkClass->SendGossipMenu(uiTextId, uiGuid) +// This fuction Sends the current menu to show to client, uiTextId - NPCTEXTID(uint32) , uiGuid - npc guid(ObjectGuid) +#define SEND_GOSSIP_MENU(uiTextId, guid) PlayerTalkClass->SendGossipMenu(uiTextId, guid) // This fuction shows POI(point of interest) to client. // a - position X diff --git a/include/sc_instance.cpp b/include/sc_instance.cpp index 1c44734..94dc9a5 100644 --- a/include/sc_instance.cpp +++ b/include/sc_instance.cpp @@ -4,10 +4,16 @@ #include "precompiled.h" -//Optional uiWithRestoreTime. If not defined, autoCloseTime will be used (if not 0 by default in *_template) +/** + Function that uses a door or a button + + @param guid The ObjectGuid of the Door/ Button that will be used + @param uiWithRestoreTime (in seconds) if == 0 autoCloseTime will be used (if not 0 by default in *_template) + @param bUseAlternativeState Use to alternative state + */ void ScriptedInstance::DoUseDoorOrButton(ObjectGuid guid, uint32 uiWithRestoreTime, bool bUseAlternativeState) { - if (guid.IsEmpty()) + if (!guid) return; if (GameObject* pGo = instance->GetGameObject(guid)) @@ -24,9 +30,26 @@ void ScriptedInstance::DoUseDoorOrButton(ObjectGuid guid, uint32 uiWithRestoreTi } } +/// Function that uses a door or button that is stored in m_mGoEntryGuidStore +void ScriptedInstance::DoUseDoorOrButton(uint32 uiEntry, uint32 uiWithRestoreTime /*= 0*/, bool bUseAlternativeState /*= false*/) +{ + EntryGuidMap::iterator find = m_mGoEntryGuidStore.find(uiEntry); + if (find != m_mGoEntryGuidStore.end()) + DoUseDoorOrButton(find->second, uiWithRestoreTime, bUseAlternativeState); + else + // Output log, possible reason is not added GO to storage, or not yet loaded + debug_log("SD2: Script call DoUseDoorOrButton(by Entry), but no gameobject of entry %u was created yet, or it was not stored by script for map %u.", uiEntry, instance->GetId()); +} + +/** + Function that respawns a despawned GameObject with given time + + @param guid The ObjectGuid of the GO that will be respawned + @param uiTimeToDespawn (in seconds) Despawn the GO after this time, default is a minute + */ void ScriptedInstance::DoRespawnGameObject(ObjectGuid guid, uint32 uiTimeToDespawn) { - if (guid.IsEmpty()) + if (!guid) return; if (GameObject* pGo = instance->GetGameObject(guid)) @@ -44,6 +67,23 @@ void ScriptedInstance::DoRespawnGameObject(ObjectGuid guid, uint32 uiTimeToDespa } } +/// Function that respawns a despawned GO that is stored in m_mGoEntryGuidStore +void ScriptedInstance::DoRespawnGameObject(uint32 uiEntry, uint32 uiTimeToDespawn) +{ + EntryGuidMap::iterator find = m_mGoEntryGuidStore.find(uiEntry); + if (find != m_mGoEntryGuidStore.end()) + DoRespawnGameObject(find->second, uiTimeToDespawn); + else + // Output log, possible reason is not added GO to storage, or not yet loaded; + debug_log("SD2: Script call DoRespawnGameObject(by Entry), but no gameobject of entry %u was created yet, or it was not stored by script for map %u.", uiEntry, instance->GetId()); +} + +/** + Helper function to update a world state for all players in the map + + @param uiStateId The WorldState that will be set for all players in the map + @param uiStateData The Value to which the State will be set to + */ void ScriptedInstance::DoUpdateWorldState(uint32 uiStateId, uint32 uiStateData) { Map::PlayerList const& lPlayers = instance->GetPlayers(); @@ -76,6 +116,7 @@ void ScriptedInstance::DoCompleteAchievement(uint32 uiAchievmentId) debug_log("SD2: DoCompleteAchievement attempt set data but no players in map."); } +/// Get the first found Player* (with requested properties) in the map. Can return NULL. Player* ScriptedInstance::GetPlayerInMap(bool bOnlyAlive /*=false*/, bool bCanBeGamemaster /*=true*/) { Map::PlayerList const& lPlayers = instance->GetPlayers(); @@ -90,7 +131,40 @@ Player* ScriptedInstance::GetPlayerInMap(bool bOnlyAlive /*=false*/, bool bCanBe return NULL; } -void ScriptedInstance::DoStartTimedAchievement(AchievementCriteriaTypes tCriteriaType, uint32 uiTimedCriteriaMiscId) +/// Returns a pointer to a loaded GameObject that was stored in m_mGoEntryGuidStore. Can return NULL +GameObject* ScriptedInstance::GetSingleGameObjectFromStorage(uint32 uiEntry) +{ + EntryGuidMap::iterator find = m_mGoEntryGuidStore.find(uiEntry); + if (find != m_mGoEntryGuidStore.end()) + return instance->GetGameObject(find->second); + + // Output log, possible reason is not added GO to map, or not yet loaded; + debug_log("SD2: Script requested gameobject with entry %u, but no gameobject of this entry was created yet, or it was not stored by script for map %u.", uiEntry, instance->GetId()); + + return NULL; +} + +/// Returns a pointer to a loaded Creature that was stored in m_mGoEntryGuidStore. Can return NULL +Creature* ScriptedInstance::GetSingleCreatureFromStorage(uint32 uiEntry, bool bSkipDebugLog /*=false*/) +{ + EntryGuidMap::iterator find = m_mNpcEntryGuidStore.find(uiEntry); + if (find != m_mNpcEntryGuidStore.end()) + return instance->GetCreature(find->second); + + // Output log, possible reason is not added GO to map, or not yet loaded; + if (!bSkipDebugLog) + debug_log("SD2: Script requested creature with entry %u, but no npc of this entry was created yet, or it was not stored by script for map %u.", uiEntry, instance->GetId()); + + return NULL; +} + +/** + Helper function to start a timed achievement criteria for players in the map + + @param criteriaType The Type that is required to complete the criteria, see enum AchievementCriteriaTypes in MaNGOS + @param uiTimedCriteriaMiscId The ID that identifies how the criteria is started + */ +void ScriptedInstance::DoStartTimedAchievement(AchievementCriteriaTypes criteriaType, uint32 uiTimedCriteriaMiscId) { Map::PlayerList const& lPlayers = instance->GetPlayers(); @@ -99,10 +173,9 @@ void ScriptedInstance::DoStartTimedAchievement(AchievementCriteriaTypes tCriteri for(Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr) { if (Player* pPlayer = itr->getSource()) - pPlayer->StartTimedAchievementCriteria(tCriteriaType, uiTimedCriteriaMiscId); + pPlayer->StartTimedAchievementCriteria(criteriaType, uiTimedCriteriaMiscId); } } else debug_log("SD2: DoStartTimedAchievement attempt start achievements but no players in map."); } - diff --git a/include/sc_instance.h b/include/sc_instance.h index a50b98f..818664d 100644 --- a/include/sc_instance.h +++ b/include/sc_instance.h @@ -26,15 +26,20 @@ enum EncounterState class MANGOS_DLL_DECL ScriptedInstance : public InstanceData { public: - ScriptedInstance(Map* pMap) : InstanceData(pMap) {} ~ScriptedInstance() {} + // Default accessor functions + GameObject* GetSingleGameObjectFromStorage(uint32 uiEntry); + Creature* GetSingleCreatureFromStorage(uint32 uiEntry, bool bSkipDebugLog = false); + // Change active state of doors or buttons void DoUseDoorOrButton(ObjectGuid guid, uint32 uiWithRestoreTime = 0, bool bUseAlternativeState = false); + void DoUseDoorOrButton(uint32 uiEntry, uint32 uiWithRestoreTime = 0, bool bUseAlternativeState = false); // Respawns a GO having negative spawntimesecs in gameobject-table void DoRespawnGameObject(ObjectGuid guid, uint32 uiTimeToDespawn = MINUTE); + void DoRespawnGameObject(uint32 uiEntry, uint32 uiTimeToDespawn = MINUTE); // Sends world state update to all players in instance void DoUpdateWorldState(uint32 uiStateId, uint32 uiStateData); @@ -45,8 +50,20 @@ class MANGOS_DLL_DECL ScriptedInstance : public InstanceData // Get a Player from map Player* GetPlayerInMap(bool bOnlyAlive = false, bool bCanBeGamemaster = true); - // starts a timed achievement criteria for all players in instance - void DoStartTimedAchievement(AchievementCriteriaTypes tCriteriaType, uint32 uiTimedCriteriaMiscId); + /// Wrapper for simulating map-wide text in this instance. It is expected that the Creature is stored in m_mNpcEntryGuidStore if loaded. + void DoOrSimulateScriptTextForThisInstance(int32 iTextEntry, uint32 uiCreatureEntry) + { + // Prevent debug output in GetSingleCreatureFromStorage + DoOrSimulateScriptTextForMap(iTextEntry, uiCreatureEntry, instance, GetSingleCreatureFromStorage(uiCreatureEntry, true)); + } + // Starts a timed achievement criteria for all players in instance + void DoStartTimedAchievement(AchievementCriteriaTypes criteriaType, uint32 uiTimedCriteriaMiscId); + + protected: + // Storage for GO-Guids and NPC-Guids + EntryGuidMap m_mGoEntryGuidStore; ///< Store unique GO-Guids by entry + EntryGuidMap m_mNpcEntryGuidStore; ///< Store unique NPC-Guids by entry }; + #endif diff --git a/scripts/custom/npc_arena_honor.cpp b/scripts/custom/npc_arena_honor.cpp index e0d6e10..71c6710 100644 --- a/scripts/custom/npc_arena_honor.cpp +++ b/scripts/custom/npc_arena_honor.cpp @@ -38,7 +38,7 @@ bool GossipHello_npc_arena_honor(Player* pPlayer, Creature *pCreature) pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_HONOR_TO_ARENA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARENA_TO_HONOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARENA_TO_HONOR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - pPlayer->SEND_GOSSIP_MENU(3961,pCreature->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(3961,pCreature->GetObjectGuid()); return true; } diff --git a/scripts/custom/teleguy.cpp b/scripts/custom/teleguy.cpp index a8a7970..411e226 100644 --- a/scripts/custom/teleguy.cpp +++ b/scripts/custom/teleguy.cpp @@ -27,7 +27,7 @@ bool GossipHello_mob_teleguy(Player *player, Creature *_Creature) player->ADD_GOSSIP_ITEM( 7, "[Instances] ->" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "[Instances WotLK] ->" , GOSSIP_SENDER_MAIN, 5554); } - player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); + player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetObjectGuid()); return true; } @@ -72,7 +72,7 @@ void SendDefaultMenu_mob_teleguy(Player *player, Creature *_Creature, uint32 act player->ADD_GOSSIP_ITEM( 5, "Scarlet Monastery. 20 Silver" , GOSSIP_SENDER_MAIN, 1257); player->ADD_GOSSIP_ITEM( 7, "[More] ->" , GOSSIP_SENDER_MAIN, 5551); player->ADD_GOSSIP_ITEM( 7, "<- [Main Menu]" , GOSSIP_SENDER_MAIN, 5552); - player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); + player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetObjectGuid()); break; case 5551: //More Instances player->ADD_GOSSIP_ITEM( 5, "Uldaman. 30 Silver" , GOSSIP_SENDER_MAIN, 1258); @@ -88,7 +88,7 @@ void SendDefaultMenu_mob_teleguy(Player *player, Creature *_Creature, uint32 act player->ADD_GOSSIP_ITEM( 7, "[More] ->" , GOSSIP_SENDER_MAIN, 5553); player->ADD_GOSSIP_ITEM( 7, "<- [Back]" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "<- [Main Menu]" , GOSSIP_SENDER_MAIN, 5552); - player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); + player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetObjectGuid()); break; case 5553: //Instances 60-70 @@ -106,7 +106,7 @@ player->ADD_GOSSIP_ITEM( 7, "<- [Back]" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "<- [Main Menu]" , GOSSIP_SENDER_MAIN, 5552); -player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); +player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetObjectGuid()); break; @@ -126,7 +126,7 @@ player->ADD_GOSSIP_ITEM( 7, "<- [Back]" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "<- [Main Menu]" , GOSSIP_SENDER_MAIN, 5552); -player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); +player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetObjectGuid()); break; @@ -158,7 +158,7 @@ player->ADD_GOSSIP_ITEM( 7, "[Instances] ->" , GOSSIP_SENDER_MAIN, 5550); player->ADD_GOSSIP_ITEM( 7, "[Instances WotLK] ->" , GOSSIP_SENDER_MAIN, 5554); } -player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetGUID()); +player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,_Creature->GetObjectGuid()); break; diff --git a/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.cpp b/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.cpp index 0b459f5..4e35134 100644 --- a/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.cpp +++ b/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.cpp @@ -196,7 +196,7 @@ struct MANGOS_DLL_DECL npc_grimstoneAI : public npc_escortAI m_creature->GetRandomPoint(fX, fY, fZ, 10.0f, fcX, fcY, fcZ); pSummoned->GetMotionMaster()->MovePoint(1, fcX, fcY, fcZ); - m_lSummonedGUIDList.push_back(pSummoned->GetGUID()); + m_lSummonedGUIDList.push_back(pSummoned->GetObjectGuid()); } void DoChallengeQuestCredit() @@ -296,13 +296,13 @@ struct MANGOS_DLL_DECL npc_grimstoneAI : public npc_escortAI // Reset Doors if (m_uiEventPhase >= 9) // North Gate is opened { - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_2)); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_4)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_2); + m_pInstance->DoUseDoorOrButton(GO_ARENA_4); } else if (m_uiEventPhase >= 4) // East Gate is opened { - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_1)); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_4)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_1); + m_pInstance->DoUseDoorOrButton(GO_ARENA_4); } // Despawn Summoned Mobs @@ -327,7 +327,7 @@ struct MANGOS_DLL_DECL npc_grimstoneAI : public npc_escortAI case 0: // Shortly after spawn, start walking //DoScriptText(-1000000, m_creature); // no more text on spawn - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_4)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_4); Start(false); SetEscortPaused(false); m_uiEventTimer = 0; @@ -342,7 +342,7 @@ struct MANGOS_DLL_DECL npc_grimstoneAI : public npc_escortAI break; case 3: // Open East Gate - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_1)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_1); m_uiEventTimer = 3000; break; case 4: @@ -366,14 +366,14 @@ struct MANGOS_DLL_DECL npc_grimstoneAI : public npc_escortAI case 7: // Summoned Mobs are dead, continue event m_creature->SetVisibility(VISIBILITY_ON); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_1)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_1); //DoScriptText(-1000000, m_creature); // after killed the mobs, no say here SetEscortPaused(false); m_uiEventTimer = 0; break; case 8: // Open North Gate - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_2)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_uiEventTimer = 5000; break; case 9: @@ -397,9 +397,9 @@ struct MANGOS_DLL_DECL npc_grimstoneAI : public npc_escortAI case 10: // Boss dead m_lSummonedGUIDList.clear(); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_2)); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_3)); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_ARENA_4)); + m_pInstance->DoUseDoorOrButton(GO_ARENA_2); + m_pInstance->DoUseDoorOrButton(GO_ARENA_3); + m_pInstance->DoUseDoorOrButton(GO_ARENA_4); SetEscortPaused(false); m_uiEventTimer = 0; break; @@ -681,7 +681,7 @@ struct MANGOS_DLL_DECL npc_rocknotAI : public npc_escortAI void DoGo(uint32 id, uint32 state) { - if (GameObject* pGo = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(id))) + if (GameObject* pGo = m_pInstance->GetSingleGameObjectFromStorage(id)) pGo->SetGoState(GOState(state)); } @@ -736,7 +736,7 @@ struct MANGOS_DLL_DECL npc_rocknotAI : public npc_escortAI DoGo(GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future //spell by trap has effect61, this indicate the bar go hostile - if (Creature* pTmp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_PHALANX))) + if (Creature* pTmp = m_pInstance->GetSingleCreatureFromStorage(NPC_PHALANX)) pTmp->setFaction(14); // for later, this event(s) has alot more to it. diff --git a/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.h b/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.h index 3439293..9a60bbe 100644 --- a/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.h +++ b/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.h @@ -23,7 +23,7 @@ enum NPC_VILEREL = 9036, NPC_GLOOMREL = 9037, NPC_SEETHREL = 9038, - NPC_DOOMREL = 9039, + // NPC_DOOMREL = 9039, NPC_DOPEREL = 9040, GO_ARENA_1 = 161525, @@ -101,7 +101,6 @@ class MANGOS_DLL_DECL instance_blackrock_depths : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -115,39 +114,6 @@ class MANGOS_DLL_DECL instance_blackrock_depths : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiEmperorGUID; - uint64 m_uiPrincessGUID; - uint64 m_uiPhalanxGUID; - uint64 m_uiHaterelGUID; - uint64 m_uiAngerrelGUID; - uint64 m_uiVilerelGUID; - uint64 m_uiGloomrelGUID; - uint64 m_uiSeethrelGUID; - uint64 m_uiDoomrelGUID; - uint64 m_uiDoperelGUID; - - uint64 m_uiGoArena1GUID; - uint64 m_uiGoArena2GUID; - uint64 m_uiGoArena3GUID; - uint64 m_uiGoArena4GUID; - uint64 m_uiGoShadowLockGUID; - uint64 m_uiGoShadowMechGUID; - uint64 m_uiGoShadowGiantGUID; - uint64 m_uiGoShadowDummyGUID; - uint64 m_uiGoBarKegGUID; - uint64 m_uiGoBarKegTrapGUID; - uint64 m_uiGoBarDoorGUID; - uint64 m_uiGoTombEnterGUID; - uint64 m_uiGoTombExitGUID; - uint64 m_uiGoLyceumGUID; - uint64 m_uiGoGolemNGUID; - uint64 m_uiGoGolemSGUID; - uint64 m_uiGoThroneGUID; - - uint64 m_uiSpectralChaliceGUID; - uint64 m_uiSevensChestGUID; - uint64 m_uiArenaSpoilsGUID; - uint32 m_uiBarAleCount; float m_fArenaCenterX, m_fArenaCenterY, m_fArenaCenterZ; diff --git a/scripts/eastern_kingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp b/scripts/eastern_kingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp index 152bd5f..ff3358d 100644 --- a/scripts/eastern_kingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp +++ b/scripts/eastern_kingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp @@ -66,7 +66,7 @@ struct MANGOS_DLL_DECL boss_emperor_dagran_thaurissanAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pPrincess = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_PRINCESS))) + if (Creature* pPrincess = m_pInstance->GetSingleCreatureFromStorage(NPC_PRINCESS)) { if (pPrincess->isAlive()) { @@ -179,7 +179,7 @@ struct MANGOS_DLL_DECL boss_moira_bronzebeardAI : public ScriptedAI { if (m_pInstance) { - if (Creature* pEmperor = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_EMPEROR))) + if (Creature* pEmperor = m_pInstance->GetSingleCreatureFromStorage(NPC_EMPEROR)) { // if evade, then check if he is alive. If not, start make portal if (!pEmperor->isAlive()) @@ -224,7 +224,7 @@ struct MANGOS_DLL_DECL boss_moira_bronzebeardAI : public ScriptedAI //Heal_Timer if (m_uiHeal_Timer < uiDiff) { - if (Creature* pEmperor = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_EMPEROR))) + if (Creature* pEmperor = m_pInstance->GetSingleCreatureFromStorage(NPC_EMPEROR)) { if (pEmperor->isAlive() && pEmperor->GetHealthPercent() != 100.0f) DoCastSpellIfCan(pEmperor, SPELL_HEAL); diff --git a/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp b/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp index 91eecee..7641d22 100644 --- a/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp +++ b/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp @@ -80,7 +80,7 @@ bool GossipSelect_boss_gloomrel(Player* pPlayer, Creature* pCreature, uint32 uiS if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature->GetInstanceData()) { //are 5 minutes expected? go template may have data to despawn when used at quest - pInstance->DoRespawnGameObject(pInstance->GetData64(GO_SPECTRAL_CHALICE), MINUTE*5); + pInstance->DoRespawnGameObject(GO_SPECTRAL_CHALICE, MINUTE*5); } break; } @@ -154,17 +154,17 @@ struct MANGOS_DLL_DECL boss_doomrelAI : public ScriptedAI switch(uiPhase) { case 0: - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_ANGERREL)); + return m_pInstance->GetSingleCreatureFromStorage(NPC_ANGERREL); case 1: - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SEETHREL)); + return m_pInstance->GetSingleCreatureFromStorage(NPC_SEETHREL); case 2: - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_DOPEREL)); + return m_pInstance->GetSingleCreatureFromStorage(NPC_DOPEREL); case 3: - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_GLOOMREL)); + return m_pInstance->GetSingleCreatureFromStorage(NPC_GLOOMREL); case 4: - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_VILEREL)); + return m_pInstance->GetSingleCreatureFromStorage(NPC_VILEREL); case 5: - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_HATEREL)); + return m_pInstance->GetSingleCreatureFromStorage(NPC_HATEREL); case 6: return m_creature; } diff --git a/scripts/eastern_kingdoms/blackrock_depths/instance_blackrock_depths.cpp b/scripts/eastern_kingdoms/blackrock_depths/instance_blackrock_depths.cpp index db301bf..2798518 100644 --- a/scripts/eastern_kingdoms/blackrock_depths/instance_blackrock_depths.cpp +++ b/scripts/eastern_kingdoms/blackrock_depths/instance_blackrock_depths.cpp @@ -25,39 +25,6 @@ EndScriptData */ #include "blackrock_depths.h" instance_blackrock_depths::instance_blackrock_depths(Map* pMap) : ScriptedInstance(pMap), - m_uiEmperorGUID(0), - m_uiPrincessGUID(0), - m_uiPhalanxGUID(0), - m_uiHaterelGUID(0), - m_uiAngerrelGUID(0), - m_uiVilerelGUID(0), - m_uiGloomrelGUID(0), - m_uiSeethrelGUID(0), - m_uiDoomrelGUID(0), - m_uiDoperelGUID(0), - - m_uiGoArena1GUID(0), - m_uiGoArena2GUID(0), - m_uiGoArena3GUID(0), - m_uiGoArena4GUID(0), - m_uiGoShadowLockGUID(0), - m_uiGoShadowMechGUID(0), - m_uiGoShadowGiantGUID(0), - m_uiGoShadowDummyGUID(0), - m_uiGoBarKegGUID(0), - m_uiGoBarKegTrapGUID(0), - m_uiGoBarDoorGUID(0), - m_uiGoTombEnterGUID(0), - m_uiGoTombExitGUID(0), - m_uiGoLyceumGUID(0), - m_uiGoGolemNGUID(0), - m_uiGoGolemSGUID(0), - m_uiGoThroneGUID(0), - - m_uiSpectralChaliceGUID(0), - m_uiSevensChestGUID(0), - m_uiArenaSpoilsGUID(0), - m_uiBarAleCount(0), m_fArenaCenterX(0.0f), @@ -76,16 +43,17 @@ void instance_blackrock_depths::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_EMPEROR: m_uiEmperorGUID = pCreature->GetGUID(); break; - case NPC_PRINCESS: m_uiPrincessGUID = pCreature->GetGUID(); break; - case NPC_PHALANX: m_uiPhalanxGUID = pCreature->GetGUID(); break; - case NPC_HATEREL: m_uiHaterelGUID = pCreature->GetGUID(); break; - case NPC_ANGERREL: m_uiAngerrelGUID = pCreature->GetGUID(); break; - case NPC_VILEREL: m_uiVilerelGUID = pCreature->GetGUID(); break; - case NPC_GLOOMREL: m_uiGloomrelGUID = pCreature->GetGUID(); break; - case NPC_SEETHREL: m_uiSeethrelGUID = pCreature->GetGUID(); break; - case NPC_DOOMREL: m_uiDoomrelGUID = pCreature->GetGUID(); break; - case NPC_DOPEREL: m_uiDoperelGUID = pCreature->GetGUID(); break; + case NPC_EMPEROR: + case NPC_PRINCESS: + case NPC_PHALANX: + case NPC_HATEREL: + case NPC_ANGERREL: + case NPC_VILEREL: + case NPC_GLOOMREL: + case NPC_SEETHREL: + case NPC_DOPEREL: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -93,27 +61,32 @@ void instance_blackrock_depths::OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { - case GO_ARENA_1: m_uiGoArena1GUID = pGo->GetGUID(); break; - case GO_ARENA_2: m_uiGoArena2GUID = pGo->GetGUID(); break; - case GO_ARENA_3: m_uiGoArena3GUID = pGo->GetGUID(); break; - case GO_ARENA_4: m_uiGoArena4GUID = pGo->GetGUID(); break; - case GO_SHADOW_LOCK: m_uiGoShadowLockGUID = pGo->GetGUID(); break; - case GO_SHADOW_MECHANISM: m_uiGoShadowMechGUID = pGo->GetGUID(); break; - case GO_SHADOW_GIANT_DOOR: m_uiGoShadowGiantGUID = pGo->GetGUID(); break; - case GO_SHADOW_DUMMY: m_uiGoShadowDummyGUID = pGo->GetGUID(); break; - case GO_BAR_KEG_SHOT: m_uiGoBarKegGUID = pGo->GetGUID(); break; - case GO_BAR_KEG_TRAP: m_uiGoBarKegTrapGUID = pGo->GetGUID(); break; - case GO_BAR_DOOR: m_uiGoBarDoorGUID = pGo->GetGUID(); break; - case GO_TOMB_ENTER: m_uiGoTombEnterGUID = pGo->GetGUID(); break; - case GO_TOMB_EXIT: m_uiGoTombExitGUID = pGo->GetGUID(); break; - case GO_LYCEUM: m_uiGoLyceumGUID = pGo->GetGUID(); break; - case GO_GOLEM_ROOM_N: m_uiGoGolemNGUID = pGo->GetGUID(); break; - case GO_GOLEM_ROOM_S: m_uiGoGolemSGUID = pGo->GetGUID(); break; - case GO_THRONE_ROOM: m_uiGoThroneGUID = pGo->GetGUID(); break; - case GO_SPECTRAL_CHALICE: m_uiSpectralChaliceGUID = pGo->GetGUID(); break; - case GO_CHEST_SEVEN: m_uiSevensChestGUID = pGo->GetGUID(); break; - case GO_ARENA_SPOILS: m_uiArenaSpoilsGUID = pGo->GetGUID(); break; + case GO_ARENA_1: + case GO_ARENA_2: + case GO_ARENA_3: + case GO_ARENA_4: + case GO_SHADOW_LOCK: + case GO_SHADOW_MECHANISM: + case GO_SHADOW_GIANT_DOOR: + case GO_SHADOW_DUMMY: + case GO_BAR_KEG_SHOT: + case GO_BAR_KEG_TRAP: + case GO_BAR_DOOR: + case GO_TOMB_ENTER: + case GO_TOMB_EXIT: + case GO_LYCEUM: + case GO_GOLEM_ROOM_N: + case GO_GOLEM_ROOM_S: + case GO_THRONE_ROOM: + case GO_SPECTRAL_CHALICE: + case GO_CHEST_SEVEN: + case GO_ARENA_SPOILS: + break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_blackrock_depths::SetData(uint32 uiType, uint32 uiData) @@ -123,7 +96,7 @@ void instance_blackrock_depths::SetData(uint32 uiType, uint32 uiData) case TYPE_RING_OF_LAW: // If finished the arena event after theldren fight if (uiData == DONE && m_auiEncounter[0] == SPECIAL) - DoRespawnGameObject(m_uiArenaSpoilsGUID, HOUR*IN_MILLISECONDS); + DoRespawnGameObject(GO_ARENA_SPOILS, HOUR); m_auiEncounter[0] = uiData; break; case TYPE_VAULT: @@ -139,16 +112,16 @@ void instance_blackrock_depths::SetData(uint32 uiType, uint32 uiData) switch(uiData) { case IN_PROGRESS: - DoUseDoorOrButton(m_uiGoTombEnterGUID); + DoUseDoorOrButton(GO_TOMB_ENTER); break; case FAIL: if (m_auiEncounter[3] == IN_PROGRESS)//prevent use more than one time - DoUseDoorOrButton(m_uiGoTombEnterGUID); + DoUseDoorOrButton(GO_TOMB_ENTER); break; case DONE: - DoRespawnGameObject(m_uiSevensChestGUID, HOUR*IN_MILLISECONDS); - DoUseDoorOrButton(m_uiGoTombExitGUID); - DoUseDoorOrButton(m_uiGoTombEnterGUID); + DoRespawnGameObject(GO_CHEST_SEVEN, HOUR); + DoUseDoorOrButton(GO_TOMB_EXIT); + DoUseDoorOrButton(GO_TOMB_ENTER); break; } m_auiEncounter[3] = uiData; @@ -156,8 +129,8 @@ void instance_blackrock_depths::SetData(uint32 uiType, uint32 uiData) case TYPE_LYCEUM: if (uiData == DONE) { - DoUseDoorOrButton(m_uiGoGolemNGUID); - DoUseDoorOrButton(m_uiGoGolemSGUID); + DoUseDoorOrButton(GO_GOLEM_ROOM_N); + DoUseDoorOrButton(GO_GOLEM_ROOM_S); } m_auiEncounter[4] = uiData; break; @@ -165,17 +138,17 @@ void instance_blackrock_depths::SetData(uint32 uiType, uint32 uiData) switch(uiData) { case IN_PROGRESS: - DoUseDoorOrButton(m_uiGoGolemNGUID); - DoUseDoorOrButton(m_uiGoGolemSGUID); + DoUseDoorOrButton(GO_GOLEM_ROOM_N); + DoUseDoorOrButton(GO_GOLEM_ROOM_S); break; case FAIL: - DoUseDoorOrButton(m_uiGoGolemNGUID); - DoUseDoorOrButton(m_uiGoGolemSGUID); + DoUseDoorOrButton(GO_GOLEM_ROOM_N); + DoUseDoorOrButton(GO_GOLEM_ROOM_S); break; case DONE: - DoUseDoorOrButton(m_uiGoGolemNGUID); - DoUseDoorOrButton(m_uiGoGolemSGUID); - DoUseDoorOrButton(m_uiGoThroneGUID); + DoUseDoorOrButton(GO_GOLEM_ROOM_N); + DoUseDoorOrButton(GO_GOLEM_ROOM_S); + DoUseDoorOrButton(GO_THRONE_ROOM); break; } m_auiEncounter[5] = uiData; @@ -221,36 +194,6 @@ uint32 instance_blackrock_depths::GetData(uint32 uiType) } } -uint64 instance_blackrock_depths::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_EMPEROR: return m_uiEmperorGUID; - case NPC_PRINCESS: return m_uiPrincessGUID; - case NPC_PHALANX: return m_uiPhalanxGUID; - case NPC_HATEREL: return m_uiHaterelGUID; - case NPC_ANGERREL: return m_uiAngerrelGUID; - case NPC_VILEREL: return m_uiVilerelGUID; - case NPC_GLOOMREL: return m_uiGloomrelGUID; - case NPC_SEETHREL: return m_uiSeethrelGUID; - case NPC_DOOMREL: return m_uiDoomrelGUID; - case NPC_DOPEREL: return m_uiDoperelGUID; - - case GO_ARENA_1: return m_uiGoArena1GUID; - case GO_ARENA_2: return m_uiGoArena2GUID; - case GO_ARENA_3: return m_uiGoArena3GUID; - case GO_ARENA_4: return m_uiGoArena4GUID; - case GO_BAR_KEG_SHOT: return m_uiGoBarKegGUID; - case GO_BAR_KEG_TRAP: return m_uiGoBarKegTrapGUID; - case GO_BAR_DOOR: return m_uiGoBarDoorGUID; - case GO_SPECTRAL_CHALICE: return m_uiSpectralChaliceGUID; - case GO_TOMB_EXIT: return m_uiGoTombExitGUID; - - default: - return 0; - } -} - void instance_blackrock_depths::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/eastern_kingdoms/blackrock_spire/blackrock_spire.h b/scripts/eastern_kingdoms/blackrock_spire/blackrock_spire.h index ed355a9..762e17b 100644 --- a/scripts/eastern_kingdoms/blackrock_spire/blackrock_spire.h +++ b/scripts/eastern_kingdoms/blackrock_spire/blackrock_spire.h @@ -32,7 +32,6 @@ enum GO_GYTH_COMBAT_DOOR = 175185, // control in boss_script, because will auto-close after each wave GO_GYTH_EXIT_DOOR = 175186, - GO_ROOM_7_RUNE = 175194, GO_ROOM_3_RUNE = 175195, GO_ROOM_6_RUNE = 175196, @@ -58,9 +57,8 @@ class MANGOS_DLL_DECL instance_blackrock_spire : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); void SetData64(uint32 uiType, uint64 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiType); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); void DoSortRoomEventMobs(); @@ -69,21 +67,9 @@ class MANGOS_DLL_DECL instance_blackrock_spire : public ScriptedInstance protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiEmberseerGUID; - uint64 m_uiNefariusGUID; - uint64 m_uiGythGUID; - uint64 m_uiInfiltratorGUID; - - uint64 m_uiEmberseerInDoorGUID; - uint64 m_uiEmberseerCombatDoorGUID; - uint64 m_uiEmberseerOutDoorGUID; - uint64 m_uiGythEntryDoorGUID; - uint64 m_uiGythCombatDoorGUID; - uint64 m_uiGythExitDoorGUID; + std::string m_strInstData; - uint64 m_auiRoomRuneGUID[MAX_ROOMS]; + ObjectGuid m_aRoomRuneGuid[MAX_ROOMS]; GUIDList m_alRoomEventMobGUIDSorted[MAX_ROOMS]; GUIDList m_lRoomEventMobGUIDList; GUIDList m_lIncanceratorGUIDList; diff --git a/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp b/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp index 813464e..131a8ec 100644 --- a/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp +++ b/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp @@ -51,7 +51,6 @@ struct MANGOS_DLL_DECL boss_gythAI : public ScriptedAI } instance_blackrock_spire* m_pInstance; - uint64 m_uiCombatDoorGUID; uint32 uiAggroTimer; uint32 uiDragonsTimer; uint32 uiOrcTimer; @@ -90,10 +89,7 @@ struct MANGOS_DLL_DECL boss_gythAI : public ScriptedAI void Aggro(Unit* pWho) { if (m_pInstance) - { m_pInstance->SetData(TYPE_GYTH, IN_PROGRESS); - m_uiCombatDoorGUID = m_pInstance->GetData64(GO_GYTH_COMBAT_DOOR); - } } void JustDied(Unit* pKiller) @@ -141,7 +137,7 @@ struct MANGOS_DLL_DECL boss_gythAI : public ScriptedAI m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveAurasDueToSpell(SPELL_ROOT_SELF); if (m_pInstance) - m_pInstance->DoUseDoorOrButton(m_uiCombatDoorGUID); + m_pInstance->DoUseDoorOrButton(GO_GYTH_COMBAT_DOOR); } else @@ -160,7 +156,7 @@ struct MANGOS_DLL_DECL boss_gythAI : public ScriptedAI SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP); --uiLine1Count; if (m_pInstance) - m_pInstance->DoUseDoorOrButton(m_uiCombatDoorGUID); + m_pInstance->DoUseDoorOrButton(GO_GYTH_COMBAT_DOOR); uiDragonsTimer = 60000; } else @@ -178,7 +174,7 @@ struct MANGOS_DLL_DECL boss_gythAI : public ScriptedAI SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP); SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP); if (m_pInstance) - m_pInstance->DoUseDoorOrButton(m_uiCombatDoorGUID); + m_pInstance->DoUseDoorOrButton(GO_GYTH_COMBAT_DOOR); --uiLine2Count; uiOrcTimer = 60000; } diff --git a/scripts/eastern_kingdoms/blackrock_spire/instance_blackrock_spire.cpp b/scripts/eastern_kingdoms/blackrock_spire/instance_blackrock_spire.cpp index 09093d9..23c232d 100644 --- a/scripts/eastern_kingdoms/blackrock_spire/instance_blackrock_spire.cpp +++ b/scripts/eastern_kingdoms/blackrock_spire/instance_blackrock_spire.cpp @@ -44,19 +44,7 @@ enum 3726 UBRS, entrance to BWL */ -instance_blackrock_spire::instance_blackrock_spire(Map* pMap) : ScriptedInstance(pMap), - m_uiEmberseerGUID(0), - m_uiNefariusGUID(0), - m_uiGythGUID(0), - m_uiInfiltratorGUID(0), - - m_uiEmberseerInDoorGUID(0), - m_uiEmberseerCombatDoorGUID(0), - m_uiEmberseerOutDoorGUID(0), - - m_uiGythEntryDoorGUID(0), - m_uiGythCombatDoorGUID(0), - m_uiGythExitDoorGUID(0) +instance_blackrock_spire::instance_blackrock_spire(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -64,7 +52,7 @@ instance_blackrock_spire::instance_blackrock_spire(Map* pMap) : ScriptedInstance void instance_blackrock_spire::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&m_auiRoomRuneGUID, 0, sizeof(m_auiRoomRuneGUID)); + memset(&m_aRoomRuneGuid, 0, sizeof(m_aRoomRuneGuid)); } void instance_blackrock_spire::OnObjectCreate(GameObject* pGo) @@ -72,54 +60,53 @@ void instance_blackrock_spire::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_EMBERSEER_IN: - m_uiEmberseerInDoorGUID = pGo->GetGUID(); if (GetData(TYPE_ROOM_EVENT) == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOORS: - m_uiEmberseerCombatDoorGUID = pGo->GetGUID(); break; case GO_EMBERSEER_OUT: - m_uiEmberseerOutDoorGUID = pGo->GetGUID(); if (GetData(TYPE_EMBERSEER) == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_GYTH_ENTRY_DOOR: - m_uiGythEntryDoorGUID = pGo->GetGUID(); - break; case GO_GYTH_COMBAT_DOOR: - m_uiGythCombatDoorGUID = pGo->GetGUID(); break; case GO_GYTH_EXIT_DOOR: - m_uiGythExitDoorGUID = pGo->GetGUID(); if (GetData(TYPE_GYTH) == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; - case GO_ROOM_1_RUNE: m_auiRoomRuneGUID[0] = pGo->GetGUID(); break; - case GO_ROOM_2_RUNE: m_auiRoomRuneGUID[1] = pGo->GetGUID(); break; - case GO_ROOM_3_RUNE: m_auiRoomRuneGUID[2] = pGo->GetGUID(); break; - case GO_ROOM_4_RUNE: m_auiRoomRuneGUID[3] = pGo->GetGUID(); break; - case GO_ROOM_5_RUNE: m_auiRoomRuneGUID[4] = pGo->GetGUID(); break; - case GO_ROOM_6_RUNE: m_auiRoomRuneGUID[5] = pGo->GetGUID(); break; - case GO_ROOM_7_RUNE: m_auiRoomRuneGUID[6] = pGo->GetGUID(); break; + case GO_ROOM_1_RUNE: m_aRoomRuneGuid[0] = pGo->GetObjectGuid(); return; + case GO_ROOM_2_RUNE: m_aRoomRuneGuid[1] = pGo->GetObjectGuid(); return; + case GO_ROOM_3_RUNE: m_aRoomRuneGuid[2] = pGo->GetObjectGuid(); return; + case GO_ROOM_4_RUNE: m_aRoomRuneGuid[3] = pGo->GetObjectGuid(); return; + case GO_ROOM_5_RUNE: m_aRoomRuneGuid[4] = pGo->GetObjectGuid(); return; + case GO_ROOM_6_RUNE: m_aRoomRuneGuid[5] = pGo->GetObjectGuid(); return; + case GO_ROOM_7_RUNE: m_aRoomRuneGuid[6] = pGo->GetObjectGuid(); return; + + case GO_ROOKERY_EGG: m_lRookeryEggGUIDList.push_back(pGo->GetObjectGuid()); return; - case GO_ROOKERY_EGG: m_lRookeryEggGUIDList.push_back(pGo->GetGUID()); break; + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_blackrock_spire::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_PYROGUARD_EMBERSEER: m_uiEmberseerGUID = pCreature->GetEntry(); break; - case NPC_LORD_VICTOR_NEFARIUS: m_uiNefariusGUID = pCreature->GetGUID(); break; - case NPC_GYTH: m_uiGythGUID = pCreature->GetGUID(); break; - case NPC_SCARSHIELD_INFILTRATOR: m_uiInfiltratorGUID = pCreature->GetGUID(); break; + case NPC_PYROGUARD_EMBERSEER: + case NPC_LORD_VICTOR_NEFARIUS: + case NPC_GYTH: + case NPC_SCARSHIELD_INFILTRATOR: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; case NPC_BLACKHAND_SUMMONER: - case NPC_BLACKHAND_VETERAN: m_lRoomEventMobGUIDList.push_back(pCreature->GetGUID()); break; - case NPC_BLACKHAND_INCANCERATOR: m_lIncanceratorGUIDList.push_back(pCreature->GetGUID()); break; + case NPC_BLACKHAND_VETERAN: m_lRoomEventMobGUIDList.push_back(pCreature->GetObjectGuid()); break; + case NPC_BLACKHAND_INCANCERATOR: m_lIncanceratorGUIDList.push_back(pCreature->GetObjectGuid()); break; } } @@ -129,16 +116,16 @@ void instance_blackrock_spire::SetData(uint32 uiType, uint32 uiData) { case TYPE_ROOM_EVENT: if (uiData == DONE) - DoUseDoorOrButton(m_uiEmberseerInDoorGUID); + DoUseDoorOrButton(GO_EMBERSEER_IN); m_auiEncounter[0] = uiData; break; case TYPE_EMBERSEER: if (uiData == IN_PROGRESS || uiData == FAIL) - DoUseDoorOrButton(m_uiEmberseerCombatDoorGUID); + DoUseDoorOrButton(GO_DOORS); else if (uiData == DONE) { - DoUseDoorOrButton(m_uiEmberseerCombatDoorGUID); - DoUseDoorOrButton(m_uiEmberseerOutDoorGUID); + DoUseDoorOrButton(GO_DOORS); + DoUseDoorOrButton(GO_EMBERSEER_OUT); } m_auiEncounter[1] = uiData; break; @@ -147,11 +134,11 @@ void instance_blackrock_spire::SetData(uint32 uiType, uint32 uiData) break; case TYPE_GYTH: if (uiData == IN_PROGRESS || uiData == FAIL) - DoUseDoorOrButton(m_uiGythEntryDoorGUID); + DoUseDoorOrButton(GO_GYTH_ENTRY_DOOR); else if (uiData == DONE) { - DoUseDoorOrButton(m_uiGythEntryDoorGUID); - DoUseDoorOrButton(m_uiGythExitDoorGUID); + DoUseDoorOrButton(GO_GYTH_ENTRY_DOOR); + DoUseDoorOrButton(GO_GYTH_EXIT_DOOR); } m_auiEncounter[3] = uiData; break; @@ -167,7 +154,7 @@ void instance_blackrock_spire::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -179,15 +166,15 @@ void instance_blackrock_spire::SetData64(uint32 uiType, uint64 uiData) if (uiType == TYPE_ROOM_EVENT && GetData(TYPE_ROOM_EVENT) == IN_PROGRESS) { uint8 uiNotEmptyRoomsCount = 0; - for (uint8 i = 0; i< MAX_ROOMS; ++i) + for (uint8 i = 0; i < MAX_ROOMS; ++i) { - if (m_auiRoomRuneGUID[i]) // This check is used, to ensure which runes still need processing + if (m_aRoomRuneGuid[i]) // This check is used, to ensure which runes still need processing { - m_alRoomEventMobGUIDSorted[i].remove(uiData); + m_alRoomEventMobGUIDSorted[i].remove(ObjectGuid(uiData)); if (m_alRoomEventMobGUIDSorted[i].empty()) { - DoUseDoorOrButton(m_auiRoomRuneGUID[i]); - m_auiRoomRuneGUID[i] = 0; + DoUseDoorOrButton(m_aRoomRuneGuid[i]); + m_aRoomRuneGuid[i].Clear(); } else ++uiNotEmptyRoomsCount; // found an not empty room @@ -233,19 +220,6 @@ uint32 instance_blackrock_spire::GetData(uint32 uiType) return 0; } -uint64 instance_blackrock_spire::GetData64(uint32 uiType) -{ - switch (uiType) - { - case NPC_PYROGUARD_EMBERSEER: return m_uiEmberseerGUID; - case NPC_LORD_VICTOR_NEFARIUS: return m_uiNefariusGUID; - case NPC_GYTH: return m_uiGythGUID; - case NPC_SCARSHIELD_INFILTRATOR: return m_uiInfiltratorGUID; - case GO_GYTH_COMBAT_DOOR: return m_uiGythCombatDoorGUID; - } - return 0; -} - void instance_blackrock_spire::DoSortRoomEventMobs() { if (GetData(TYPE_ROOM_EVENT) != NOT_STARTED) @@ -253,7 +227,7 @@ void instance_blackrock_spire::DoSortRoomEventMobs() for (uint8 i = 0; i < MAX_ROOMS; ++i) { - if (GameObject* pRune = instance->GetGameObject(m_auiRoomRuneGUID[i])) + if (GameObject* pRune = instance->GetGameObject(m_aRoomRuneGuid[i])) { for (GUIDList::const_iterator itr = m_lRoomEventMobGUIDList.begin(); itr != m_lRoomEventMobGUIDList.end(); ++itr) { @@ -285,7 +259,7 @@ bool AreaTrigger_at_blackrock_spire(Player* pPlayer, AreaTriggerEntry const* pAt break; case AREATRIGGER_STADIUM: if (instance_blackrock_spire* pInstance = (instance_blackrock_spire*) pPlayer->GetInstanceData()) - if (Creature* pGyth = pInstance->instance->GetCreature(pInstance->GetData64(NPC_GYTH))) + if (Creature* pGyth = pInstance->GetSingleCreatureFromStorage(NPC_GYTH)) if (pGyth->isAlive() && !pGyth->isInCombat()) pGyth->AI()->AttackStart(pPlayer); break; diff --git a/scripts/eastern_kingdoms/blackwing_lair/blackwing_lair.h b/scripts/eastern_kingdoms/blackwing_lair/blackwing_lair.h index ede0e53..de3fe7f 100644 --- a/scripts/eastern_kingdoms/blackwing_lair/blackwing_lair.h +++ b/scripts/eastern_kingdoms/blackwing_lair/blackwing_lair.h @@ -58,16 +58,6 @@ class MANGOS_DLL_DECL instance_blackwing_lair : public ScriptedInstance protected: std::string m_strInstData; uint32 m_auiEncounter[MAX_ENCOUNTER]; - - // Doors - uint64 m_uiRazorgoreEnterDoorGUID; - uint64 m_uiRazorgoreExitDoorGUID; - uint64 m_uiVaelastraszDoorGUID; - uint64 m_uiLashlayerDoorGUID; - uint64 m_uiChromaggusEnterDoorGUID; - uint64 m_uiChromaggusExitDoorGUID; - uint64 m_uiChromaggusSideDoorGUID; - uint64 m_uiNefarianDoorGUID; }; #endif diff --git a/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp b/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp index 12e2ab5..e444072 100644 --- a/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp +++ b/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp @@ -56,7 +56,7 @@ struct MANGOS_DLL_DECL boss_vaelastraszAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 m_uiPlayerGUID; + ObjectGuid m_playerGuid; uint32 m_uiSpeachTimer; uint32 m_uiSpeachNum; uint32 m_uiCleaveTimer; @@ -70,7 +70,8 @@ struct MANGOS_DLL_DECL boss_vaelastraszAI : public ScriptedAI void Reset() { - m_uiPlayerGUID = 0; + m_playerGuid.Clear(); + m_uiSpeachTimer = 0; m_uiSpeachNum = 0; m_uiCleaveTimer = 8000; // These times are probably wrong @@ -86,7 +87,7 @@ struct MANGOS_DLL_DECL boss_vaelastraszAI : public ScriptedAI void BeginSpeach(Unit* target) { // Stand up and begin speach - m_uiPlayerGUID = target->GetGUID(); + m_playerGuid = target->GetObjectGuid(); // 10 seconds DoScriptText(SAY_LINE_1, m_creature); @@ -149,9 +150,9 @@ struct MANGOS_DLL_DECL boss_vaelastraszAI : public ScriptedAI m_creature->setFaction(103); m_creature->SetHealth(int(m_creature->GetMaxHealth()*.3)); - if (m_uiPlayerGUID) + if (m_playerGuid) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiPlayerGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerGuid)) AttackStart(pPlayer); DoCastSpellIfCan(m_creature, SPELL_ESSENCE_OF_THE_RED); diff --git a/scripts/eastern_kingdoms/blackwing_lair/instance_blackwing_lair.cpp b/scripts/eastern_kingdoms/blackwing_lair/instance_blackwing_lair.cpp index a5d1232..e9c0ca4 100644 --- a/scripts/eastern_kingdoms/blackwing_lair/instance_blackwing_lair.cpp +++ b/scripts/eastern_kingdoms/blackwing_lair/instance_blackwing_lair.cpp @@ -24,16 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "blackwing_lair.h" - -instance_blackwing_lair::instance_blackwing_lair(Map* pMap) : ScriptedInstance(pMap), - m_uiRazorgoreEnterDoorGUID(0), - m_uiRazorgoreExitDoorGUID(0), - m_uiVaelastraszDoorGUID(0), - m_uiLashlayerDoorGUID(0), - m_uiChromaggusEnterDoorGUID(0), - m_uiChromaggusExitDoorGUID(0), - m_uiChromaggusSideDoorGUID(0), - m_uiNefarianDoorGUID(0) +instance_blackwing_lair::instance_blackwing_lair(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -58,38 +49,32 @@ void instance_blackwing_lair::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_DOOR_RAZORGORE_ENTER: - m_uiRazorgoreEnterDoorGUID = pGo->GetGUID(); break; case GO_DOOR_RAZORGORE_EXIT: - m_uiRazorgoreExitDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_RAZORGORE] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOOR_NEFARIAN: - m_uiNefarianDoorGUID = pGo->GetGUID(); - break; case GO_DOOR_CHROMAGGUS_ENTER: - m_uiChromaggusEnterDoorGUID = pGo->GetGUID(); - break; case GO_DOOR_CHROMAGGUS_SIDE: - m_uiChromaggusSideDoorGUID = pGo->GetGUID(); break; case GO_DOOR_CHROMAGGUS_EXIT: - m_uiChromaggusExitDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_CHROMAGGUS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOOR_VAELASTRASZ: - m_uiVaelastraszDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_VAELASTRASZ] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOOR_LASHLAYER: - m_uiLashlayerDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_LASHLAYER] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_blackwing_lair::SetData(uint32 uiType, uint32 uiData) @@ -98,21 +83,21 @@ void instance_blackwing_lair::SetData(uint32 uiType, uint32 uiData) { case TYPE_RAZORGORE: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_uiRazorgoreEnterDoorGUID); + DoUseDoorOrButton(GO_DOOR_RAZORGORE_ENTER); if (uiData == DONE) - DoUseDoorOrButton(m_uiRazorgoreExitDoorGUID); + DoUseDoorOrButton(GO_DOOR_RAZORGORE_EXIT); break; case TYPE_VAELASTRASZ: m_auiEncounter[uiType] = uiData; // Prevent the players from running back to the first room - DoUseDoorOrButton(m_uiRazorgoreExitDoorGUID); + DoUseDoorOrButton(GO_DOOR_RAZORGORE_EXIT); if (uiData == DONE) - DoUseDoorOrButton(m_uiVaelastraszDoorGUID); + DoUseDoorOrButton(GO_DOOR_VAELASTRASZ); break; case TYPE_LASHLAYER: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiLashlayerDoorGUID); + DoUseDoorOrButton(GO_DOOR_LASHLAYER); break; case TYPE_FIREMAW: case TYPE_EBONROC: @@ -121,13 +106,13 @@ void instance_blackwing_lair::SetData(uint32 uiType, uint32 uiData) break; case TYPE_CHROMAGGUS: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_uiChromaggusEnterDoorGUID); + DoUseDoorOrButton(GO_DOOR_CHROMAGGUS_ENTER); if (uiData == DONE) - DoUseDoorOrButton(m_uiChromaggusExitDoorGUID); + DoUseDoorOrButton(GO_DOOR_CHROMAGGUS_EXIT); break; case TYPE_NEFARIAN: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_uiNefarianDoorGUID); + DoUseDoorOrButton(GO_DOOR_NEFARIAN); break; } diff --git a/scripts/eastern_kingdoms/deadmines/deadmines.cpp b/scripts/eastern_kingdoms/deadmines/deadmines.cpp index 046dd35..f1bb623 100644 --- a/scripts/eastern_kingdoms/deadmines/deadmines.cpp +++ b/scripts/eastern_kingdoms/deadmines/deadmines.cpp @@ -117,7 +117,7 @@ struct MANGOS_DLL_DECL boss_mr_smiteAI : public ScriptedAI if (!pInstance) return; - GameObject* pChest = pInstance->instance->GetGameObject(pInstance->GetData64(GO_SMITE_CHEST)); + GameObject* pChest = pInstance->GetSingleGameObjectFromStorage(GO_SMITE_CHEST); if (!pChest) return; @@ -285,7 +285,7 @@ bool GOUse_go_door_lever_dm(Player* pPlayer, GameObject* pGo) if (!pInstance) return false; - GameObject* pGoDoor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_IRON_CLAD_DOOR)); + GameObject* pGoDoor = pInstance->GetSingleGameObjectFromStorage(GO_IRON_CLAD_DOOR); if (pGoDoor && pGoDoor->GetGoState() == GO_STATE_READY) return false; diff --git a/scripts/eastern_kingdoms/deadmines/deadmines.h b/scripts/eastern_kingdoms/deadmines/deadmines.h index 53aeffa..321fbc3 100644 --- a/scripts/eastern_kingdoms/deadmines/deadmines.h +++ b/scripts/eastern_kingdoms/deadmines/deadmines.h @@ -35,4 +35,28 @@ enum NPC_SQUALLSHAPER = 1732, }; +class MANGOS_DLL_DECL instance_deadmines : public ScriptedInstance +{ + public: + instance_deadmines(Map* pMap); + + void Initialize(); + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + + void OnCreatureDeath(Creature* pCreature); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + void Update(uint32 uiDiff); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + + uint32 m_uiIronDoorTimer; + uint32 m_uiDoorStep; +}; + #endif diff --git a/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp b/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp index a23ca90..ae31c9a 100644 --- a/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp +++ b/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp @@ -24,225 +24,184 @@ EndScriptData */ #include "precompiled.h" #include "deadmines.h" -struct MANGOS_DLL_DECL instance_deadmines : public ScriptedInstance +instance_deadmines::instance_deadmines(Map* pMap) : ScriptedInstance(pMap), + m_uiIronDoorTimer(0), + m_uiDoorStep(0) { - instance_deadmines(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; + Initialize(); +} - uint64 m_uiFactoryDoorGUID; - uint64 m_uiMastRoomDoorGUID; - uint64 m_uiFoundryDoorGUID; - uint64 m_uiIronCladGUID; - uint64 m_uiCannonGUID; - uint64 m_uiSmiteChestGUID; - uint64 m_uiSmiteGUID; +void instance_deadmines::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - uint32 m_uiIronDoor_Timer; - uint32 m_uiDoor_Step; +void instance_deadmines::OnCreatureCreate(Creature* pCreature) +{ + if (pCreature->GetEntry() == NPC_MR_SMITE) + m_mNpcEntryGuidStore[NPC_MR_SMITE] = pCreature->GetObjectGuid(); +} - void Initialize() +void instance_deadmines::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiFactoryDoorGUID = 0; - m_uiMastRoomDoorGUID = 0; - m_uiFoundryDoorGUID = 0; - m_uiIronCladGUID = 0; - m_uiCannonGUID = 0; - m_uiSmiteChestGUID = 0; - m_uiSmiteGUID = 0; - - m_uiIronDoor_Timer = 0; - m_uiDoor_Step = 0; + case GO_FACTORY_DOOR: + if (GetData(TYPE_RHAHKZOR) == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + + break; + case GO_MAST_ROOM_DOOR: + if (GetData(TYPE_SNEED) == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + + break; + case GO_FOUNDRY_DOOR: + if (GetData(TYPE_GILNID) == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + + break; + case GO_IRON_CLAD_DOOR: + case GO_DEFIAS_CANNON: + case GO_SMITE_CHEST: + break; + + default: + return; } - void OnCreatureCreate(Creature* pCreature) + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); +} + +void instance_deadmines::OnCreatureDeath(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - if (pCreature->GetEntry() == NPC_MR_SMITE) - m_uiSmiteGUID = pCreature->GetGUID(); + case NPC_RHAHKZOR: + SetData(TYPE_RHAHKZOR, DONE); + break; + case NPC_SNEED: + SetData(TYPE_SNEED, DONE); + break; + case NPC_GILNID: + SetData(TYPE_GILNID, DONE); + break; } +} - void OnObjectCreate(GameObject* pGo) +void instance_deadmines::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(pGo->GetEntry()) + case TYPE_RHAHKZOR: { - case GO_FACTORY_DOOR: - m_uiFactoryDoorGUID = pGo->GetGUID(); + if (uiData == DONE) + DoUseDoorOrButton(GO_FACTORY_DOOR); - if (GetData(TYPE_RHAHKZOR) == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_MAST_ROOM_DOOR: - m_uiMastRoomDoorGUID = pGo->GetGUID(); - - if (GetData(TYPE_SNEED) == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_FOUNDRY_DOOR: - m_uiFoundryDoorGUID = pGo->GetGUID(); - - if (GetData(TYPE_GILNID) == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_IRON_CLAD_DOOR: - m_uiIronCladGUID = pGo->GetGUID(); - break; - case GO_DEFIAS_CANNON: - m_uiCannonGUID = pGo->GetGUID(); - break; - case GO_SMITE_CHEST: - m_uiSmiteChestGUID = pGo->GetGUID(); - break; + m_auiEncounter[1] = uiData; + break; } - } - - void OnCreatureDeath(Creature* pCreature) - { - switch(pCreature->GetEntry()) + case TYPE_SNEED: { - case NPC_RHAHKZOR: - SetData(TYPE_RHAHKZOR, DONE); - break; - case NPC_SNEED: - SetData(TYPE_SNEED, DONE); - break; - case NPC_GILNID: - SetData(TYPE_GILNID, DONE); - break; - } - } + if (uiData == DONE) + DoUseDoorOrButton(GO_MAST_ROOM_DOOR); - void SetData(uint32 uiType, uint32 uiData) - { - switch(uiType) + m_auiEncounter[2] = uiData; + break; + } + case TYPE_GILNID: { - case TYPE_RHAHKZOR: - { - if (uiData == DONE) - DoUseDoorOrButton(m_uiFactoryDoorGUID); - - m_auiEncounter[1] = uiData; - break; - } - case TYPE_SNEED: - { - if (uiData == DONE) - DoUseDoorOrButton(m_uiMastRoomDoorGUID); + if (uiData == DONE) + DoUseDoorOrButton(GO_FOUNDRY_DOOR); - m_auiEncounter[2] = uiData; - break; - } - case TYPE_GILNID: - { - if (uiData == DONE) - DoUseDoorOrButton(m_uiFoundryDoorGUID); - - m_auiEncounter[3] = uiData; - break; - } - case TYPE_DEFIAS_ENDDOOR: + m_auiEncounter[3] = uiData; + break; + } + case TYPE_DEFIAS_ENDDOOR: + { + if (uiData == IN_PROGRESS) { - if (uiData == IN_PROGRESS) + if (GameObject* pGo = GetSingleGameObjectFromStorage(GO_IRON_CLAD_DOOR)) { - if (GameObject* pGo = instance->GetGameObject(m_uiIronCladGUID)) - { - pGo->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - m_uiIronDoor_Timer = 3000; - } + pGo->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + m_uiIronDoorTimer = 3000; } - m_auiEncounter[0] = uiData; - break; } + m_auiEncounter[0] = uiData; + break; } } +} - uint32 GetData(uint32 uiType) +uint32 instance_deadmines::GetData(uint32 uiType) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_DEFIAS_ENDDOOR: - return m_auiEncounter[0]; - case TYPE_RHAHKZOR: - return m_auiEncounter[1]; - case TYPE_SNEED: - return m_auiEncounter[2]; - case TYPE_GILNID: - return m_auiEncounter[3]; - } - - return 0; + case TYPE_DEFIAS_ENDDOOR: + return m_auiEncounter[0]; + case TYPE_RHAHKZOR: + return m_auiEncounter[1]; + case TYPE_SNEED: + return m_auiEncounter[2]; + case TYPE_GILNID: + return m_auiEncounter[3]; } - uint64 GetData64(uint32 uiData) - { - switch(uiData) - { - case GO_IRON_CLAD_DOOR: - return m_uiIronCladGUID; - case GO_SMITE_CHEST: - return m_uiSmiteChestGUID; - } - - return 0; - } + return 0; +} - void Update(uint32 uiDiff) +void instance_deadmines::Update(uint32 uiDiff) +{ + if (m_uiIronDoorTimer) { - if (m_uiIronDoor_Timer) + if (m_uiIronDoorTimer <= uiDiff) { - if (m_uiIronDoor_Timer <= uiDiff) + if (Creature* pMrSmite = GetSingleCreatureFromStorage(NPC_MR_SMITE)) { - if (Creature* pMrSmite = instance->GetCreature(m_uiSmiteGUID)) + switch(m_uiDoorStep) { - switch(m_uiDoor_Step) + case 0: + DoScriptText(INST_SAY_ALARM1,pMrSmite); + m_uiIronDoorTimer = 2000; + ++m_uiDoorStep; + break; + case 1: { - case 0: - DoScriptText(INST_SAY_ALARM1,pMrSmite); - m_uiIronDoor_Timer = 2000; - ++m_uiDoor_Step; - break; - case 1: + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_IRON_CLAD_DOOR)) { - if (GameObject* pDoor = instance->GetGameObject(m_uiIronCladGUID)) + // should be static spawns, fetch the closest ones at the pier + if (Creature* pi1 = GetClosestCreatureWithEntry(pDoor, NPC_PIRATE, 40.0f)) { - // should be static spawns, fetch the closest ones at the pier - if (Creature* pi1 = GetClosestCreatureWithEntry(pDoor, NPC_PIRATE, 40.0f)) - { - pi1->RemoveSplineFlag(SPLINEFLAG_WALKMODE); - pi1->GetMotionMaster()->MovePoint(0, pDoor->GetPositionX(), pDoor->GetPositionY(), pDoor->GetPositionZ()); - } - - if (Creature* pi2 = GetClosestCreatureWithEntry(pDoor, NPC_SQUALLSHAPER, 40.0f)) - { - pi2->RemoveSplineFlag(SPLINEFLAG_WALKMODE); - pi2->GetMotionMaster()->MovePoint(0, pDoor->GetPositionX(), pDoor->GetPositionY(), pDoor->GetPositionZ()); - } + pi1->RemoveSplineFlag(SPLINEFLAG_WALKMODE); + pi1->GetMotionMaster()->MovePoint(0, pDoor->GetPositionX(), pDoor->GetPositionY(), pDoor->GetPositionZ()); } - ++m_uiDoor_Step; - m_uiIronDoor_Timer = 10000; - break; + if (Creature* pi2 = GetClosestCreatureWithEntry(pDoor, NPC_SQUALLSHAPER, 40.0f)) + { + pi2->RemoveSplineFlag(SPLINEFLAG_WALKMODE); + pi2->GetMotionMaster()->MovePoint(0, pDoor->GetPositionX(), pDoor->GetPositionY(), pDoor->GetPositionZ()); + } } - case 2: - DoScriptText(INST_SAY_ALARM2,pMrSmite); - m_uiDoor_Step = 0; - m_uiIronDoor_Timer = 0; - debug_log("SD2: Instance Deadmines: Iron door event reached end."); - break; + + ++m_uiDoorStep; + m_uiIronDoorTimer = 10000; + break; } + case 2: + DoScriptText(INST_SAY_ALARM2,pMrSmite); + m_uiDoorStep = 0; + m_uiIronDoorTimer = 0; + debug_log("SD2: Instance Deadmines: Iron door event reached end."); + break; } - else - m_uiIronDoor_Timer = 0; } else - m_uiIronDoor_Timer -= uiDiff; + m_uiIronDoorTimer = 0; } + else + m_uiIronDoorTimer -= uiDiff; } -}; +} InstanceData* GetInstanceData_instance_deadmines(Map* pMap) { @@ -251,9 +210,10 @@ InstanceData* GetInstanceData_instance_deadmines(Map* pMap) void AddSC_instance_deadmines() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_deadmines"; - newscript->GetInstanceData = &GetInstanceData_instance_deadmines; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_deadmines"; + pNewScript->GetInstanceData = &GetInstanceData_instance_deadmines; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/eversong_woods.cpp b/scripts/eastern_kingdoms/eversong_woods.cpp index 05e92b2..5879e71 100644 --- a/scripts/eastern_kingdoms/eversong_woods.cpp +++ b/scripts/eastern_kingdoms/eversong_woods.cpp @@ -147,7 +147,7 @@ struct MANGOS_DLL_DECL npc_kelerun_bloodmournAI : public ScriptedAI { if (m_uiTimeOutTimer && m_uiTimeOutTimer < uiDiff) { - if (m_playerGuid.IsEmpty()) + if (!m_playerGuid) { //player are expected to use GO within a minute, if not, event will fail. Reset(); @@ -352,22 +352,22 @@ enum struct MANGOS_DLL_DECL npc_apprentice_mirvedaAI : public ScriptedAI { - npc_apprentice_mirvedaAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} + npc_apprentice_mirvedaAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } uint8 m_uiMobCount; uint32 m_uiFireballTimer; - uint64 m_uiPlayerGUID; + ObjectGuid m_playerGuid; void Reset() { m_uiMobCount = 0; - m_uiPlayerGUID = 0; + m_playerGuid.Clear(); m_uiFireballTimer = 0; } void JustDied(Unit* pKiller) { - Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiPlayerGUID); + Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerGuid); if (pPlayer && pPlayer->GetQuestStatus(QUEST_UNEXPECTED_RESULT) == QUEST_STATUS_INCOMPLETE) pPlayer->SendQuestFailed(QUEST_UNEXPECTED_RESULT); @@ -386,19 +386,19 @@ struct MANGOS_DLL_DECL npc_apprentice_mirvedaAI : public ScriptedAI if (m_uiMobCount) return; - Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiPlayerGUID); + Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerGuid); if (pPlayer && pPlayer->GetQuestStatus(QUEST_UNEXPECTED_RESULT) == QUEST_STATUS_INCOMPLETE) pPlayer->GroupEventHappens(QUEST_UNEXPECTED_RESULT, m_creature); - m_uiPlayerGUID = 0; + m_playerGuid.Clear(); m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); } - void StartEvent(uint64 uiPlayerGUID) + void StartEvent(Player* pPlayer) { m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - m_uiPlayerGUID = uiPlayerGUID; + m_playerGuid = pPlayer->GetObjectGuid(); m_creature->SummonCreature(NPC_GHARSUL, 8745.0f, -7134.32f, 35.22f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 4000); m_creature->SummonCreature(NPC_ANGERSHADE, 8745.0f, -7134.32f, 35.22f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 4000); @@ -427,7 +427,7 @@ bool QuestAccept_unexpected_results(Player* pPlayer, Creature* pCreature, const { if (pQuest->GetQuestId() == QUEST_UNEXPECTED_RESULT) if (npc_apprentice_mirvedaAI* pMirvedaAI = dynamic_cast(pCreature->AI())) - pMirvedaAI->StartEvent(pPlayer->GetGUID()); + pMirvedaAI->StartEvent(pPlayer); return true; } diff --git a/scripts/eastern_kingdoms/ghostlands.cpp b/scripts/eastern_kingdoms/ghostlands.cpp index 16dd143..03fe12a 100644 --- a/scripts/eastern_kingdoms/ghostlands.cpp +++ b/scripts/eastern_kingdoms/ghostlands.cpp @@ -118,7 +118,7 @@ struct MANGOS_DLL_DECL npc_ranger_lilathaAI : public npc_escortAI { if (HasEscortState(STATE_ESCORT_ESCORTING)) { - if (m_heliosGuid.IsEmpty() && pUnit->GetEntry() == NPC_CAPTAIN_HELIOS) + if (!m_heliosGuid && pUnit->GetEntry() == NPC_CAPTAIN_HELIOS) { if (m_creature->IsWithinDistInMap(pUnit, 30.0f)) m_heliosGuid = pUnit->GetObjectGuid(); diff --git a/scripts/eastern_kingdoms/gnomeregan/boss_thermaplugg.cpp b/scripts/eastern_kingdoms/gnomeregan/boss_thermaplugg.cpp index 3d04e22..467ad3b 100644 --- a/scripts/eastern_kingdoms/gnomeregan/boss_thermaplugg.cpp +++ b/scripts/eastern_kingdoms/gnomeregan/boss_thermaplugg.cpp @@ -73,6 +73,17 @@ struct MANGOS_DLL_DECL boss_thermapluggAI : public ScriptedAI m_lLandedBombGUIDs.clear(); } + void GetAIInformation(ChatHandler& reader) + { + reader.PSendSysMessage("Thermaplugg, currently phase %s", m_bIsPhaseTwo ? "two" : "one"); + + if (m_asBombFaces) + { + for (uint8 i = 0; i < MAX_GNOME_FACES; ++i) + reader.PSendSysMessage("Bomb face %u is %s ", (uint32)i, m_asBombFaces[i].m_bActivated ? "activated" : "not activated"); + } + } + void KilledUnit(Unit* pVictim) { DoScriptText(SAY_SLAY, m_creature); @@ -119,7 +130,7 @@ struct MANGOS_DLL_DECL boss_thermapluggAI : public ScriptedAI { if (pSummoned->GetEntry() == NPC_WALKING_BOMB) { - m_lSummonedBombGUIDs.push_back(pSummoned->GetGUID()); + m_lSummonedBombGUIDs.push_back(pSummoned->GetObjectGuid()); // calculate point for falling down float fX, fY; fX = 0.2*m_afSpawnPos[0] + 0.8*pSummoned->GetPositionX(); @@ -131,12 +142,12 @@ struct MANGOS_DLL_DECL boss_thermapluggAI : public ScriptedAI void SummonedMovementInform(Creature* pSummoned, uint32 uiMotionType, uint32 uiPointId) { if (pSummoned->GetEntry() == NPC_WALKING_BOMB && uiMotionType == POINT_MOTION_TYPE && uiPointId == 1) - m_lLandedBombGUIDs.push_back(pSummoned->GetGUID()); + m_lLandedBombGUIDs.push_back(pSummoned->GetObjectGuid()); } void SummonedCreatureDespawn(Creature* pSummoned) { - m_lSummonedBombGUIDs.remove(pSummoned->GetGUID()); + m_lSummonedBombGUIDs.remove(pSummoned->GetObjectGuid()); } void UpdateAI(const uint32 uiDiff) @@ -200,7 +211,7 @@ struct MANGOS_DLL_DECL boss_thermapluggAI : public ScriptedAI { // Calculate the spawning position as 90% between face and thermaplugg spawn-pos, and hight hardcoded float fX = 0.0f, fY = 0.0f; - if (GameObject* pFace = m_creature->GetMap()->GetGameObject(m_asBombFaces[i].m_uiGnomeFaceGUID)) + if (GameObject* pFace = m_creature->GetMap()->GetGameObject(m_asBombFaces[i].m_gnomeFaceGuid)) { fX = 0.35*m_afSpawnPos[0] + 0.65*pFace->GetPositionX(); fY = 0.35*m_afSpawnPos[1] + 0.65*pFace->GetPositionY(); diff --git a/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp b/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp index b8e4e21..120cacb 100644 --- a/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp +++ b/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp @@ -141,7 +141,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI uint8 m_uiPhase; uint32 m_uiPhaseTimer; - uint64 m_uiPlayerGUID; + ObjectGuid m_playerGuid; bool m_bDidAggroText, m_bSouthernCaveInOpened, m_bNorthernCaveInOpened; GUIDList m_luiSummonedMobGUIDs; @@ -177,7 +177,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI case NPC_CAVERNDEEP_BURROWER: case NPC_CAVERNDEEP_AMBUSHER: { - if (GameObject* pDoor = m_creature->GetMap()->GetGameObject(m_pInstance->GetData64(m_uiPhase > 20 ? GO_CAVE_IN_NORTH : GO_CAVE_IN_SOUTH))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(m_uiPhase > 20 ? GO_CAVE_IN_NORTH : GO_CAVE_IN_SOUTH)) { float fX, fY, fZ; pDoor->GetNearPoint(pDoor, fX, fY, fZ, 0.0f, 2.0f, frand(0.0f, 2*M_PI_F)); @@ -190,7 +190,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI DoScriptText(SAY_GRUBBIS_SPAWN, pSummoned); break; } - m_luiSummonedMobGUIDs.push_back(pSummoned->GetGUID()); + m_luiSummonedMobGUIDs.push_back(pSummoned->GetObjectGuid()); } void SummonedCreatureJustDied(Creature* pSummoned) @@ -201,7 +201,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI m_pInstance->SetData(TYPE_GRUBBIS, DONE); m_uiPhaseTimer = 1000; } - m_luiSummonedMobGUIDs.remove(pSummoned->GetGUID()); + m_luiSummonedMobGUIDs.remove(pSummoned->GetObjectGuid()); } bool IsPreparingExplosiveCharge() @@ -247,9 +247,9 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI m_pInstance->SetData(TYPE_GRUBBIS, FAIL); if (m_bSouthernCaveInOpened) // close southern cave-in door - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_CAVE_IN_SOUTH)); + m_pInstance->DoUseDoorOrButton(GO_CAVE_IN_SOUTH); if (m_bNorthernCaveInOpened) // close northern cave-in door - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_CAVE_IN_NORTH)); + m_pInstance->DoUseDoorOrButton(GO_CAVE_IN_NORTH); for (GUIDList::const_iterator itr = m_luiSummonedMobGUIDs.begin(); itr != m_luiSummonedMobGUIDs.end(); ++itr) { @@ -258,7 +258,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI } } - void StartEvent(uint64 uiPlayerGUID) + void StartEvent(Player* pPlayer) { if (!m_pInstance) return; @@ -267,7 +267,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI m_uiPhase = 1; m_uiPhaseTimer = 1000; - m_uiPlayerGUID = uiPlayerGUID; + m_playerGuid = pPlayer->GetObjectGuid(); } void WaypointStart(uint32 uiPointId) @@ -277,7 +277,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI case 10: // Open Southern Cave-In if (m_pInstance && !m_bSouthernCaveInOpened) - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_CAVE_IN_SOUTH)); + m_pInstance->DoUseDoorOrButton(GO_CAVE_IN_SOUTH); m_bSouthernCaveInOpened = true; break; case 12: @@ -287,7 +287,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI DoScriptText(SAY_CHARGE_3, m_creature); // Open Northern Cave-In if (m_pInstance && !m_bNorthernCaveInOpened) - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_CAVE_IN_NORTH)); + m_pInstance->DoUseDoorOrButton(GO_CAVE_IN_NORTH); m_bNorthernCaveInOpened = true; break; } @@ -315,7 +315,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI SetEscortPaused(true); if (m_pInstance) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_CAVE_IN_SOUTH))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_CAVE_IN_SOUTH)) m_creature->SetFacingToObject(pDoor); } DoScriptText(SAY_BLOW_1_10, m_creature); @@ -357,7 +357,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI m_uiPhaseTimer = 3500; // 6s delay, but 2500ms for escortstarting break; case 3: - Start(false, m_creature->GetMap()->GetPlayer(m_uiPlayerGUID), NULL, false, false); + Start(false, m_creature->GetMap()->GetPlayer(m_playerGuid), NULL, false, false); m_uiPhaseTimer = 0; break; @@ -377,7 +377,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI case 7: if (m_pInstance) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_CAVE_IN_SOUTH))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_CAVE_IN_SOUTH)) m_creature->SetFacingToObject(pDoor); } m_uiPhaseTimer = 2000; @@ -425,7 +425,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI m_uiPhaseTimer = 1; break; case 15: // shortly before starting WP 14 - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiPlayerGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerGuid)) m_creature->SetFacingToObject(pPlayer); DoScriptText(SAY_CHARGE_2, m_creature); m_uiPhaseTimer = 0; @@ -447,7 +447,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI // Close southern cave-in and let charges explode if (m_pInstance) { - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_CAVE_IN_SOUTH)); + m_pInstance->DoUseDoorOrButton(GO_CAVE_IN_SOUTH); m_bSouthernCaveInOpened = false; m_pInstance->SetData(TYPE_EXPLOSIVE_CHARGE, DATA_EXPLOSIVE_CHARGE_USE); } @@ -468,7 +468,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI case 23: if (m_pInstance) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_CAVE_IN_NORTH))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_CAVE_IN_NORTH)) m_creature->SetFacingToObject(pDoor); } m_uiPhaseTimer = 3000; @@ -520,7 +520,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI case 31: // shortly after reaching WP 19 if (m_pInstance) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_CAVE_IN_NORTH))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_CAVE_IN_NORTH)) m_creature->SetFacingToObject(pDoor); } DoScriptText(SAY_BLOW_2_10, m_creature); @@ -538,7 +538,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI case 34: // 1 sek after Death of Grubbis if (m_pInstance) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_CAVE_IN_NORTH))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_CAVE_IN_NORTH)) m_creature->SetFacingToObject(pDoor); } m_creature->HandleEmote(EMOTE_ONESHOT_CHEER); @@ -564,7 +564,7 @@ struct MANGOS_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI // Close northern cave-in and let charges explode if (m_pInstance) { - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_CAVE_IN_NORTH)); + m_pInstance->DoUseDoorOrButton(GO_CAVE_IN_NORTH); m_bNorthernCaveInOpened = false; m_pInstance->SetData(TYPE_EXPLOSIVE_CHARGE, DATA_EXPLOSIVE_CHARGE_USE); } @@ -616,7 +616,7 @@ bool GossipSelect_npc_blastmaster_emi_shortfuse(Player* pPlayer, Creature* pCrea if (pInstance->GetData(TYPE_GRUBBIS) == NOT_STARTED || pInstance->GetData(TYPE_GRUBBIS) == FAIL) { if (npc_blastmaster_emi_shortfuseAI* pEmiAI = dynamic_cast(pCreature->AI())) - pEmiAI->StartEvent(pPlayer->GetGUID()); + pEmiAI->StartEvent(pPlayer); } } } diff --git a/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h b/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h index fa4d4b9..c137e14 100644 --- a/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h +++ b/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h @@ -46,7 +46,7 @@ enum struct sBombFace { - uint64 m_uiGnomeFaceGUID; + ObjectGuid m_gnomeFaceGuid; bool m_bActivated; uint32 m_uiBombTimer; }; @@ -64,26 +64,20 @@ class MANGOS_DLL_DECL instance_gnomeregan : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); sBombFace* GetBombFaces(); void DoActivateBombFace(uint8 uiIndex); void DoDeactivateBombFace(uint8 uiIndex); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + std::string m_strInstData; sBombFace m_asBombFaces[MAX_GNOME_FACES]; - uint64 m_auiExplosiveSortedGUIDs[2][MAX_EXPLOSIVES_PER_SIDE]; - - uint64 m_uiBlastmasterShortfuseGUID; - uint64 m_uiCaveInNorthGUID; - uint64 m_uiCaveInSouthGUID; - uint64 m_uiDoorFinalChamberGUID; + ObjectGuid m_aExplosiveSortedGuids[2][MAX_EXPLOSIVES_PER_SIDE]; GUIDList m_luiExplosiveChargeGUIDs; GUIDList m_luiSpawnedExplosiveChargeGUIDs; diff --git a/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp b/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp index 3ade2b2..72f239a 100644 --- a/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp +++ b/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp @@ -24,11 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "gnomeregan.h" -instance_gnomeregan::instance_gnomeregan(Map* pMap) : ScriptedInstance(pMap), - m_uiBlastmasterShortfuseGUID(0), - m_uiCaveInNorthGUID(0), - m_uiCaveInSouthGUID(0), - m_uiDoorFinalChamberGUID(0) +instance_gnomeregan::instance_gnomeregan(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -36,34 +32,39 @@ instance_gnomeregan::instance_gnomeregan(Map* pMap) : ScriptedInstance(pMap), void instance_gnomeregan::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&m_asBombFaces, 0, sizeof(m_asBombFaces)); - memset(&m_auiExplosiveSortedGUIDs, 0, sizeof(m_auiExplosiveSortedGUIDs)); + + for (uint8 i = 0; i < MAX_GNOME_FACES; ++i) + { + m_asBombFaces[i].m_bActivated = false; + m_asBombFaces[i].m_uiBombTimer = 0; + } } void instance_gnomeregan::OnCreatureCreate(Creature* pCreature) { - switch (pCreature->GetEntry()) - { - case NPC_BLASTMASTER_SHORTFUSE: m_uiBlastmasterShortfuseGUID = pCreature->GetGUID(); break; - } + if (pCreature->GetEntry() == NPC_BLASTMASTER_SHORTFUSE) + m_mNpcEntryGuidStore[NPC_BLASTMASTER_SHORTFUSE] = pCreature->GetObjectGuid(); } void instance_gnomeregan::OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { - case GO_RED_ROCKET: m_lRedRocketGUIDs.push_back(pGo->GetGUID()); break; - case GO_CAVE_IN_NORTH: m_uiCaveInNorthGUID = pGo->GetGUID(); break; - case GO_CAVE_IN_SOUTH: m_uiCaveInSouthGUID = pGo->GetGUID(); break; - case GO_EXPLOSIVE_CHARGE: m_luiExplosiveChargeGUIDs.push_back(pGo->GetGUID()); break; - case GO_THE_FINAL_CHAMBER: m_uiDoorFinalChamberGUID = pGo->GetGUID(); break; - - case GO_GNOME_FACE_1: m_asBombFaces[0].m_uiGnomeFaceGUID = pGo->GetGUID(); break; - case GO_GNOME_FACE_2: m_asBombFaces[1].m_uiGnomeFaceGUID = pGo->GetGUID(); break; - case GO_GNOME_FACE_3: m_asBombFaces[2].m_uiGnomeFaceGUID = pGo->GetGUID(); break; - case GO_GNOME_FACE_4: m_asBombFaces[3].m_uiGnomeFaceGUID = pGo->GetGUID(); break; - case GO_GNOME_FACE_5: m_asBombFaces[4].m_uiGnomeFaceGUID = pGo->GetGUID(); break; - case GO_GNOME_FACE_6: m_asBombFaces[5].m_uiGnomeFaceGUID = pGo->GetGUID(); break; + case GO_CAVE_IN_NORTH: + case GO_CAVE_IN_SOUTH: + case GO_THE_FINAL_CHAMBER: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; + + case GO_RED_ROCKET: m_lRedRocketGUIDs.push_back(pGo->GetObjectGuid()); return; + case GO_EXPLOSIVE_CHARGE: m_luiExplosiveChargeGUIDs.push_back(pGo->GetObjectGuid()); return; + + case GO_GNOME_FACE_1: m_asBombFaces[0].m_gnomeFaceGuid = pGo->GetObjectGuid(); return; + case GO_GNOME_FACE_2: m_asBombFaces[1].m_gnomeFaceGuid = pGo->GetObjectGuid(); return; + case GO_GNOME_FACE_3: m_asBombFaces[2].m_gnomeFaceGuid = pGo->GetObjectGuid(); return; + case GO_GNOME_FACE_4: m_asBombFaces[3].m_gnomeFaceGuid = pGo->GetObjectGuid(); return; + case GO_GNOME_FACE_5: m_asBombFaces[4].m_gnomeFaceGuid = pGo->GetObjectGuid(); return; + case GO_GNOME_FACE_6: m_asBombFaces[5].m_gnomeFaceGuid = pGo->GetObjectGuid(); return; } } @@ -97,20 +98,20 @@ void instance_gnomeregan::SetData(uint32 uiType, uint32 uiData) // Sort to south and north uint8 uiCounterSouth = 0; uint8 uiCounterNorth = 0; - GameObject* pCaveInSouth = instance->GetGameObject(m_uiCaveInSouthGUID); - GameObject* pCaveInNorth = instance->GetGameObject(m_uiCaveInNorthGUID); + GameObject* pCaveInSouth = GetSingleGameObjectFromStorage(GO_CAVE_IN_SOUTH); + GameObject* pCaveInNorth = GetSingleGameObjectFromStorage(GO_CAVE_IN_NORTH); if (pCaveInSouth && pCaveInNorth) { for (std::list::iterator itr = lExplosiveCharges.begin(); itr != lExplosiveCharges.end(); ++itr) { if ((*itr)->GetDistanceOrder(pCaveInSouth, pCaveInNorth) && uiCounterSouth < MAX_EXPLOSIVES_PER_SIDE) { - m_auiExplosiveSortedGUIDs[0][uiCounterSouth] = (*itr)->GetGUID(); + m_aExplosiveSortedGuids[0][uiCounterSouth] = (*itr)->GetObjectGuid(); ++uiCounterSouth; } else if (uiCounterNorth < MAX_EXPLOSIVES_PER_SIDE) { - m_auiExplosiveSortedGUIDs[1][uiCounterNorth] = (*itr)->GetGUID(); + m_aExplosiveSortedGuids[1][uiCounterNorth] = (*itr)->GetObjectGuid(); ++uiCounterNorth; } } @@ -132,23 +133,23 @@ void instance_gnomeregan::SetData(uint32 uiType, uint32 uiData) switch (uiData) { case DATA_EXPLOSIVE_CHARGE_1: - DoRespawnGameObject(m_auiExplosiveSortedGUIDs[0][0], HOUR); - m_luiSpawnedExplosiveChargeGUIDs.push_back(m_auiExplosiveSortedGUIDs[0][0]); + DoRespawnGameObject(m_aExplosiveSortedGuids[0][0], HOUR); + m_luiSpawnedExplosiveChargeGUIDs.push_back(m_aExplosiveSortedGuids[0][0]); break; case DATA_EXPLOSIVE_CHARGE_2: - DoRespawnGameObject(m_auiExplosiveSortedGUIDs[0][1], HOUR); - m_luiSpawnedExplosiveChargeGUIDs.push_back(m_auiExplosiveSortedGUIDs[0][1]); + DoRespawnGameObject(m_aExplosiveSortedGuids[0][1], HOUR); + m_luiSpawnedExplosiveChargeGUIDs.push_back(m_aExplosiveSortedGuids[0][1]); break; case DATA_EXPLOSIVE_CHARGE_3: - DoRespawnGameObject(m_auiExplosiveSortedGUIDs[1][0], HOUR); - m_luiSpawnedExplosiveChargeGUIDs.push_back(m_auiExplosiveSortedGUIDs[1][0]); + DoRespawnGameObject(m_aExplosiveSortedGuids[1][0], HOUR); + m_luiSpawnedExplosiveChargeGUIDs.push_back(m_aExplosiveSortedGuids[1][0]); break; case DATA_EXPLOSIVE_CHARGE_4: - DoRespawnGameObject(m_auiExplosiveSortedGUIDs[1][1], HOUR); - m_luiSpawnedExplosiveChargeGUIDs.push_back(m_auiExplosiveSortedGUIDs[1][1]); + DoRespawnGameObject(m_aExplosiveSortedGuids[1][1], HOUR); + m_luiSpawnedExplosiveChargeGUIDs.push_back(m_aExplosiveSortedGuids[1][1]); break; case DATA_EXPLOSIVE_CHARGE_USE: - Creature* pBlastmaster = instance->GetCreature(m_uiBlastmasterShortfuseGUID); + Creature* pBlastmaster = GetSingleCreatureFromStorage(NPC_BLASTMASTER_SHORTFUSE); if (!pBlastmaster) break; for (GUIDList::const_iterator itr = m_luiSpawnedExplosiveChargeGUIDs.begin(); itr != m_luiSpawnedExplosiveChargeGUIDs.end(); ++itr) @@ -165,13 +166,11 @@ void instance_gnomeregan::SetData(uint32 uiType, uint32 uiData) if (uiData == IN_PROGRESS) { // Make Door locked - if (GameObject* pDoor = instance->GetGameObject(m_uiDoorFinalChamberGUID)) + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_THE_FINAL_CHAMBER)) { + pDoor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); if (pDoor->getLootState() == GO_ACTIVATED) pDoor->ResetDoorOrButton(); - - // Doesn't work here, because the flags are to be reseted on next tick in GO::Update - pDoor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } // Always directly activates this bomb-face @@ -180,11 +179,11 @@ void instance_gnomeregan::SetData(uint32 uiType, uint32 uiData) else if (uiData == DONE || uiData == FAIL) { // Make Door unlocked again - if (GameObject* pDoor = instance->GetGameObject(m_uiDoorFinalChamberGUID)) + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_THE_FINAL_CHAMBER)) { + pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); if (pDoor->getLootState() == GO_READY) pDoor->UseDoorOrButton(); - pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } // Deactivate all remaining BombFaces @@ -201,7 +200,7 @@ void instance_gnomeregan::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -241,17 +240,6 @@ uint32 instance_gnomeregan::GetData(uint32 uiType) } } -uint64 instance_gnomeregan::GetData64(uint32 uiData) -{ - switch(uiData) - { - case GO_CAVE_IN_NORTH: return m_uiCaveInNorthGUID; - case GO_CAVE_IN_SOUTH: return m_uiCaveInSouthGUID; - default: - return 0; - } -} - sBombFace* instance_gnomeregan::GetBombFaces() { return m_asBombFaces; @@ -264,7 +252,7 @@ void instance_gnomeregan::DoActivateBombFace(uint8 uiIndex) if (!m_asBombFaces[uiIndex].m_bActivated) { - DoUseDoorOrButton(m_asBombFaces[uiIndex].m_uiGnomeFaceGUID); + DoUseDoorOrButton(m_asBombFaces[uiIndex].m_gnomeFaceGuid); m_asBombFaces[uiIndex].m_bActivated = true; m_asBombFaces[uiIndex].m_uiBombTimer = 3000; } @@ -277,7 +265,7 @@ void instance_gnomeregan::DoDeactivateBombFace(uint8 uiIndex) if (m_asBombFaces[uiIndex].m_bActivated) { - DoUseDoorOrButton(m_asBombFaces[uiIndex].m_uiGnomeFaceGUID); + DoUseDoorOrButton(m_asBombFaces[uiIndex].m_gnomeFaceGuid); m_asBombFaces[uiIndex].m_bActivated = false; m_asBombFaces[uiIndex].m_uiBombTimer = 0; } diff --git a/scripts/eastern_kingdoms/karazhan/boss_midnight.cpp b/scripts/eastern_kingdoms/karazhan/boss_midnight.cpp index e6e2588..1784e8a 100644 --- a/scripts/eastern_kingdoms/karazhan/boss_midnight.cpp +++ b/scripts/eastern_kingdoms/karazhan/boss_midnight.cpp @@ -53,14 +53,13 @@ struct MANGOS_DLL_DECL boss_midnightAI : public ScriptedAI { boss_midnightAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint64 m_uiAttumenGUID; + ObjectGuid m_attumenGuid; uint8 m_uiPhase; uint32 m_uiMount_Timer; void Reset() { m_uiPhase = 1; - m_uiAttumenGUID = 0; m_uiMount_Timer = 0; m_creature->SetVisibility(VISIBILITY_ON); @@ -70,7 +69,7 @@ struct MANGOS_DLL_DECL boss_midnightAI : public ScriptedAI { if (m_uiPhase == 2) { - if (Creature* pAttumen = m_creature->GetMap()->GetCreature(m_uiAttumenGUID)) + if (Creature* pAttumen = m_creature->GetMap()->GetCreature(m_attumenGuid)) DoScriptText(SAY_MIDNIGHT_KILL, pAttumen); } } @@ -103,7 +102,7 @@ struct MANGOS_DLL_DECL boss_midnightAI : public ScriptedAI m_uiMount_Timer = 1000; } - void SetMidnight(Creature *, uint64); //Below .. + void SetMidnight(Creature*, ObjectGuid); // Below .. void UpdateAI(const uint32 uiDiff) { @@ -119,9 +118,9 @@ struct MANGOS_DLL_DECL boss_midnightAI : public ScriptedAI if (Creature* pAttumen = m_creature->SummonCreature(SUMMON_ATTUMEN, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000)) { - m_uiAttumenGUID = pAttumen->GetGUID(); + m_attumenGuid = pAttumen->GetObjectGuid(); pAttumen->AI()->AttackStart(m_creature->getVictim()); - SetMidnight(pAttumen, m_creature->GetGUID()); + SetMidnight(pAttumen, m_creature->GetObjectGuid()); switch(urand(0, 2)) { @@ -135,7 +134,7 @@ struct MANGOS_DLL_DECL boss_midnightAI : public ScriptedAI case 2: if (m_creature->GetHealthPercent() < 25.0f) { - if (Creature* pAttumen = m_creature->GetMap()->GetCreature(m_uiAttumenGUID)) + if (Creature* pAttumen = m_creature->GetMap()->GetCreature(m_attumenGuid)) Mount(pAttumen); } break; @@ -148,7 +147,7 @@ struct MANGOS_DLL_DECL boss_midnightAI : public ScriptedAI m_creature->SetVisibility(VISIBILITY_OFF); m_creature->GetMotionMaster()->MoveIdle(); - if (Creature *pAttumen = m_creature->GetMap()->GetCreature(m_uiAttumenGUID)) + if (Creature *pAttumen = m_creature->GetMap()->GetCreature(m_attumenGuid)) { pAttumen->SetDisplayId(MOUNTED_DISPLAYID); pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -191,7 +190,7 @@ struct MANGOS_DLL_DECL boss_attumenAI : public ScriptedAI m_uiResetTimer = 0; } - uint64 m_uiMidnightGUID; + ObjectGuid m_midnightGuid; uint8 m_uiPhase; uint32 m_uiCleaveTimer; uint32 m_uiCurseTimer; @@ -219,7 +218,7 @@ struct MANGOS_DLL_DECL boss_attumenAI : public ScriptedAI { DoScriptText(SAY_DEATH, m_creature); - if (Creature* pMidnight = m_creature->GetMap()->GetCreature(m_uiMidnightGUID)) + if (Creature* pMidnight = m_creature->GetMap()->GetCreature(m_midnightGuid)) pMidnight->DealDamage(pMidnight, pMidnight->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -231,12 +230,12 @@ struct MANGOS_DLL_DECL boss_attumenAI : public ScriptedAI { m_uiResetTimer = 0; - if (Creature *pMidnight = m_creature->GetMap()->GetCreature(m_uiMidnightGUID)) + if (Creature *pMidnight = m_creature->GetMap()->GetCreature(m_midnightGuid)) { pMidnight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pMidnight->SetVisibility(VISIBILITY_ON); } - m_uiMidnightGUID = 0; + m_midnightGuid.Clear(); m_creature->SetVisibility(VISIBILITY_OFF); m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); @@ -309,7 +308,7 @@ struct MANGOS_DLL_DECL boss_attumenAI : public ScriptedAI { if (m_creature->GetHealthPercent() < 25.0f) { - if (Creature *pMidnight = m_creature->GetMap()->GetCreature(m_uiMidnightGUID)) + if (Creature *pMidnight = m_creature->GetMap()->GetCreature(m_midnightGuid)) { if (boss_midnightAI* pMidnightAI = dynamic_cast(pMidnight->AI())) pMidnightAI->Mount(m_creature); @@ -324,10 +323,10 @@ struct MANGOS_DLL_DECL boss_attumenAI : public ScriptedAI } }; -void boss_midnightAI::SetMidnight(Creature* pAttumen, uint64 uiValue) +void boss_midnightAI::SetMidnight(Creature* pAttumen, ObjectGuid midnightGuid) { if (boss_attumenAI* pAttumenAI = dynamic_cast(pAttumen->AI())) - pAttumenAI->m_uiMidnightGUID = uiValue; + pAttumenAI->m_midnightGuid = midnightGuid; } CreatureAI* GetAI_boss_attumen(Creature* pCreature) diff --git a/scripts/eastern_kingdoms/karazhan/boss_moroes.cpp b/scripts/eastern_kingdoms/karazhan/boss_moroes.cpp index e8386ea..7875434 100644 --- a/scripts/eastern_kingdoms/karazhan/boss_moroes.cpp +++ b/scripts/eastern_kingdoms/karazhan/boss_moroes.cpp @@ -26,6 +26,8 @@ EndScriptData */ enum { + MAX_GUESTS = 4, + SAY_AGGRO = -1532011, SAY_SPECIAL_1 = -1532012, SAY_SPECIAL_2 = -1532013, @@ -41,7 +43,7 @@ enum SPELL_FRENZY = 37023 }; -const float afLocations[4][4]= +static const float afLocations[4][MAX_GUESTS]= { {-10991.0f, -1884.33f, 81.73f, 0.614315f}, {-10989.4f, -1885.88f, 81.73f, 0.904913f}, @@ -49,7 +51,7 @@ const float afLocations[4][4]= {-10975.9f, -1885.81f, 81.73f, 2.253890f} }; -const uint32 auiAdds[6]= +static const uint32 auiAdds[6]= { 17007, 19872, @@ -70,8 +72,8 @@ struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 m_auiAddGUID[4]; - uint32 m_auiAddId[4]; + ObjectGuid m_aAddGuid[MAX_GUESTS]; + uint32 m_auiAddId[MAX_GUESTS]; uint32 m_uiVanish_Timer; uint32 m_uiBlind_Timer; @@ -157,18 +159,18 @@ struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI { std::vector vAddList; - for(uint8 i = 0; i < 6; ++i) + for (uint8 i = 0; i < 6; ++i) vAddList.push_back(auiAdds[i]); - while(vAddList.size() > 4) + while (vAddList.size() > MAX_GUESTS) vAddList.erase((vAddList.begin())+(rand()%vAddList.size())); uint8 i = 0; - for(std::vector::iterator itr = vAddList.begin(); itr != vAddList.end(); ++itr, ++i) + for (std::vector::iterator itr = vAddList.begin(); itr != vAddList.end(); ++itr, ++i) { if (Creature* pCreature = m_creature->SummonCreature(*itr, afLocations[i][0], afLocations[i][1], afLocations[i][2], afLocations[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) { - m_auiAddGUID[i] = pCreature->GetGUID(); + m_aAddGuid[i] = pCreature->GetObjectGuid(); m_auiAddId[i] = *itr; } } @@ -177,9 +179,9 @@ struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI } else { - for(uint8 i = 0; i < 4; ++i) + for (uint8 i = 0; i < MAX_GUESTS; ++i) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_auiAddGUID[i])) + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_aAddGuid[i])) { if (!pCreature->isAlive()) // Exists but is dead { @@ -194,7 +196,7 @@ struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI else { // Does not exist if (Creature* pCreature = m_creature->SummonCreature(m_auiAddId[i], afLocations[i][0], afLocations[i][1], afLocations[i][2], afLocations[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) - m_auiAddGUID[i] = pCreature->GetGUID(); + m_aAddGuid[i] = pCreature->GetObjectGuid(); } } } @@ -202,11 +204,11 @@ struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI void AddsAttack() { - for(uint8 i = 0; i < 4; ++i) + for(uint8 i = 0; i < MAX_GUESTS; ++i) { - if (m_auiAddGUID[i]) + if (m_aAddGuid[i]) { - Creature* pTemp = m_creature->GetMap()->GetCreature(m_auiAddGUID[i]); + Creature* pTemp = m_creature->GetMap()->GetCreature(m_aAddGuid[i]); if (pTemp && pTemp->isAlive()) pTemp->AI()->AttackStart(m_creature->getVictim()); else @@ -231,11 +233,11 @@ struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI if (m_uiCheckAdds_Timer < uiDiff) { - for (uint8 i = 0; i < 4; ++i) + for (uint8 i = 0; i < MAX_GUESTS; ++i) { - if (m_auiAddGUID[i]) + if (m_aAddGuid[i]) { - Creature* pTemp = m_creature->GetMap()->GetCreature(m_auiAddGUID[i]); + Creature* pTemp = m_creature->GetMap()->GetCreature(m_aAddGuid[i]); if (pTemp && pTemp->isAlive() && (!pTemp->SelectHostileTarget() || !pTemp->getVictim())) pTemp->AI()->AttackStart(m_creature->getVictim()); } @@ -328,12 +330,10 @@ struct MANGOS_DLL_DECL boss_moroes_guestAI : public ScriptedAI { ScriptedInstance* m_pInstance; - uint64 m_auiGuestGUID[4]; + ObjectGuid m_aGuestGuid[MAX_GUESTS]; boss_moroes_guestAI(Creature* pCreature) : ScriptedAI(pCreature) { - memset(&m_auiGuestGUID, 0, sizeof(m_auiGuestGUID)); - m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); AcquireGUID(); Reset(); @@ -350,28 +350,28 @@ struct MANGOS_DLL_DECL boss_moroes_guestAI : public ScriptedAI if (!m_pInstance) return; - m_auiGuestGUID[0] = m_pInstance->GetData64(NPC_MOROES); - - if (Creature* pMoroes = m_creature->GetMap()->GetCreature(m_auiGuestGUID[0])) + if (Creature* pMoroes = m_pInstance->GetSingleCreatureFromStorage(NPC_MOROES)) { + m_aGuestGuid[0] = pMoroes->GetObjectGuid(); + for(uint8 i = 0; i < 3; ++i) { - uint64 uiGUID = 0; + ObjectGuid addGuid; if (boss_moroesAI* pMoroesAI = dynamic_cast(pMoroes->AI())) - uiGUID = pMoroesAI->m_auiAddGUID[i]; + addGuid = pMoroesAI->m_aAddGuid[i]; - if (uiGUID && uiGUID != m_creature->GetGUID()) - m_auiGuestGUID[i+1] = uiGUID; + if (addGuid && addGuid != m_creature->GetObjectGuid()) + m_aGuestGuid[i+1] = addGuid; } } } Unit* SelectTarget() { - if (uint64 uiTempGUID = m_auiGuestGUID[rand()%4]) + if (ObjectGuid tempGuid = m_aGuestGuid[urand(0, MAX_GUESTS-1)]) { - Creature* pTemp = m_creature->GetMap()->GetCreature(uiTempGUID); + Creature* pTemp = m_creature->GetMap()->GetCreature(tempGuid); if (pTemp && pTemp->isAlive()) return pTemp; } diff --git a/scripts/eastern_kingdoms/karazhan/boss_netherspite.cpp b/scripts/eastern_kingdoms/karazhan/boss_netherspite.cpp index 8cac07a..1e13f28 100644 --- a/scripts/eastern_kingdoms/karazhan/boss_netherspite.cpp +++ b/scripts/eastern_kingdoms/karazhan/boss_netherspite.cpp @@ -106,7 +106,6 @@ struct MANGOS_DLL_DECL boss_netherspiteAI : public ScriptedAI uint32 m_uiPhaseSwitchTimer; uint32 m_uiNetherbreathTimer; - void Reset() { m_bIsEnraged = false; diff --git a/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp b/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp index 8633ca3..aa59210 100644 --- a/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp +++ b/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp @@ -23,18 +23,21 @@ EndScriptData */ #include "precompiled.h" -#define SAY_AGGRO -1532091 -#define SAY_AXE_TOSS1 -1532092 -#define SAY_AXE_TOSS2 -1532093 -#define SAY_SPECIAL1 -1532094 -#define SAY_SPECIAL2 -1532095 -#define SAY_SPECIAL3 -1532096 -#define SAY_SLAY1 -1532097 -#define SAY_SLAY2 -1532098 -#define SAY_SLAY3 -1532099 -#define SAY_SUMMON1 -1532100 -#define SAY_SUMMON2 -1532101 -#define SAY_DEATH -1532102 +enum +{ + SAY_AGGRO = -1532091, + SAY_AXE_TOSS1 = -1532092, + SAY_AXE_TOSS2 = -1532093, + SAY_SPECIAL1 = -1532094, + SAY_SPECIAL2 = -1532095, + SAY_SPECIAL3 = -1532096, + SAY_SLAY1 = -1532097, + SAY_SLAY2 = -1532098, + SAY_SLAY3 = -1532099, + SAY_SUMMON1 = -1532100, + SAY_SUMMON2 = -1532101, + SAY_DEATH = -1532102, +}; // 18 Coordinates for Infernal spawns struct InfernalPoint @@ -66,153 +69,162 @@ static InfernalPoint InfernalPoints[] = {-10935.7f, -1996.0f} }; -#define TOTAL_INFERNAL_POINTS 18 +enum +{ + TOTAL_INFERNAL_POINTS = 18, //Enfeeble is supposed to reduce hp to 1 and then heal player back to full when it ends //Along with reducing healing and regen while enfeebled to 0% //This spell effect will only reduce healing -#define SPELL_ENFEEBLE 30843 //Enfeeble during phase 1 and 2 -#define SPELL_ENFEEBLE_EFFECT 41624 - -#define SPELL_SHADOWNOVA 30852 //Shadownova used during all phases -#define SPELL_SW_PAIN 30854 //Shadow word pain during phase 1 and 3 (different targeting rules though) -#define SPELL_THRASH_PASSIVE 12787 //Extra attack chance during phase 2 -#define SPELL_SUNDER_ARMOR 30901 //Sunder armor during phase 2 -#define SPELL_THRASH_AURA 12787 //Passive proc chance for thrash -#define SPELL_EQUIP_AXES 30857 //Visual for axe equiping -#define SPELL_AMPLIFY_DAMAGE 39095 //Amplifiy during phase 3 -#define SPELL_CLEAVE 30131 //Same as Nightbane. -#define SPELL_HELLFIRE 30859 //Infenals' hellfire aura -#define NETHERSPITE_INFERNAL 17646 //The netherspite infernal creature -#define MALCHEZARS_AXE 17650 //Malchezar's axes (creatures), summoned during phase 3 - -#define INFERNAL_MODEL_INVISIBLE 11686 //Infernal Effects -#define SPELL_INFERNAL_RELAY 30834 - -#define EQUIP_ID_AXE 33542 //Axes info + SPELL_ENFEEBLE = 30843, // Enfeeble during m_uiPhase 1 and 2 + SPELL_ENFEEBLE_EFFECT = 41624, + + SPELL_SHADOWNOVA = 30852, // Shadownova used during all phases + SPELL_SW_PAIN = 30854, // Shadow word pain during m_uiPhase 1 and 3 (different targeting rules though) + SPELL_THRASH_PASSIVE = 12787, // Extra attack chance during m_uiPhase 2 + SPELL_SUNDER_ARMOR = 30901, // Sunder armor during m_uiPhase 2 + SPELL_THRASH_AURA = 12787, // Passive proc chance for thrash + SPELL_EQUIP_AXES = 30857, // Visual for axe equiping + SPELL_AMPLIFY_DAMAGE = 39095, // Amplifiy during m_uiPhase 3 + SPELL_CLEAVE = 30131, // Same as Nightbane. + SPELL_HELLFIRE = 30859, // Infenals' hellfire aura + NETHERSPITE_INFERNAL = 17646, // The netherspite infernal creature + MALCHEZARS_AXE = 17650, // Malchezar's m_aAxeGuid (creatures), summoned during m_uiPhase 3 + + INFERNAL_MODEL_INVISIBLE = 11686, // Infernal Effects + SPELL_INFERNAL_RELAY = 30834, + + EQUIP_ID_AXE = 33542, // Axes info +}; //---------Infernal code first struct MANGOS_DLL_DECL netherspite_infernalAI : public ScriptedAI { - netherspite_infernalAI(Creature* pCreature) : ScriptedAI(pCreature) , - malchezaar(0), HellfireTimer(0), CleanupTimer(0), point(NULL) {Reset();} + netherspite_infernalAI(Creature* pCreature) : ScriptedAI(pCreature), + m_uiHellfireTimer(0), + m_uiCleanupTimer(0), + pPoint(NULL) + { + Reset(); + } - uint32 HellfireTimer; - uint32 CleanupTimer; - uint64 malchezaar; - InfernalPoint *point; + uint32 m_uiHellfireTimer; + uint32 m_uiCleanupTimer; + ObjectGuid m_malchezaarGuid; + InfernalPoint* pPoint; void Reset() {} - void MoveInLineOfSight(Unit *who) {} + void MoveInLineOfSight(Unit* pWho) {} - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (HellfireTimer) + if (m_uiHellfireTimer) { - if (HellfireTimer <= diff) + if (m_uiHellfireTimer <= uiDiff) { - DoCastSpellIfCan(m_creature, SPELL_HELLFIRE); - HellfireTimer = 0; - } else HellfireTimer -= diff; + if (DoCastSpellIfCan(m_creature, SPELL_HELLFIRE) == CAST_OK) + m_uiHellfireTimer = 0; + } + else + m_uiHellfireTimer -= uiDiff; } - if (CleanupTimer) + if (m_uiCleanupTimer) { - if (CleanupTimer <= diff) + if (m_uiCleanupTimer <= uiDiff) { Cleanup(); - CleanupTimer = 0; - } else CleanupTimer -= diff; + m_uiCleanupTimer = 0; + } + else + m_uiCleanupTimer -= uiDiff; } } void KilledUnit(Unit *who) { - if (Creature *pMalchezaar = m_creature->GetMap()->GetCreature(malchezaar)) + if (Creature* pMalchezaar = m_creature->GetMap()->GetCreature(m_malchezaarGuid)) pMalchezaar->AI()->KilledUnit(who); } - void SpellHit(Unit *who, const SpellEntry *spell) + void SpellHit(Unit* pWho, const SpellEntry* pSpell) { - if (spell->Id == SPELL_INFERNAL_RELAY) + if (pSpell->Id == SPELL_INFERNAL_RELAY) { m_creature->SetDisplayId(m_creature->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - HellfireTimer = 4000; - CleanupTimer = 170000; + m_uiHellfireTimer = 4000; + m_uiCleanupTimer = 170000; } } - void DamageTaken(Unit *done_by, uint32 &damage) + void DamageTaken(Unit* pDealer, uint32& uiDamage) { - if (done_by->GetGUID() != malchezaar) - damage = 0; + if (pDealer->GetObjectGuid() != m_malchezaarGuid) + uiDamage = 0; } - void Cleanup(); //below ... + void Cleanup(); // below ... }; struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI { boss_malchezaarAI(Creature* pCreature) : ScriptedAI(pCreature) { - for(uint8 i =0; i < 2; ++i) - axes[i] = 0; - Reset(); } - uint32 EnfeebleTimer; - uint32 EnfeebleResetTimer; - uint32 ShadowNovaTimer; - uint32 SWPainTimer; + uint32 m_uiEnfeebleTimer; + uint32 m_uiEnfeebleResetTimer; + uint32 m_uiShadowNovaTimer; + uint32 m_uiSWPainTimer; uint32 SunderArmorTimer; - uint32 AmplifyDamageTimer; - uint32 Cleave_Timer; + uint32 m_uiAmplifyDamageTimer; + uint32 m_uiCleave_Timer; uint32 InfernalTimer; - uint32 AxesTargetSwitchTimer; - uint32 InfernalCleanupTimer; + uint32 m_uiAxesTargetSwitchTimer; + uint32 m_uiInfernalCleanupTimer; - GUIDVector infernals; - std::vector positions; + GUIDVector m_vInfernalGuids; + std::vector m_positions; - uint64 axes[2]; - uint64 enfeeble_targets[5]; - uint64 enfeeble_health[5]; + ObjectGuid m_aAxeGuid[2]; + ObjectGuid m_aEnfeebleTargetGuid[5]; + uint32 m_auiEnfeebleHealth[5]; - uint32 phase; + uint32 m_uiPhase; void Reset() { AxesCleanup(); ClearWeapons(); InfernalCleanup(); - positions.clear(); + m_positions.clear(); - for(int i =0; i < 5; ++i) + for (uint8 i = 0; i < 5; ++i) { - enfeeble_targets[i] = 0; - enfeeble_health[i] = 0; + m_aEnfeebleTargetGuid[i].Clear(); + m_auiEnfeebleHealth[i] = 0; } for(int i = 0; i < TOTAL_INFERNAL_POINTS; ++i) - positions.push_back(&InfernalPoints[i]); - - EnfeebleTimer = 30000; - EnfeebleResetTimer = 38000; - ShadowNovaTimer = 35500; - SWPainTimer = 20000; - AmplifyDamageTimer = 5000; - Cleave_Timer = 8000; + m_positions.push_back(&InfernalPoints[i]); + + m_uiEnfeebleTimer = 30000; + m_uiEnfeebleResetTimer = 38000; + m_uiShadowNovaTimer = 35500; + m_uiSWPainTimer = 20000; + m_uiAmplifyDamageTimer = 5000; + m_uiCleave_Timer = 8000; InfernalTimer = 45000; - InfernalCleanupTimer = 47000; - AxesTargetSwitchTimer = urand(7500, 20000); + m_uiInfernalCleanupTimer = 47000; + m_uiAxesTargetSwitchTimer = urand(7500, 20000); SunderArmorTimer = urand(5000, 10000); - phase = 1; + m_uiPhase = 1; } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { switch(urand(0, 2)) { @@ -222,17 +234,17 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI } } - void JustDied(Unit *victim) + void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); AxesCleanup(); ClearWeapons(); InfernalCleanup(); - positions.clear(); + m_positions.clear(); - for(int i = 0; i < TOTAL_INFERNAL_POINTS; ++i) - positions.push_back(&InfernalPoints[i]); + for (uint8 i = 0; i < TOTAL_INFERNAL_POINTS; ++i) + m_positions.push_back(&InfernalPoints[i]); } void Aggro(Unit *who) @@ -242,8 +254,8 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI void InfernalCleanup() { - //Infernal Cleanup - for(GUIDVector::const_iterator itr = infernals.begin(); itr!= infernals.end(); ++itr) + // Infernal Cleanup + for(GUIDVector::const_iterator itr = m_vInfernalGuids.begin(); itr!= m_vInfernalGuids.end(); ++itr) { Creature *pInfernal = m_creature->GetMap()->GetCreature(*itr); if (pInfernal && pInfernal->isAlive()) @@ -252,17 +264,17 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI pInfernal->SetDeathState(JUST_DIED); } } - infernals.clear(); + m_vInfernalGuids.clear(); } void AxesCleanup() { - for(int i=0; i<2;++i) + for (uint8 i = 0; i < 2; ++i) { - Creature *axe = m_creature->GetMap()->GetCreature(axes[i]); - if (axe && axe->isAlive()) - axe->DealDamage(axe, axe->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - axes[i] = 0; + Creature* pAxe = m_creature->GetMap()->GetCreature(m_aAxeGuid[i]); + if (pAxe && pAxe->isAlive()) + pAxe->DealDamage(pAxe, pAxe->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + m_aAxeGuid[i].Clear(); } } @@ -310,10 +322,10 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI Unit *target = *iter; if (target) { - enfeeble_targets[i] = target->GetGUID(); - enfeeble_health[i] = target->GetHealth(); + m_aEnfeebleTargetGuid[i] = target->GetObjectGuid(); + m_auiEnfeebleHealth[i] = target->GetHealth(); - target->CastSpell(target, SPELL_ENFEEBLE, true, 0, 0, m_creature->GetGUID()); + target->CastSpell(target, SPELL_ENFEEBLE, true, 0, 0, m_creature->GetObjectGuid()); target->SetHealth(1); } } @@ -324,29 +336,29 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI { for(int i = 0; i < 5; ++i) { - Player* pTarget = m_creature->GetMap()->GetPlayer(enfeeble_targets[i]); + Player* pTarget = m_creature->GetMap()->GetPlayer(m_aEnfeebleTargetGuid[i]); if (pTarget && pTarget->isAlive()) - pTarget->SetHealth(enfeeble_health[i]); + pTarget->SetHealth(m_auiEnfeebleHealth[i]); - enfeeble_targets[i] = 0; - enfeeble_health[i] = 0; + m_aEnfeebleTargetGuid[i].Clear(); + m_auiEnfeebleHealth[i] = 0; } } - void SummonInfernal(const uint32 diff) + void SummonInfernal() { InfernalPoint *point = NULL; float posX,posY,posZ; - if ((m_creature->GetMapId() != 532) || positions.empty()) + if ((m_creature->GetMapId() != 532) || m_positions.empty()) { m_creature->GetRandomPoint(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 60, posX, posY, posZ); } else { - std::vector::iterator itr = positions.begin()+rand()%positions.size(); + std::vector::iterator itr = m_positions.begin()+rand()%m_positions.size(); point = *itr; - positions.erase(itr); + m_positions.erase(itr); posX = point->x; posY = point->y; @@ -365,45 +377,47 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI if (pInfernalAI) { if (point) - pInfernalAI->point = point; + pInfernalAI->pPoint = point; - pInfernalAI->malchezaar = m_creature->GetGUID(); + pInfernalAI->m_malchezaarGuid = m_creature->GetObjectGuid(); } - infernals.push_back(Infernal->GetGUID()); + m_vInfernalGuids.push_back(Infernal->GetObjectGuid()); DoCastSpellIfCan(Infernal, SPELL_INFERNAL_RELAY); } DoScriptText(urand(0, 1) ? SAY_SUMMON1 : SAY_SUMMON2, m_creature); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (EnfeebleResetTimer) + if (m_uiEnfeebleResetTimer) { - if (EnfeebleResetTimer <= diff) //Let's not forget to reset that + if (m_uiEnfeebleResetTimer <= uiDiff) //Let's not forget to reset that { EnfeebleResetHealth(); - EnfeebleResetTimer=0; - } else EnfeebleResetTimer -= diff; + m_uiEnfeebleResetTimer=0; + } + else + m_uiEnfeebleResetTimer -= uiDiff; } - if (m_creature->hasUnitState(UNIT_STAT_STUNNED)) //While shifting to phase 2 malchezaar stuns himself + if (m_creature->hasUnitState(UNIT_STAT_STUNNED)) //While shifting to m_uiPhase 2 m_malchezaarGuid stuns himself return; if (m_creature->GetTargetGuid() != m_creature->getVictim()->GetObjectGuid()) m_creature->SetTargetGuid(m_creature->getVictim()->GetObjectGuid()); - if (phase == 1) + if (m_uiPhase == 1) { if (m_creature->GetHealthPercent() < 60.0f) { m_creature->InterruptNonMeleeSpells(false); - phase = 2; + m_uiPhase = 2; //animation DoCastSpellIfCan(m_creature, SPELL_EQUIP_AXES); @@ -432,13 +446,13 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI m_creature->SetAttackTime(OFF_ATTACK, (m_creature->GetAttackTime(BASE_ATTACK)*150)/100); } } - else if (phase == 2) + else if (m_uiPhase == 2) { if (m_creature->GetHealthPercent() < 30.0f) { InfernalTimer = 15000; - phase = 3; + m_uiPhase = 3; ClearWeapons(); @@ -447,58 +461,62 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI DoScriptText(SAY_AXE_TOSS2, m_creature); - Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); - for(uint32 i=0; i<2; ++i) + Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + for (uint32 i = 0; i < 2; ++i) { - Creature *axe = m_creature->SummonCreature(MALCHEZARS_AXE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000); - if (axe) + Creature* pAxe = m_creature->SummonCreature(MALCHEZARS_AXE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000); + if (pAxe) { - axe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - axe->setFaction(m_creature->getFaction()); + pAxe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pAxe->setFaction(m_creature->getFaction()); - axes[i] = axe->GetGUID(); - if (target) + m_aAxeGuid[i] = pAxe->GetObjectGuid(); + if (pTarget) { - axe->AI()->AttackStart(target); - // axe->getThreatManager().tauntApply(target); //Taunt Apply and fade out does not work properly - // So we'll use a hack to add a lot of threat to our target - axe->AddThreat(target, 10000000.0f); + pAxe->AI()->AttackStart(pTarget); + // pAxe->getThreatManager().tauntApply(pTarget); //Taunt Apply and fade out does not work properly + // So we'll use a hack to add a lot of threat to our pTarget + pAxe->AddThreat(pTarget, 10000000.0f); } } } - if (ShadowNovaTimer > 35000) - ShadowNovaTimer = EnfeebleTimer + 5000; + if (m_uiShadowNovaTimer > 35000) + m_uiShadowNovaTimer = m_uiEnfeebleTimer + 5000; return; } - if (SunderArmorTimer < diff) + if (SunderArmorTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_SUNDER_ARMOR); SunderArmorTimer = urand(10000, 18000); - }else SunderArmorTimer -= diff; + } + else + SunderArmorTimer -= uiDiff; - if (Cleave_Timer < diff) + if (m_uiCleave_Timer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE); - Cleave_Timer = urand(6000, 12000); + m_uiCleave_Timer = urand(6000, 12000); - }else Cleave_Timer -= diff; + } + else + m_uiCleave_Timer -= uiDiff; } else { - if (AxesTargetSwitchTimer < diff) + if (m_uiAxesTargetSwitchTimer < uiDiff) { - AxesTargetSwitchTimer = urand(7500, 20000); + m_uiAxesTargetSwitchTimer = urand(7500, 20000); Unit *target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); if (target) { for(int i = 0; i < 2; ++i) { - Creature *axe = m_creature->GetMap()->GetCreature(axes[i]); + Creature *axe = m_creature->GetMap()->GetCreature(m_aAxeGuid[i]); if (axe) { float threat = 1000000.0f; @@ -514,36 +532,44 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI } } } - } else AxesTargetSwitchTimer -= diff; + } + else + m_uiAxesTargetSwitchTimer -= uiDiff; - if (AmplifyDamageTimer < diff) + if (m_uiAmplifyDamageTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) DoCastSpellIfCan(pTarget, SPELL_AMPLIFY_DAMAGE); - AmplifyDamageTimer = urand(20000, 30000); - }else AmplifyDamageTimer -= diff; + m_uiAmplifyDamageTimer = urand(20000, 30000); + } + else + m_uiAmplifyDamageTimer -= uiDiff; } //Time for global and double timers - if (InfernalTimer < diff) + if (InfernalTimer < uiDiff) { - SummonInfernal(diff); - InfernalTimer = phase == 3 ? 14500 : 44500; //15 secs in phase 3, 45 otherwise - }else InfernalTimer -= diff; + SummonInfernal(); + InfernalTimer = m_uiPhase == 3 ? 14500 : 44500; //15 secs in m_uiPhase 3, 45 otherwise + } + else + InfernalTimer -= uiDiff; - if (ShadowNovaTimer < diff) + if (m_uiShadowNovaTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_SHADOWNOVA); - ShadowNovaTimer = phase == 3 ? 31000 : -1; - } else ShadowNovaTimer -= diff; + m_uiShadowNovaTimer = m_uiPhase == 3 ? 31000 : -1; + } + else + m_uiShadowNovaTimer -= uiDiff; - if (phase != 2) + if (m_uiPhase != 2) { - if (SWPainTimer < diff) + if (m_uiSWPainTimer < uiDiff) { Unit* target = NULL; - if (phase == 1) + if (m_uiPhase == 1) target = m_creature->getVictim(); // the tank else //anyone but the tank target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1); @@ -551,22 +577,26 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI if (target) DoCastSpellIfCan(target, SPELL_SW_PAIN); - SWPainTimer = 20000; - }else SWPainTimer -= diff; + m_uiSWPainTimer = 20000; + } + else + m_uiSWPainTimer -= uiDiff; } - if (phase != 3) + if (m_uiPhase != 3) { - if (EnfeebleTimer < diff) + if (m_uiEnfeebleTimer < uiDiff) { EnfeebleHealthEffect(); - EnfeebleTimer = 30000; - ShadowNovaTimer = 5000; - EnfeebleResetTimer = 9000; - }else EnfeebleTimer -= diff; + m_uiEnfeebleTimer = 30000; + m_uiShadowNovaTimer = 5000; + m_uiEnfeebleResetTimer = 9000; + } + else + m_uiEnfeebleTimer -= uiDiff; } - if (phase==2) + if (m_uiPhase==2) DoMeleeAttacksIfReady(); else DoMeleeAttackIfReady(); @@ -574,7 +604,7 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI void DoMeleeAttacksIfReady() { - // Check if target is valid + // Check if pTarget is valid if (!m_creature->getVictim()) return; @@ -597,25 +627,25 @@ struct MANGOS_DLL_DECL boss_malchezaarAI : public ScriptedAI void Cleanup(Creature *infernal, InfernalPoint *point) { - for(GUIDVector::iterator itr = infernals.begin(); itr!= infernals.end(); ++itr) - if (*itr == infernal->GetGUID()) + for(GUIDVector::iterator itr = m_vInfernalGuids.begin(); itr!= m_vInfernalGuids.end(); ++itr) + if (*itr == infernal->GetObjectGuid()) { - infernals.erase(itr); + m_vInfernalGuids.erase(itr); break; } - positions.push_back(point); + m_positions.push_back(point); } }; void netherspite_infernalAI::Cleanup() { - Creature* pMalchezaar = m_creature->GetMap()->GetCreature(malchezaar); + Creature* pMalchezaar = m_creature->GetMap()->GetCreature(m_malchezaarGuid); if (pMalchezaar && pMalchezaar->isAlive()) { if (boss_malchezaarAI* pMalAI = dynamic_cast(pMalchezaar->AI())) - pMalAI->Cleanup(m_creature, point); + pMalAI->Cleanup(m_creature, pPoint); } } @@ -629,20 +659,17 @@ CreatureAI* GetAI_boss_malchezaar(Creature* pCreature) return new boss_malchezaarAI(pCreature); } -void AddSC_netherspite_infernal() +void AddSC_boss_prince_malchezaar() { - Script *newscript; - newscript = new Script; - newscript->Name = "netherspite_infernal"; - newscript->GetAI = &GetAI_netherspite_infernal; - newscript->RegisterSelf(); -} + Script* pNewScript; -void AddSC_boss_malchezaar() -{ - Script *newscript; - newscript = new Script; - newscript->Name = "boss_malchezaar"; - newscript->GetAI = &GetAI_boss_malchezaar; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "boss_malchezaar"; + pNewScript->GetAI = &GetAI_boss_malchezaar; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "netherspite_infernal"; + pNewScript->GetAI = &GetAI_netherspite_infernal; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/karazhan/boss_shade_of_aran.cpp b/scripts/eastern_kingdoms/karazhan/boss_shade_of_aran.cpp index a330f54..2562df8 100644 --- a/scripts/eastern_kingdoms/karazhan/boss_shade_of_aran.cpp +++ b/scripts/eastern_kingdoms/karazhan/boss_shade_of_aran.cpp @@ -104,7 +104,7 @@ struct MANGOS_DLL_DECL boss_aranAI : public ScriptedAI uint32 m_uiFlameWreath_Timer; uint32 m_uiFlameWreathCheck_Timer; - uint64 m_uiFlameWreathTarget[3]; + ObjectGuid m_aFlameWreathTargetGuid[3]; float m_fFWTargPosX[3]; float m_fFWTargPosY[3]; @@ -200,7 +200,7 @@ struct MANGOS_DLL_DECL boss_aranAI : public ScriptedAI { if (*itr) { - m_uiFlameWreathTarget[i] = (*itr)->GetGUID(); + m_aFlameWreathTargetGuid[i] = (*itr)->GetObjectGuid(); m_fFWTargPosX[i] = (*itr)->GetPositionX(); m_fFWTargPosY[i] = (*itr)->GetPositionY(); m_creature->CastSpell((*itr), SPELL_FLAME_WREATH, true); @@ -220,7 +220,7 @@ struct MANGOS_DLL_DECL boss_aranAI : public ScriptedAI { if (m_pInstance) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_PRIVATE_LIBRARY_DOOR))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_PRIVATE_LIBRARY_DOOR)) pDoor->SetGoState(GO_STATE_READY); m_uiCloseDoor_Timer = 0; @@ -389,7 +389,8 @@ struct MANGOS_DLL_DECL boss_aranAI : public ScriptedAI m_uiFlameWreath_Timer = 20000; m_uiFlameWreathCheck_Timer = 500; - memset(&m_uiFlameWreathTarget, 0, sizeof(m_uiFlameWreathTarget)); + for (uint8 i = 0; i < 3; ++i) + m_aFlameWreathTargetGuid[i].Clear(); FlameWreathEffect(); break; @@ -456,16 +457,16 @@ struct MANGOS_DLL_DECL boss_aranAI : public ScriptedAI { for (uint32 i = 0; i < 3; ++i) { - if (!m_uiFlameWreathTarget[i]) + if (!m_aFlameWreathTargetGuid[i]) continue; - Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiFlameWreathTarget[i]); + Player* pPlayer = m_creature->GetMap()->GetPlayer(m_aFlameWreathTargetGuid[i]); if (pPlayer && !pPlayer->IsWithinDist2d(m_fFWTargPosX[i], m_fFWTargPosY[i], 3.0f)) { pPlayer->CastSpell(pPlayer, SPELL_EXPLOSION, true, 0, 0, m_creature->GetObjectGuid()); pPlayer->CastSpell(pPlayer, SPELL_KNOCKBACK_500, true); - m_uiFlameWreathTarget[i] = 0; + m_aFlameWreathTargetGuid[i].Clear(); } } m_uiFlameWreathCheck_Timer = 500; diff --git a/scripts/eastern_kingdoms/karazhan/boss_terestian_illhoof.cpp b/scripts/eastern_kingdoms/karazhan/boss_terestian_illhoof.cpp index a61c8d0..64c1baf 100644 --- a/scripts/eastern_kingdoms/karazhan/boss_terestian_illhoof.cpp +++ b/scripts/eastern_kingdoms/karazhan/boss_terestian_illhoof.cpp @@ -61,26 +61,20 @@ enum struct MANGOS_DLL_DECL mob_demon_chainAI : public ScriptedAI { - mob_demon_chainAI(Creature* pCreature) : ScriptedAI(pCreature) - { - Reset(); - } + mob_demon_chainAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - uint64 m_uiSacrificeGUID; + ObjectGuid m_sacrificeGuid; - void Reset() - { - m_uiSacrificeGUID = 0; - } + void Reset(){} void AttackStart(Unit* pWho) {} void MoveInLineOfSight(Unit* pWho) {} void JustDied(Unit* pKiller) { - if (m_uiSacrificeGUID) + if (m_sacrificeGuid) { - if (Player* pSacrifice = m_creature->GetMap()->GetPlayer(m_uiSacrificeGUID)) + if (Player* pSacrifice = m_creature->GetMap()->GetPlayer(m_sacrificeGuid)) pSacrifice->RemoveAurasDueToSpell(SPELL_SACRIFICE); } } @@ -90,7 +84,6 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI { boss_terestianAI(Creature* pCreature) : ScriptedAI(pCreature) { - memset(&m_uiPortalGUID, 0, sizeof(m_uiPortalGUID)); m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); m_bSummonKilrek = true; Reset(); @@ -98,7 +91,7 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 m_uiPortalGUID[2]; + ObjectGuid m_aPortalGuid[2]; uint32 m_uiSummonKilrekTimer; uint32 m_uiSacrifice_Timer; @@ -126,12 +119,12 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI for(uint8 i = 0; i < 2; ++i) { - if (m_uiPortalGUID[i]) + if (m_aPortalGuid[i]) { - if (Creature* pPortal = m_pInstance->instance->GetCreature(m_uiPortalGUID[i])) + if (Creature* pPortal = m_pInstance->instance->GetCreature(m_aPortalGuid[i])) pPortal->ForcedDespawn(); - m_uiPortalGUID[i] = 0; + m_aPortalGuid[i].Clear(); } } @@ -153,8 +146,6 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI if (m_pInstance) m_pInstance->SetData(TYPE_TERESTIAN, IN_PROGRESS); - else - ERROR_INST_DATA(m_creature); } void KilledUnit(Unit* pVictim) @@ -168,16 +159,16 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI { case NPC_PORTAL: { - if (m_uiPortalGUID[0]) + if (m_aPortalGuid[0]) { - m_uiPortalGUID[1] = pSummoned->GetGUID(); + m_aPortalGuid[1] = pSummoned->GetObjectGuid(); if (npc_fiendish_portalAI* pPortalAI = dynamic_cast(pSummoned->AI())) pPortalAI->m_uiSummonTimer = 10000; } else { - m_uiPortalGUID[0] = pSummoned->GetGUID(); + m_aPortalGuid[0] = pSummoned->GetObjectGuid(); DoCastSpellIfCan(m_creature, SPELL_FIENDISH_PORTAL_1, CAST_TRIGGERED); } @@ -207,12 +198,12 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI for(uint8 i = 0; i < 2; ++i) { - if (m_uiPortalGUID[i]) + if (m_aPortalGuid[i]) { - if (Creature* pPortal = m_pInstance->instance->GetCreature(m_uiPortalGUID[i])) + if (Creature* pPortal = m_pInstance->instance->GetCreature(m_aPortalGuid[i])) pPortal->ForcedDespawn(); - m_uiPortalGUID[i] = 0; + m_aPortalGuid[i].Clear(); } } @@ -248,7 +239,7 @@ struct MANGOS_DLL_DECL boss_terestianAI : public ScriptedAI if (Creature* pChains = m_creature->SummonCreature(NPC_DEMONCHAINS, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 21000)) { if (mob_demon_chainAI* pDemonAI = dynamic_cast(pChains->AI())) - pDemonAI->m_uiSacrificeGUID = pTarget->GetGUID(); + pDemonAI->m_sacrificeGuid = pTarget->GetObjectGuid(); pChains->CastSpell(pChains, SPELL_DEMON_CHAINS, true); diff --git a/scripts/eastern_kingdoms/karazhan/bosses_opera.cpp b/scripts/eastern_kingdoms/karazhan/bosses_opera.cpp index 0d23352..0e6c595 100644 --- a/scripts/eastern_kingdoms/karazhan/bosses_opera.cpp +++ b/scripts/eastern_kingdoms/karazhan/bosses_opera.cpp @@ -213,20 +213,19 @@ struct MANGOS_DLL_DECL mob_titoAI : public ScriptedAI Reset(); } - uint64 DorotheeGUID; + ObjectGuid m_dorotheeGuid; uint32 YipTimer; void Reset() { - DorotheeGUID = 0; YipTimer = 10000; } void JustDied(Unit* killer) { - if (DorotheeGUID) + if (m_dorotheeGuid) { - Creature* Dorothee = m_creature->GetMap()->GetCreature(DorotheeGUID); + Creature* Dorothee = m_creature->GetMap()->GetCreature(m_dorotheeGuid); if (Dorothee && Dorothee->isAlive()) { if (boss_dorotheeAI* pDoroAI = dynamic_cast(Dorothee->AI())) @@ -259,7 +258,7 @@ void boss_dorotheeAI::SummonTito() DoScriptText(SAY_DOROTHEE_SUMMON, m_creature); if (mob_titoAI* pTitoAI = dynamic_cast(pTito->AI())) - pTitoAI->DorotheeGUID = m_creature->GetGUID(); + pTitoAI->m_dorotheeGuid = m_creature->GetObjectGuid(); pTito->AI()->AttackStart(m_creature->getVictim()); @@ -761,7 +760,7 @@ struct MANGOS_DLL_DECL boss_bigbadwolfAI : public ScriptedAI uint32 FearTimer; uint32 SwipeTimer; - uint64 HoodGUID; + ObjectGuid m_hoodGuid; float TempThreat; bool IsChasing; @@ -772,7 +771,7 @@ struct MANGOS_DLL_DECL boss_bigbadwolfAI : public ScriptedAI FearTimer = urand(25000, 35000); SwipeTimer = 5000; - HoodGUID = 0; + m_hoodGuid.Clear(); TempThreat = 0; IsChasing = false; @@ -817,7 +816,7 @@ struct MANGOS_DLL_DECL boss_bigbadwolfAI : public ScriptedAI if (TempThreat) m_creature->getThreatManager().modifyThreatPercent(target, -100); - HoodGUID = target->GetGUID(); + m_hoodGuid = target->GetObjectGuid(); m_creature->AddThreat(target, 1000000.0f); ChaseTimer = 20000; IsChasing = true; @@ -827,9 +826,9 @@ struct MANGOS_DLL_DECL boss_bigbadwolfAI : public ScriptedAI { IsChasing = false; - if (Player* target = m_creature->GetMap()->GetPlayer(HoodGUID)) + if (Player* target = m_creature->GetMap()->GetPlayer(m_hoodGuid)) { - HoodGUID = 0; + m_hoodGuid.Clear(); if (m_creature->getThreatManager().getThreat(target)) m_creature->getThreatManager().modifyThreatPercent(target, -100); @@ -953,7 +952,7 @@ struct MANGOS_DLL_DECL boss_julianneAI : public ScriptedAI uint32 EntryYellTimer; uint32 AggroYellTimer; - uint64 RomuloGUID; + ObjectGuid m_romuloGuid; uint32 Phase; uint32 BlindingPassionTimer; @@ -971,7 +970,7 @@ struct MANGOS_DLL_DECL boss_julianneAI : public ScriptedAI void Reset() { - RomuloGUID = 0; + m_romuloGuid.Clear(); Phase = PHASE_JULIANNE; BlindingPassionTimer = 30000; @@ -1053,7 +1052,7 @@ struct MANGOS_DLL_DECL boss_romuloAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 JulianneGUID; + ObjectGuid m_julianneGuid; uint32 Phase; uint32 EntryYellTimer; @@ -1069,7 +1068,7 @@ struct MANGOS_DLL_DECL boss_romuloAI : public ScriptedAI void Reset() { - JulianneGUID = 0; + m_julianneGuid.Clear(); Phase = PHASE_ROMULO; BackwardLungeTimer = 15000; @@ -1093,9 +1092,9 @@ struct MANGOS_DLL_DECL boss_romuloAI : public ScriptedAI { DoScriptText(SAY_ROMULO_AGGRO, m_creature); - if (JulianneGUID) + if (m_julianneGuid) { - Creature* Julianne = m_creature->GetMap()->GetCreature(JulianneGUID); + Creature* Julianne = m_creature->GetMap()->GetCreature(m_julianneGuid); if (Julianne && Julianne->getVictim()) m_creature->AddThreat(Julianne->getVictim()); @@ -1160,7 +1159,7 @@ void boss_julianneAI::DamageTaken(Unit* done_by, uint32 &damage) //if this is true then we have to kill romulo too if (RomuloDead) { - if (Creature* Romulo = m_creature->GetMap()->GetCreature(RomuloGUID)) + if (Creature* Romulo = m_creature->GetMap()->GetCreature(m_romuloGuid)) { Romulo->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Romulo->GetMotionMaster()->Clear(); @@ -1173,7 +1172,7 @@ void boss_julianneAI::DamageTaken(Unit* done_by, uint32 &damage) } //if not already returned, then romulo is alive and we can pretend die - if (Creature* Romulo = m_creature->GetMap()->GetCreature(RomuloGUID)) + if (Creature* Romulo = m_creature->GetMap()->GetCreature(m_romuloGuid)) { PretendToDie(m_creature); IsFakingDeath = true; @@ -1206,7 +1205,7 @@ void boss_romuloAI::DamageTaken(Unit* done_by, uint32 &damage) IsFakingDeath = true; Phase = PHASE_BOTH; - if (Creature* Julianne = m_creature->GetMap()->GetCreature(JulianneGUID)) + if (Creature* Julianne = m_creature->GetMap()->GetCreature(m_julianneGuid)) { if (boss_julianneAI* pJulAI = dynamic_cast(Julianne->AI())) { @@ -1223,7 +1222,7 @@ void boss_romuloAI::DamageTaken(Unit* done_by, uint32 &damage) { if (JulianneDead) { - if (Creature* Julianne = m_creature->GetMap()->GetCreature(JulianneGUID)) + if (Creature* Julianne = m_creature->GetMap()->GetCreature(m_julianneGuid)) { Julianne->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Julianne->GetMotionMaster()->Clear(); @@ -1235,7 +1234,7 @@ void boss_romuloAI::DamageTaken(Unit* done_by, uint32 &damage) return; } - if (Creature* Julianne = m_creature->GetMap()->GetCreature(JulianneGUID)) + if (Creature* Julianne = m_creature->GetMap()->GetCreature(m_julianneGuid)) { PretendToDie(m_creature); IsFakingDeath = true; @@ -1294,11 +1293,11 @@ void boss_julianneAI::UpdateAI(const uint32 diff) { if (Creature* pRomulo = m_creature->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) { - RomuloGUID = pRomulo->GetGUID(); + m_romuloGuid = pRomulo->GetObjectGuid(); if (boss_romuloAI* pRomAI = dynamic_cast(pRomulo->AI())) { - pRomAI->JulianneGUID = m_creature->GetGUID(); + pRomAI->m_julianneGuid = m_creature->GetObjectGuid(); pRomAI->Phase = PHASE_ROMULO; } @@ -1334,7 +1333,7 @@ void boss_julianneAI::UpdateAI(const uint32 diff) { if (ResurrectTimer < diff) { - Creature* pRomulo = m_creature->GetMap()->GetCreature(RomuloGUID); + Creature* pRomulo = m_creature->GetMap()->GetCreature(m_romuloGuid); boss_romuloAI* pRomAI = dynamic_cast(pRomulo->AI()); if (pRomulo && pRomAI && pRomAI->IsFakingDeath) @@ -1376,7 +1375,7 @@ void boss_julianneAI::UpdateAI(const uint32 diff) { if (urand(0, 1) && SummonedRomulo) { - Creature* Romulo = m_creature->GetMap()->GetCreature(RomuloGUID); + Creature* Romulo = m_creature->GetMap()->GetCreature(m_romuloGuid); if (Romulo && Romulo->isAlive() && !RomuloDead) DoCastSpellIfCan(Romulo, SPELL_ETERNAL_AFFECTION); } else DoCastSpellIfCan(m_creature, SPELL_ETERNAL_AFFECTION); @@ -1396,7 +1395,7 @@ void boss_romuloAI::UpdateAI(const uint32 diff) { if (ResurrectTimer < diff) { - Creature* pJulianne = m_creature->GetMap()->GetCreature(JulianneGUID); + Creature* pJulianne = m_creature->GetMap()->GetCreature(m_julianneGuid); boss_julianneAI* pJulAI = dynamic_cast(pJulianne->AI()); if (pJulianne && pJulAI && pJulAI->IsFakingDeath) diff --git a/scripts/eastern_kingdoms/karazhan/instance_karazhan.cpp b/scripts/eastern_kingdoms/karazhan/instance_karazhan.cpp index 4922858..02f2185 100644 --- a/scripts/eastern_kingdoms/karazhan/instance_karazhan.cpp +++ b/scripts/eastern_kingdoms/karazhan/instance_karazhan.cpp @@ -39,22 +39,7 @@ EndScriptData */ */ instance_karazhan::instance_karazhan(Map* pMap) : ScriptedInstance(pMap), - m_uiOzDeathCount(0), - - m_uiMoroesGUID(0), - m_uiTerestianGUID(0), - m_uiNightbaneGUID(0), - - m_uiCurtainGUID(0), - m_uiStageDoorLeftGUID(0), - m_uiStageDoorRightGUID(0), - m_uiLibraryDoor(0), - m_uiMassiveDoor(0), - m_uiSideEntranceDoor(0), - m_uiGamesmansDoor(0), - m_uiGamesmansExitDoor(0), - m_uiNetherspaceDoor(0), - m_uiDustCoveredChest(0) + m_uiOzDeathCount(0) { Initialize(); } @@ -80,9 +65,10 @@ void instance_karazhan::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_TERESTIAN: m_uiTerestianGUID = pCreature->GetGUID(); break; - case NPC_MOROES: m_uiMoroesGUID = pCreature->GetGUID(); break; - case NPC_NIGHTBANE: m_uiNightbaneGUID = pCreature->GetGUID(); break; + case NPC_MOROES: + case NPC_NIGHTBANE: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -91,59 +77,53 @@ void instance_karazhan::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_STAGE_CURTAIN: - m_uiCurtainGUID = pGo->GetGUID(); break; case GO_STAGE_DOOR_LEFT: - m_uiStageDoorLeftGUID = pGo->GetGUID(); if (m_auiEncounter[4] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_STAGE_DOOR_RIGHT: - m_uiStageDoorRightGUID = pGo->GetGUID(); if (m_auiEncounter[4] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PRIVATE_LIBRARY_DOOR: - m_uiLibraryDoor = pGo->GetGUID(); break; case GO_MASSIVE_DOOR: - m_uiMassiveDoor = pGo->GetGUID(); break; case GO_GAMESMANS_HALL_DOOR: - m_uiGamesmansDoor = pGo->GetGUID(); break; case GO_GAMESMANS_HALL_EXIT_DOOR: - m_uiGamesmansExitDoor = pGo->GetGUID(); break; case GO_NETHERSPACE_DOOR: - m_uiNetherspaceDoor = pGo->GetGUID(); break; case GO_SIDE_ENTRANCE_DOOR: - m_uiSideEntranceDoor = pGo->GetGUID(); if (m_auiEncounter[4] != DONE) pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); break; case GO_DUST_COVERED_CHEST: - m_uiDustCoveredChest = pGo->GetGUID(); break; case GO_OZ_BACKDROP: case GO_OZ_HAY: // if (m_uiOperaEvent == EVENT_OZ) // TODO - respawn, store for later respawn? - break; + return; case GO_HOOD_BACKDROP: case GO_HOOD_TREE: case GO_HOOD_HOUSE: // if (m_uiOperaEvent == EVENT_HOOD) // TODO - respawn, store for later respawn? - break; + return; case GO_RAJ_BACKDROP: case GO_RAJ_MOON: case GO_RAJ_BALCONY: // if (m_uiOperaEvent == EVENT_RAJ) // TODO - respawn, store for later respawn? - break; + return; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_karazhan::SetData(uint32 uiType, uint32 uiData) @@ -164,9 +144,9 @@ void instance_karazhan::SetData(uint32 uiType, uint32 uiData) m_auiEncounter[3] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_uiStageDoorLeftGUID); - DoUseDoorOrButton(m_uiStageDoorRightGUID); - if (GameObject* pSideEntrance = instance->GetGameObject(m_uiSideEntranceDoor)) + DoUseDoorOrButton(GO_STAGE_DOOR_LEFT); + DoUseDoorOrButton(GO_STAGE_DOOR_RIGHT); + if (GameObject* pSideEntrance = GetSingleGameObjectFromStorage(GO_SIDE_ENTRANCE_DOOR)) pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } break; @@ -179,15 +159,15 @@ void instance_karazhan::SetData(uint32 uiType, uint32 uiData) case TYPE_ARAN: m_auiEncounter[6] = uiData; if (uiData != IN_PROGRESS) - DoUseDoorOrButton(m_uiLibraryDoor); + DoUseDoorOrButton(GO_PRIVATE_LIBRARY_DOOR); break; case TYPE_NETHERSPITE: m_auiEncounter[7] = uiData; - DoUseDoorOrButton(m_uiMassiveDoor); + DoUseDoorOrButton(GO_MASSIVE_DOOR); break; case TYPE_CHESS: if (uiData == DONE) - DoRespawnGameObject(m_uiDustCoveredChest, DAY); + DoRespawnGameObject(GO_DUST_COVERED_CHEST, DAY); m_auiEncounter[8] = uiData; break; case TYPE_MALCHEZZAR: @@ -246,29 +226,6 @@ uint32 instance_karazhan::GetData(uint32 uiType) } } -uint64 instance_karazhan::GetData64(uint32 uiData) -{ - switch (uiData) - { - case NPC_MOROES: return m_uiMoroesGUID; - case NPC_TERESTIAN: return m_uiTerestianGUID; - case NPC_NIGHTBANE: return m_uiNightbaneGUID; - - case GO_STAGE_DOOR_LEFT: return m_uiStageDoorLeftGUID; - case GO_STAGE_DOOR_RIGHT: return m_uiStageDoorRightGUID; - case GO_STAGE_CURTAIN: return m_uiCurtainGUID; - case GO_PRIVATE_LIBRARY_DOOR: return m_uiLibraryDoor; - case GO_MASSIVE_DOOR: return m_uiMassiveDoor; - case GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor; - case GO_GAMESMANS_HALL_DOOR: return m_uiGamesmansDoor; - case GO_GAMESMANS_HALL_EXIT_DOOR: return m_uiGamesmansExitDoor; - case GO_NETHERSPACE_DOOR: return m_uiNetherspaceDoor; - - default: - return 0; - } -} - void instance_karazhan::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/eastern_kingdoms/karazhan/karazhan.cpp b/scripts/eastern_kingdoms/karazhan/karazhan.cpp index a282966..66dbd5b 100644 --- a/scripts/eastern_kingdoms/karazhan/karazhan.cpp +++ b/scripts/eastern_kingdoms/karazhan/karazhan.cpp @@ -120,7 +120,7 @@ struct MANGOS_DLL_DECL npc_barnesAI : public npc_escortAI ScriptedInstance* m_pInstance; - uint64 m_uiSpotlightGUID; + ObjectGuid m_spotlightGuid; uint32 m_uiTalkCount; uint32 m_uiTalkTimer; @@ -132,7 +132,7 @@ struct MANGOS_DLL_DECL npc_barnesAI : public npc_escortAI void Reset() { - m_uiSpotlightGUID = 0; + m_spotlightGuid.Clear(); m_uiTalkCount = 0; m_uiTalkTimer = 2000; @@ -167,7 +167,7 @@ struct MANGOS_DLL_DECL npc_barnesAI : public npc_escortAI { case 0: m_creature->CastSpell(m_creature, SPELL_TUXEDO, false); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_STAGE_DOOR_LEFT)); + m_pInstance->DoUseDoorOrButton(GO_STAGE_DOOR_LEFT); break; case 4: m_uiTalkCount = 0; @@ -179,16 +179,16 @@ struct MANGOS_DLL_DECL npc_barnesAI : public npc_escortAI { pSpotlight->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pSpotlight->CastSpell(pSpotlight, SPELL_SPOTLIGHT, false); - m_uiSpotlightGUID = pSpotlight->GetGUID(); + m_spotlightGuid = pSpotlight->GetObjectGuid(); } break; case 8: - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_STAGE_DOOR_LEFT)); + m_pInstance->DoUseDoorOrButton(GO_STAGE_DOOR_LEFT); m_bPerformanceReady = true; break; case 9: PrepareEncounter(); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_STAGE_CURTAIN)); + m_pInstance->DoUseDoorOrButton(GO_STAGE_CURTAIN); break; } } @@ -257,7 +257,7 @@ struct MANGOS_DLL_DECL npc_barnesAI : public npc_escortAI { if (m_uiTalkCount > 3) { - if (Creature* pSpotlight = m_creature->GetMap()->GetCreature(m_uiSpotlightGUID)) + if (Creature* pSpotlight = m_creature->GetMap()->GetCreature(m_spotlightGuid)) pSpotlight->ForcedDespawn(); SetEscortPaused(false); diff --git a/scripts/eastern_kingdoms/karazhan/karazhan.h b/scripts/eastern_kingdoms/karazhan/karazhan.h index ce3179d..1782b21 100644 --- a/scripts/eastern_kingdoms/karazhan/karazhan.h +++ b/scripts/eastern_kingdoms/karazhan/karazhan.h @@ -25,7 +25,7 @@ enum DATA_OPERA_OZ_DEATHCOUNT = 12, NPC_MOROES = 15687, - NPC_TERESTIAN = 15688, + // NPC_TERESTIAN = 15688, NPC_NIGHTBANE = 17225, GO_STAGE_CURTAIN = 183932, @@ -57,8 +57,6 @@ enum OperaEvents EVENT_RAJ = 3 }; -#define ERROR_INST_DATA(a) error_log("SD2: Instance Data for Karazhan not set properly. Encounter for Creature Entry %u may not work properly.", a->GetEntry()); - class MANGOS_DLL_DECL instance_karazhan : public ScriptedInstance { public: @@ -73,7 +71,6 @@ class MANGOS_DLL_DECL instance_karazhan : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); void Load(const char* chrIn); const char* Save() { return m_strInstData.c_str(); } @@ -84,21 +81,6 @@ class MANGOS_DLL_DECL instance_karazhan : public ScriptedInstance uint32 m_uiOperaEvent; uint32 m_uiOzDeathCount; - - uint64 m_uiMoroesGUID; - uint64 m_uiTerestianGUID; - uint64 m_uiNightbaneGUID; - - uint64 m_uiCurtainGUID; - uint64 m_uiStageDoorLeftGUID; - uint64 m_uiStageDoorRightGUID; - uint64 m_uiLibraryDoor; // Door at Shade of Aran - uint64 m_uiMassiveDoor; // Door at Netherspite - uint64 m_uiSideEntranceDoor; // Side Entrance - uint64 m_uiGamesmansDoor; // Door before Chess - uint64 m_uiGamesmansExitDoor; // Door after Chess - uint64 m_uiNetherspaceDoor; // Door at Malchezaar - uint64 m_uiDustCoveredChest; // Chest respawn at event complete }; class MANGOS_DLL_DECL npc_fiendish_portalAI : public ScriptedAI diff --git a/scripts/eastern_kingdoms/magisters_terrace/boss_felblood_kaelthas.cpp b/scripts/eastern_kingdoms/magisters_terrace/boss_felblood_kaelthas.cpp index c297a22..205d61c 100644 --- a/scripts/eastern_kingdoms/magisters_terrace/boss_felblood_kaelthas.cpp +++ b/scripts/eastern_kingdoms/magisters_terrace/boss_felblood_kaelthas.cpp @@ -25,54 +25,54 @@ EndScriptData */ #include "magisters_terrace.h" #include "WorldPacket.h" -#define SAY_AGGRO -1585023 //This yell should be done when the room is cleared. For now, set it as a movelineofsight yell. -#define SAY_PHOENIX -1585024 -#define SAY_FLAMESTRIKE -1585025 -#define SAY_GRAVITY_LAPSE -1585026 -#define SAY_TIRED -1585027 -#define SAY_RECAST_GRAVITY -1585028 -#define SAY_DEATH -1585029 - -/*** Spells ***/ - -// Phase 1 spells -#define SPELL_FIREBALL_NORMAL 44189 // Deals 2700-3300 damage at current target -#define SPELL_FIREBALL_HEROIC 46164 // 4950-6050 - -#define SPELL_PHOENIX 44194 // Summons a phoenix (Doesn't work?) -#define SPELL_PHOENIX_BURN 44197 // A spell Phoenix uses to damage everything around -#define SPELL_REBIRTH_DMG 44196 // DMG if a Phoenix rebirth happen - -#define SPELL_FLAME_STRIKE_DUMMY 44191 // Flamestrike indicator before the damage -#define SPELL_FLAME_STRIKE 44192 // Summons the trigger + animation (projectile) - -#define SPELL_SHOCK_BARRIER 46165 // Heroic only; 10k damage shield, followed by Pyroblast -#define SPELL_PYROBLAST 36819 // Heroic only; 45-55k fire damage - -// Phase 2 spells -#define SPELL_GRAVITY_LAPSE_INITIAL 44224 // Cast at the beginning of every Gravity Lapse -#define SPELL_GRAVITY_LAPSE_CHANNEL 44251 // Channeled; blue beam animation to every enemy in range -#define SPELL_TELEPORT_CENTER 44218 // Should teleport people to the center. Requires DB entry in spell_target_position. -#define SPELL_GRAVITY_LAPSE_FLY 44227 // Hastens flyspeed and allows flying for 1 minute. For some reason removes 44226. -#define SPELL_GRAVITY_LAPSE_DOT 44226 // Knocks up in the air and applies a 300 DPS DoT. -#define SPELL_ARCANE_SPHERE_PASSIVE 44263 // Passive auras on Arcane Spheres -#define SPELL_POWER_FEEDBACK 44233 // Stuns him, making him take 50% more damage for 10 seconds. Cast after Gravity Lapse - -/*** Creatures ***/ -#define NPC_FLAME_STRIKE_TRIGGER 24666 -#define CREATURE_PHOENIX 24674 -#define CREATURE_PHOENIX_EGG 24675 -#define CREATURE_ARCANE_SPHERE 24708 +enum +{ + SAY_AGGRO = -1585023, // This yell should be done when the room is cleared. For now, set it as a movelineofsight yell. + SAY_PHOENIX = -1585024, + SAY_FLAMESTRIKE = -1585025, + SAY_GRAVITY_LAPSE = -1585026, + SAY_TIRED = -1585027, + SAY_RECAST_GRAVITY = -1585028, + SAY_DEATH = -1585029, + + // Phase 1 spells + SPELL_FIREBALL = 44189, // Deals 2700-3300 damage at current target + SPELL_FIREBALL_H = 46164, // 4950-6050 + + SPELL_PHOENIX = 44194, // Summons a phoenix + SPELL_PHOENIX_BURN = 44197, // A spell Phoenix uses to damage everything around + SPELL_REBIRTH_DMG = 44196, // DMG if a Phoenix rebirth happen + + SPELL_FLAME_STRIKE_DUMMY = 44191, // Flamestrike indicator before the damage + SPELL_FLAME_STRIKE = 44192, // Summons the trigger + animation (projectile) + + SPELL_SHOCK_BARRIER = 46165, // Heroic only; 10k damage shield, followed by Pyroblast + SPELL_PYROBLAST = 36819, // Heroic only; 45-55k fire damage + + // Phase 2 spells + SPELL_GRAVITY_LAPSE_INITIAL = 44224, // Cast at the beginning of every Gravity Lapse + SPELL_GRAVITY_LAPSE_CHANNEL = 44251, // Channeled; blue beam animation to every enemy in range + SPELL_TELEPORT_CENTER = 44218, // Should teleport people to the center. Requires DB entry in spell_target_position. + SPELL_GRAVITY_LAPSE_FLY = 44227, // Hastens flyspeed and allows flying for 1 minute. For some reason removes 44226. + SPELL_GRAVITY_LAPSE_DOT = 44226, // Knocks up in the air and applies a 300 DPS DoT. + SPELL_ARCANE_SPHERE_PASSIVE = 44263, // Passive auras on Arcane Spheres + SPELL_POWER_FEEDBACK = 44233, // Stuns him, making him take 50% more damage for 10 seconds. Cast after Gravity Lapse + + NPC_FLAME_STRIKE_TRIGGER = 24666, + NPC_PHOENIX = 24674, + NPC_PHOENIX_EGG = 24675, + NPC_ARCANE_SPHERE = 24708, +}; /** Locations **/ -float KaelLocations[3][2]= +static const float KaelLocations[3][2]= { {148.744659f, 181.377426f}, {140.823883f, 195.403046f}, {156.574188f, 195.650482f}, }; -#define LOCATION_Z -16.727455f +static const float LOCATION_Z = -16.727455f; struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI { @@ -86,26 +86,26 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI ScriptedInstance* m_pInstance; bool m_bIsRegularMode; - uint32 FireballTimer; - uint32 PhoenixTimer; - uint32 FlameStrikeTimer; - uint32 CombatPulseTimer; + uint32 m_uiFireballTimer; + uint32 m_uiPhoenixTimer; + uint32 m_uiFlameStrikeTimer; + uint32 m_uiCombatPulseTimer; - //Heroic only - uint32 PyroblastTimer; + // Heroic only + uint32 m_uiPyroblastTimer; - uint32 GravityLapseTimer; - uint32 GravityLapsePhase; + uint32 m_uiGravityLapseTimer; + uint32 m_uiGravityLapsePhase; // 0 = No Gravity Lapse // 1 = Casting Gravity Lapse visual // 2 = Teleported people to self // 3 = Knocked people up in the air // 4 = Applied an aura that allows them to fly, channeling visual, relased Arcane Orbs. - bool FirstGravityLapse; - bool HasTaunted; + bool m_bFirstGravityLapse; + bool m_bHasTaunted; - uint8 Phase; + uint8 m_uiPhase; // 0 = Not started // 1 = Fireball; Summon Phoenix; Flamestrike // 2 = Gravity Lapses @@ -113,23 +113,23 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI void Reset() { // TODO: Timers - FireballTimer = 0; - PhoenixTimer = 10000; - FlameStrikeTimer = 25000; - CombatPulseTimer = 0; + m_uiFireballTimer = 0; + m_uiPhoenixTimer = 10000; + m_uiFlameStrikeTimer = 25000; + m_uiCombatPulseTimer = 0; - PyroblastTimer = 60000; + m_uiPyroblastTimer = 60000; - GravityLapseTimer = 0; - GravityLapsePhase = 0; + m_uiGravityLapseTimer = 0; + m_uiGravityLapsePhase = 0; - FirstGravityLapse = true; - HasTaunted = false; + m_bFirstGravityLapse = true; + m_bHasTaunted = false; - Phase = 0; + m_uiPhase = 0; } - void JustDied(Unit *killer) + void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); @@ -137,13 +137,13 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI m_pInstance->SetData(TYPE_KAELTHAS, DONE); } - void DamageTaken(Unit* done_by, uint32 &damage) + void DamageTaken(Unit* pDealer, uint32& uiDamage) { - if (damage > m_creature->GetHealth()) + if (uiDamage > m_creature->GetHealth()) RemoveGravityLapse(); // Remove Gravity Lapse so that players fall to ground if they kill him when in air. } - void Aggro(Unit *who) + void Aggro(Unit* pWho) { if (m_pInstance) m_pInstance->SetData(TYPE_KAELTHAS, IN_PROGRESS); @@ -153,24 +153,35 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI { if (m_pInstance) m_pInstance->SetData(TYPE_KAELTHAS, FAIL); - } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* pWho) { - if (!HasTaunted && m_creature->IsWithinDistInMap(who, 40.0)) + if (!m_bHasTaunted && m_creature->IsWithinDistInMap(pWho, 40.0)) { DoScriptText(SAY_AGGRO, m_creature); - HasTaunted = true; + m_bHasTaunted = true; } - ScriptedAI::MoveInLineOfSight(who); + ScriptedAI::MoveInLineOfSight(pWho); } void JustSummoned(Creature* pSummoned) { - if (pSummoned->GetEntry() == NPC_FLAME_STRIKE_TRIGGER) - pSummoned->CastSpell(pSummoned, SPELL_FLAME_STRIKE_DUMMY, false, NULL, NULL, m_creature->GetObjectGuid()); + switch (pSummoned->GetEntry()) + { + case NPC_FLAME_STRIKE_TRIGGER: + pSummoned->CastSpell(pSummoned, SPELL_FLAME_STRIKE_DUMMY, false, NULL, NULL, m_creature->GetObjectGuid()); + break; + case NPC_PHOENIX: + // TODO ThreatList and Flag removal likely wrong + pSummoned->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); + SetThreatList(pSummoned); + + if (m_creature->getVictim()) + pSummoned->AI()->AttackStart(m_creature->getVictim()); + break; + } } void SetThreatList(Creature* SummonedUnit) @@ -252,67 +263,60 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI } } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - switch(Phase) + switch (m_uiPhase) { case 0: { // *Heroic mode only: if (!m_bIsRegularMode) { - if (PyroblastTimer < diff) + if (m_uiPyroblastTimer < uiDiff) { m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); DoCastSpellIfCan(m_creature, SPELL_SHOCK_BARRIER, CAST_TRIGGERED); DoCastSpellIfCan(m_creature->getVictim(), SPELL_PYROBLAST); - PyroblastTimer = 60000; - }else PyroblastTimer -= diff; + m_uiPyroblastTimer = 60000; + } + else + m_uiPyroblastTimer -= uiDiff; } - if (FireballTimer < diff) + if (m_uiFireballTimer < uiDiff) { - DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_FIREBALL_NORMAL : SPELL_FIREBALL_HEROIC); - FireballTimer = urand(2000, 6000); - }else FireballTimer -= diff; + if (DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_FIREBALL : SPELL_FIREBALL_H) == CAST_OK) + m_uiFireballTimer = urand(2000, 6000); + } + else + m_uiFireballTimer -= uiDiff; - if (PhoenixTimer < diff) + if (m_uiPhoenixTimer < uiDiff) { - - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,1)) + if (DoCastSpellIfCan(m_creature, SPELL_PHOENIX) == CAST_OK) { - uint32 random = urand(1, 2); - float x = KaelLocations[random][0]; - float y = KaelLocations[random][1]; - - if (Creature* Phoenix = m_creature->SummonCreature(CREATURE_PHOENIX, x, y, LOCATION_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000)) - { - Phoenix->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); - SetThreatList(Phoenix); - Phoenix->AI()->AttackStart(pTarget); - DoScriptText(SAY_PHOENIX, m_creature); - } + DoScriptText(SAY_PHOENIX, m_creature); + m_uiPhoenixTimer = 60000; } + } + else + m_uiPhoenixTimer -= uiDiff; - PhoenixTimer = 60000; - }else PhoenixTimer -= diff; - - if (FlameStrikeTimer < diff) + if (m_uiFlameStrikeTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { - if (m_creature->IsNonMeleeSpellCasted(false)) - m_creature->InterruptNonMeleeSpells(false); - - DoCastSpellIfCan(pTarget, SPELL_FLAME_STRIKE); + DoCastSpellIfCan(pTarget, SPELL_FLAME_STRIKE, CAST_INTERRUPT_PREVIOUS); DoScriptText(SAY_FLAMESTRIKE, m_creature); } - FlameStrikeTimer = urand(15000, 25000); - }else FlameStrikeTimer -= diff; + m_uiFlameStrikeTimer = urand(15000, 25000); + } + else + m_uiFlameStrikeTimer -= uiDiff; // Below 50% if (m_creature->GetHealthPercent() < 50.0f) @@ -321,33 +325,35 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI m_creature->StopMoving(); m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveIdle(); - GravityLapseTimer = 0; - GravityLapsePhase = 0; - Phase = 1; + m_uiGravityLapseTimer = 0; + m_uiGravityLapsePhase = 0; + m_uiPhase = 1; + + return; } DoMeleeAttackIfReady(); - } - break; + break; + } case 1: { - if (GravityLapseTimer < diff) + if (m_uiGravityLapseTimer < uiDiff) { - switch(GravityLapsePhase) + switch (m_uiGravityLapsePhase) { case 0: - if (FirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse + if (m_bFirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse { DoScriptText(SAY_GRAVITY_LAPSE, m_creature); - FirstGravityLapse = false; + m_bFirstGravityLapse = false; if (m_pInstance) { - if (GameObject* pKaelLeft = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_KAEL_STATUE_LEFT))) + if (GameObject* pKaelLeft = m_pInstance->GetSingleGameObjectFromStorage(GO_KAEL_STATUE_LEFT)) pKaelLeft->SetGoState(GO_STATE_ACTIVE); - if (GameObject* pKaelRight = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_KAEL_STATUE_RIGHT))) + if (GameObject* pKaelRight = m_pInstance->GetSingleGameObjectFromStorage(GO_KAEL_STATUE_RIGHT)) pKaelRight->SetGoState(GO_STATE_ACTIVE); } } @@ -357,33 +363,32 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI } DoCastSpellIfCan(m_creature, SPELL_GRAVITY_LAPSE_INITIAL); - GravityLapseTimer = 2000 + diff;// Don't interrupt the visual spell - GravityLapsePhase = 1; + m_uiGravityLapseTimer = 2000 + uiDiff;// Don't interrupt the visual spell + m_uiGravityLapsePhase = 1; break; case 1: TeleportPlayersToSelf(); - GravityLapseTimer = 1000; - GravityLapsePhase = 2; + m_uiGravityLapseTimer = 1000; + m_uiGravityLapsePhase = 2; break; case 2: CastGravityLapseKnockUp(); - GravityLapseTimer = 1000; - GravityLapsePhase = 3; + m_uiGravityLapseTimer = 1000; + m_uiGravityLapsePhase = 3; break; case 3: CastGravityLapseFly(); - GravityLapseTimer = 30000; - GravityLapsePhase = 4; - + m_uiGravityLapseTimer = 30000; + m_uiGravityLapsePhase = 4; for(uint8 i = 0; i < 3; ++i) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) { - if (Creature* Orb = DoSpawnCreature(CREATURE_ARCANE_SPHERE, 5, 5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000)) + if (Creature* Orb = DoSpawnCreature(NPC_ARCANE_SPHERE, 5, 5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000)) Orb->AI()->AttackStart(pTarget); } } @@ -396,13 +401,16 @@ struct MANGOS_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI DoScriptText(SAY_TIRED, m_creature); DoCastSpellIfCan(m_creature, SPELL_POWER_FEEDBACK); RemoveGravityLapse(); - GravityLapseTimer = 10000; - GravityLapsePhase = 0; + m_uiGravityLapseTimer = 10000; + m_uiGravityLapsePhase = 0; break; } - }else GravityLapseTimer -= diff; + } + else + m_uiGravityLapseTimer -= uiDiff; + + break; } - break; } } }; @@ -416,40 +424,40 @@ struct MANGOS_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI } ScriptedInstance* m_pInstance; - uint32 BurnTimer; - uint32 Death_Timer; - bool Rebirth; - bool FakeDeath; + uint32 m_uiBurnTimer; + uint32 m_uiDeathTimer; + bool m_bRebirth; + bool m_bFakeDeath; void Reset() { - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); - m_creature->CastSpell(m_creature,SPELL_PHOENIX_BURN,true); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + m_creature->CastSpell(m_creature, SPELL_PHOENIX_BURN, true); - BurnTimer = 2000; - Death_Timer = 3000; - Rebirth = false; - FakeDeath = false; + m_uiBurnTimer = 2000; + m_uiDeathTimer = 3000; + m_bRebirth = false; + m_bFakeDeath = false; } - void DamageTaken(Unit* pKiller, uint32 &damage) + void DamageTaken(Unit* pKiller, uint32& uiDamage) { - if (damage < m_creature->GetHealth()) + if (uiDamage < m_creature->GetHealth()) return; - //Prevent glitch if in fake death - if (FakeDeath) + // Prevent glitch if in fake death + if (m_bFakeDeath) { - damage = 0; + uiDamage = 0; return; } - //Don't really die in all phases of Kael'Thas - if (m_pInstance && m_pInstance->GetData(TYPE_KAELTHAS) == NOT_STARTED) + // Don't really die in all phases of Kael'Thas + if (m_pInstance && m_pInstance->GetData(TYPE_KAELTHAS) == IN_PROGRESS) { - //prevent death - damage = 0; - FakeDeath = true; + // prevent death + uiDamage = 0; + m_bFakeDeath = true; m_creature->InterruptNonMeleeSpells(false); m_creature->SetHealth(0); @@ -464,54 +472,50 @@ struct MANGOS_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveIdle(); m_creature->SetStandState(UNIT_STAND_STATE_DEAD); - } - - } - - void JustDied(Unit* slayer) - { - m_creature->SummonCreature(CREATURE_PHOENIX_EGG, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - //If we are fake death, we cast revbirth and after that we kill the phoenix to spawn the egg. - if (FakeDeath) + // If we are fake death, we cast rebirth and after that we kill the phoenix to spawn the egg. + if (m_bFakeDeath) { - if (!Rebirth) + if (!m_bRebirth) { DoCastSpellIfCan(m_creature, SPELL_REBIRTH_DMG); - Rebirth = true; + m_bRebirth = true; } - if (Rebirth) + if (m_bRebirth) { - if (Death_Timer < diff) + if (m_uiDeathTimer < uiDiff) { - m_creature->SummonCreature(CREATURE_PHOENIX_EGG, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000); + m_creature->SummonCreature(NPC_PHOENIX_EGG, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000); m_creature->SetDeathState(JUST_DIED); m_creature->RemoveCorpse(); - Rebirth = false; - }else Death_Timer -= diff; + m_bRebirth = false; + } + else + m_uiDeathTimer -= uiDiff; } - + return; } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (BurnTimer < diff) + if (m_uiBurnTimer < uiDiff) { //spell Burn should possible do this, but it doesn't, so do this for now. uint32 dmg = urand(1650,2050); m_creature->DealDamage(m_creature, dmg, 0, DOT, SPELL_SCHOOL_MASK_FIRE, NULL, false); - BurnTimer += 2000; - } BurnTimer -= diff; - + m_uiBurnTimer += 2000; + } + else + m_uiBurnTimer -= uiDiff; DoMeleeAttackIfReady(); } @@ -521,24 +525,25 @@ struct MANGOS_DLL_DECL mob_felkael_phoenix_eggAI : public ScriptedAI { mob_felkael_phoenix_eggAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint32 HatchTimer; + uint32 m_uiHatchTimer; void Reset() { - HatchTimer = 10000; - + m_uiHatchTimer = 10000; } - void MoveInLineOfSight(Unit* who) {} + void MoveInLineOfSight(Unit* pWho) {} + void AttackStart(Unit* pWho) {} - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (HatchTimer < diff) + if (m_uiHatchTimer < uiDiff) { - m_creature->SummonCreature(CREATURE_PHOENIX, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); + m_creature->SummonCreature(NPC_PHOENIX, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - }else HatchTimer -= diff; - + } + else + m_uiHatchTimer -= uiDiff; } }; @@ -546,37 +551,44 @@ struct MANGOS_DLL_DECL mob_arcane_sphereAI : public ScriptedAI { mob_arcane_sphereAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint32 DespawnTimer; - uint32 ChangeTargetTimer; + uint32 m_uiDespawnTimer; + uint32 m_uiChangeTargetTimer; void Reset() { - DespawnTimer = 30000; - ChangeTargetTimer = urand(6000, 12000); + m_uiDespawnTimer = 30000; + m_uiChangeTargetTimer = urand(6000, 12000); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCastSpellIfCan(m_creature, SPELL_ARCANE_SPHERE_PASSIVE, CAST_TRIGGERED); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (DespawnTimer < diff) + if (m_uiDespawnTimer < uiDiff) + { m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - else DespawnTimer -= diff; + return; + } + else + m_uiDespawnTimer -= uiDiff; - if (!m_creature->getVictim() || !m_creature->SelectHostileTarget()) + // Note: This check was reversed for some unknown reason, changed to usual behaviour! + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (ChangeTargetTimer < diff) + if (m_uiChangeTargetTimer < uiDiff) { - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { - m_creature->TauntApply(pTarget); + m_creature->TauntApply(pTarget); // Useless Workaround AttackStart(pTarget); } - ChangeTargetTimer = urand(5000, 15000); - }else ChangeTargetTimer -= diff; + m_uiChangeTargetTimer = urand(5000, 15000); + } + else + m_uiChangeTargetTimer -= uiDiff; } }; diff --git a/scripts/eastern_kingdoms/magisters_terrace/boss_priestess_delrissa.cpp b/scripts/eastern_kingdoms/magisters_terrace/boss_priestess_delrissa.cpp index 3b103a6..0b44ddb 100644 --- a/scripts/eastern_kingdoms/magisters_terrace/boss_priestess_delrissa.cpp +++ b/scripts/eastern_kingdoms/magisters_terrace/boss_priestess_delrissa.cpp @@ -91,7 +91,6 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - memset(&m_auiLackeyGUID, 0, sizeof(m_auiLackeyGUID)); LackeyEntryList.clear(); Reset(); } @@ -100,7 +99,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI bool m_bIsRegularMode; std::vector LackeyEntryList; - uint64 m_auiLackeyGUID[MAX_ACTIVE_LACKEY]; + ObjectGuid m_aLackeyGuid[MAX_ACTIVE_LACKEY]; uint8 PlayersKilled; @@ -136,7 +135,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI for(uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUID[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[i])) { if (!pAdd->getVictim()) { @@ -176,7 +175,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI for(std::vector::iterator itr = LackeyEntryList.begin(); itr != LackeyEntryList.end(); ++itr) { if (Creature* pAdd = m_creature->SummonCreature((*itr), LackeyLocations[j][0], LackeyLocations[j][1], fZLocation, fOrientation, TEMPSUMMON_CORPSE_DESPAWN, 0)) - m_auiLackeyGUID[j] = pAdd->GetGUID(); + m_aLackeyGuid[j] = pAdd->GetObjectGuid(); ++j; } @@ -185,13 +184,13 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI { for(std::vector::iterator itr = LackeyEntryList.begin(); itr != LackeyEntryList.end(); ++itr) { - Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUID[j]); + Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[j]); //object already removed, not exist if (!pAdd) { if (Creature* pAdd = m_creature->SummonCreature((*itr), LackeyLocations[j][0], LackeyLocations[j][1], fZLocation, fOrientation, TEMPSUMMON_CORPSE_DESPAWN, 0)) - m_auiLackeyGUID[j] = pAdd->GetGUID(); + m_aLackeyGuid[j] = pAdd->GetObjectGuid(); } ++j; } @@ -237,7 +236,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI for(uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUID[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[i])) { if (pAdd->isAlive() && pAdd->GetHealth() < health) target = pAdd; @@ -254,7 +253,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI if (urand(0, 1)) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[rand()%MAX_ACTIVE_LACKEY])) { if (pAdd->isAlive()) target = pAdd; @@ -271,7 +270,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI if (urand(0, 1)) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[rand()%MAX_ACTIVE_LACKEY])) { if (pAdd->isAlive() && !pAdd->HasAura(SPELL_SHIELD)) target = pAdd; @@ -297,7 +296,7 @@ struct MANGOS_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI target = m_creature; else { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[rand()%MAX_ACTIVE_LACKEY])) { if (pAdd->isAlive()) target = pAdd; @@ -339,14 +338,13 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI boss_priestess_lackey_commonAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - memset(&m_auiLackeyGUIDs, 0, sizeof(m_auiLackeyGUIDs)); Reset(); - AcquireGUIDs(); + AcquireGuids(); } ScriptedInstance* m_pInstance; - uint64 m_auiLackeyGUIDs[MAX_ACTIVE_LACKEY]; + ObjectGuid m_aLackeyGuid[MAX_ACTIVE_LACKEY]; uint32 m_uiResetThreatTimer; bool m_bUsedPotion; @@ -361,7 +359,7 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI m_uiResetThreatTimer = urand(5000, 15000); // in case she is not alive and Reset was for some reason called, respawn her (most likely party wipe after killing her) - if (Creature* pDelrissa = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DELRISSA))) + if (Creature* pDelrissa = m_pInstance->GetSingleCreatureFromStorage(NPC_DELRISSA)) { if (!pDelrissa->isAlive()) pDelrissa->Respawn(); @@ -377,7 +375,7 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI { for(uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUIDs[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[i])) { if (!pAdd->getVictim() && pAdd != m_creature) { @@ -387,7 +385,7 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI } } - if (Creature* pDelrissa = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DELRISSA))) + if (Creature* pDelrissa = m_pInstance->GetSingleCreatureFromStorage(NPC_DELRISSA)) { if (pDelrissa->isAlive() && !pDelrissa->getVictim()) { @@ -405,7 +403,7 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI if (!m_pInstance) return; - Creature* pDelrissa = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DELRISSA)); + Creature* pDelrissa = m_pInstance->GetSingleCreatureFromStorage(NPC_DELRISSA); uint32 uiLackeyDeathCount = m_pInstance->GetData(TYPE_DELRISSA_DEATH_COUNT); if (!pDelrissa) @@ -437,16 +435,16 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pDelrissa = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DELRISSA))) + if (Creature* pDelrissa = m_pInstance->GetSingleCreatureFromStorage(NPC_DELRISSA)) pDelrissa->AI()->KilledUnit(pVictim); } - void AcquireGUIDs() + void AcquireGuids() { if (!m_pInstance) return; - if (Creature* pDelrissa = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DELRISSA))) + if (Creature* pDelrissa = m_pInstance->GetSingleCreatureFromStorage(NPC_DELRISSA)) { boss_priestess_delrissaAI* pDelrissaAI = dynamic_cast(pDelrissa->AI()); @@ -454,7 +452,7 @@ struct MANGOS_DLL_DECL boss_priestess_lackey_commonAI : public ScriptedAI return; for(uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) - m_auiLackeyGUIDs[i] = pDelrissaAI->m_auiLackeyGUID[i]; + m_aLackeyGuid[i] = pDelrissaAI->m_aLackeyGuid[i]; } } @@ -966,11 +964,10 @@ struct MANGOS_DLL_DECL boss_garaxxasAI : public boss_priestess_lackey_commonAI boss_garaxxasAI(Creature* pCreature) : boss_priestess_lackey_commonAI(pCreature) { SetCombatMovement(false); - m_uiPetGUID = 0; Reset(); } - uint64 m_uiPetGUID; + ObjectGuid m_petGuid; uint32 Aimed_Shot_Timer; uint32 Shoot_Timer; @@ -988,7 +985,7 @@ struct MANGOS_DLL_DECL boss_garaxxasAI : public boss_priestess_lackey_commonAI Wing_Clip_Timer = 4000; Freezing_Trap_Timer = 15000; - Creature* pPet = m_creature->GetMap()->GetCreature(m_uiPetGUID); + Creature* pPet = m_creature->GetMap()->GetCreature(m_petGuid); if (!pPet) m_creature->SummonCreature(NPC_SLIVER, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); @@ -997,7 +994,7 @@ struct MANGOS_DLL_DECL boss_garaxxasAI : public boss_priestess_lackey_commonAI void JustSummoned(Creature* pSummoned) { - m_uiPetGUID = pSummoned->GetGUID(); + m_petGuid = pSummoned->GetObjectGuid(); } void UpdateAI(const uint32 diff) @@ -1144,7 +1141,7 @@ struct MANGOS_DLL_DECL boss_apokoAI : public boss_priestess_lackey_commonAI if (Healing_Wave_Timer < diff) { // std::vector::iterator itr = Group.begin() + rand()%Group.size(); - // uint64 guid = (*itr)->guid; + // ObjectGuid guid = (*itr)->guid; // if (guid) // { // Unit* pAdd = m_creature->GetMap()->GetUnit((*itr)->guid); @@ -1226,7 +1223,7 @@ struct MANGOS_DLL_DECL boss_zelfanAI : public boss_priestess_lackey_commonAI { for(uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiLackeyGUIDs[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aLackeyGuid[i])) { if (pAdd->IsPolymorphed()) { diff --git a/scripts/eastern_kingdoms/magisters_terrace/boss_selin_fireheart.cpp b/scripts/eastern_kingdoms/magisters_terrace/boss_selin_fireheart.cpp index f942a1b..fd23dc9 100644 --- a/scripts/eastern_kingdoms/magisters_terrace/boss_selin_fireheart.cpp +++ b/scripts/eastern_kingdoms/magisters_terrace/boss_selin_fireheart.cpp @@ -24,147 +24,114 @@ EndScriptData */ #include "precompiled.h" #include "magisters_terrace.h" -#define SAY_AGGRO -1585000 -#define SAY_ENERGY -1585001 -#define SAY_EMPOWERED -1585002 -#define SAY_KILL_1 -1585003 -#define SAY_KILL_2 -1585004 -#define SAY_DEATH -1585005 -#define EMOTE_CRYSTAL -1585006 - -//Crystal effect spells -#define SPELL_FEL_CRYSTAL_COSMETIC 44374 -#define SPELL_FEL_CRYSTAL_DUMMY 44329 -#define SPELL_FEL_CRYSTAL_VISUAL 44355 -#define SPELL_MANA_RAGE 44320 // This spell triggers 44321, which changes scale and regens mana Requires an entry in spell_script_target - -//Selin's spells -#define SPELL_DRAIN_LIFE 44294 -#define SPELL_FEL_EXPLOSION 44314 - -#define SPELL_DRAIN_MANA 46153 // Heroic only - -#define CRYSTALS_NUMBER 5 -#define DATA_CRYSTALS 6 - -#define CREATURE_FEL_CRYSTAL 24722 +enum +{ + SAY_AGGRO = -1585000, + SAY_ENERGY = -1585001, + SAY_EMPOWERED = -1585002, + SAY_KILL_1 = -1585003, + SAY_KILL_2 = -1585004, + SAY_DEATH = -1585005, + EMOTE_CRYSTAL = -1585006, + + // Crystal effect spells + SPELL_FEL_CRYSTAL_COSMETIC = 44374, + SPELL_FEL_CRYSTAL_DUMMY = 44329, + SPELL_FEL_CRYSTAL_VISUAL = 44355, + SPELL_MANA_RAGE = 44320, // This spell triggers 44321, which changes scale and regens mana Requires an entry in spell_script_target + + // Selin's spells + SPELL_DRAIN_LIFE = 44294, + SPELL_FEL_EXPLOSION = 44314, + + SPELL_DRAIN_MANA = 46153, // Heroic only +}; struct MANGOS_DLL_DECL boss_selin_fireheartAI : public ScriptedAI { boss_selin_fireheartAI(Creature* pCreature) : ScriptedAI(pCreature) { - m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + m_pInstance = (instance_magisters_terrace*)pCreature->GetInstanceData(); m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - - Crystals.clear(); - //GUIDs per instance is static, so we only need to load them once. - if (m_pInstance) - { - uint32 size = m_pInstance->GetData(TYPE_FEL_CRYSTAL_SIZE); - for(uint8 i = 0; i < size; ++i) - { - uint64 guid = m_pInstance->GetData64(NPC_FEL_CRYSTAL); - debug_log("SD2: Selin: Adding Fel Crystal " UI64FMTD " to list", guid); - Crystals.push_back(guid); - } - } Reset(); } - ScriptedInstance* m_pInstance; + instance_magisters_terrace* m_pInstance; bool m_bIsRegularMode; - GUIDList Crystals; + GUIDList m_lCrystalGuids; - uint32 DrainLifeTimer; - uint32 DrainManaTimer; - uint32 FelExplosionTimer; - uint32 DrainCrystalTimer; - uint32 EmpowerTimer; + uint32 m_uiDrainLifeTimer; + uint32 m_uiDrainManaTimer; + uint32 m_uiFelExplosionTimer; + uint32 m_uiDrainCrystalTimer; + uint32 m_uiEmpowerTimer; - bool IsDraining; - bool DrainingCrystal; + bool m_bIsDraining; + bool m_bDrainingCrystal; - uint64 CrystalGUID; // This will help us create a pointer to the crystal we are draining. We store GUIDs, never units in case unit is deleted/offline (offline if player of course). + ObjectGuid m_crystalGuid; // This will help us create a pointer to the crystal we are draining. We store GUIDs, never units in case unit is deleted/offline (offline if player of course). void Reset() { - if (m_pInstance) - { - //for(uint8 i = 0; i < CRYSTALS_NUMBER; ++i) - for(GUIDList::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) - { - //Creature* pUnit = m_creature->GetMap()->GetCreature(FelCrystals[i]); - if (Creature* pCrystal = m_creature->GetMap()->GetCreature(*itr)) - { - if (!pCrystal->isAlive()) - pCrystal->Respawn(); // Let MaNGOS handle setting death state, etc. - - // Only need to set unselectable flag. You can't attack unselectable units so non_attackable flag is not necessary here. - pCrystal->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - } - } - - DrainLifeTimer = urand(3000, 7000); - DrainManaTimer = DrainLifeTimer + 5000; - FelExplosionTimer = 2100; - DrainCrystalTimer = urand(10000, 15000); - DrainCrystalTimer = urand(20000, 25000); - EmpowerTimer = 10000; - - IsDraining = false; - DrainingCrystal = false; - CrystalGUID = 0; + m_uiDrainLifeTimer = urand(3000, 7000); + m_uiDrainManaTimer = m_uiDrainLifeTimer + 5000; + m_uiFelExplosionTimer = 2100; + m_uiDrainCrystalTimer = urand(10000, 15000); + m_uiDrainCrystalTimer = urand(20000, 25000); + m_uiEmpowerTimer = 10000; + + m_bIsDraining = false; + m_bDrainingCrystal = false; + m_crystalGuid.Clear(); } void SelectNearestCrystal() { - if (Crystals.empty()) + if (m_lCrystalGuids.empty()) return; float ShortestDistance = 0; - CrystalGUID = 0; + m_crystalGuid.Clear(); Creature* pCrystal = NULL; - Creature* CrystalChosen = NULL; - //for(uint8 i = 0; i < CRYSTALS_NUMBER; ++i) - for(GUIDList::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) + Creature* pCrystalChosen = NULL; + + for (GUIDList::const_iterator itr = m_lCrystalGuids.begin(); itr != m_lCrystalGuids.end(); ++itr) { pCrystal = m_creature->GetMap()->GetCreature(*itr); if (pCrystal && pCrystal->isAlive()) { // select nearest - if (!CrystalChosen || m_creature->GetDistanceOrder(pCrystal, CrystalChosen, false)) + if (!pCrystalChosen || m_creature->GetDistanceOrder(pCrystal, pCrystalChosen, false)) { - CrystalGUID = pCrystal->GetGUID(); - CrystalChosen = pCrystal; // Store a copy of pCrystal so we don't need to recreate a pointer to closest crystal for the movement and yell. + m_crystalGuid = pCrystal->GetObjectGuid(); + pCrystalChosen = pCrystal; // Store a copy of pCrystal so we don't need to recreate a pointer to closest crystal for the movement and yell. } } } - if (CrystalChosen) + if (pCrystalChosen) { DoScriptText(SAY_ENERGY, m_creature); DoScriptText(EMOTE_CRYSTAL, m_creature); - CrystalChosen->CastSpell(CrystalChosen, SPELL_FEL_CRYSTAL_COSMETIC, true); + pCrystalChosen->CastSpell(pCrystalChosen, SPELL_FEL_CRYSTAL_COSMETIC, true); float x, y, z; // coords that we move to, close to the crystal. - CrystalChosen->GetClosePoint(x, y, z, m_creature->GetObjectBoundingRadius(), CONTACT_DISTANCE); + pCrystalChosen->GetClosePoint(x, y, z, m_creature->GetObjectBoundingRadius(), CONTACT_DISTANCE); m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); m_creature->GetMotionMaster()->MovePoint(1, x, y, z); - DrainingCrystal = true; + m_bDrainingCrystal = true; } } void ShatterRemainingCrystals() { - if (Crystals.empty()) + if (m_lCrystalGuids.empty()) return; - //for(uint8 i = 0; i < CRYSTALS_NUMBER; ++i) - for(GUIDList::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) + for (GUIDList::const_iterator itr = m_lCrystalGuids.begin(); itr != m_lCrystalGuids.end(); ++itr) { //Creature* pCrystal = m_creature->GetMap()->GetCreature(FelCrystals[i]); Creature* pCrystal = m_creature->GetMap()->GetCreature(*itr); @@ -174,48 +141,72 @@ struct MANGOS_DLL_DECL boss_selin_fireheartAI : public ScriptedAI } } - void Aggro(Unit* who) + void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); if (m_pInstance) + { m_pInstance->SetData(TYPE_SELIN, IN_PROGRESS); + + if (m_lCrystalGuids.empty()) + { + // Get and output crystals + m_pInstance->GetFelCrystalList(m_lCrystalGuids); + for (GUIDList::const_iterator itr = m_lCrystalGuids.begin(); itr != m_lCrystalGuids.end(); ++itr) + debug_log("SD2: Selin: Added Fel Crystal %s to list", ObjectGuid(*itr).GetString().c_str()); + } + } } void JustReachedHome() { if (m_pInstance) + { m_pInstance->SetData(TYPE_SELIN, FAIL); + + for (GUIDList::const_iterator itr = m_lCrystalGuids.begin(); itr != m_lCrystalGuids.end(); ++itr) + { + if (Creature* pCrystal = m_creature->GetMap()->GetCreature(*itr)) + { + if (!pCrystal->isAlive()) + pCrystal->Respawn(); // Let MaNGOS handle setting death state, etc. + + // Only need to set unselectable flag. You can't attack unselectable units so non_attackable flag is not necessary here. + pCrystal->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + } + } } - void KilledUnit(Unit* victim) + void KilledUnit(Unit* pVictim) { DoScriptText(urand(0, 1) ? SAY_KILL_1 : SAY_KILL_2, m_creature); } - void MovementInform(uint32 type, uint32 id) + void MovementInform(uint32 uiType, uint32 uiPointId) { - if (type == POINT_MOTION_TYPE && id == 1) + if (uiType == POINT_MOTION_TYPE && uiPointId == 1) { - Creature* CrystalChosen = m_creature->GetMap()->GetCreature(CrystalGUID); - if (CrystalChosen && CrystalChosen->isAlive()) + Creature* pCrystalChosen = m_creature->GetMap()->GetCreature(m_crystalGuid); + if (pCrystalChosen && pCrystalChosen->isAlive()) { // Make the crystal attackable // We also remove NON_ATTACKABLE in case the database has it set. - CrystalChosen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); - CrystalChosen->CastSpell(m_creature, SPELL_MANA_RAGE, true); - IsDraining = true; + pCrystalChosen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); + pCrystalChosen->CastSpell(m_creature, SPELL_MANA_RAGE, true); + m_bIsDraining = true; } else { // Make an error message in case something weird happened here - error_log("SD2: Selin Fireheart unable to drain crystal as the crystal is either dead or despawned"); - DrainingCrystal = false; + error_log("SD2: Selin Fireheart unable to drain crystal as the crystal is either dead or deleted.."); + m_bDrainingCrystal = false; } } } - void JustDied(Unit* killer) + void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); @@ -227,87 +218,97 @@ struct MANGOS_DLL_DECL boss_selin_fireheartAI : public ScriptedAI ShatterRemainingCrystals(); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (!DrainingCrystal) + if (!m_bDrainingCrystal) { - uint32 maxPowerMana = m_creature->GetMaxPower(POWER_MANA); - if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10)) + uint32 uiMaxPowerMana = m_creature->GetMaxPower(POWER_MANA); + if (uiMaxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / uiMaxPowerMana) < 10)) { - if (DrainLifeTimer < diff) + if (m_uiDrainLifeTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - DoCastSpellIfCan(pTarget, SPELL_DRAIN_LIFE); - - DrainLifeTimer = 10000; - }else DrainLifeTimer -= diff; + { + if (DoCastSpellIfCan(pTarget, SPELL_DRAIN_LIFE) == CAST_OK) + m_uiDrainLifeTimer = 10000; + } + } + else + m_uiDrainLifeTimer -= uiDiff; // Heroic only if (!m_bIsRegularMode) { - if (DrainManaTimer < diff) + if (m_uiDrainManaTimer < uiDiff) { - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1)) - DoCastSpellIfCan(pTarget, SPELL_DRAIN_MANA); + Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1); + if (!pTarget) + pTarget = m_creature->getVictim(); - DrainManaTimer = 10000; - }else DrainManaTimer -= diff; + if (DoCastSpellIfCan(pTarget, SPELL_DRAIN_MANA) == CAST_OK) + m_uiDrainManaTimer = 10000; + } + else + m_uiDrainManaTimer -= uiDiff; } } - if (FelExplosionTimer < diff) + if (m_uiFelExplosionTimer < uiDiff) { - if (!m_creature->IsNonMeleeSpellCasted(false)) - { - DoCastSpellIfCan(m_creature, SPELL_FEL_EXPLOSION); - FelExplosionTimer = 2000; - } - }else FelExplosionTimer -= diff; + if (DoCastSpellIfCan(m_creature, SPELL_FEL_EXPLOSION) == CAST_OK) + m_uiFelExplosionTimer = 2000; + } + else + m_uiFelExplosionTimer -= uiDiff; // If below 10% mana, start recharging - maxPowerMana = m_creature->GetMaxPower(POWER_MANA); - if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10)) + uiMaxPowerMana = m_creature->GetMaxPower(POWER_MANA); + if (uiMaxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / uiMaxPowerMana) < 10)) { - if (DrainCrystalTimer < diff) + if (m_uiDrainCrystalTimer < uiDiff) { SelectNearestCrystal(); if (m_bIsRegularMode) - DrainCrystalTimer = urand(20000, 25000); + m_uiDrainCrystalTimer = urand(20000, 25000); else - DrainCrystalTimer = urand(10000, 15000); + m_uiDrainCrystalTimer = urand(10000, 15000); - }else DrainCrystalTimer -= diff; + } + else + m_uiDrainCrystalTimer -= uiDiff; } - }else + DoMeleeAttackIfReady(); + } + else // if m_bDrainingCrystal { - if (IsDraining) + if (m_bIsDraining) { - if (EmpowerTimer < diff) + if (m_uiEmpowerTimer < uiDiff) { - IsDraining = false; - DrainingCrystal = false; + m_bIsDraining = false; + m_bDrainingCrystal = false; DoScriptText(SAY_EMPOWERED, m_creature); - Creature* CrystalChosen = m_creature->GetMap()->GetCreature(CrystalGUID); + Creature* CrystalChosen = m_creature->GetMap()->GetCreature(m_crystalGuid); if (CrystalChosen && CrystalChosen->isAlive()) // Use Deal Damage to kill it, not SetDeathState. CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - CrystalGUID = 0; + m_crystalGuid.Clear(); m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - }else EmpowerTimer -= diff; + } + else + m_uiEmpowerTimer -= uiDiff; } } - - DoMeleeAttackIfReady(); // No need to check if we are draining crystal here, as the spell has a stun. } }; @@ -321,26 +322,26 @@ struct MANGOS_DLL_DECL mob_fel_crystalAI : public ScriptedAI mob_fel_crystalAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } void Reset() {} - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} - void UpdateAI(const uint32 diff) {} + void AttackStart(Unit* pWho) {} + void MoveInLineOfSight(Unit* pWho) {} + void UpdateAI(const uint32 uiDiff) {} void JustDied(Unit* killer) { if (ScriptedInstance* pInstance = (ScriptedInstance*)m_creature->GetInstanceData()) { - Creature* pSelin = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SELIN_FIREHEART)); + Creature* pSelin = pInstance->GetSingleCreatureFromStorage(NPC_SELIN_FIREHEART); if (pSelin && pSelin->isAlive()) { boss_selin_fireheartAI* pSelinAI = dynamic_cast(pSelin->AI()); - if (pSelinAI && pSelinAI->CrystalGUID == m_creature->GetGUID()) + if (pSelinAI && pSelinAI->m_crystalGuid == m_creature->GetObjectGuid()) { // Set this to false if we are the creature that Selin is draining so his AI flows properly - pSelinAI->DrainingCrystal = false; - pSelinAI->IsDraining = false; - pSelinAI->EmpowerTimer = 10000; + pSelinAI->m_bDrainingCrystal = false; + pSelinAI->m_bIsDraining = false; + pSelinAI->m_uiEmpowerTimer = 10000; if (pSelin->getVictim()) { @@ -360,15 +361,15 @@ CreatureAI* GetAI_mob_fel_crystal(Creature* pCreature) void AddSC_boss_selin_fireheart() { - Script *newscript; + Script* pNewScript; - newscript = new Script; - newscript->Name = "boss_selin_fireheart"; - newscript->GetAI = &GetAI_boss_selin_fireheart; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "boss_selin_fireheart"; + pNewScript->GetAI = &GetAI_boss_selin_fireheart; + pNewScript->RegisterSelf(); - newscript = new Script; - newscript->Name = "mob_fel_crystal"; - newscript->GetAI = &GetAI_mob_fel_crystal; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "mob_fel_crystal"; + pNewScript->GetAI = &GetAI_mob_fel_crystal; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/magisters_terrace/boss_vexallus.cpp b/scripts/eastern_kingdoms/magisters_terrace/boss_vexallus.cpp index 6c54a3d..ecb2010 100644 --- a/scripts/eastern_kingdoms/magisters_terrace/boss_vexallus.cpp +++ b/scripts/eastern_kingdoms/magisters_terrace/boss_vexallus.cpp @@ -201,7 +201,7 @@ struct MANGOS_DLL_DECL mob_pure_energyAI : public ScriptedAI return; if (Player* pPlayer = pKiller->GetCharmerOrOwnerPlayerOrPlayerItself()) - pPlayer->CastSpell(pPlayer, SPELL_ENERGY_FEEDBACK, true, NULL, NULL, pVex->GetGUID()); + pPlayer->CastSpell(pPlayer, SPELL_ENERGY_FEEDBACK, true, NULL, NULL, pVex->GetObjectGuid()); } } } diff --git a/scripts/eastern_kingdoms/magisters_terrace/instance_magisters_terrace.cpp b/scripts/eastern_kingdoms/magisters_terrace/instance_magisters_terrace.cpp index 77033ce..789bc80 100644 --- a/scripts/eastern_kingdoms/magisters_terrace/instance_magisters_terrace.cpp +++ b/scripts/eastern_kingdoms/magisters_terrace/instance_magisters_terrace.cpp @@ -32,17 +32,7 @@ EndScriptData */ */ instance_magisters_terrace::instance_magisters_terrace(Map* pMap) : ScriptedInstance(pMap), - m_uiDelrissaDeathCount(0), - - m_uiSelinGUID(0), - m_uiDelrissaGUID(0), - m_uiVexallusDoorGUID(0), - m_uiSelinDoorGUID(0), - m_uiSelinEncounterDoorGUID(0), - m_uiDelrissaDoorGUID(0), - m_uiKaelDoorGUID(0), - - m_bInitializedItr(false) + m_uiDelrissaDeathCount(0) { Initialize(); } @@ -50,16 +40,19 @@ instance_magisters_terrace::instance_magisters_terrace(Map* pMap) : ScriptedInst void instance_magisters_terrace::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&m_auiKaelStatue, 0, sizeof(m_auiKaelStatue)); } void instance_magisters_terrace::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_SELIN_FIREHEART: m_uiSelinGUID = pCreature->GetGUID(); break; - case NPC_DELRISSA: m_uiDelrissaGUID = pCreature->GetGUID(); break; - case NPC_FEL_CRYSTAL: FelCrystals.push_back(pCreature->GetGUID()); break; + case NPC_SELIN_FIREHEART: + case NPC_DELRISSA: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + case NPC_FEL_CRYSTAL: + m_lFelCrystalGuid.push_back(pCreature->GetObjectGuid()); + break; } } @@ -68,26 +61,27 @@ void instance_magisters_terrace::OnObjectCreate(GameObject* pGo) switch (pGo->GetEntry()) { case GO_VEXALLUS_DOOR: - m_uiVexallusDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_VEXALLUS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_SELIN_DOOR: - m_uiSelinDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_SELIN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DELRISSA_DOOR: - m_uiDelrissaDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_DELRISSA] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; + case GO_SELIN_ENCOUNTER_DOOR: + case GO_KAEL_DOOR: + case GO_KAEL_STATUE_LEFT: + case GO_KAEL_STATUE_RIGHT: + break; - case GO_SELIN_ENCOUNTER_DOOR: m_uiSelinEncounterDoorGUID = pGo->GetGUID(); break; - case GO_KAEL_DOOR: m_uiKaelDoorGUID = pGo->GetGUID(); break; - case GO_KAEL_STATUE_LEFT: m_auiKaelStatue[0] = pGo->GetGUID(); break; - case GO_KAEL_STATUE_RIGHT: m_auiKaelStatue[1] = pGo->GetGUID(); break; + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_magisters_terrace::SetData(uint32 uiType, uint32 uiData) @@ -96,24 +90,24 @@ void instance_magisters_terrace::SetData(uint32 uiType, uint32 uiData) { case TYPE_SELIN: if (uiData == DONE) - DoUseDoorOrButton(m_uiSelinDoorGUID); - DoUseDoorOrButton(m_uiSelinEncounterDoorGUID); + DoUseDoorOrButton(GO_SELIN_DOOR); + DoUseDoorOrButton(GO_SELIN_ENCOUNTER_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_VEXALLUS: if (uiData == DONE) - DoUseDoorOrButton(m_uiVexallusDoorGUID); + DoUseDoorOrButton(GO_VEXALLUS_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_DELRISSA: if (uiData == DONE) - DoUseDoorOrButton(m_uiDelrissaDoorGUID); + DoUseDoorOrButton(GO_DELRISSA_DOOR); if (uiData == IN_PROGRESS) m_uiDelrissaDeathCount = 0; m_auiEncounter[uiType] = uiData; break; case TYPE_KAELTHAS: - DoUseDoorOrButton(m_uiKaelDoorGUID); + DoUseDoorOrButton(GO_KAEL_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_DELRISSA_DEATH_COUNT: @@ -169,44 +163,18 @@ uint32 instance_magisters_terrace::GetData(uint32 uiType) case TYPE_DELRISSA: return m_auiEncounter[2]; case TYPE_KAELTHAS: return m_auiEncounter[3]; case TYPE_DELRISSA_DEATH_COUNT: return m_uiDelrissaDeathCount; - case TYPE_FEL_CRYSTAL_SIZE: return FelCrystals.size(); default: return 0; } } -uint64 instance_magisters_terrace::GetData64(uint32 uiData) +void instance_magisters_terrace::GetFelCrystalList(GUIDList& lList) { - switch (uiData) - { - case NPC_SELIN_FIREHEART: return m_uiSelinGUID; - case NPC_DELRISSA: return m_uiDelrissaGUID; - case GO_KAEL_STATUE_LEFT: return m_auiKaelStatue[0]; - case GO_KAEL_STATUE_RIGHT: return m_auiKaelStatue[1]; - - case NPC_FEL_CRYSTAL: - { - if (FelCrystals.empty()) - { - error_log("SD2: Magisters Terrace: No Fel Crystals loaded in Inst Data"); - return 0; - } - - if (!m_bInitializedItr) - { - CrystalItr = FelCrystals.begin(); - m_bInitializedItr = true; - } - - uint64 guid = *CrystalItr; - ++CrystalItr; - return guid; - } + if (m_lFelCrystalGuid.empty()) + error_log("SD2: Magisters Terrace: No Fel Crystals loaded in Inst Data"); - default: - return 0; - } + lList = m_lFelCrystalGuid; } InstanceData* GetInstanceData_instance_magisters_terrace(Map* pMap) diff --git a/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.h b/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.h index 1a2f2e2..dbf1e68 100644 --- a/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.h +++ b/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.h @@ -14,8 +14,7 @@ enum TYPE_DELRISSA = 2, TYPE_KAELTHAS = 3, - TYPE_FEL_CRYSTAL_SIZE = 4, - TYPE_DELRISSA_DEATH_COUNT = 5, + TYPE_DELRISSA_DEATH_COUNT = 4, NPC_SELIN_FIREHEART = 24723, NPC_DELRISSA = 24560, @@ -46,7 +45,8 @@ class MANGOS_DLL_DECL instance_magisters_terrace : public ScriptedInstance uint32 GetData(uint32 uiType); void SetData(uint32 uiType, uint32 uiData); - uint64 GetData64(uint32 uiData); + + void GetFelCrystalList(GUIDList& lList); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -57,19 +57,7 @@ class MANGOS_DLL_DECL instance_magisters_terrace : public ScriptedInstance uint32 m_uiDelrissaDeathCount; - GUIDList FelCrystals; - GUIDList::iterator CrystalItr; - - uint64 m_uiSelinGUID; - uint64 m_uiDelrissaGUID; - uint64 m_uiVexallusDoorGUID; - uint64 m_uiSelinDoorGUID; - uint64 m_uiSelinEncounterDoorGUID; - uint64 m_uiDelrissaDoorGUID; - uint64 m_uiKaelDoorGUID; - uint64 m_auiKaelStatue[2]; - - bool m_bInitializedItr; + GUIDList m_lFelCrystalGuid; }; #endif diff --git a/scripts/eastern_kingdoms/molten_core/boss_garr.cpp b/scripts/eastern_kingdoms/molten_core/boss_garr.cpp index 6b740fb..727826c 100644 --- a/scripts/eastern_kingdoms/molten_core/boss_garr.cpp +++ b/scripts/eastern_kingdoms/molten_core/boss_garr.cpp @@ -142,7 +142,7 @@ struct MANGOS_DLL_DECL mob_fireswornAI : public ScriptedAI if (m_uiSeparationCheckTimer < uiDiff) { // Distance guesswork, but should be ok - Creature* pGarr = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_GARR)); + Creature* pGarr = m_pInstance->GetSingleCreatureFromStorage(NPC_GARR); if (pGarr && pGarr->isAlive() && !m_creature->IsWithinDist2d(pGarr->GetPositionX(), pGarr->GetPositionY(), 50.0f)) DoCastSpellIfCan(m_creature, SPELL_SEPARATION_ANXIETY, CAST_TRIGGERED); diff --git a/scripts/eastern_kingdoms/molten_core/boss_majordomo_executus.cpp b/scripts/eastern_kingdoms/molten_core/boss_majordomo_executus.cpp index 3f3f891..f9df503 100644 --- a/scripts/eastern_kingdoms/molten_core/boss_majordomo_executus.cpp +++ b/scripts/eastern_kingdoms/molten_core/boss_majordomo_executus.cpp @@ -81,7 +81,7 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI uint32 m_uiAegisTimer; uint32 m_uiSpeechTimer; - uint64 m_uiRagnarosGUID; + ObjectGuid m_ragnarosGuid; bool m_bHasEncounterFinished; uint8 m_uiAddsKilled; uint8 m_uiSpeech; @@ -96,7 +96,6 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI m_uiAegisTimer = 5000; m_uiSpeechTimer = 1000; - m_uiRagnarosGUID = 0; m_uiAddsKilled = 0; m_uiSpeech = 0; } @@ -159,7 +158,7 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); // Prevent possible exploits with double summoning - if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_uiRagnarosGUID)) + if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_ragnarosGuid)) return; DoScriptText(SAY_SUMMON_0, m_creature, pPlayer); @@ -187,12 +186,12 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI { if (pSummoned->GetEntry() == NPC_FLAMEWAKER_HEALER || pSummoned->GetEntry() == NPC_FLAMEWAKER_ELITE) { - m_luiMajordomoAddsGUIDs.push_back(pSummoned->GetGUID()); + m_luiMajordomoAddsGUIDs.push_back(pSummoned->GetObjectGuid()); pSummoned->SetRespawnDelay(2*HOUR); } else if (pSummoned->GetEntry() == NPC_RAGNAROS) { - m_uiRagnarosGUID = pSummoned->GetGUID(); + m_ragnarosGuid = pSummoned->GetObjectGuid(); pSummoned->CastSpell(pSummoned, SPELL_RAGNA_EMERGE, false); } } @@ -309,7 +308,7 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI break; case 12: // Reset orientation - if (GameObject* pLavaSteam = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_LAVA_STEAM))) + if (GameObject* pLavaSteam = m_pInstance->GetSingleGameObjectFromStorage(GO_LAVA_STEAM)) m_creature->SetFacingToObject(pLavaSteam); m_uiSpeechTimer = 4500; ++m_uiSpeech; @@ -322,13 +321,13 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI case 14: // Summon Ragnaros if (m_pInstance) - if (GameObject* pGo = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_LAVA_STEAM))) + if (GameObject* pGo = m_pInstance->GetSingleGameObjectFromStorage(GO_LAVA_STEAM)) m_creature->SummonCreature(NPC_RAGNAROS, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ(), fmod(m_creature->GetOrientation() + M_PI, 2*M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 2*HOUR*IN_MILLISECONDS); ++m_uiSpeech; m_uiSpeechTimer = 8700; break; case 15: - if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_uiRagnarosGUID)) + if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_ragnarosGuid)) DoScriptText(SAY_ARRIVAL1_RAG, pRagnaros); ++m_uiSpeech; m_uiSpeechTimer = 11700; @@ -339,13 +338,13 @@ struct MANGOS_DLL_DECL boss_majordomoAI : public ScriptedAI m_uiSpeechTimer = 8700; break; case 17: - if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_uiRagnarosGUID)) + if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_ragnarosGuid)) DoScriptText(SAY_ARRIVAL3_RAG, pRagnaros); ++m_uiSpeech; m_uiSpeechTimer = 16500; break; case 18: - if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_uiRagnarosGUID)) + if (Creature* pRagnaros = m_creature->GetMap()->GetCreature(m_ragnarosGuid)) pRagnaros->CastSpell(m_creature, SPELL_ELEMENTAL_FIRE, false); // Rest of summoning speech is handled by Ragnaros, as Majordomo will be dead m_uiSpeech = 0; diff --git a/scripts/eastern_kingdoms/molten_core/instance_molten_core.cpp b/scripts/eastern_kingdoms/molten_core/instance_molten_core.cpp index 0068edf..0a76b57 100644 --- a/scripts/eastern_kingdoms/molten_core/instance_molten_core.cpp +++ b/scripts/eastern_kingdoms/molten_core/instance_molten_core.cpp @@ -24,20 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "molten_core.h" -instance_molten_core::instance_molten_core(Map* pMap) : ScriptedInstance(pMap), - m_uiGarrGUID(0), - m_uiSulfuronGUID(0), - m_uiMajordomoGUID(0), - m_uiRuneKoroGUID(0), - m_uiRuneZethGUID(0), - m_uiRuneMazjGUID(0), - m_uiRuneTheriGUID(0), - m_uiRuneBlazGUID(0), - m_uiRuneKressGUID(0), - m_uiRuneMohnGUID(0), - m_uiLavaSteamGUID(0), - m_uiLavaSplashGUID(0), - m_uiFirelordCacheGUID(0) +instance_molten_core::instance_molten_core(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -69,16 +56,18 @@ void instance_molten_core::OnCreatureCreate(Creature* pCreature) switch (pCreature->GetEntry()) { // Bosses - case NPC_GARR: m_uiGarrGUID = pCreature->GetGUID(); break; - case NPC_SULFURON: m_uiSulfuronGUID = pCreature->GetGUID(); break; - case NPC_MAJORDOMO: m_uiMajordomoGUID = pCreature->GetGUID(); break; + case NPC_GARR: + case NPC_SULFURON: + case NPC_MAJORDOMO: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; // Push adds to lists in order to handle respawn - case NPC_FLAMEWAKER_PROTECTOR: m_luiProtectorGUIDs.push_back(pCreature->GetGUID()); break; - case NPC_FLAMEWAKER: m_luiFlamewakerGUIDs.push_back(pCreature->GetGUID()); break; - case NPC_FIRESWORN: m_luiFireswornGUIDs.push_back(pCreature->GetGUID()); break; - case NPC_FLAMEWAKER_PRIEST: m_luiPriestGUIDs.push_back(pCreature->GetGUID()); break; - case NPC_CORE_RAGER: m_luiRagerGUIDs.push_back(pCreature->GetGUID()); break; + case NPC_FLAMEWAKER_PROTECTOR: m_luiProtectorGUIDs.push_back(pCreature->GetObjectGuid()); break; + case NPC_FLAMEWAKER: m_luiFlamewakerGUIDs.push_back(pCreature->GetObjectGuid()); break; + case NPC_FIRESWORN: m_luiFireswornGUIDs.push_back(pCreature->GetObjectGuid()); break; + case NPC_FLAMEWAKER_PRIEST: m_luiPriestGUIDs.push_back(pCreature->GetObjectGuid()); break; + case NPC_CORE_RAGER: m_luiRagerGUIDs.push_back(pCreature->GetObjectGuid()); break; } } @@ -87,19 +76,21 @@ void instance_molten_core::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { // Runes - case GO_RUNE_KRESS: m_uiRuneKressGUID = pGo->GetGUID(); break; // Magmadar - case GO_RUNE_MOHN: m_uiRuneMohnGUID = pGo->GetGUID(); break; // Gehennas - case GO_RUNE_BLAZ: m_uiRuneBlazGUID = pGo->GetGUID(); break; // Garr - case GO_RUNE_MAZJ: m_uiRuneMazjGUID = pGo->GetGUID(); break; // Shazzrah - case GO_RUNE_ZETH: m_uiRuneZethGUID = pGo->GetGUID(); break; // Geddon - case GO_RUNE_THERI: m_uiRuneTheriGUID = pGo->GetGUID(); break; // Golemagg - case GO_RUNE_KORO: m_uiRuneKoroGUID = pGo->GetGUID(); break; // Sulfuron + case GO_RUNE_KRESS: + case GO_RUNE_MOHN: + case GO_RUNE_BLAZ: + case GO_RUNE_MAZJ: + case GO_RUNE_ZETH: + case GO_RUNE_THERI: + case GO_RUNE_KORO: // Majordomo event chest - case GO_CACHE_OF_THE_FIRE_LORD: m_uiFirelordCacheGUID = pGo->GetGUID(); break; + case GO_CACHE_OF_THE_FIRE_LORD: // Ragnaros GOs - case GO_LAVA_STEAM: m_uiLavaSteamGUID = pGo->GetGUID(); break; - case GO_LAVA_SPLASH: m_uiLavaSplashGUID = pGo->GetGUID(); break; + case GO_LAVA_STEAM: + case GO_LAVA_SPLASH: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; } } @@ -115,13 +106,13 @@ void instance_molten_core::SetData(uint32 uiType, uint32 uiData) case TYPE_MAGMADAR: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiRuneKressGUID); + DoUseDoorOrButton(GO_RUNE_KRESS); break; case TYPE_GEHENNAS: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_uiRuneMohnGUID); + DoUseDoorOrButton(GO_RUNE_MOHN); m_luiFlamewakerGUIDs.clear(); } if (uiData == FAIL) @@ -131,7 +122,7 @@ void instance_molten_core::SetData(uint32 uiType, uint32 uiData) m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_uiRuneBlazGUID); + DoUseDoorOrButton(GO_RUNE_BLAZ); m_luiFireswornGUIDs.clear(); } if (uiData == FAIL) @@ -140,18 +131,18 @@ void instance_molten_core::SetData(uint32 uiType, uint32 uiData) case TYPE_SHAZZRAH: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiRuneMazjGUID); + DoUseDoorOrButton(GO_RUNE_MAZJ); break; case TYPE_GEDDON: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiRuneZethGUID); + DoUseDoorOrButton(GO_RUNE_ZETH); break; case TYPE_GOLEMAGG: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_uiRuneTheriGUID); + DoUseDoorOrButton(GO_RUNE_THERI); DoHandleAdds(m_luiRagerGUIDs, false); m_luiRagerGUIDs.clear(); } @@ -162,7 +153,7 @@ void instance_molten_core::SetData(uint32 uiType, uint32 uiData) m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_uiRuneKoroGUID); + DoUseDoorOrButton(GO_RUNE_KORO); m_luiPriestGUIDs.clear(); } if (uiData == FAIL) @@ -171,7 +162,7 @@ void instance_molten_core::SetData(uint32 uiType, uint32 uiData) case TYPE_MAJORDOMO: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoRespawnGameObject(m_uiFirelordCacheGUID); + DoRespawnGameObject(GO_CACHE_OF_THE_FIRE_LORD, HOUR); break; case TYPE_RAGNAROS: m_auiEncounter[uiType] = uiData; @@ -210,14 +201,14 @@ uint32 instance_molten_core::GetData(uint32 uiType) // Handle Majordomo summon here void instance_molten_core::DoSpawnMajordomoIfCan(bool bByPlayerEnter) { - // If already spawned return - if (m_uiMajordomoGUID) - return; - // If both Majordomo and Ragnaros events are finished, return if (m_auiEncounter[TYPE_MAJORDOMO] == DONE && m_auiEncounter[TYPE_RAGNAROS] == DONE) return; + // If already spawned return + if (GetSingleCreatureFromStorage(NPC_MAJORDOMO, true)) + return; + // Check if all rune bosses are done for(uint8 i = TYPE_MAGMADAR; i < TYPE_MAJORDOMO; ++i) { @@ -270,22 +261,6 @@ void instance_molten_core::DoHandleAdds(GUIDList &luiAddsGUIDs, bool bRespawn /* } } -uint64 instance_molten_core::GetData64(uint32 uiData) -{ - switch (uiData) - { - case NPC_GARR: return m_uiGarrGUID; - case NPC_SULFURON: return m_uiSulfuronGUID; - case NPC_MAJORDOMO: return m_uiMajordomoGUID; - - case GO_LAVA_STEAM: return m_uiLavaSteamGUID; - case GO_LAVA_SPLASH: return m_uiLavaSplashGUID; - - default: - return 0; - } -} - void instance_molten_core::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/eastern_kingdoms/molten_core/molten_core.h b/scripts/eastern_kingdoms/molten_core/molten_core.h index 6facdda..67432dc 100644 --- a/scripts/eastern_kingdoms/molten_core/molten_core.h +++ b/scripts/eastern_kingdoms/molten_core/molten_core.h @@ -98,7 +98,6 @@ class MANGOS_DLL_DECL instance_molten_core : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -112,26 +111,6 @@ class MANGOS_DLL_DECL instance_molten_core : public ScriptedInstance std::string m_strInstData; uint32 m_auiEncounter[MAX_ENCOUNTER]; - // Creatures - uint64 m_uiGarrGUID; - uint64 m_uiSulfuronGUID; - uint64 m_uiMajordomoGUID; - - // Runes - uint64 m_uiRuneKoroGUID; - uint64 m_uiRuneZethGUID; - uint64 m_uiRuneMazjGUID; - uint64 m_uiRuneTheriGUID; - uint64 m_uiRuneBlazGUID; - uint64 m_uiRuneKressGUID; - uint64 m_uiRuneMohnGUID; - - // Ragnaros related GOs - uint64 m_uiLavaSteamGUID; - uint64 m_uiLavaSplashGUID; - // Chests - uint64 m_uiFirelordCacheGUID; - // Adds lists GUIDList m_luiProtectorGUIDs; GUIDList m_luiFlamewakerGUIDs; diff --git a/scripts/eastern_kingdoms/scarlet_enclave/ebon_hold.cpp b/scripts/eastern_kingdoms/scarlet_enclave/ebon_hold.cpp index d56aea9..03d8478 100644 --- a/scripts/eastern_kingdoms/scarlet_enclave/ebon_hold.cpp +++ b/scripts/eastern_kingdoms/scarlet_enclave/ebon_hold.cpp @@ -164,7 +164,7 @@ struct MANGOS_DLL_DECL npc_a_special_surpriseAI : public ScriptedAI void MoveInLineOfSight(Unit* pWho) { - if (!m_playerGuid.IsEmpty() || pWho->GetTypeId() != TYPEID_PLAYER || !pWho->IsWithinDist(m_creature, INTERACTION_DISTANCE)) + if (m_playerGuid || pWho->GetTypeId() != TYPEID_PLAYER || !pWho->IsWithinDist(m_creature, INTERACTION_DISTANCE)) return; if (MeetQuestCondition((Player*)pWho)) @@ -173,7 +173,7 @@ struct MANGOS_DLL_DECL npc_a_special_surpriseAI : public ScriptedAI void UpdateAI(const uint32 uiDiff) { - if (!m_playerGuid.IsEmpty() && !m_creature->getVictim() && m_creature->isAlive()) + if (m_playerGuid && !m_creature->getVictim() && m_creature->isAlive()) { if (m_uiExecuteSpeech_Timer < uiDiff) { @@ -997,7 +997,7 @@ struct MANGOS_DLL_DECL npc_unworthy_initiateAI : public ScriptedAI Creature* GetAnchor() { - if (!m_myAnchorGuid.IsEmpty()) + if (m_myAnchorGuid) return m_creature->GetMap()->GetCreature(m_myAnchorGuid); else return GetClosestCreatureWithEntry(m_creature, NPC_ANCHOR, INTERACTION_DISTANCE*2); @@ -1272,8 +1272,8 @@ struct MANGOS_DLL_DECL mob_scarlet_ghoulAI : public ScriptedAI Unit* pTarget; ObjectGuid m_uiCreatorGuid; - uint64 m_uiTargetGUID; - uint64 m_uiHarvesterGUID; + ObjectGuid m_uiTargetGUID; + ObjectGuid m_uiHarvesterGUID; uint32 m_uiWaitForThrowTimer; @@ -1288,19 +1288,17 @@ struct MANGOS_DLL_DECL mob_scarlet_ghoulAI : public ScriptedAI m_uiWaitForThrowTimer = 3000; m_bWaitForThrow = false; pTarget = NULL; - m_uiTargetGUID = 0; - m_uiHarvesterGUID = 0; } void MoveInLineOfSight(Unit *pWho) { if (!m_bWaitForThrow && pWho->GetEntry() == ENTRY_GOTHIK && m_creature->GetDistance(pWho) < 15.0f) { - m_uiHarvesterGUID = pWho->GetGUID(); + m_uiHarvesterGUID = pWho->GetObjectGuid(); if (Player* pOwner = m_creature->GetMap()->GetPlayer(m_uiCreatorGuid) ) { - pOwner->KilledMonsterCredit(m_creature->GetEntry(), m_creature->GetGUID() ); + pOwner->KilledMonsterCredit(m_creature->GetEntry(), m_creature->GetObjectGuid() ); // this will execute if m_creature survived Harvester's wrath float x, y, z, o; o = float(urand(53, 57))/10.0f; @@ -1643,28 +1641,28 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI uint32 uiTargetcheck; // Dawn - uint64 uiTirionGUID; - uint64 uiAlexandrosGUID; - uint64 uiDarionGUID; - uint64 uiKorfaxGUID; - uint64 uiMaxwellGUID; - uint64 uiEligorGUID; - uint64 uiRayneGUID; - uint64 uiDefenderGUID[ENCOUNTER_DEFENDER_NUMBER]; - uint64 uiEarthshatterGUID[ENCOUNTER_EARTHSHATTER_NUMBER]; + ObjectGuid uiTirionGUID; + ObjectGuid uiAlexandrosGUID; + ObjectGuid uiDarionGUID; + ObjectGuid uiKorfaxGUID; + ObjectGuid uiMaxwellGUID; + ObjectGuid uiEligorGUID; + ObjectGuid uiRayneGUID; + ObjectGuid uiDefenderGUID[ENCOUNTER_DEFENDER_NUMBER]; + ObjectGuid uiEarthshatterGUID[ENCOUNTER_EARTHSHATTER_NUMBER]; // Death - uint64 uiKoltiraGUID; - uint64 uiOrbazGUID; - uint64 uiThassarianGUID; - uint64 uiLichKingGUID; - uint64 uiAbominationGUID[ENCOUNTER_ABOMINATION_NUMBER]; - uint64 uiBehemothGUID[ENCOUNTER_BEHEMOTH_NUMBER]; - uint64 uiGhoulGUID[ENCOUNTER_GHOUL_NUMBER]; - uint64 uiWarriorGUID[ENCOUNTER_WARRIOR_NUMBER]; + ObjectGuid uiKoltiraGUID; + ObjectGuid uiOrbazGUID; + ObjectGuid uiThassarianGUID; + ObjectGuid uiLichKingGUID; + ObjectGuid uiAbominationGUID[ENCOUNTER_ABOMINATION_NUMBER]; + ObjectGuid uiBehemothGUID[ENCOUNTER_BEHEMOTH_NUMBER]; + ObjectGuid uiGhoulGUID[ENCOUNTER_GHOUL_NUMBER]; + ObjectGuid uiWarriorGUID[ENCOUNTER_WARRIOR_NUMBER]; // Misc - uint64 uiDawnofLightGUID; + ObjectGuid uiDawnofLightGUID; void Reset() { @@ -1678,7 +1676,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI uiTotal_scourge = ENCOUNTER_TOTAL_SCOURGE; uiSummon_counter = 0; - uiDawnofLightGUID = 0; + uiDawnofLightGUID.Clear(); uiAnti_magic_zone = 1000 + rand()%5000; uiDeath_strike = 5000 + rand()%5000; @@ -1708,23 +1706,23 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiRayneGUID)) pTemp->SetDeathState(JUST_DIED); - uiTirionGUID = NULL; - uiKorfaxGUID = NULL; - uiMaxwellGUID = NULL; - uiEligorGUID = NULL; - uiRayneGUID = NULL; + uiTirionGUID.Clear(); + uiKorfaxGUID.Clear(); + uiMaxwellGUID.Clear(); + uiEligorGUID.Clear(); + uiRayneGUID.Clear(); for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiDefenderGUID[i])) pTemp->SetDeathState(JUST_DIED); - uiDefenderGUID[i] = 0; + uiDefenderGUID[i].Clear(); } for (uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiEarthshatterGUID[i])) pTemp->SetDeathState(JUST_DIED); - uiEarthshatterGUID[i] = 0; + uiEarthshatterGUID[i].Clear(); } if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiKoltiraGUID)) @@ -1736,33 +1734,33 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiLichKingGUID)) pTemp->SetDeathState(JUST_DIED); - uiKoltiraGUID = NULL; - uiOrbazGUID = NULL; - uiThassarianGUID = NULL; - uiLichKingGUID = NULL; + uiKoltiraGUID.Clear(); + uiOrbazGUID.Clear(); + uiThassarianGUID.Clear(); + uiLichKingGUID.Clear(); for(uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiAbominationGUID[i])) pTemp->SetDeathState(JUST_DIED); - uiAbominationGUID[i] = 0; + uiAbominationGUID[i].Clear(); } for(uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiBehemothGUID[i])) pTemp->SetDeathState(JUST_DIED); - uiBehemothGUID[i] = 0; + uiBehemothGUID[i].Clear(); } for(uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiGhoulGUID[i])) pTemp->SetDeathState(JUST_DIED); - uiGhoulGUID[i] = 0; + uiGhoulGUID[i].Clear(); } for(uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiWarriorGUID[i])) pTemp->SetDeathState(JUST_DIED); - uiWarriorGUID[i] = 0; + uiWarriorGUID[i].Clear(); } } } @@ -1807,7 +1805,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI if (GameObject* pGo = GetClosestGameObjectWithEntry(m_creature, GO_LIGHT_OF_DAWN, 100.0f)) // make dawn of light effect off { - uiDawnofLightGUID = pGo->GetGUID(); + uiDawnofLightGUID = pGo->GetObjectGuid(); pGo->SetPhaseMask(0, true); } @@ -1941,11 +1939,11 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI case 2: DoScriptText(SAY_LIGHT_OF_DAWN04, m_creature); if (Creature* pKoltira = GetClosestCreatureWithEntry(m_creature, NPC_KOLTIRA_DEATHWEAVER, 50.0f)) - uiKoltiraGUID = pKoltira->GetGUID(); + uiKoltiraGUID = pKoltira->GetObjectGuid(); if (Creature* pOrbaz = GetClosestCreatureWithEntry(m_creature, NPC_ORBAZ_BLOODBANE, 50.0f)) - uiOrbazGUID = pOrbaz->GetGUID(); + uiOrbazGUID = pOrbaz->GetObjectGuid(); if (Creature* pThassarian = GetClosestCreatureWithEntry(m_creature, NPC_THASSARIAN, 50.0f)) - uiThassarianGUID = pThassarian->GetGUID(); + uiThassarianGUID = pThassarian->GetObjectGuid(); JumpToNextStep(10000); break; @@ -1964,7 +1962,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp->RemoveSplineFlag(SPLINEFLAG_WALKMODE); pTemp->setFaction(2084); - uiGhoulGUID[uiSummon_counter] = pTemp->GetGUID(); + uiGhoulGUID[uiSummon_counter] = pTemp->GetObjectGuid(); uiSummon_counter++; } } @@ -1984,7 +1982,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp->RemoveSplineFlag(SPLINEFLAG_WALKMODE); pTemp->setFaction(2084); - uiAbominationGUID[uiSummon_counter] = pTemp->GetGUID(); + uiAbominationGUID[uiSummon_counter] = pTemp->GetObjectGuid(); uiSummon_counter++; } } @@ -2004,7 +2002,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp->RemoveSplineFlag(SPLINEFLAG_WALKMODE); pTemp->setFaction(2084); - uiWarriorGUID[uiSummon_counter] = pTemp->GetGUID(); + uiWarriorGUID[uiSummon_counter] = pTemp->GetObjectGuid(); uiSummon_counter++; } } @@ -2024,7 +2022,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp->RemoveSplineFlag(SPLINEFLAG_WALKMODE); pTemp->setFaction(2084); - uiBehemothGUID[uiSummon_counter] = pTemp->GetGUID(); + uiBehemothGUID[uiSummon_counter] = pTemp->GetObjectGuid(); uiSummon_counter++; } } @@ -2103,7 +2101,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pTemp->CastSpell(pTemp, SPELL_ALEXANDROS_MOGRAINE_SPAWN, true); DoScriptText(EMOTE_LIGHT_OF_DAWN06, pTemp); - uiAlexandrosGUID = pTemp->GetGUID(); + uiAlexandrosGUID = pTemp->GetObjectGuid(); } JumpToNextStep(4000); break; @@ -2130,7 +2128,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { DoScriptText(SAY_LIGHT_OF_DAWN35, pTemp); pTemp->RemoveSplineFlag(SPLINEFLAG_WALKMODE); - uiDarionGUID = pTemp->GetGUID(); + uiDarionGUID = pTemp->GetObjectGuid(); } JumpToNextStep(4000); break; @@ -2206,7 +2204,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI if (Creature* pTemp = m_creature->SummonCreature(NPC_THE_LICH_KING, LightofDawnLoc[26].x, LightofDawnLoc[26].y, LightofDawnLoc[26].z, LightofDawnLoc[26].o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) { DoScriptText(SAY_LIGHT_OF_DAWN43, pTemp); - uiLichKingGUID = pTemp->GetGUID(); + uiLichKingGUID = pTemp->GetObjectGuid(); if (Creature* pAlex = m_creature->GetMap()->GetCreature(uiAlexandrosGUID)) pTemp->CastSpell(pAlex, SPELL_SOUL_FEAST_ALEX, false); } @@ -2321,7 +2319,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp->SetSpeedRate(MOVE_RUN, 2.0f); pTemp->setFaction(m_creature->getFaction()); pTemp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); - uiDefenderGUID[0] = pTemp->GetGUID(); + uiDefenderGUID[0] = pTemp->GetObjectGuid(); } if (pTemp = m_creature->SummonCreature(NPC_RIMBLAT_EARTHSHATTER, LightofDawnLoc[0].x+rand()%10, LightofDawnLoc[0].y+rand()%10, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000)) @@ -2331,7 +2329,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp->SetSpeedRate(MOVE_RUN, 2.0f); pTemp->setFaction(m_creature->getFaction()); pTemp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); - uiEarthshatterGUID[0] = pTemp->GetGUID(); + uiEarthshatterGUID[0] = pTemp->GetObjectGuid(); } } if (Creature* pTemp = m_creature->GetMap()->GetCreature(uiMaxwellGUID)) @@ -2731,7 +2729,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp->setFaction(m_creature->getFaction()); pTemp->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); DoScriptText(SAY_LIGHT_OF_DAWN25, pTemp); - uiTirionGUID = pTemp->GetGUID(); + uiTirionGUID = pTemp->GetObjectGuid(); } } if (uiFight_duration < diff) @@ -2838,7 +2836,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI uiStep++; } - void NPCChangeTarget(uint64 ui_GUID) + void NPCChangeTarget(ObjectGuid ui_GUID) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(ui_GUID)) if (pTemp->isAlive()) @@ -2863,7 +2861,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp = m_creature->SummonCreature(NPC_ACHERUS_GHOUL, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2084); - uiGhoulGUID[i] = pTemp->GetGUID(); + uiGhoulGUID[i] = pTemp->GetObjectGuid(); } } for(uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) @@ -2872,7 +2870,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp = m_creature->SummonCreature(NPC_WARRIOR_OF_THE_FROZEN_WASTES, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2084); - uiAbominationGUID[i] = pTemp->GetGUID(); + uiAbominationGUID[i] = pTemp->GetObjectGuid(); } } for(uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) @@ -2881,7 +2879,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp = m_creature->SummonCreature(NPC_RAMPAGING_ABOMINATION, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2084); - uiWarriorGUID[i] = pTemp->GetGUID(); + uiWarriorGUID[i] = pTemp->GetObjectGuid(); } } for(uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) @@ -2890,7 +2888,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI { pTemp = m_creature->SummonCreature(NPC_FLESH_BEHEMOTH, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2084); - uiBehemothGUID[i] = pTemp->GetGUID(); + uiBehemothGUID[i] = pTemp->GetObjectGuid(); } } @@ -2902,7 +2900,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp = m_creature->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2089); m_creature->AddThreat(pTemp, 0.0f); - uiDefenderGUID[i] = pTemp->GetGUID(); + uiDefenderGUID[i] = pTemp->GetObjectGuid(); } } for(uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i) @@ -2912,7 +2910,7 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp = m_creature->SummonCreature(NPC_RIMBLAT_EARTHSHATTER, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2089); m_creature->AddThreat(pTemp, 0.0f); - uiEarthshatterGUID[i] = pTemp->GetGUID(); + uiEarthshatterGUID[i] = pTemp->GetObjectGuid(); } } if (!(pTemp = m_creature->GetMap()->GetCreature(uiKorfaxGUID))) @@ -2920,32 +2918,32 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI pTemp = m_creature->SummonCreature(NPC_KORFAX_CHAMPION_OF_THE_LIGHT, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000); pTemp->setFaction(2089); m_creature->AddThreat(pTemp, 0.0f); - uiKorfaxGUID = pTemp->GetGUID(); + uiKorfaxGUID = pTemp->GetObjectGuid(); } if (!(pTemp = m_creature->GetMap()->GetCreature(uiMaxwellGUID))) { pTemp = m_creature->SummonCreature(NPC_LORD_MAXWELL_TYROSUS, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000); pTemp->setFaction(2089); m_creature->AddThreat(pTemp, 0.0f); - uiMaxwellGUID = pTemp->GetGUID(); + uiMaxwellGUID = pTemp->GetObjectGuid(); } if (!(pTemp = m_creature->GetMap()->GetCreature(uiEligorGUID))) { pTemp = m_creature->SummonCreature(NPC_COMMANDER_ELIGOR_DAWNBRINGER, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000); pTemp->setFaction(2089); m_creature->AddThreat(pTemp, 0.0f); - uiEligorGUID = pTemp->GetGUID(); + uiEligorGUID = pTemp->GetObjectGuid(); } if (!(pTemp = m_creature->GetMap()->GetCreature(uiRayneGUID))) { pTemp = m_creature->SummonCreature(NPC_RAYNE, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); pTemp->setFaction(2089); m_creature->AddThreat(pTemp, 0.0f); - uiRayneGUID = pTemp->GetGUID(); + uiRayneGUID = pTemp->GetObjectGuid(); } } - void DespawnNPC(uint64 pGUID) + void DespawnNPC(ObjectGuid pGUID) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(pGUID)) if (pTemp->isAlive()) @@ -2959,12 +2957,12 @@ struct MANGOS_DLL_DECL npc_highlord_darion_mograineAI : public npc_escortAI bool GossipHello_npc_highlord_darion_mograine(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) - pPlayer->PrepareQuestMenu( pCreature->GetGUID() ); + pPlayer->PrepareQuestMenu( pCreature->GetObjectGuid() ); if (pPlayer->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) pPlayer->ADD_GOSSIP_ITEM( 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetObjectGuid()); return true; } diff --git a/scripts/eastern_kingdoms/scarlet_monastery/boss_interrogator_vishas.cpp b/scripts/eastern_kingdoms/scarlet_monastery/boss_interrogator_vishas.cpp index 7198b7e..aaaf296 100644 --- a/scripts/eastern_kingdoms/scarlet_monastery/boss_interrogator_vishas.cpp +++ b/scripts/eastern_kingdoms/scarlet_monastery/boss_interrogator_vishas.cpp @@ -72,7 +72,7 @@ struct MANGOS_DLL_DECL boss_interrogator_vishasAI : public ScriptedAI return; //Any other actions to do with vorrel? setStandState? - if (Creature *vorrel = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VORREL))) + if (Creature *vorrel = m_pInstance->GetSingleCreatureFromStorage(NPC_VORREL)) DoScriptText(SAY_TRIGGER_VORREL, vorrel); } diff --git a/scripts/eastern_kingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp b/scripts/eastern_kingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp index ab2b81b..5699063 100644 --- a/scripts/eastern_kingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp +++ b/scripts/eastern_kingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp @@ -85,7 +85,7 @@ struct MANGOS_DLL_DECL boss_scarlet_commander_mograineAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pWhitemane = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_WHITEMANE))) + if (Creature* pWhitemane = m_pInstance->GetSingleCreatureFromStorage(NPC_WHITEMANE)) { if (m_creature->isAlive() && !pWhitemane->isAlive()) pWhitemane->Respawn(); @@ -114,7 +114,7 @@ struct MANGOS_DLL_DECL boss_scarlet_commander_mograineAI : public ScriptedAI return; //On first death, fake death and open door, as well as initiate whitemane if exist - if (Creature* pWhitemane = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_WHITEMANE))) + if (Creature* pWhitemane = m_pInstance->GetSingleCreatureFromStorage(NPC_WHITEMANE)) { m_pInstance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS); @@ -163,7 +163,7 @@ struct MANGOS_DLL_DECL boss_scarlet_commander_mograineAI : public ScriptedAI if (m_bHasDied && !m_bHeal && m_pInstance && m_pInstance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL) { //On ressurection, stop fake death and heal whitemane and resume fight - if (Creature* pWhitemane = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_WHITEMANE))) + if (Creature* pWhitemane = m_pInstance->GetSingleCreatureFromStorage(NPC_WHITEMANE)) { m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetStandState(UNIT_STAND_STATE_STAND); @@ -236,14 +236,13 @@ struct MANGOS_DLL_DECL boss_high_inquisitor_whitemaneAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pMograine = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_MOGRAINE))) + if (Creature* pMograine = m_pInstance->GetSingleCreatureFromStorage(NPC_MOGRAINE)) { if (m_creature->isAlive() && !pMograine->isAlive()) pMograine->Respawn(); } } - void JustReachedHome() { if (m_pInstance) @@ -298,7 +297,7 @@ struct MANGOS_DLL_DECL boss_high_inquisitor_whitemaneAI : public ScriptedAI //When casting resuruction make sure to delay so on rez when reinstate battle deepsleep runs out if (m_pInstance && m_uiWait_Timer < uiDiff) { - if (Creature* pMograine = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_MOGRAINE))) + if (Creature* pMograine = m_pInstance->GetSingleCreatureFromStorage(NPC_MOGRAINE)) { DoCastSpellIfCan(pMograine, SPELL_SCARLETRESURRECTION); DoScriptText(SAY_WH_RESSURECT, m_creature); @@ -335,7 +334,7 @@ struct MANGOS_DLL_DECL boss_high_inquisitor_whitemaneAI : public ScriptedAI if (m_pInstance) { - if (Creature* pMograine = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_MOGRAINE))) + if (Creature* pMograine = m_pInstance->GetSingleCreatureFromStorage(NPC_MOGRAINE)) { if (pMograine->isAlive() && pMograine->GetHealthPercent() <= 75.0f) pTarget = pMograine; diff --git a/scripts/eastern_kingdoms/scarlet_monastery/instance_scarlet_monastery.cpp b/scripts/eastern_kingdoms/scarlet_monastery/instance_scarlet_monastery.cpp index 845d4cb..4cd2a54 100644 --- a/scripts/eastern_kingdoms/scarlet_monastery/instance_scarlet_monastery.cpp +++ b/scripts/eastern_kingdoms/scarlet_monastery/instance_scarlet_monastery.cpp @@ -24,78 +24,54 @@ EndScriptData */ #include "precompiled.h" #include "scarlet_monastery.h" -struct MANGOS_DLL_DECL instance_scarlet_monastery : public ScriptedInstance +instance_scarlet_monastery::instance_scarlet_monastery(Map* pMap) : ScriptedInstance(pMap) { - instance_scarlet_monastery(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - uint64 m_uiMograineGUID; - uint64 m_uiWhitemaneGUID; - uint64 m_uiVorrelGUID; - uint64 m_uiDoorHighInquisitorGUID; - - void Initialize() - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiMograineGUID = 0; - m_uiWhitemaneGUID = 0; - m_uiVorrelGUID = 0; - m_uiDoorHighInquisitorGUID = 0; - } + Initialize(); +} - void OnCreatureCreate(Creature* pCreature) - { - switch(pCreature->GetEntry()) - { - case NPC_MOGRAINE: m_uiMograineGUID = pCreature->GetGUID(); break; - case NPC_WHITEMANE: m_uiWhitemaneGUID = pCreature->GetGUID(); break; - case NPC_VORREL: m_uiVorrelGUID = pCreature->GetGUID(); break; - } - } +void instance_scarlet_monastery::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void OnObjectCreate(GameObject* pGo) +void instance_scarlet_monastery::OnCreatureCreate(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - if (pGo->GetEntry() == GO_WHITEMANE_DOOR) - m_uiDoorHighInquisitorGUID = pGo->GetGUID(); + case NPC_MOGRAINE: + case NPC_WHITEMANE: + case NPC_VORREL: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } +} - uint64 GetData64(uint32 data) - { - switch(data) - { - case NPC_MOGRAINE: return m_uiMograineGUID; - case NPC_WHITEMANE: return m_uiWhitemaneGUID; - case NPC_VORREL: return m_uiVorrelGUID; - case GO_WHITEMANE_DOOR: return m_uiDoorHighInquisitorGUID; - - default: - return 0; - } - } +void instance_scarlet_monastery::OnObjectCreate(GameObject* pGo) +{ + if (pGo->GetEntry() == GO_WHITEMANE_DOOR) + m_mGoEntryGuidStore[GO_WHITEMANE_DOOR] = pGo->GetObjectGuid(); +} - void SetData(uint32 uiType, uint32 uiData) +void instance_scarlet_monastery::SetData(uint32 uiType, uint32 uiData) +{ + if (uiType == TYPE_MOGRAINE_AND_WHITE_EVENT) { - if (uiType == TYPE_MOGRAINE_AND_WHITE_EVENT) - { - if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiDoorHighInquisitorGUID); - if (uiData == FAIL) - DoUseDoorOrButton(m_uiDoorHighInquisitorGUID); + if (uiData == IN_PROGRESS) + DoUseDoorOrButton(GO_WHITEMANE_DOOR); + if (uiData == FAIL) + DoUseDoorOrButton(GO_WHITEMANE_DOOR); - m_auiEncounter[0] = uiData; - } + m_auiEncounter[0] = uiData; } +} - uint32 GetData(uint32 uiData) - { - if (uiData == TYPE_MOGRAINE_AND_WHITE_EVENT) - return m_auiEncounter[0]; +uint32 instance_scarlet_monastery::GetData(uint32 uiData) +{ + if (uiData == TYPE_MOGRAINE_AND_WHITE_EVENT) + return m_auiEncounter[0]; - return 0; - } -}; + return 0; +} InstanceData* GetInstanceData_instance_scarlet_monastery(Map* pMap) { @@ -104,9 +80,10 @@ InstanceData* GetInstanceData_instance_scarlet_monastery(Map* pMap) void AddSC_instance_scarlet_monastery() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_scarlet_monastery"; - newscript->GetInstanceData = &GetInstanceData_instance_scarlet_monastery; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_scarlet_monastery"; + pNewScript->GetInstanceData = &GetInstanceData_instance_scarlet_monastery; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/scarlet_monastery/scarlet_monastery.h b/scripts/eastern_kingdoms/scarlet_monastery/scarlet_monastery.h index 87c56d9..27d7660 100644 --- a/scripts/eastern_kingdoms/scarlet_monastery/scarlet_monastery.h +++ b/scripts/eastern_kingdoms/scarlet_monastery/scarlet_monastery.h @@ -18,4 +18,21 @@ enum GO_WHITEMANE_DOOR = 104600, }; +class MANGOS_DLL_DECL instance_scarlet_monastery : public ScriptedInstance +{ + public: + instance_scarlet_monastery(Map* pMap); + + void Initialize(); + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiData); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; +}; + #endif diff --git a/scripts/eastern_kingdoms/scholomance/instance_scholomance.cpp b/scripts/eastern_kingdoms/scholomance/instance_scholomance.cpp index 02d7ed2..794d99a 100644 --- a/scripts/eastern_kingdoms/scholomance/instance_scholomance.cpp +++ b/scripts/eastern_kingdoms/scholomance/instance_scholomance.cpp @@ -25,10 +25,6 @@ EndScriptData */ #include "scholomance.h" instance_scholomance::instance_scholomance(Map* pMap) : ScriptedInstance(pMap), - m_uiDarkmasterGandlingGUID(0), - m_uiGateKirtonosGUID(0), - m_uiGateRasGUID(0), - m_uiGateGandlingGUID(0), m_uiGandlingEvent(0) { Initialize(); @@ -53,7 +49,7 @@ void instance_scholomance::OnCreatureCreate(Creature* pCreature) switch (pCreature->GetEntry()) { case NPC_DARKMASTER_GANDLING: - m_uiDarkmasterGandlingGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[NPC_DARKMASTER_GANDLING] = pCreature->GetObjectGuid(); break; case NPC_BONE_MINION: GandlingEventMap::iterator find = m_mGandlingData.find(m_uiGandlingEvent); @@ -67,16 +63,18 @@ void instance_scholomance::OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { - case GO_GATE_KIRTONOS: m_uiGateKirtonosGUID = pGo->GetGUID(); break; - case GO_GATE_RAS: m_uiGateRasGUID = pGo->GetGUID(); break; - case GO_GATE_GANDLING: m_uiGateGandlingGUID = pGo->GetGUID(); break; + case GO_GATE_KIRTONOS: + case GO_GATE_RAS: + case GO_GATE_GANDLING: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; - case GO_GATE_MALICIA: m_mGandlingData[EVENT_ID_MALICIA].m_uiDoorGUID = pGo->GetGUID(); break; - case GO_GATE_THEOLEN: m_mGandlingData[EVENT_ID_THEOLEN].m_uiDoorGUID = pGo->GetGUID(); break; - case GO_GATE_POLKELT: m_mGandlingData[EVENT_ID_POLKELT].m_uiDoorGUID = pGo->GetGUID(); break; - case GO_GATE_RAVENIAN: m_mGandlingData[EVENT_ID_RAVENIAN].m_uiDoorGUID = pGo->GetGUID(); break; - case GO_GATE_BAROV: m_mGandlingData[EVENT_ID_BAROV].m_uiDoorGUID = pGo->GetGUID(); break; - case GO_GATE_ILLUCIA: m_mGandlingData[EVENT_ID_ILLUCIA].m_uiDoorGUID = pGo->GetGUID(); break; + case GO_GATE_MALICIA: m_mGandlingData[EVENT_ID_MALICIA].m_doorGuid = pGo->GetObjectGuid(); break; + case GO_GATE_THEOLEN: m_mGandlingData[EVENT_ID_THEOLEN].m_doorGuid = pGo->GetObjectGuid(); break; + case GO_GATE_POLKELT: m_mGandlingData[EVENT_ID_POLKELT].m_doorGuid = pGo->GetObjectGuid(); break; + case GO_GATE_RAVENIAN: m_mGandlingData[EVENT_ID_RAVENIAN].m_doorGuid = pGo->GetObjectGuid(); break; + case GO_GATE_BAROV: m_mGandlingData[EVENT_ID_BAROV].m_doorGuid = pGo->GetObjectGuid(); break; + case GO_GATE_ILLUCIA: m_mGandlingData[EVENT_ID_ILLUCIA].m_doorGuid = pGo->GetObjectGuid(); break; case GO_VIEWING_ROOM_DOOR: // In normal flow of the instance, this door is opened by a dropped key @@ -95,43 +93,43 @@ void instance_scholomance::SetData(uint32 uiType, uint32 uiData) if (m_auiEncounter[uiType] != FAIL && uiData == IN_PROGRESS) return; m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_uiGateKirtonosGUID); + DoUseDoorOrButton(GO_GATE_KIRTONOS); break; case TYPE_RATTLEGORE: m_auiEncounter[uiType] = uiData; break; case TYPE_RAS_FROSTWHISPER: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_uiGateRasGUID); + DoUseDoorOrButton(GO_GATE_RAS); break; case TYPE_MALICIA: // TODO this code can be simplified, when it is known which event-ids correspond to which room m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_mGandlingData[EVENT_ID_MALICIA].m_uiDoorGUID); + DoUseDoorOrButton(m_mGandlingData[EVENT_ID_MALICIA].m_doorGuid); break; case TYPE_THEOLEN: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_mGandlingData[EVENT_ID_THEOLEN].m_uiDoorGUID); + DoUseDoorOrButton(m_mGandlingData[EVENT_ID_THEOLEN].m_doorGuid); break; case TYPE_POLKELT: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_mGandlingData[EVENT_ID_POLKELT].m_uiDoorGUID); + DoUseDoorOrButton(m_mGandlingData[EVENT_ID_POLKELT].m_doorGuid); break; case TYPE_RAVENIAN: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_mGandlingData[EVENT_ID_RAVENIAN].m_uiDoorGUID); + DoUseDoorOrButton(m_mGandlingData[EVENT_ID_RAVENIAN].m_doorGuid); break; case TYPE_ALEXEI_BAROV: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_mGandlingData[EVENT_ID_BAROV].m_uiDoorGUID); + DoUseDoorOrButton(m_mGandlingData[EVENT_ID_BAROV].m_doorGuid); break; case TYPE_ILLUCIA_BAROV: m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_mGandlingData[EVENT_ID_ILLUCIA].m_uiDoorGUID); + DoUseDoorOrButton(m_mGandlingData[EVENT_ID_ILLUCIA].m_doorGuid); break; case TYPE_GANDLING: m_auiEncounter[uiType] = uiData; // Close the door to main room, because the encounter will take place only in the main hall and random around all the 6 rooms - DoUseDoorOrButton(m_uiGateGandlingGUID); + DoUseDoorOrButton(GO_GATE_GANDLING); break; } @@ -157,14 +155,14 @@ void instance_scholomance::SetData(uint32 uiType, uint32 uiData) void instance_scholomance::DoSpawnGandlingIfCan(bool bByPlayerEnter) { - // Summon only once - if (m_uiDarkmasterGandlingGUID) - return; - // Do not summon, if event finished if (m_auiEncounter[TYPE_GANDLING] == DONE) return; + // Summon only once + if (GetSingleCreatureFromStorage(NPC_DARKMASTER_GANDLING)) + return; + Player* pPlayer = GetPlayerInMap(); if (!pPlayer) return; @@ -196,7 +194,7 @@ void instance_scholomance::HandlePortalEvent(uint32 uiEventId, uint32 uiData) if (!find->second.m_bIsActive) { find->second.m_bIsActive = true; - DoUseDoorOrButton(find->second.m_uiDoorGUID); + DoUseDoorOrButton(find->second.m_doorGuid); } } // Toggle door and event state in case of state-switch @@ -207,7 +205,7 @@ void instance_scholomance::HandlePortalEvent(uint32 uiEventId, uint32 uiData) uiData == DONE && find->second.m_bIsActive) { find->second.m_bIsActive = !find->second.m_bIsActive; - DoUseDoorOrButton(find->second.m_uiDoorGUID); + DoUseDoorOrButton(find->second.m_doorGuid); } } } diff --git a/scripts/eastern_kingdoms/scholomance/scholomance.h b/scripts/eastern_kingdoms/scholomance/scholomance.h index 739fac0..162f822 100644 --- a/scripts/eastern_kingdoms/scholomance/scholomance.h +++ b/scripts/eastern_kingdoms/scholomance/scholomance.h @@ -68,9 +68,9 @@ static const SpawnLocation aGandlingSpawnLocs[1] = struct GandlingEventData { - GandlingEventData() : m_bIsActive(false), m_uiDoorGUID(0) {} + GandlingEventData() : m_bIsActive(false) {} bool m_bIsActive; - uint64 m_uiDoorGUID; + ObjectGuid m_doorGuid; std::set m_sAddGuids; }; @@ -108,12 +108,6 @@ class MANGOS_DLL_DECL instance_scholomance : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiDarkmasterGandlingGUID; - - uint64 m_uiGateKirtonosGUID; - uint64 m_uiGateRasGUID; - uint64 m_uiGateGandlingGUID; - uint32 m_uiGandlingEvent; GandlingEventMap m_mGandlingData; }; diff --git a/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp b/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp index 8c7fc6a..0ee8439 100644 --- a/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp +++ b/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp @@ -24,206 +24,167 @@ EndScriptData */ #include "precompiled.h" #include "shadowfang_keep.h" -struct MANGOS_DLL_DECL instance_shadowfang_keep : public ScriptedInstance +instance_shadowfang_keep::instance_shadowfang_keep(Map* pMap) : ScriptedInstance(pMap) { - instance_shadowfang_keep(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiAshGUID; - uint64 m_uiAdaGUID; - - uint64 m_uiDoorCourtyardGUID; - uint64 m_uiDoorSorcererGUID; - uint64 m_uiDoorArugalGUID; - - uint64 m_uiFenrusGUID; - uint64 m_uiVincentGUID; + Initialize(); +} - uint64 m_uiArugalFocusGUID; +void instance_shadowfang_keep::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void Initialize() +void instance_shadowfang_keep::OnCreatureCreate(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiAshGUID = 0; - m_uiAdaGUID = 0; - - m_uiDoorCourtyardGUID = 0; - m_uiDoorSorcererGUID = 0; - m_uiDoorArugalGUID = 0; - - m_uiFenrusGUID = 0; - m_uiVincentGUID = 0; - - m_uiArugalFocusGUID = 0; + case NPC_ASH: + case NPC_ADA: + case NPC_FENRUS: + break; + case NPC_VINCENT: + // If Arugal has done the intro, make Vincent dead! + if (m_auiEncounter[4] == DONE) + pCreature->SetStandState(UNIT_STAND_STATE_DEAD); + break; + + default: + return; } + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); +} - void OnCreatureCreate(Creature* pCreature) +void instance_shadowfang_keep::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - switch(pCreature->GetEntry()) - { - case NPC_ASH: m_uiAshGUID = pCreature->GetGUID(); break; - case NPC_ADA: m_uiAdaGUID = pCreature->GetGUID(); break; - case NPC_FENRUS: m_uiFenrusGUID = pCreature->GetGUID(); break; - case NPC_VINCENT: - m_uiVincentGUID = pCreature->GetGUID(); - //if Arugal has done the intro, make Vincent dead! - if (m_auiEncounter[4] == DONE) - pCreature->SetStandState(UNIT_STAND_STATE_DEAD); - break; - } + case GO_COURTYARD_DOOR: + if (m_auiEncounter[0] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + // For this we ignore voidwalkers, because if the server restarts + // They won't be there, but Fenrus is dead so the door can't be opened! + case GO_SORCERER_DOOR: + if (m_auiEncounter[2] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ARUGAL_DOOR: + if (m_auiEncounter[3] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ARUGAL_FOCUS: + break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); +} - void OnObjectCreate(GameObject* pGo) - { - switch(pGo->GetEntry()) - { - case GO_COURTYARD_DOOR: - m_uiDoorCourtyardGUID = pGo->GetGUID(); - if (m_auiEncounter[0] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - //for this we ignore voidwalkers, because if the server restarts - //they won't be there, but Fenrus is dead so the door can't be opened! - case GO_SORCERER_DOOR: - m_uiDoorSorcererGUID = pGo->GetGUID(); - if (m_auiEncounter[2] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ARUGAL_DOOR: - m_uiDoorArugalGUID = pGo->GetGUID(); - if (m_auiEncounter[3] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ARUGAL_FOCUS: - m_uiArugalFocusGUID = pGo->GetGUID(); - break; - } - } +void instance_shadowfang_keep::DoSpeech() +{ + Creature* pAda = GetSingleCreatureFromStorage(NPC_ADA); + Creature* pAsh = GetSingleCreatureFromStorage(NPC_ASH); - void DoSpeech() + if (pAda && pAda->isAlive() && pAsh && pAsh->isAlive()) { - Creature* pAda = instance->GetCreature(m_uiAdaGUID); - Creature* pAsh = instance->GetCreature(m_uiAshGUID); - - if (pAda && pAda->isAlive() && pAsh && pAsh->isAlive()) - { - DoScriptText(SAY_BOSS_DIE_AD,pAda); - DoScriptText(SAY_BOSS_DIE_AS,pAsh); - } + DoScriptText(SAY_BOSS_DIE_AD,pAda); + DoScriptText(SAY_BOSS_DIE_AS,pAsh); } +} - void SetData(uint32 uiType, uint32 uiData) +void instance_shadowfang_keep::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_FREE_NPC: - if (uiData == DONE) - DoUseDoorOrButton(m_uiDoorCourtyardGUID); - m_auiEncounter[0] = uiData; - break; - case TYPE_RETHILGORE: - if (uiData == DONE) - DoSpeech(); - m_auiEncounter[1] = uiData; - break; - case TYPE_FENRUS: - if (uiData == DONE) - if (Creature* pFenrus = instance->GetCreature(m_uiFenrusGUID)) - pFenrus->SummonCreature(NPC_ARCHMAGE_ARUGAL,-136.89f,2169.17f,136.58f,2.794f,TEMPSUMMON_TIMED_DESPAWN,30000); - m_auiEncounter[2] = uiData; - break; - case TYPE_NANDOS: - if (uiData == DONE) - DoUseDoorOrButton(m_uiDoorArugalGUID); - m_auiEncounter[3] = uiData; - break; - case TYPE_INTRO: - m_auiEncounter[4] = uiData; - break; - case TYPE_VOIDWALKER: - if (uiData == DONE) - { - m_auiEncounter[5]++; - if (m_auiEncounter[5] > 3) - DoUseDoorOrButton(m_uiDoorSorcererGUID); - } - break; - } - - if (uiData == DONE) - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] - << " " << m_auiEncounter[4] << " " << m_auiEncounter[5]; - - strInstData = saveStream.str(); - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + case TYPE_FREE_NPC: + if (uiData == DONE) + DoUseDoorOrButton(GO_COURTYARD_DOOR); + m_auiEncounter[0] = uiData; + break; + case TYPE_RETHILGORE: + if (uiData == DONE) + DoSpeech(); + m_auiEncounter[1] = uiData; + break; + case TYPE_FENRUS: + if (uiData == DONE) + { + if (Creature* pFenrus = GetSingleCreatureFromStorage(NPC_FENRUS)) + pFenrus->SummonCreature(NPC_ARCHMAGE_ARUGAL, -136.89f, 2169.17f, 136.58f, 2.794f, TEMPSUMMON_TIMED_DESPAWN, 30000); + } + m_auiEncounter[2] = uiData; + break; + case TYPE_NANDOS: + if (uiData == DONE) + DoUseDoorOrButton(GO_ARUGAL_DOOR); + m_auiEncounter[3] = uiData; + break; + case TYPE_INTRO: + m_auiEncounter[4] = uiData; + break; + case TYPE_VOIDWALKER: + if (uiData == DONE) + { + m_auiEncounter[5]++; + if (m_auiEncounter[5] > 3) + DoUseDoorOrButton(GO_SORCERER_DOOR); + } + break; } - uint32 GetData(uint32 uiType) + if (uiData == DONE) { - switch(uiType) - { - case TYPE_FREE_NPC: - return m_auiEncounter[0]; - case TYPE_RETHILGORE: - return m_auiEncounter[1]; - case TYPE_FENRUS: - return m_auiEncounter[2]; - case TYPE_NANDOS: - return m_auiEncounter[3]; - case TYPE_INTRO: - return m_auiEncounter[4]; - } - return 0; - } + OUT_SAVE_INST_DATA; - uint64 GetData64(uint32 uiType) - { - switch(uiType) - { - case GO_ARUGAL_FOCUS: - return m_uiArugalFocusGUID; - } - return 0; + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] + << " " << m_auiEncounter[4] << " " << m_auiEncounter[5]; + + m_strInstData = saveStream.str(); + + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - const char* Save() +uint32 instance_shadowfang_keep::GetData(uint32 uiType) +{ + switch(uiType) { - return strInstData.c_str(); + case TYPE_FREE_NPC: return m_auiEncounter[0]; + case TYPE_RETHILGORE: return m_auiEncounter[1]; + case TYPE_FENRUS: return m_auiEncounter[2]; + case TYPE_NANDOS: return m_auiEncounter[3]; + case TYPE_INTRO: return m_auiEncounter[4]; + + default: + return 0; } +} - void Load(const char* chrIn) +void instance_shadowfang_keep::Load(const char* chrIn) +{ + if (!chrIn) { - if (!chrIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(chrIn); + OUT_LOAD_INST_DATA_FAIL; + return; + } - std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] - >> m_auiEncounter[4] >> m_auiEncounter[5]; + OUT_LOAD_INST_DATA(chrIn); - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] + >> m_auiEncounter[4] >> m_auiEncounter[5]; - OUT_LOAD_INST_DATA_COMPLETE; + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; } -}; + + OUT_LOAD_INST_DATA_COMPLETE; +} InstanceData* GetInstanceData_instance_shadowfang_keep(Map* pMap) { @@ -232,9 +193,10 @@ InstanceData* GetInstanceData_instance_shadowfang_keep(Map* pMap) void AddSC_instance_shadowfang_keep() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_shadowfang_keep"; - newscript->GetInstanceData = &GetInstanceData_instance_shadowfang_keep; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_shadowfang_keep"; + pNewScript->GetInstanceData = &GetInstanceData_instance_shadowfang_keep; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp b/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp index 63814b5..e069928 100644 --- a/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp +++ b/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp @@ -51,9 +51,9 @@ enum SPELL_UNLOCK = 6421, SPELL_FIRE = 6422, -}; -#define GOSSIP_ITEM_DOOR "Please unlock the courtyard door." + GOSSIP_ITEM_DOOR = -3033000 +}; struct MANGOS_DLL_DECL npc_shadowfang_prisonerAI : public npc_escortAI { @@ -120,8 +120,8 @@ struct MANGOS_DLL_DECL npc_shadowfang_prisonerAI : public npc_escortAI void Reset() {} - //let's prevent Adamant from charging into Ashcrombe's cell - //and beating the crap out of him and vice versa XD + // Let's prevent Adamant from charging into Ashcrombe's cell + // And beating the crap out of him and vice versa XD void AttackStart(Unit* pWho) { if (pWho) @@ -144,7 +144,7 @@ bool GossipHello_npc_shadowfang_prisoner(Player* pPlayer, Creature* pCreature) ScriptedInstance* pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); if (pInstance && pInstance->GetData(TYPE_FREE_NPC) != DONE && pInstance->GetData(TYPE_RETHILGORE) == DONE) - pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetObjectGuid()); return true; @@ -171,12 +171,11 @@ struct Waypoint float fX, fY, fZ; }; -//Cordinates for voidwalker spawns +// Cordinates for voidwalker spawns static const Waypoint VWWaypoints[]= { - //fX fY fZ - {-146.06f, 2172.84f, 127.953f}, //this is the initial location, in the middle of the room - {-159.547f, 2178.11f, 128.944f}, //when they come back up, they hit this point then walk back down + {-146.06f, 2172.84f, 127.953f}, // This is the initial location, in the middle of the room + {-159.547f, 2178.11f, 128.944f}, // When they come back up, they hit this point then walk back down {-171.113f, 2182.69f, 129.255f}, {-177.613f, 2175.59f, 128.161f}, {-185.396f, 2178.35f, 126.413f}, @@ -205,24 +204,23 @@ struct MANGOS_DLL_DECL mob_arugal_voidwalkerAI : public ScriptedAI { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); m_bIsLeader = false; - m_uiLeaderGUID = 0; m_uiCurrentPoint = 0; m_bReverse = false; } uint32 m_uiResetTimer, m_uiDarkOffering; - uint8 m_uiCurrentPoint, m_uiPosition; //0 - leader, 1 - behind-right, 2 - behind, 3 - behind-left - uint64 m_uiLeaderGUID; + uint8 m_uiCurrentPoint, m_uiPosition; // 0 - leader, 1 - behind-right, 2 - behind, 3 - behind-left + ObjectGuid m_leaderGuid; ScriptedInstance* m_pInstance; bool m_bIsLeader, m_bReverse, m_bWPDone; void Reset() { m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_uiDarkOffering = urand(4400,12500); + m_uiDarkOffering = urand(4400, 12500); m_bWPDone = true; - Creature* pLeader = m_creature->GetMap()->GetCreature(m_uiLeaderGUID); + Creature* pLeader = m_creature->GetMap()->GetCreature(m_leaderGuid); if (pLeader && pLeader->isAlive()) { m_creature->GetMotionMaster()->MoveFollow(pLeader, 1.0f, M_PI/2*m_uiPosition); @@ -251,7 +249,7 @@ struct MANGOS_DLL_DECL mob_arugal_voidwalkerAI : public ScriptedAI if (pNewLeader) { - m_uiLeaderGUID = pNewLeader->GetGUID(); + m_leaderGuid = pNewLeader->GetObjectGuid(); if (pNewLeader == m_creature) { m_bIsLeader = true; @@ -269,8 +267,6 @@ struct MANGOS_DLL_DECL mob_arugal_voidwalkerAI : public ScriptedAI } } - //this is the ACID script converted into C++ - //unfortunately, we can't have both AIs at the same time :( void UpdateAI(const uint32 uiDiff) { if (m_bIsLeader && m_bWPDone) @@ -285,7 +281,7 @@ struct MANGOS_DLL_DECL mob_arugal_voidwalkerAI : public ScriptedAI if (m_uiDarkOffering < uiDiff) { - m_uiDarkOffering = urand(4400,12500); + m_uiDarkOffering = urand(4400, 12500); if (Unit* pUnit = DoSelectLowestHpFriendly(10.0f, 290)) DoCastSpellIfCan(pUnit, SPELL_DARK_OFFERING); @@ -293,7 +289,7 @@ struct MANGOS_DLL_DECL mob_arugal_voidwalkerAI : public ScriptedAI else m_uiDarkOffering -= uiDiff; - //Check if we have a current target + // Check if we have a current target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; @@ -340,7 +336,12 @@ struct MANGOS_DLL_DECL mob_arugal_voidwalkerAI : public ScriptedAI if (!uiPosition) m_bIsLeader = true; else - pLeader ? m_uiLeaderGUID = pLeader->GetGUID() : m_uiLeaderGUID = 0; + { + if (pLeader) + m_leaderGuid = pLeader->GetObjectGuid(); + else + m_leaderGuid.Clear(); + } Reset(); } @@ -407,9 +408,9 @@ enum enum ArugalPosition { - POSITION_SPAWN_LEDGE = 1, - POSITION_UPPER_LEDGE, - POSITION_STAIRS + POSITION_SPAWN_LEDGE = 0, + POSITION_UPPER_LEDGE = 1, + POSITION_STAIRS = 2 }; struct SpawnPoint @@ -417,18 +418,18 @@ struct SpawnPoint float fX, fY, fZ, fO; }; -//Cordinates for voidwalker spawns +// Cordinates for voidwalker spawns static const SpawnPoint VWSpawns[]= { //fX fY fZ fO {-155.352f, 2172.780f, 128.448f, 4.679f}, {-147.059f, 2163.193f, 128.696f, 0.128f}, {-148.869f, 2180.859f, 128.448f, 1.814f}, - {-140.203f, 2175.263f, 128.448f, 0.373f}, + {-140.203f, 2175.263f, 128.448f, 0.373f} }; -//roughly the height of Fenrus' room, -//used to tell how he should behave +// Roughly the height of Fenrus' room, +// Used to tell how he should behave const float HEIGHT_FENRUS_ROOM = 140.0f; struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI @@ -500,7 +501,7 @@ struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI break; case 3: if (m_pInstance) - if (GameObject* pLightning = m_creature->GetMap()->GetGameObject(m_pInstance->GetData64(GO_ARUGAL_FOCUS))) + if (GameObject* pLightning = m_pInstance->GetSingleGameObjectFromStorage(GO_ARUGAL_FOCUS)) pLightning->Use(m_creature); m_uiSpeechTimer = 5000; @@ -510,12 +511,13 @@ struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI m_uiSpeechTimer = 500; break; case 5: - Creature *pVoidwalker, *pLeader; - pVoidwalker = pLeader = NULL; + { + Creature* pVoidwalker = NULL; + Creature* pLeader = NULL; - for(uint8 i = 0; i < 4; ++i) + for (uint8 i = 0; i < 4; ++i) { - pVoidwalker = m_creature->SummonCreature(NPC_VOIDWALKER,VWSpawns[i].fX, + pVoidwalker = m_creature->SummonCreature(NPC_VOIDWALKER, VWSpawns[i].fX, VWSpawns[i].fY, VWSpawns[i].fZ, VWSpawns[i].fO, TEMPSUMMON_DEAD_DESPAWN, 1); if (!pVoidwalker) @@ -531,6 +533,7 @@ struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI } m_uiSpeechStep = 0; return; + } default: m_uiSpeechStep = 0; return; @@ -543,7 +546,7 @@ struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI return; } - //Check if we have a current target + // Check if we have a current target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; @@ -607,10 +610,10 @@ struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI ArugalPosition posNewPosition; if (m_posPosition == POSITION_SPAWN_LEDGE) - posNewPosition = (ArugalPosition)urand(2, 3); + posNewPosition = (ArugalPosition)urand(1, 2); else { - posNewPosition = (ArugalPosition)urand(1, 2); + posNewPosition = (ArugalPosition)urand(0, 1); if (m_posPosition == posNewPosition) posNewPosition = POSITION_STAIRS; @@ -663,7 +666,7 @@ struct MANGOS_DLL_DECL boss_arugalAI : public ScriptedAI ScriptedAI::AttackStart(pWho); } - //make the code nice and pleasing to the eye + // Make the code nice and pleasing to the eye inline float GetManaPercent() { return (((float)m_creature->GetPower(POWER_MANA) / (float)m_creature->GetMaxPower(POWER_MANA)) * 100); @@ -760,7 +763,7 @@ struct MANGOS_DLL_DECL npc_arugalAI : public ScriptedAI m_uiSpeechTimer = 2000; break; case 3: - //make him die + // Make him die if (Creature* pVincent = GetClosestCreatureWithEntry(m_creature,NPC_VINCENT,20.0f)) pVincent->SetStandState(UNIT_STAND_STATE_DEAD); @@ -768,7 +771,7 @@ struct MANGOS_DLL_DECL npc_arugalAI : public ScriptedAI break; case 4: DoScriptText(SAY_INTRO_1, m_creature); - //m_creature->HandleEmote(EMOTE_ONESHOT_TALK); + // m_creature->HandleEmote(EMOTE_ONESHOT_TALK); m_uiSpeechTimer = 1750; break; case 5: @@ -784,7 +787,7 @@ struct MANGOS_DLL_DECL npc_arugalAI : public ScriptedAI m_uiSpeechTimer = 1750; break; case 8: - //m_creature->HandleEmote(EMOTE_ONESHOT_TALK); + // m_creature->HandleEmote(EMOTE_ONESHOT_TALK); DoScriptText(SAY_INTRO_3, m_creature); m_uiSpeechTimer = 1750; break; @@ -886,9 +889,7 @@ struct MANGOS_DLL_DECL npc_deathstalker_vincentAI : public ScriptedAI m_creature->DeleteThreatList(); m_creature->CombatStop(true); m_creature->LoadCreatureAddon(); - m_creature->SetLootRecipient(NULL); - Reset(); } }; @@ -900,32 +901,32 @@ CreatureAI* GetAI_npc_deathstalker_vincent(Creature* pCreature) void AddSC_shadowfang_keep() { - Script *newscript; - - newscript = new Script; - newscript->Name = "npc_shadowfang_prisoner"; - newscript->pGossipHello = &GossipHello_npc_shadowfang_prisoner; - newscript->pGossipSelect = &GossipSelect_npc_shadowfang_prisoner; - newscript->GetAI = &GetAI_npc_shadowfang_prisoner; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_arugal_voidwalker"; - newscript->GetAI = &GetAI_mob_arugal_voidwalker; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "npc_arugal"; - newscript->GetAI = &GetAI_npc_arugal; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "boss_arugal"; - newscript->GetAI = &GetAI_boss_arugal; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "npc_deathstalker_vincent"; - newscript->GetAI = &GetAI_npc_deathstalker_vincent; - newscript->RegisterSelf(); + Script *pNewScript; + + pNewScript = new Script; + pNewScript->Name = "npc_shadowfang_prisoner"; + pNewScript->pGossipHello = &GossipHello_npc_shadowfang_prisoner; + pNewScript->pGossipSelect = &GossipSelect_npc_shadowfang_prisoner; + pNewScript->GetAI = &GetAI_npc_shadowfang_prisoner; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_arugal_voidwalker"; + pNewScript->GetAI = &GetAI_mob_arugal_voidwalker; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "npc_arugal"; + pNewScript->GetAI = &GetAI_npc_arugal; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "boss_arugal"; + pNewScript->GetAI = &GetAI_boss_arugal; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "npc_deathstalker_vincent"; + pNewScript->GetAI = &GetAI_npc_deathstalker_vincent; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h b/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h index 0b63b05..5450e21 100644 --- a/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h +++ b/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h @@ -32,4 +32,26 @@ enum GO_ARUGAL_FOCUS = 18973, //this generates the lightning visual in the Fenrus event }; +class MANGOS_DLL_DECL instance_shadowfang_keep : public ScriptedInstance +{ + public: + instance_shadowfang_keep(Map* pMap); + + void Initialize(); + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + void DoSpeech(); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + const char* Save() { return m_strInstData.c_str(); } + void Load(const char* chrIn); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + std::string m_strInstData; +}; + #endif diff --git a/scripts/eastern_kingdoms/stranglethorn_vale.cpp b/scripts/eastern_kingdoms/stranglethorn_vale.cpp index de71947..5601351 100644 --- a/scripts/eastern_kingdoms/stranglethorn_vale.cpp +++ b/scripts/eastern_kingdoms/stranglethorn_vale.cpp @@ -173,13 +173,13 @@ bool GossipHello_npc_riggle_bassbait(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) // If the quest is still running. { - pPlayer->PrepareQuestMenu(pCreature->GetGUID()); - pPlayer->SEND_GOSSIP_MENU(7614, pCreature->GetGUID()); + pPlayer->PrepareQuestMenu(pCreature->GetObjectGuid()); + pPlayer->SEND_GOSSIP_MENU(7614, pCreature->GetObjectGuid()); return true; } // The Quest is not there anymore // There is a winner! - pPlayer->SEND_GOSSIP_MENU(7714, pCreature->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(7714, pCreature->GetObjectGuid()); return true; } diff --git a/scripts/eastern_kingdoms/stratholme/boss_order_of_silver_hand.cpp b/scripts/eastern_kingdoms/stratholme/boss_order_of_silver_hand.cpp index 2d10906..8061cff 100644 --- a/scripts/eastern_kingdoms/stratholme/boss_order_of_silver_hand.cpp +++ b/scripts/eastern_kingdoms/stratholme/boss_order_of_silver_hand.cpp @@ -142,7 +142,6 @@ CreatureAI* GetAI_boss_silver_hand_bossesAI(Creature* pCreature) return new boss_silver_hand_bossesAI(pCreature); } - void AddSC_boss_order_of_silver_hand() { Script *newscript; diff --git a/scripts/eastern_kingdoms/stratholme/instance_stratholme.cpp b/scripts/eastern_kingdoms/stratholme/instance_stratholme.cpp index 82b3872..3032b35 100644 --- a/scripts/eastern_kingdoms/stratholme/instance_stratholme.cpp +++ b/scripts/eastern_kingdoms/stratholme/instance_stratholme.cpp @@ -30,22 +30,7 @@ instance_stratholme::instance_stratholme(Map* pMap) : ScriptedInstance(pMap), m_uiMindlessSummonTimer(0), m_uiSlaugtherSquareTimer(0), m_uiYellCounter(0), - m_uiMindlessCount(0), - - m_uiServiceEntranceGUID(0), - m_uiGauntletGate1GUID(0), - m_uiPortGauntletGUID(0), - m_uiPortSlaugtherGUID(0), - m_uiPortElderGUID(0), - m_uiPortSlaughterGateGUID(0), - m_auiRamsteinDoorGUID(0), - m_auiRivendareDoorGUID(0), - m_uiYsidaCageGUID(0), - - m_uiBaronGUID(0), - m_uiYsidaTriggerGUID(0), - - m_uiAcolyteAnnouncerGUID(0) + m_uiMindlessCount(0) { Initialize(); } @@ -54,23 +39,16 @@ void instance_stratholme::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); memset(&m_bIsSilverHandDead, false, sizeof(m_bIsSilverHandDead)); - memset(&m_auiZigguratGUID, 0, sizeof(m_auiZigguratGUID)); - memset(&m_auiCrystalSortedGUID, 0, sizeof(m_auiCrystalSortedGUID)); - - m_luiCrystalGUIDs.clear(); - m_sAbomnationGUID.clear(); - m_luiAcolyteGUIDs.clear(); } bool instance_stratholme::StartSlaugtherSquare() { if (m_auiEncounter[TYPE_BARONESS] == SPECIAL && m_auiEncounter[TYPE_NERUB] == SPECIAL && m_auiEncounter[TYPE_PALLID] == SPECIAL) { - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) - DoScriptText(SAY_ANNOUNCE_RIVENDARE, pBaron); + DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RIVENDARE, NPC_BARON); - DoUseDoorOrButton(m_uiPortGauntletGUID); - DoUseDoorOrButton(m_uiPortSlaugtherGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); + DoUseDoorOrButton(GO_PORT_SLAUGTHER); debug_log("SD2: Instance Stratholme: Open slaugther square."); @@ -84,13 +62,22 @@ void instance_stratholme::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_BARON: m_uiBaronGUID = pCreature->GetGUID(); break; - case NPC_YSIDA_TRIGGER: m_uiYsidaTriggerGUID = pCreature->GetGUID(); break; - case NPC_CRYSTAL: m_luiCrystalGUIDs.push_back(pCreature->GetGUID()); break; + case NPC_BARON: + case NPC_YSIDA_TRIGGER: + case NPC_BARTHILAS: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + + case NPC_CRYSTAL: + m_luiCrystalGUIDs.push_back(pCreature->GetObjectGuid()); + break; case NPC_ABOM_BILE: - case NPC_ABOM_VENOM: m_sAbomnationGUID.insert(pCreature->GetGUID()); break; - case NPC_THUZADIN_ACOLYTE: m_luiAcolyteGUIDs.push_back(pCreature->GetGUID()); break; - case NPC_BARTHILAS: m_uiBarthilasGUID = pCreature->GetGUID(); break; + case NPC_ABOM_VENOM: + m_sAbomnationGUID.insert(pCreature->GetObjectGuid()); + break; + case NPC_THUZADIN_ACOLYTE: + m_luiAcolyteGUIDs.push_back(pCreature->GetObjectGuid()); + break; } } @@ -99,61 +86,57 @@ void instance_stratholme::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_SERVICE_ENTRANCE: - m_uiServiceEntranceGUID = pGo->GetGUID(); break; case GO_GAUNTLET_GATE1: // TODO //weird, but unless flag is set, client will not respond as expected. DB bug? pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - m_uiGauntletGate1GUID = pGo->GetGUID(); break; + case GO_ZIGGURAT_DOOR_1: - m_auiZigguratGUID[0] = pGo->GetGUID(); + m_zigguratStorage[0].m_doorGuid = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_BARONESS] == DONE || m_auiEncounter[TYPE_BARONESS] == SPECIAL) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_ZIGGURAT_DOOR_2: - m_auiZigguratGUID[1] = pGo->GetGUID(); + m_zigguratStorage[1].m_doorGuid = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_NERUB] == DONE || m_auiEncounter[TYPE_NERUB] == SPECIAL) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_ZIGGURAT_DOOR_3: - m_auiZigguratGUID[2] = pGo->GetGUID(); + m_zigguratStorage[2].m_doorGuid = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_PALLID] == DONE || m_auiEncounter[TYPE_PALLID] == SPECIAL) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; + case GO_ZIGGURAT_DOOR_4: - m_auiRamsteinDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_RAMSTEIN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_ZIGGURAT_DOOR_5: - m_auiRivendareDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_RAMSTEIN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PORT_GAUNTLET: - m_uiPortGauntletGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BARONESS] == SPECIAL && m_auiEncounter[TYPE_NERUB] == SPECIAL && m_auiEncounter[TYPE_PALLID] == SPECIAL) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PORT_SLAUGTHER: - m_uiPortSlaugtherGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BARONESS] == SPECIAL && m_auiEncounter[TYPE_NERUB] == SPECIAL && m_auiEncounter[TYPE_PALLID] == SPECIAL) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PORT_SLAUGHTER_GATE: - m_uiPortSlaughterGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_RAMSTEIN] == DONE) // Might actually be uneeded pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PORT_ELDERS: - m_uiPortElderGUID = pGo->GetGUID(); - break; case GO_YSIDA_CAGE: - m_uiYsidaCageGUID = pGo->GetGUID(); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_stratholme::SetData(uint32 uiType, uint32 uiData) @@ -168,8 +151,7 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) if (m_auiEncounter[uiType] == IN_PROGRESS || m_auiEncounter[uiType] == FAIL) break; - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) - DoScriptText(SAY_ANNOUNCE_RUN_START, pBaron); + DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_START, NPC_BARON); m_uiBaronRunTimer = 45*MINUTE*IN_MILLISECONDS; debug_log("SD2: Instance Stratholme: Baron run in progress."); @@ -190,7 +172,7 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) if (uiData == DONE) { DoSortZiggurats(); - DoUseDoorOrButton(m_auiZigguratGUID[uiType - TYPE_BARONESS]); + DoUseDoorOrButton(m_zigguratStorage[uiType - TYPE_BARONESS].m_doorGuid); } if (uiData == SPECIAL) StartSlaugtherSquare(); @@ -201,7 +183,7 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) if (m_auiEncounter[uiType] != SPECIAL && m_auiEncounter[uiType] != DONE) { m_uiSlaugtherSquareTimer = 20000; // TODO - unknown, also possible that this is not the very correct place.. - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); } uint32 uiCount = m_sAbomnationGUID.size(); @@ -223,14 +205,14 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) if (!uiCount) { - // Old Comment: a bit itchy, it should close m_auiRamsteinDoorGUID door after 10 secs, but it doesn't. skipping it for now. + // Old Comment: a bit itchy, it should close GO_ZIGGURAT_DOOR_4 door after 10 secs, but it doesn't. skipping it for now. // However looks like that this door is no more closed - DoUseDoorOrButton(m_auiRamsteinDoorGUID); + DoUseDoorOrButton(GO_ZIGGURAT_DOOR_4); // No more handlng of Abomnations m_uiSlaugtherSquareTimer = 0; - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) + if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON)) { DoScriptText(SAY_ANNOUNCE_RAMSTEIN, pBaron); if (Creature* pRamstein = pBaron->SummonCreature(NPC_RAMSTEIN, sStratholmeLocation[2].m_fX, sStratholmeLocation[2].m_fY, sStratholmeLocation[2].m_fZ, sStratholmeLocation[2].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0)) @@ -244,25 +226,25 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) } // After fail aggroing Ramstein means wipe on Ramstein, so close door again if (uiData == IN_PROGRESS && m_auiEncounter[uiType] == FAIL) - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); if (uiData == DONE) { // Open side gate and start summoning skeletons - DoUseDoorOrButton(m_uiPortSlaughterGateGUID); + DoUseDoorOrButton(GO_PORT_SLAUGHTER_GATE); // use this timer as a bool just to start summoning m_uiMindlessSummonTimer = 500; m_uiMindlessCount = 0; m_luiUndeadGUIDs.clear(); // Summon 5 guards - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) + if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON)) { for(uint8 i = 0; i < 5; ++i) { float fX, fY, fZ; pBaron->GetRandomPoint(sStratholmeLocation[6].m_fX, sStratholmeLocation[6].m_fY, sStratholmeLocation[6].m_fZ, 5.0f, fX, fY, fZ); if (Creature* pTemp = pBaron->SummonCreature(NPC_BLACK_GUARD, sStratholmeLocation[6].m_fX, sStratholmeLocation[6].m_fY, sStratholmeLocation[6].m_fZ, sStratholmeLocation[6].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0)) - m_luiGuardGUIDs.push_back(pTemp->GetGUID()); + m_luiGuardGUIDs.push_back(pTemp->GetObjectGuid()); } debug_log("SD2: Instance Stratholme - Slaugther event: Summoned 5 guards."); @@ -271,7 +253,7 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) // Open Door again and stop Abomnation if (uiData == FAIL && m_auiEncounter[uiType] != FAIL) { - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); m_uiSlaugtherSquareTimer = 0; // Let already moving Abomnations stop @@ -294,7 +276,7 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) // Close Slaughterhouse door if needed if (m_auiEncounter[5] == FAIL) // TODO - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); } if (uiData == DONE) { @@ -315,31 +297,29 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) } // Open cage and finish rescue event - if (Creature* pYsidaT = instance->GetCreature(m_uiYsidaTriggerGUID)) + if (Creature* pYsidaT = GetSingleCreatureFromStorage(NPC_YSIDA_TRIGGER)) { if (Creature* pYsida = pYsidaT->SummonCreature(NPC_YSIDA, pYsidaT->GetPositionX(), pYsidaT->GetPositionY(), pYsidaT->GetPositionZ(), pYsidaT->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1800000)) { DoScriptText(SAY_EPILOGUE, pYsida); pYsida->GetMotionMaster()->MovePoint(0, sStratholmeLocation[7].m_fX, sStratholmeLocation[7].m_fY, sStratholmeLocation[7].m_fZ); } - DoUseDoorOrButton(m_uiYsidaCageGUID); + DoUseDoorOrButton(GO_YSIDA_CAGE); } } // Open Slaughterhouse door again - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); } if (uiData == FAIL) - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); - // combat door - DoUseDoorOrButton(m_auiRivendareDoorGUID); m_auiEncounter[5] = uiData; // TODO break; case TYPE_BARTHILAS_RUN: if (uiData == IN_PROGRESS) { - Creature* pBarthilas = instance->GetCreature(m_uiBarthilasGUID); + Creature* pBarthilas = GetSingleCreatureFromStorage(NPC_BARTHILAS); if (pBarthilas && pBarthilas->isAlive() && !pBarthilas->isInCombat()) { DoScriptText(SAY_WARN_BARON, pBarthilas); @@ -358,15 +338,15 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) // Restart after failure, close Gauntlet if (uiData == IN_PROGRESS && m_auiEncounter[7] == FAIL) - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); // Wipe case - open gauntlet if (uiData == FAIL) - DoUseDoorOrButton(m_uiPortGauntletGUID); + DoUseDoorOrButton(GO_PORT_GAUNTLET); if (uiData == DONE) { - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) + if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON)) DoScriptText(SAY_UNDEAD_DEFEAT, pBaron); - DoUseDoorOrButton(m_auiRivendareDoorGUID); + DoUseDoorOrButton(GO_ZIGGURAT_DOOR_5); } m_auiEncounter[7] = uiData; // TODO @@ -398,7 +378,7 @@ void instance_stratholme::SetData(uint32 uiType, uint32 uiData) saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -463,19 +443,6 @@ uint32 instance_stratholme::GetData(uint32 uiType) } } -uint64 instance_stratholme::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_BARON: - return m_uiBaronGUID; - case NPC_YSIDA_TRIGGER: - return m_uiYsidaTriggerGUID; - default: - return 0; - } -} - static bool sortByHeight(Creature* pFirst, Creature* pSecond) { return pFirst && pSecond && pFirst->GetPositionZ() > pSecond->GetPositionZ(); @@ -497,11 +464,11 @@ void instance_stratholme::DoSortZiggurats() if (lAcolytes.empty()) return; - if (!m_uiAcolyteAnnouncerGUID) + if (!GetSingleCreatureFromStorage(NPC_THUZADIN_ACOLYTE, true)) { // Sort the acolytes by height, and the one with the biggest height is the announcer (a bit outside the map) lAcolytes.sort(sortByHeight); - m_uiAcolyteAnnouncerGUID = (*lAcolytes.begin())->GetGUID(); + m_mNpcEntryGuidStore[NPC_THUZADIN_ACOLYTE] = (*lAcolytes.begin())->GetObjectGuid(); lAcolytes.erase(lAcolytes.begin()); } @@ -511,11 +478,11 @@ void instance_stratholme::DoSortZiggurats() bool bAlreadyIterated = false; for (uint8 i = 0; i < MAX_ZIGGURATS; ++i) { - if (GameObject* pZigguratDoor = instance->GetGameObject(m_auiZigguratGUID[i])) + if (GameObject* pZigguratDoor = instance->GetGameObject(m_zigguratStorage[i].m_doorGuid)) { - if ((*itr)->isAlive() && (*itr)->IsWithinDistInMap(pZigguratDoor, 30.0f, false)) + if ((*itr)->isAlive() && (*itr)->IsWithinDistInMap(pZigguratDoor, 35.0f, false)) { - m_alZigguratAcolyteGUID[i].push_back((*itr)->GetGUID()); + m_zigguratStorage[i].m_lZigguratAcolyteGuid.push_back((*itr)->GetObjectGuid()); itr = lAcolytes.erase(itr); bAlreadyIterated = true; break; @@ -529,7 +496,7 @@ void instance_stratholme::DoSortZiggurats() // In case some mobs have not been able to be sorted, store their GUIDs again for (std::list::const_iterator itr = lAcolytes.begin(); itr != lAcolytes.end(); ++itr) - m_luiAcolyteGUIDs.push_back((*itr)->GetGUID()); + m_luiAcolyteGUIDs.push_back((*itr)->GetObjectGuid()); // Sort Crystal for (GUIDList::iterator itr = m_luiCrystalGUIDs.begin(); itr != m_luiCrystalGUIDs.end(); ) @@ -544,11 +511,11 @@ void instance_stratholme::DoSortZiggurats() bool bAlreadyIterated = false; for (uint8 i = 0; i < MAX_ZIGGURATS; ++i) { - if (GameObject* pZigguratDoor = instance->GetGameObject(m_auiZigguratGUID[i])) + if (GameObject* pZigguratDoor = instance->GetGameObject(m_zigguratStorage[i].m_doorGuid)) { if (pCrystal->IsWithinDistInMap(pZigguratDoor, 50.0f, false)) { - m_auiCrystalSortedGUID[i] = *itr; + m_zigguratStorage[i].m_crystalGuid = pCrystal->GetObjectGuid(); itr = m_luiCrystalGUIDs.erase(itr); bAlreadyIterated = true; break; @@ -619,31 +586,7 @@ void instance_stratholme::OnCreatureDeath(Creature* pCreature) case NPC_BARON: SetData(TYPE_BARON, DONE); break; case NPC_THUZADIN_ACOLYTE: - for (uint8 i = 0; i < MAX_ZIGGURATS; ++i) - { - if (m_alZigguratAcolyteGUID[i].empty()) - continue; // nothing to do anymore for this ziggurat - - m_alZigguratAcolyteGUID[i].remove(pCreature->GetGUID()); - if (m_alZigguratAcolyteGUID[i].empty()) - { - // A random zone yell after one is cleared - int32 aAnnounceSay[MAX_ZIGGURATS] = {SAY_ANNOUNCE_ZIGGURAT_1, SAY_ANNOUNCE_ZIGGURAT_2, SAY_ANNOUNCE_ZIGGURAT_3}; - if (Creature* pAnnouncer = instance->GetCreature(m_uiAcolyteAnnouncerGUID)) - DoScriptText(aAnnounceSay[i], pAnnouncer); - - // Kill Crystal - if (Creature* pCrystal = instance->GetCreature(m_auiCrystalSortedGUID[i])) - pCrystal->DealDamage(pCrystal, pCrystal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - - switch (i) - { - case 0: SetData(TYPE_BARONESS, SPECIAL); break; - case 1: SetData(TYPE_NERUB, SPECIAL); break; - case 2: SetData(TYPE_PALLID, SPECIAL); break; - } - } - } + ThazudinAcolyteJustDied(pCreature); break; case NPC_ABOM_BILE: @@ -653,7 +596,7 @@ void instance_stratholme::OnCreatureDeath(Creature* pCreature) break; case NPC_MINDLESS_UNDEAD: - m_luiUndeadGUIDs.remove(pCreature->GetGUID()); + m_luiUndeadGUIDs.remove(pCreature->GetObjectGuid()); if (m_luiUndeadGUIDs.empty()) { // Let the black Guards move out of the citadel @@ -670,7 +613,7 @@ void instance_stratholme::OnCreatureDeath(Creature* pCreature) } break; case NPC_BLACK_GUARD: - m_luiGuardGUIDs.remove(pCreature->GetGUID()); + m_luiGuardGUIDs.remove(pCreature->GetObjectGuid()); if (m_luiGuardGUIDs.empty()) SetData(TYPE_BLACK_GUARDS, DONE); @@ -678,13 +621,41 @@ void instance_stratholme::OnCreatureDeath(Creature* pCreature) } } +void instance_stratholme::ThazudinAcolyteJustDied(Creature* pCreature) +{ + for (uint8 i = 0; i < MAX_ZIGGURATS; ++i) + { + if (m_zigguratStorage[i].m_lZigguratAcolyteGuid.empty()) + continue; // nothing to do anymore for this ziggurat + + m_zigguratStorage[i].m_lZigguratAcolyteGuid.remove(pCreature->GetObjectGuid()); + if (m_zigguratStorage[i].m_lZigguratAcolyteGuid.empty()) + { + // A random zone yell after one is cleared + int32 aAnnounceSay[MAX_ZIGGURATS] = {SAY_ANNOUNCE_ZIGGURAT_1, SAY_ANNOUNCE_ZIGGURAT_2, SAY_ANNOUNCE_ZIGGURAT_3}; + DoOrSimulateScriptTextForThisInstance(aAnnounceSay[i], NPC_THUZADIN_ACOLYTE); + + // Kill Crystal + if (Creature* pCrystal = instance->GetCreature(m_zigguratStorage[i].m_crystalGuid)) + pCrystal->DealDamage(pCrystal, pCrystal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + + switch (i) + { + case 0: SetData(TYPE_BARONESS, SPECIAL); break; + case 1: SetData(TYPE_NERUB, SPECIAL); break; + case 2: SetData(TYPE_PALLID, SPECIAL); break; + } + } + } +} + void instance_stratholme::Update(uint32 uiDiff) { if (m_uiBarthilasRunTimer) { if (m_uiBarthilasRunTimer <= uiDiff) { - Creature* pBarthilas = instance->GetCreature(m_uiBarthilasGUID); + Creature* pBarthilas = GetSingleCreatureFromStorage(NPC_BARTHILAS); if (pBarthilas && pBarthilas->isAlive() && !pBarthilas->isInCombat()) pBarthilas->NearTeleportTo(sStratholmeLocation[1].m_fX, sStratholmeLocation[1].m_fY, sStratholmeLocation[1].m_fZ, sStratholmeLocation[1].m_fO); @@ -699,14 +670,12 @@ void instance_stratholme::Update(uint32 uiDiff) { if (m_uiYellCounter == 0 && m_uiBaronRunTimer <= 10*MINUTE*IN_MILLISECONDS) { - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) - DoScriptText(SAY_ANNOUNCE_RUN_10_MIN, pBaron); + DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_10_MIN, NPC_BARON); ++m_uiYellCounter; } else if (m_uiYellCounter == 1 && m_uiBaronRunTimer <= 5*MINUTE*IN_MILLISECONDS) { - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) - DoScriptText(SAY_ANNOUNCE_RUN_5_MIN, pBaron); + DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_5_MIN, NPC_BARON); ++m_uiYellCounter; } @@ -714,8 +683,7 @@ void instance_stratholme::Update(uint32 uiDiff) { SetData(TYPE_BARON_RUN, FAIL); - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) - DoScriptText(SAY_ANNOUNCE_RUN_FAIL, pBaron); + DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_FAIL, NPC_BARON); m_uiBaronRunTimer = 0; debug_log("SD2: Instance Stratholme: Baron run event reached end. Event has state %u.", GetData(TYPE_BARON_RUN)); @@ -730,7 +698,7 @@ void instance_stratholme::Update(uint32 uiDiff) { if (m_uiMindlessSummonTimer <= uiDiff) { - if (Creature* pBaron = instance->GetCreature(m_uiBaronGUID)) + if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON)) { // Summon mindless skeletons and move them to random point in the center of the square if (Creature* pTemp = pBaron->SummonCreature(NPC_MINDLESS_UNDEAD, sStratholmeLocation[4].m_fX, sStratholmeLocation[4].m_fY, sStratholmeLocation[4].m_fZ, sStratholmeLocation[4].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0)) @@ -738,7 +706,7 @@ void instance_stratholme::Update(uint32 uiDiff) float fX, fY, fZ; pBaron->GetRandomPoint(sStratholmeLocation[5].m_fX, sStratholmeLocation[5].m_fY, sStratholmeLocation[5].m_fZ, 20.0f, fX, fY, fZ); pTemp->GetMotionMaster()->MovePoint(0, fX, fY, fZ); - m_luiUndeadGUIDs.push_back(pTemp->GetGUID()); + m_luiUndeadGUIDs.push_back(pTemp->GetObjectGuid()); ++m_uiMindlessCount; } } @@ -766,7 +734,7 @@ void instance_stratholme::Update(uint32 uiDiff) // Let Move to somewhere in the middle if (!pAbom->isInCombat()) { - if (GameObject* pDoor = instance->GetGameObject(m_uiPortSlaugtherGUID)) + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_PORT_SLAUGTHER)) { float fX, fY, fZ; pAbom->GetRandomPoint(pDoor->GetPositionX(), pDoor->GetPositionY(), pDoor->GetPositionZ(), 10.0f, fX, fY, fZ); diff --git a/scripts/eastern_kingdoms/stratholme/stratholme.cpp b/scripts/eastern_kingdoms/stratholme/stratholme.cpp index 4e8f8db..234e0f5 100644 --- a/scripts/eastern_kingdoms/stratholme/stratholme.cpp +++ b/scripts/eastern_kingdoms/stratholme/stratholme.cpp @@ -135,17 +135,18 @@ enum NPC_FREED_SOUL = 11136, }; +// TODO - likely entirely not needed workaround struct MANGOS_DLL_DECL mob_restless_soulAI : public ScriptedAI { mob_restless_soulAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - uint64 m_uiTaggerGUID; + ObjectGuid m_taggerGuid; uint32 m_uiDieTimer; bool m_bIsTagged; void Reset() { - m_uiTaggerGUID = 0; + m_taggerGuid.Clear(); m_uiDieTimer = 5000; m_bIsTagged = false; } @@ -157,7 +158,7 @@ struct MANGOS_DLL_DECL mob_restless_soulAI : public ScriptedAI if (!m_bIsTagged && pSpell->Id == SPELL_EGAN_BLASTER && ((Player*)pCaster)->GetQuestStatus(QUEST_RESTLESS_SOUL) == QUEST_STATUS_INCOMPLETE) { m_bIsTagged = true; - m_uiTaggerGUID = pCaster->GetGUID(); + m_taggerGuid = pCaster->GetObjectGuid(); } } } @@ -179,7 +180,7 @@ struct MANGOS_DLL_DECL mob_restless_soulAI : public ScriptedAI { if (m_uiDieTimer < uiDiff) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiTaggerGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_taggerGuid)) pPlayer->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } else diff --git a/scripts/eastern_kingdoms/stratholme/stratholme.h b/scripts/eastern_kingdoms/stratholme/stratholme.h index e32bd87..455efeb 100644 --- a/scripts/eastern_kingdoms/stratholme/stratholme.h +++ b/scripts/eastern_kingdoms/stratholme/stratholme.h @@ -91,7 +91,14 @@ static sEventLocation sStratholmeLocation[] = {4042.575f, -3337.929f, 115.059f} // ysida move loc }; -struct MANGOS_DLL_DECL instance_stratholme : public ScriptedInstance +struct ZigguratStore +{ + ObjectGuid m_doorGuid; + ObjectGuid m_crystalGuid; + GUIDList m_lZigguratAcolyteGuid; +}; + +class MANGOS_DLL_DECL instance_stratholme : public ScriptedInstance { public: instance_stratholme(Map* pMap); @@ -104,9 +111,8 @@ struct MANGOS_DLL_DECL instance_stratholme : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); void OnCreatureEnterCombat(Creature* pCreature); @@ -115,13 +121,14 @@ struct MANGOS_DLL_DECL instance_stratholme : public ScriptedInstance void Update(uint32 uiDiff); + protected: bool StartSlaugtherSquare(); void DoSortZiggurats(); + void ThazudinAcolyteJustDied( Creature* pCreature ); - protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; bool m_bIsSilverHandDead[MAX_SILVERHAND]; - std::string strInstData; + std::string m_strInstData; uint32 m_uiBaronRunTimer; uint32 m_uiBarthilasRunTimer; @@ -131,27 +138,11 @@ struct MANGOS_DLL_DECL instance_stratholme : public ScriptedInstance uint32 m_uiYellCounter; uint32 m_uiMindlessCount; - uint64 m_uiServiceEntranceGUID; - uint64 m_uiGauntletGate1GUID; - uint64 m_auiZigguratGUID[MAX_ZIGGURATS]; - uint64 m_auiRamsteinDoorGUID; - uint64 m_auiRivendareDoorGUID; - uint64 m_uiPortGauntletGUID; - uint64 m_uiPortSlaugtherGUID; - uint64 m_uiPortElderGUID; - uint64 m_uiPortSlaughterGateGUID; - uint64 m_uiYsidaCageGUID; - - uint64 m_uiBaronGUID; - uint64 m_uiYsidaTriggerGUID; - uint64 m_uiBarthilasGUID; - uint64 m_uiAcolyteAnnouncerGUID; - uint64 m_auiCrystalSortedGUID[MAX_ZIGGURATS]; + ZigguratStore m_zigguratStorage[MAX_ZIGGURATS]; GUIDList m_luiCrystalGUIDs; GUIDSet m_sAbomnationGUID; GUIDList m_luiAcolyteGUIDs; - GUIDList m_alZigguratAcolyteGUID[MAX_ZIGGURATS]; GUIDList m_luiUndeadGUIDs; GUIDList m_luiGuardGUIDs; }; diff --git a/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp b/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp index 3647dc9..7f6ac74 100644 --- a/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp +++ b/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp @@ -16,8 +16,8 @@ /* ScriptData SDName: instance_sunken_temple -SD%Complete: 50 -SDComment: Hakkar Summon Event missing +SD%Complete: 90 +SDComment: Hakkar Summon Event needs more sources to improve SDCategory: Sunken Temple EndScriptData */ @@ -25,12 +25,13 @@ EndScriptData */ #include "sunken_temple.h" instance_sunken_temple::instance_sunken_temple(Map* pMap) : ScriptedInstance(pMap), - m_uiAtalarionGUID(0), - m_uiJammalanGUID(0), - m_uiJammalanBarrierGUID(0), - m_uiIdolOfHakkarGUID(0), m_uiStatueCounter(0), - m_uiProtectorsRemaining(0) + m_uiAvatarSummonTimer(0), + m_uiSupressorTimer(0), + m_uiFlameCounter(0), + m_uiProtectorsRemaining(0), + m_bCanSummonBloodkeeper(false), + m_bIsFirstHakkarWave(false) { Initialize(); } @@ -45,17 +46,31 @@ void instance_sunken_temple::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_JAMMALAN_BARRIER: - m_uiJammalanBarrierGUID = pGo->GetGUID(); if (m_auiEncounter[1] == DONE) - DoUseDoorOrButton(m_uiJammalanBarrierGUID); + pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_IDOL_OF_HAKKAR: - m_uiIdolOfHakkarGUID = pGo->GetGUID(); + case GO_HAKKAR_DOOR_1: + case GO_HAKKAR_DOOR_2: break; + case GO_ATALAI_LIGHT_BIG: - m_luiBigLightGUIDs.push_back(pGo->GetGUID()); - break; + m_luiBigLightGUIDs.push_back(pGo->GetObjectGuid()); + return; + case GO_EVIL_CIRCLE: + m_vuiCircleGUIDs.push_back(pGo->GetObjectGuid()); + return; + case GO_ETERNAL_FLAME_1: + case GO_ETERNAL_FLAME_2: + case GO_ETERNAL_FLAME_3: + case GO_ETERNAL_FLAME_4: + m_luiFlameGUIDs.push_back(pGo->GetObjectGuid()); + return; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_sunken_temple::OnCreatureCreate(Creature* pCreature) @@ -71,10 +86,22 @@ void instance_sunken_temple::OnCreatureCreate(Creature* pCreature) ++m_uiProtectorsRemaining; break; case NPC_JAMMALAN: - m_uiJammalanGUID = pCreature->GetGUID(); - break; case NPC_ATALARION: - m_uiAtalarionGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + } +} + +void instance_sunken_temple::OnCreatureEvade(Creature* pCreature) +{ + switch (pCreature->GetEntry()) + { + // Hakkar Event Mobs: On Wipe set as failed! + case NPC_BLOODKEEPER: + case NPC_HAKKARI_MINION: + case NPC_SUPPRESSOR: + case NPC_AVATAR_OF_HAKKAR: + SetData(TYPE_AVATAR, FAIL); break; } } @@ -83,8 +110,14 @@ void instance_sunken_temple::OnCreatureDeath(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_ATALARION: SetData(TYPE_ATALARION, DONE); break; - case NPC_JAMMALAN: SetData(TYPE_JAMMALAN, DONE); break; + case NPC_ATALARION: SetData(TYPE_ATALARION, DONE); break; + case NPC_JAMMALAN: SetData(TYPE_JAMMALAN, DONE); break; + case NPC_AVATAR_OF_HAKKAR: SetData(TYPE_AVATAR, DONE); break; + + case NPC_SUPPRESSOR: + m_bCanSummonBloodkeeper = true; + break; + // Jammalain mini-bosses case NPC_ZOLO: case NPC_GASHER: @@ -113,10 +146,9 @@ void instance_sunken_temple::SetData(uint32 uiType, uint32 uiData) if (!m_uiProtectorsRemaining) { m_auiEncounter[1] = uiData; - DoUseDoorOrButton(m_uiJammalanBarrierGUID); + DoUseDoorOrButton(GO_JAMMALAN_BARRIER); // Intro yell - if (Creature* pJammalan = instance->GetCreature(m_uiJammalanGUID)) - DoScriptText(SAY_JAMMALAN_INTRO, pJammalan); + DoOrSimulateScriptTextForThisInstance(SAY_JAMMALAN_INTRO, NPC_JAMMALAN); } } break; @@ -125,6 +157,87 @@ void instance_sunken_temple::SetData(uint32 uiType, uint32 uiData) break; case TYPE_MALFURION: m_auiEncounter[3] = uiData; + break; + case TYPE_AVATAR: + if (uiData == SPECIAL) + { + ++m_uiFlameCounter; + + Creature* pShade = GetSingleCreatureFromStorage(NPC_SHADE_OF_HAKKAR); + if (!pShade) + return; + + switch (m_uiFlameCounter) + { + // Yells on each flame + // TODO It might be possible that these yells should be ordered randomly, however this is the seen state + case 1: DoScriptText(SAY_AVATAR_BRAZIER_1, pShade); break; + case 2: DoScriptText(SAY_AVATAR_BRAZIER_2, pShade); break; + case 3: DoScriptText(SAY_AVATAR_BRAZIER_3, pShade); break; + // Summon the avatar of all flames are used + case MAX_FLAMES: + DoScriptText(SAY_AVATAR_BRAZIER_4, pShade); + pShade->CastSpell(pShade, SPELL_SUMMON_AVATAR, true); + m_uiAvatarSummonTimer = 0; + m_uiSupressorTimer = 0; + break; + } + + // Summon the suppressors only after the flames are doused + // Summon timer is confusing random; timers were: 13, 39 and 52 secs; + if (m_uiFlameCounter != MAX_FLAMES) + m_uiSupressorTimer = urand(15000, 45000); + + return; + } + + // Prevent double processing + if (m_auiEncounter[4] == uiData) + return; + + if (uiData == IN_PROGRESS) + { + m_uiSupressorTimer = 0; + DoUpdateFlamesFlags(false); + + // Summon timer; use a small delay + m_uiAvatarSummonTimer = 3000; + m_bIsFirstHakkarWave = true; + + // Summon the shade + Player* pPlayer = GetPlayerInMap(); + if (!pPlayer) + return; + + if (Creature* pShade = pPlayer->SummonCreature(NPC_SHADE_OF_HAKKAR, aSunkenTempleLocation[1].m_fX, aSunkenTempleLocation[1].m_fY, aSunkenTempleLocation[1].m_fZ, aSunkenTempleLocation[1].m_fO, TEMPSUMMON_MANUAL_DESPAWN, 0)) + { + m_mNpcEntryGuidStore[NPC_SHADE_OF_HAKKAR] = pShade->GetObjectGuid(); + pShade->SetRespawnDelay(DAY); + } + + // Respawn circles + for (GUIDVector::const_iterator itr = m_vuiCircleGUIDs.begin(); itr != m_vuiCircleGUIDs.end(); ++itr) + DoRespawnGameObject(*itr, 30*MINUTE); + } + else if (uiData == FAIL) + { + // In case of wipe during the summoning ritual the shade is despawned + // The trash mobs stay in place, they are not despawned; the avatar is not sure if it's despawned or not but most likely he'll stay in place + + // Despawn the shade and the avatar if needed -- TODO, avatar really? + if (Creature* pShade = GetSingleCreatureFromStorage(NPC_SHADE_OF_HAKKAR)) + pShade->ForcedDespawn(); + + // Reset flames + DoUpdateFlamesFlags(true); + } + + // Use combat doors + DoUseDoorOrButton(GO_HAKKAR_DOOR_1); + DoUseDoorOrButton(GO_HAKKAR_DOOR_2); + + m_auiEncounter[4] = uiData; + break; } @@ -134,8 +247,10 @@ void instance_sunken_temple::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - strInstData = saveStream.str(); + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " + << m_auiEncounter[3] << " " << m_auiEncounter[4]; + + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -144,8 +259,8 @@ void instance_sunken_temple::SetData(uint32 uiType, uint32 uiData) void instance_sunken_temple::DoSpawnAtalarionIfCan() { - // return if already summoned - if (m_uiAtalarionGUID) + // Return if already summoned + if (GetSingleCreatureFromStorage(NPC_ATALARION)) return; Player* pPlayer = GetPlayerInMap(); @@ -155,11 +270,11 @@ void instance_sunken_temple::DoSpawnAtalarionIfCan() pPlayer->SummonCreature(NPC_ATALARION, aSunkenTempleLocation[0].m_fX, aSunkenTempleLocation[0].m_fY, aSunkenTempleLocation[0].m_fZ, aSunkenTempleLocation[0].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0); // Spawn the idol of Hakkar - DoRespawnGameObject(m_uiIdolOfHakkarGUID, 30 * MINUTE); + DoRespawnGameObject(GO_IDOL_OF_HAKKAR, 30 * MINUTE); // Spawn the big green lights for (GUIDList::const_iterator itr = m_luiBigLightGUIDs.begin(); itr != m_luiBigLightGUIDs.end(); ++itr) - DoRespawnGameObject(*itr, 30*MINUTE*IN_MILLISECONDS); + DoRespawnGameObject(*itr, 30*MINUTE); } bool instance_sunken_temple::ProcessStatueEvent(uint32 uiEventId) @@ -189,6 +304,21 @@ bool instance_sunken_temple::ProcessStatueEvent(uint32 uiEventId) return true; } +void instance_sunken_temple::DoUpdateFlamesFlags(bool bRestore) +{ + for (GUIDList::const_iterator itr = m_luiFlameGUIDs.begin(); itr != m_luiFlameGUIDs.end(); ++itr) + { + if (GameObject* pFlame = instance->GetGameObject(*itr)) + { + // Remove the flags of the flames for Hakkar event + if (!bRestore) + pFlame->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + else + pFlame->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + } + } +} + void instance_sunken_temple::Load(const char* chrIn) { if (!chrIn) @@ -200,7 +330,7 @@ void instance_sunken_temple::Load(const char* chrIn) OUT_LOAD_INST_DATA(chrIn); std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> m_auiEncounter[4]; for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) { @@ -216,16 +346,101 @@ uint32 instance_sunken_temple::GetData(uint32 uiType) { switch(uiType) { - case TYPE_ATALARION: - return m_auiEncounter[0]; - case TYPE_PROTECTORS: - return m_auiEncounter[1]; - case TYPE_JAMMALAN: - return m_auiEncounter[2]; - case TYPE_MALFURION: - return m_auiEncounter[3]; + case TYPE_ATALARION: return m_auiEncounter[0]; + case TYPE_PROTECTORS: return m_auiEncounter[1]; + case TYPE_JAMMALAN: return m_auiEncounter[2]; + case TYPE_MALFURION: return m_auiEncounter[3]; + case TYPE_AVATAR: return m_auiEncounter[4]; + + default: + return 0; + } +} + +void instance_sunken_temple::Update(uint32 uiDiff) +{ + if (m_auiEncounter[4] != IN_PROGRESS) + return; + + // Summon random mobs around the circles + if (m_uiAvatarSummonTimer) + { + if (m_uiAvatarSummonTimer <= uiDiff) + { + Creature* pShade = GetSingleCreatureFromStorage(NPC_SHADE_OF_HAKKAR); + if (!pShade) + return; + + // If no summon circles are spawned then return + if (m_vuiCircleGUIDs.empty()) + return; + + if (m_bIsFirstHakkarWave) // First wave summoned + { + // Summon at all circles + for (GUIDVector::const_iterator itr = m_vuiCircleGUIDs.begin(); itr != m_vuiCircleGUIDs.end(); ++itr) + { + if (GameObject* pCircle = instance->GetGameObject(*itr)) + pShade->SummonCreature(NPC_HAKKARI_MINION, pCircle->GetPositionX(), pCircle->GetPositionY(), pCircle->GetPositionZ(), 0, TEMPSUMMON_DEAD_DESPAWN, 0); + } + + // Summon Bloodkeeper at random circle + if (GameObject* pCircle = instance->GetGameObject(m_vuiCircleGUIDs[urand(0, m_vuiCircleGUIDs.size() - 1)])) + pShade->SummonCreature(NPC_BLOODKEEPER, pCircle->GetPositionX(), pCircle->GetPositionY(), pCircle->GetPositionZ(), 0, TEMPSUMMON_DEAD_DESPAWN, 0); + + m_bCanSummonBloodkeeper = false; + m_bIsFirstHakkarWave = false; + m_uiAvatarSummonTimer = 50000; + } + else // Later wave + { + uint32 uiRoll = urand(0, 99); + uint8 uiMaxSummons = uiRoll < 75 ? 1 : uiRoll < 95 ? 2 : 3; + + if (m_bCanSummonBloodkeeper && roll_chance_i(30)) + { + // Summon a Bloodkeeper + if (GameObject* pCircle = instance->GetGameObject(m_vuiCircleGUIDs[urand(0, m_vuiCircleGUIDs.size() - 1)])) + pShade->SummonCreature(NPC_BLOODKEEPER, pCircle->GetPositionX(), pCircle->GetPositionY(), pCircle->GetPositionZ(), 0, TEMPSUMMON_DEAD_DESPAWN, 0); + + m_bCanSummonBloodkeeper = false; + --uiMaxSummons; + } + + for (uint8 i = 0; i < uiMaxSummons; ++i) + { + if (GameObject* pCircle = instance->GetGameObject(m_vuiCircleGUIDs[urand(0, m_vuiCircleGUIDs.size() - 1)])) + pShade->SummonCreature(NPC_HAKKARI_MINION, pCircle->GetPositionX(), pCircle->GetPositionY(), pCircle->GetPositionZ(), 0, TEMPSUMMON_DEAD_DESPAWN, 0); + } + m_uiAvatarSummonTimer = urand(3000, 15000); + } + } + else + m_uiAvatarSummonTimer -= uiDiff; + } + + // Summon nightmare suppressor after flame used + if (m_uiSupressorTimer) + { + if (m_uiSupressorTimer <= uiDiff) + { + Creature* pShade = GetSingleCreatureFromStorage(NPC_SHADE_OF_HAKKAR); + if (!pShade) + { + // Something went very wrong! + return; + } + + // Summon npc at random door; movement and script handled in DB + uint8 uiSummonLoc = urand(0, 1); + pShade->SummonCreature(NPC_SUPPRESSOR, aHakkariDoorLocations[uiSummonLoc].m_fX, aHakkariDoorLocations[uiSummonLoc].m_fY, aHakkariDoorLocations[uiSummonLoc].m_fZ, 0, TEMPSUMMON_DEAD_DESPAWN, 0); + + // This timer is finished now + m_uiSupressorTimer = 0; + } + else + m_uiSupressorTimer -= uiDiff; } - return 0; } InstanceData* GetInstanceData_instance_sunken_temple(Map* pMap) diff --git a/scripts/eastern_kingdoms/sunken_temple/sunken_temple.cpp b/scripts/eastern_kingdoms/sunken_temple/sunken_temple.cpp index ab8afee..21e3847 100644 --- a/scripts/eastern_kingdoms/sunken_temple/sunken_temple.cpp +++ b/scripts/eastern_kingdoms/sunken_temple/sunken_temple.cpp @@ -25,6 +25,9 @@ EndScriptData */ at_shade_of_eranikus npc_malfurion_stormrage event_antalarion_statue_activation +event_avatar_of_hakkar +go_eternal_flame +effectDummy_summon_hakkar EndContentData */ #include "precompiled.h" @@ -155,7 +158,7 @@ bool ProcessEventId_event_antalarion_statue_activation(uint32 uiEventId, Object* { // Activate the green light if the correct statue is activated if (GameObject* pLight = GetClosestGameObjectWithEntry((GameObject*)pTarget, GO_ATALAI_LIGHT, INTERACTION_DISTANCE)) - pInstance->DoRespawnGameObject(pLight->GetGUID(), 30 * MINUTE); + pInstance->DoRespawnGameObject(pLight->GetObjectGuid(), 30 * MINUTE); } else { @@ -175,6 +178,70 @@ bool ProcessEventId_event_antalarion_statue_activation(uint32 uiEventId, Object* return false; } +/*###### +## event_avatar_of_hakkar +######*/ +bool ProcessEventId_event_avatar_of_hakkar(uint32 uiEventId, Object* pSource, Object* pTarget, bool bIsStart) +{ + if (pSource->GetTypeId() == TYPEID_PLAYER) + { + if (instance_sunken_temple* pInstance = (instance_sunken_temple*)((Player*)pSource)->GetInstanceData()) + { + // return if not NOT_STARTED + if (pInstance->GetData(TYPE_AVATAR) != NOT_STARTED) + return true; + + pInstance->SetData(TYPE_AVATAR, IN_PROGRESS); + + return true; + } + } + return false; +} + +/*###### +## go_eternal_flame +######*/ +bool GOUse_go_eternal_flame(Player* pPlayer, GameObject* pGo) +{ + instance_sunken_temple* pInstance = (instance_sunken_temple*)pGo->GetInstanceData(); + + if (!pInstance) + return false; + + if (pInstance->GetData(TYPE_AVATAR) != IN_PROGRESS) + return false; + + // Set data to special when flame is used + pInstance->SetData(TYPE_AVATAR, SPECIAL); + pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + + return true; +} + +/*###### +## effectDummy_summon_hakkar +######*/ +bool EffectDummyCreature_summon_hakkar(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Creature* pCreatureTarget) +{ + // Always check spellid and effectindex + if (uiSpellId == SPELL_SUMMON_AVATAR && uiEffIndex == EFFECT_INDEX_0) + { + if (!pCaster || pCaster->GetTypeId() != TYPEID_UNIT) + return true; + + // Update entry to avatar of Hakkar and cast some visuals + ((Creature*)pCaster)->UpdateEntry(NPC_AVATAR_OF_HAKKAR); + pCaster->CastSpell(pCaster, SPELL_AVATAR_SUMMONED, true); + DoScriptText(SAY_AVATAR_SPAWN, pCaster); + + // Always return true when we are handling this spell and effect + return true; + } + + return false; +} + void AddSC_sunken_temple() { Script* pNewScript; @@ -193,4 +260,19 @@ void AddSC_sunken_temple() pNewScript->Name = "event_antalarion_statue_activation"; pNewScript->pProcessEventId = &ProcessEventId_event_antalarion_statue_activation; pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "event_avatar_of_hakkar"; + pNewScript->pProcessEventId = &ProcessEventId_event_avatar_of_hakkar; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "go_eternal_flame"; + pNewScript->pGOUse = &GOUse_go_eternal_flame; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "npc_shade_of_hakkar"; + pNewScript->pEffectDummyNPC = &EffectDummyCreature_summon_hakkar; + pNewScript->RegisterSelf(); } diff --git a/scripts/eastern_kingdoms/sunken_temple/sunken_temple.h b/scripts/eastern_kingdoms/sunken_temple/sunken_temple.h index e4031b1..b9384da 100644 --- a/scripts/eastern_kingdoms/sunken_temple/sunken_temple.h +++ b/scripts/eastern_kingdoms/sunken_temple/sunken_temple.h @@ -7,8 +7,9 @@ enum { - MAX_ENCOUNTER = 4, + MAX_ENCOUNTER = 5, MAX_STATUES = 6, + MAX_FLAMES = 4, // Don't change types 1,2 and 3 (handled in ACID) TYPE_ATALARION_OBSOLET= 1, @@ -19,6 +20,7 @@ enum TYPE_PROTECTORS = 5, TYPE_JAMMALAN = 6, TYPE_MALFURION = 7, + TYPE_AVATAR = 8, NPC_ATALARION = 8580, NPC_DREAMSCYTH = 5721, @@ -35,6 +37,12 @@ enum NPC_ZULLOR = 5716, NPC_MIJAN = 5717, + // Avatar of hakkar mobs + NPC_SHADE_OF_HAKKAR = 8440, // Shade of Hakkar appears when the event starts; will despawn when avatar of hakkar is summoned + NPC_BLOODKEEPER = 8438, // Spawned rarely and contains the hakkari blood -> used to extinguish the flames + NPC_HAKKARI_MINION = 8437, // Npc randomly spawned during the event = trash + NPC_SUPPRESSOR = 8497, // Npc summoned at one of the two doors and moves to the boss; + NPC_MALFURION = 15362, GO_ALTAR_OF_HAKKAR = 148836, // Used in order to show the player the order of the statue activation @@ -52,6 +60,10 @@ enum GO_ETERNAL_FLAME_3 = 148420, GO_ETERNAL_FLAME_4 = 148421, + GO_EVIL_CIRCLE = 148998, // Objects used at the avatar event. they are spawned when the event starts, and the mobs are summon atop of them + GO_HAKKAR_DOOR_1 = 149432, // Combat doors + GO_HAKKAR_DOOR_2 = 149433, + GO_JAMMALAN_BARRIER = 149431, // Event ids related to the statue activation @@ -62,7 +74,15 @@ enum EVENT_ID_STATUE_5 = 3099, EVENT_ID_STATUE_6 = 3100, + SPELL_SUMMON_AVATAR = 12639, // Cast by the shade of hakkar, updates entry to avatar + SPELL_AVATAR_SUMMONED = 12948, + SAY_JAMMALAN_INTRO = -1109005, + SAY_AVATAR_BRAZIER_1 = -1109006, + SAY_AVATAR_BRAZIER_2 = -1109007, + SAY_AVATAR_BRAZIER_3 = -1109008, + SAY_AVATAR_BRAZIER_4 = -1109009, + SAY_AVATAR_SPAWN = -1109010, }; // This is also the needed order for activation: S, N, SW, SE, NW, NE @@ -80,6 +100,13 @@ static const SummonLocations aSunkenTempleLocation[] = {-660.5277f, -16.7117f, -90.8357f, 1.6055f} // Malfurion summon loc }; +// Summon location for the suppressors +static const SummonLocations aHakkariDoorLocations[2] = +{ + {-420.629f, 276.682f, -90.827f}, + {-512.015f, 276.134f, -90.827f} +}; + class MANGOS_DLL_DECL instance_sunken_temple : public ScriptedInstance { public: @@ -91,31 +118,37 @@ class MANGOS_DLL_DECL instance_sunken_temple : public ScriptedInstance void OnObjectCreate(GameObject* pGo); void OnCreatureCreate(Creature* pCreature); - // No need currently to use OnEnterCombat or OnEvade + void OnCreatureEvade(Creature* pCreature); void OnCreatureDeath(Creature* pCreature); void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); + void Update(uint32 uiDiff); + bool ProcessStatueEvent(uint32 uiEventId); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: void DoSpawnAtalarionIfCan(); + void DoUpdateFlamesFlags(bool bRestore); uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + std::string m_strInstData; - uint64 m_uiAtalarionGUID; - uint64 m_uiJammalanGUID; - uint64 m_uiJammalanBarrierGUID; - uint64 m_uiIdolOfHakkarGUID; - uint8 m_uiStatueCounter; - uint8 m_uiProtectorsRemaining; + uint8 m_uiProtectorsRemaining; // Jammalan door handling + uint8 m_uiStatueCounter; // Atalarion Statue Event + uint8 m_uiFlameCounter; // Avatar of Hakkar Event + uint32 m_uiAvatarSummonTimer; + uint32 m_uiSupressorTimer; + bool m_bIsFirstHakkarWave; + bool m_bCanSummonBloodkeeper; + GUIDList m_luiFlameGUIDs; GUIDList m_luiBigLightGUIDs; + GUIDVector m_vuiCircleGUIDs; }; #endif diff --git a/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp b/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp index 6e1d0ff..8571780 100644 --- a/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp +++ b/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp @@ -126,7 +126,7 @@ struct MANGOS_DLL_DECL boss_kalecgosAI : public ScriptedAI if (m_pInstance) { // Reset Sathrovarr too - if (Creature* pSath = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SATHROVARR))) + if (Creature* pSath = m_pInstance->GetSingleCreatureFromStorage(NPC_SATHROVARR)) { if (pSath->isAlive() && pSath->getVictim()) pSath->AI()->EnterEvadeMode(); @@ -178,7 +178,7 @@ struct MANGOS_DLL_DECL boss_kalecgosAI : public ScriptedAI pTarget->CastSpell(pTarget, SPELL_SPECTRAL_REALM_FORCE_FACTION, true); pTarget->CastSpell(pTarget, SPELL_SPECTRAL_REALM, true); - m_pInstance->SetData64(DATA_PLAYER_SPECTRAL_REALM, pTarget->GetGUID()); + m_pInstance->SetGuid(DATA_PLAYER_SPECTRAL_REALM, pTarget->GetObjectGuid()); } } @@ -209,7 +209,7 @@ struct MANGOS_DLL_DECL boss_kalecgosAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pSathrovarr = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SATHROVARR))) + if (Creature* pSathrovarr = m_pInstance->GetSingleCreatureFromStorage(NPC_SATHROVARR)) { if (pSathrovarr->isAlive()) { @@ -218,7 +218,7 @@ struct MANGOS_DLL_DECL boss_kalecgosAI : public ScriptedAI } } - if (Creature* pKalec = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KALECGOS_HUMAN))) + if (Creature* pKalec = m_pInstance->GetSingleCreatureFromStorage(NPC_KALECGOS_HUMAN)) { pKalec->DeleteThreatList(); pKalec->SetVisibility(VISIBILITY_OFF); @@ -252,7 +252,7 @@ struct MANGOS_DLL_DECL boss_kalecgosAI : public ScriptedAI if (!m_bEnraged && m_creature->GetHealthPercent() < 10.0f) { - if (Creature* pSathrovarr = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SATHROVARR))) + if (Creature* pSathrovarr = m_pInstance->GetSingleCreatureFromStorage(NPC_SATHROVARR)) { if (pSathrovarr->isAlive()) pSathrovarr->CastSpell(pSathrovarr, SPELL_CRAZED_RAGE, true); @@ -378,7 +378,7 @@ struct MANGOS_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pKalec = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KALECGOS_HUMAN))) + if (Creature* pKalec = m_pInstance->GetSingleCreatureFromStorage(NPC_KALECGOS_HUMAN)) { m_creature->AddThreat(pKalec, 10000000.0f); pKalec->AddThreat(m_creature, 10000000.0f); @@ -400,7 +400,7 @@ struct MANGOS_DLL_DECL boss_sathrovarrAI : public ScriptedAI m_pInstance->SetData(DATA_SET_SPECTRAL_CHECK, 5000); - if (Creature* pKalecgos = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KALECGOS_DRAGON))) + if (Creature* pKalecgos = m_pInstance->GetSingleCreatureFromStorage(NPC_KALECGOS_DRAGON)) { if (boss_kalecgosAI* pKalecgosAI = dynamic_cast(pKalecgos->AI())) { @@ -423,7 +423,7 @@ struct MANGOS_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (!m_bEnraged && m_creature->GetHealthPercent() < 10.0f) { - if (Creature* pKalecgos = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KALECGOS_DRAGON))) + if (Creature* pKalecgos = m_pInstance->GetSingleCreatureFromStorage(NPC_KALECGOS_DRAGON)) { if (pKalecgos->isAlive()) pKalecgos->CastSpell(pKalecgos, SPELL_CRAZED_RAGE, true); @@ -510,7 +510,7 @@ struct MANGOS_DLL_DECL boss_kalecgos_humanoidAI : public ScriptedAI { if (m_pInstance) { - /*Player* pPlayer = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_RANDOM_SPECTRAL_PLAYER)); + /*Player* pPlayer = m_creature->GetMap()->GetPlayer(m_pInstance->GetGuid(DATA_RANDOM_SPECTRAL_PLAYER)); if (pPlayer) DoCastSpellIfCan(pPlayer, SPELL_REVITALIZE);*/ RevitalizeTimer = 30000; @@ -553,7 +553,7 @@ bool GOUse_go_spectral_rift(Player* pPlayer, GameObject* pGo) pPlayer->CastSpell(pPlayer, SPELL_SPECTRAL_REALM, true); // Add player to pSath's threat list - /*if (Creature* pSath = pInstance->instance->GetCreature(pInstance->GetData64(DATA_KALECGOS_DRAGON))) + /*if (Creature* pSath = pInstance->GetSingleCreatureFromStorage(NPC_KALECGOS_DRAGON)) ++ TODO might contain typos { if (pSath->isAlive()) { @@ -563,7 +563,7 @@ bool GOUse_go_spectral_rift(Player* pPlayer, GameObject* pGo) } // Remove player from Sathrovarr's threat list - if (Creature* pKalecgos = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SATHROVARR))) + if (Creature* pKalecgos = pInstance->GetSingleCreatureFromStorage(NPC_SATHROVARR)) ++ TODO might contain typos { if (pKalecgos->isAlive()) { @@ -575,7 +575,7 @@ bool GOUse_go_spectral_rift(Player* pPlayer, GameObject* pGo) } }*/ - pInstance->SetData64(DATA_PLAYER_SPECTRAL_REALM, pPlayer->GetGUID()); + pInstance->SetGuid(DATA_PLAYER_SPECTRAL_REALM, pPlayer->GetObjectGuid()); } return true; diff --git a/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp b/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp index aa9af9d..8639c02 100644 --- a/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp +++ b/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp @@ -34,31 +34,6 @@ EndScriptData */ */ instance_sunwell_plateau::instance_sunwell_plateau(Map* pMap) : ScriptedInstance(pMap), - // Creatures - m_uiKalecgos_DragonGUID(0), - m_uiKalecgos_HumanGUID(0), - m_uiSathrovarrGUID(0), - m_uiBrutallusGUID(0), - m_uiFelmystGUID(0), - m_uiAlythessGUID(0), - m_uiSacrolashGUID(0), - m_uiMuruGUID(0), - m_uiKilJaedenGUID(0), - m_uiKilJaedenControllerGUID(0), - m_uiAnveenaGUID(0), - m_uiKalecgosGUID(0), - // GameObjects - m_uiForceFieldGUID(0), - m_uiBossCollision1GUID(0), - m_uiBossCollision2GUID(0), - m_uiIceBarrierGUID(0), - m_uiDoorFireBarrierGUID(0), - m_uiDoorTheFirstGateGUID(0), - m_uiDoorTheSecondGateGUID(0), - m_uiDoorMuruEnterGateGUID(0), - m_uiDoorMuruExitGateGUID(0), - m_uiDoorTheThirdGateGUID(0), - // Misc m_uiSpectralRealmTimer(5000) { Initialize(); @@ -84,18 +59,13 @@ void instance_sunwell_plateau::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_KALECGOS_DRAGON: m_uiKalecgos_DragonGUID = pCreature->GetGUID(); break; - case NPC_KALECGOS_HUMAN: m_uiKalecgos_HumanGUID = pCreature->GetGUID(); break; - case NPC_SATHROVARR: m_uiSathrovarrGUID = pCreature->GetGUID(); break; - case NPC_BRUTALLUS: m_uiBrutallusGUID = pCreature->GetGUID(); break; - case NPC_FELMYST: m_uiFelmystGUID = pCreature->GetGUID(); break; - case NPC_ALYTHESS: m_uiAlythessGUID = pCreature->GetGUID(); break; - case NPC_SACROLASH: m_uiSacrolashGUID = pCreature->GetGUID(); break; - case NPC_MURU: m_uiMuruGUID = pCreature->GetGUID(); break; - case NPC_KILJAEDEN: m_uiKilJaedenGUID = pCreature->GetGUID(); break; - case NPC_KILJAEDEN_CONTROLLER: m_uiKilJaedenControllerGUID = pCreature->GetGUID(); break; - case NPC_ANVEENA: m_uiAnveenaGUID = pCreature->GetGUID(); break; - case NPC_KALECGOS: m_uiKalecgosGUID = pCreature->GetGUID(); break; + case NPC_KALECGOS_DRAGON: + case NPC_KALECGOS_HUMAN: + case NPC_SATHROVARR: + case NPC_ALYTHESS: + case NPC_SACROLASH: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -104,46 +74,37 @@ void instance_sunwell_plateau::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_FORCEFIELD: - m_uiForceFieldGUID = pGo->GetGUID(); - break; case GO_BOSS_COLLISION_1: - m_uiBossCollision1GUID = pGo->GetGUID(); - break; case GO_BOSS_COLLISION_2: - m_uiBossCollision2GUID = pGo->GetGUID(); - break; case GO_ICE_BARRIER: - m_uiIceBarrierGUID = pGo->GetGUID(); break; case GO_FIRE_BARRIER: - m_uiDoorFireBarrierGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_KALECGOS] == DONE && m_auiEncounter[TYPE_BRUTALLUS] == DONE && m_auiEncounter[TYPE_FELMYST] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_FIRST_GATE: - m_uiDoorTheFirstGateGUID = pGo->GetGUID(); break; case GO_SECOND_GATE: - m_uiDoorTheSecondGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_EREDAR_TWINS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_MURU_ENTER_GATE: - m_uiDoorMuruEnterGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_EREDAR_TWINS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_MURU_EXIT_GATE: - m_uiDoorMuruExitGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_MURU] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_THIRD_GATE: - m_uiDoorTheThirdGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_MURU] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_sunwell_plateau::SetData(uint32 uiType, uint32 uiData) @@ -153,38 +114,38 @@ void instance_sunwell_plateau::SetData(uint32 uiType, uint32 uiData) case TYPE_KALECGOS: m_auiEncounter[uiType] = uiData; // combat doors - DoUseDoorOrButton(m_uiForceFieldGUID); - DoUseDoorOrButton(m_uiBossCollision1GUID); - DoUseDoorOrButton(m_uiBossCollision2GUID); + DoUseDoorOrButton(GO_FORCEFIELD); + DoUseDoorOrButton(GO_BOSS_COLLISION_1); + DoUseDoorOrButton(GO_BOSS_COLLISION_2); if (uiData == IN_PROGRESS) SpectralRealmList.clear(); break; case TYPE_BRUTALLUS: m_auiEncounter[uiType] = uiData; if (uiData == SPECIAL) - DoUseDoorOrButton(m_uiIceBarrierGUID,MINUTE); + DoUseDoorOrButton(GO_ICE_BARRIER, MINUTE); break; case TYPE_FELMYST: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiDoorFireBarrierGUID); + DoUseDoorOrButton(GO_FIRE_BARRIER); break; case TYPE_EREDAR_TWINS: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_uiDoorTheSecondGateGUID); - DoUseDoorOrButton(m_uiDoorMuruEnterGateGUID); + DoUseDoorOrButton(GO_SECOND_GATE); + DoUseDoorOrButton(GO_MURU_ENTER_GATE); } break; case TYPE_MURU: m_auiEncounter[uiType] = uiData; // combat door - DoUseDoorOrButton(m_uiDoorMuruEnterGateGUID); + DoUseDoorOrButton(GO_MURU_ENTER_GATE); if (uiData == DONE) { - DoUseDoorOrButton(m_uiDoorMuruExitGateGUID); - DoUseDoorOrButton(m_uiDoorTheThirdGateGUID); + DoUseDoorOrButton(GO_MURU_EXIT_GATE); + DoUseDoorOrButton(GO_THIRD_GATE); } break; case TYPE_KILJAEDEN: @@ -203,7 +164,7 @@ void instance_sunwell_plateau::SetData(uint32 uiType, uint32 uiData) saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -213,7 +174,7 @@ void instance_sunwell_plateau::SetData(uint32 uiType, uint32 uiData) void instance_sunwell_plateau::SetData64(uint32 uiType, uint64 uiData) { if (uiType == DATA_PLAYER_SPECTRAL_REALM) - SpectralRealmList.push_back(uiData); + SpectralRealmList.push_back(ObjectGuid(uiData)); } uint32 instance_sunwell_plateau::GetData(uint32 uiType) @@ -224,34 +185,12 @@ uint32 instance_sunwell_plateau::GetData(uint32 uiType) return 0; } -uint64 instance_sunwell_plateau::GetData64(uint32 uiType) -{ - switch(uiType) - { - case NPC_KALECGOS_DRAGON: return m_uiKalecgos_DragonGUID; - case NPC_KALECGOS_HUMAN: return m_uiKalecgos_HumanGUID; - case NPC_SATHROVARR: return m_uiSathrovarrGUID; - case NPC_BRUTALLUS: return m_uiBrutallusGUID; - case NPC_FELMYST: return m_uiFelmystGUID; - case NPC_ALYTHESS: return m_uiAlythessGUID; - case NPC_SACROLASH: return m_uiSacrolashGUID; - case NPC_MURU: return m_uiMuruGUID; - case NPC_KILJAEDEN: return m_uiKilJaedenGUID; - case NPC_KILJAEDEN_CONTROLLER: return m_uiKilJaedenControllerGUID; - case NPC_ANVEENA: return m_uiAnveenaGUID; - case NPC_KALECGOS: return m_uiKalecgosGUID; - case GO_FORCEFIELD: return m_uiForceFieldGUID; - } - - return 0; -} - void instance_sunwell_plateau::EjectPlayer(Player* pPlayer) { debug_log("SD2: Ejecting Player %s from Spectral Realm", pPlayer->GetName()); // Put player back in Kalecgos(Dragon)'s threat list - /*if (Creature* pKalecgos = instance->GetCreature(m_uiKalecgos_DragonGUID)) + /*if (Creature* pKalecgos = GetSingleCreatureFromStorage(NPC_KALECGOS_DRAGON)) { if (pKalecgos->isAlive()) { @@ -261,7 +200,7 @@ void instance_sunwell_plateau::EjectPlayer(Player* pPlayer) } // Remove player from Sathrovarr's threat list - if (Creature* pSath = instance->GetCreature(m_uiSathrovarrGUID)) + if (Creature* pSath = instance->GetCreature(NPC_SATHROVARR)) { if (pSath->isAlive()) { @@ -290,7 +229,7 @@ void instance_sunwell_plateau::EjectPlayers() if (plr && !plr->HasAura(SPELL_SPECTRAL_REALM)) { - SpectralRealmList.remove(plr->GetGUID()); + SpectralRealmList.remove(plr->GetObjectGuid()); EjectPlayer(plr); } } diff --git a/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h b/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h index 16088c0..3f06cc3 100644 --- a/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h +++ b/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h @@ -22,15 +22,15 @@ enum NPC_KALECGOS_DRAGON = 24850, // kalecgos blue dragon hostile NPC_KALECGOS_HUMAN = 24891, // kalecgos human form in spectral realm NPC_SATHROVARR = 24892, - NPC_BRUTALLUS = 24882, - NPC_FELMYST = 25038, + // NPC_BRUTALLUS = 24882, + // NPC_FELMYST = 25038, NPC_ALYTHESS = 25166, NPC_SACROLASH = 25165, - NPC_MURU = 25741, - NPC_KILJAEDEN = 25315, - NPC_KILJAEDEN_CONTROLLER = 25608, // kiljaeden event controller - NPC_ANVEENA = 26046, // related to kiljaeden event - NPC_KALECGOS = 25319, // related to kiljaeden event + // NPC_MURU = 25741, + // NPC_KILJAEDEN = 25315, + // NPC_KILJAEDEN_CONTROLLER = 25608, // kiljaeden event controller + // NPC_ANVEENA = 26046, // related to kiljaeden event + // NPC_KALECGOS = 25319, // related to kiljaeden event GO_FORCEFIELD = 188421, // kalecgos door + collisions GO_BOSS_COLLISION_1 = 188523, @@ -66,11 +66,10 @@ class MANGOS_DLL_DECL instance_sunwell_plateau : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); void SetData64(uint32 uiType, uint64 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiType); void Update(uint32 uiDiff); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: @@ -78,33 +77,7 @@ class MANGOS_DLL_DECL instance_sunwell_plateau : public ScriptedInstance void EjectPlayers(); uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - // Creatures - uint64 m_uiKalecgos_DragonGUID; - uint64 m_uiKalecgos_HumanGUID; - uint64 m_uiSathrovarrGUID; - uint64 m_uiBrutallusGUID; - uint64 m_uiFelmystGUID; - uint64 m_uiAlythessGUID; - uint64 m_uiSacrolashGUID; - uint64 m_uiMuruGUID; - uint64 m_uiKilJaedenGUID; - uint64 m_uiKilJaedenControllerGUID; - uint64 m_uiAnveenaGUID; - uint64 m_uiKalecgosGUID; - - // GameObjects - uint64 m_uiForceFieldGUID; - uint64 m_uiBossCollision1GUID; - uint64 m_uiBossCollision2GUID; - uint64 m_uiIceBarrierGUID; - uint64 m_uiDoorFireBarrierGUID; - uint64 m_uiDoorTheFirstGateGUID; - uint64 m_uiDoorTheSecondGateGUID; - uint64 m_uiDoorMuruEnterGateGUID; - uint64 m_uiDoorMuruExitGateGUID; - uint64 m_uiDoorTheThirdGateGUID; + std::string m_strInstData; // Misc uint32 m_uiSpectralRealmTimer; diff --git a/scripts/eastern_kingdoms/swamp_of_sorrows.cpp b/scripts/eastern_kingdoms/swamp_of_sorrows.cpp index 7509e41..04bdc5f 100644 --- a/scripts/eastern_kingdoms/swamp_of_sorrows.cpp +++ b/scripts/eastern_kingdoms/swamp_of_sorrows.cpp @@ -72,7 +72,7 @@ struct MANGOS_DLL_DECL npc_galen_goodwardAI : public npc_escortAI case 0: { GameObject* pCage = NULL; - if (!m_galensCageGuid.IsEmpty()) + if (m_galensCageGuid) pCage = m_creature->GetMap()->GetGameObject(m_galensCageGuid); else pCage = GetClosestGameObjectWithEntry(m_creature, GO_GALENS_CAGE, INTERACTION_DISTANCE); diff --git a/scripts/eastern_kingdoms/uldaman/boss_archaedas.cpp b/scripts/eastern_kingdoms/uldaman/boss_archaedas.cpp index 41d20ea..e4b6f12 100644 --- a/scripts/eastern_kingdoms/uldaman/boss_archaedas.cpp +++ b/scripts/eastern_kingdoms/uldaman/boss_archaedas.cpp @@ -132,7 +132,7 @@ struct MANGOS_DLL_DECL boss_archaedasAI : public ScriptedAI m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); break; case 2: - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_EVENT_STARTER))) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_pInstance->GetGuid(DATA_EVENT_STARTER))) AttackStart(pPlayer); else EnterEvadeMode(); diff --git a/scripts/eastern_kingdoms/uldaman/instance_uldaman.cpp b/scripts/eastern_kingdoms/uldaman/instance_uldaman.cpp index 409a369..6699bc2 100644 --- a/scripts/eastern_kingdoms/uldaman/instance_uldaman.cpp +++ b/scripts/eastern_kingdoms/uldaman/instance_uldaman.cpp @@ -26,10 +26,6 @@ EndScriptData #include "uldaman.h" instance_uldaman::instance_uldaman(Map* pMap) : ScriptedInstance(pMap), - m_uiTempleDoorUpperGUID(0), - m_uiTempleDoorLowerGUID(0), - m_uiAncientVaultGUID(0), - m_uiPlayerGUID(0), m_uiStoneKeepersFallen(0), m_uiKeeperCooldown(5000) { @@ -39,8 +35,6 @@ instance_uldaman::instance_uldaman(Map* pMap) : ScriptedInstance(pMap), void instance_uldaman::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - m_lWardens.clear(); - m_mKeeperMap.clear(); } void instance_uldaman::OnObjectCreate(GameObject* pGo) @@ -50,21 +44,19 @@ void instance_uldaman::OnObjectCreate(GameObject* pGo) case GO_TEMPLE_DOOR_UPPER: if (m_auiEncounter[0] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - m_uiTempleDoorUpperGUID = pGo->GetGUID(); break; case GO_TEMPLE_DOOR_LOWER: if (m_auiEncounter[0] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - m_uiTempleDoorLowerGUID = pGo->GetGUID(); break; case GO_ANCIENT_VAULT: if (m_auiEncounter[1] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - m_uiAncientVaultGUID = pGo->GetGUID(); break; default: - break; + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_uldaman::OnCreatureCreate(Creature* pCreature) @@ -75,12 +67,13 @@ void instance_uldaman::OnCreatureCreate(Creature* pCreature) case NPC_CUSTODIAN: case NPC_GUARDIAN: case NPC_VAULT_WARDER: - m_lWardens.push_back(pCreature->GetGUID()); + m_lWardens.push_back(pCreature->GetObjectGuid()); pCreature->CastSpell(pCreature, SPELL_STONED, true); pCreature->SetNoCallAssistance(true); // no assistance break; case NPC_STONE_KEEPER: - m_mKeeperMap[pCreature->GetGUID()] = pCreature->isAlive(); + // FIXME - This isAlive check is currently useless + m_mKeeperMap[pCreature->GetObjectGuid()] = pCreature->isAlive(); pCreature->CastSpell(pCreature, SPELL_STONED, true); pCreature->SetNoCallAssistance(true); // no assistance break; @@ -96,8 +89,8 @@ void instance_uldaman::SetData(uint32 uiType, uint32 uiData) case TYPE_ALTAR_EVENT: if (uiData == DONE) { - DoUseDoorOrButton(m_uiTempleDoorUpperGUID); - DoUseDoorOrButton(m_uiTempleDoorLowerGUID); + DoUseDoorOrButton(GO_TEMPLE_DOOR_UPPER); + DoUseDoorOrButton(GO_TEMPLE_DOOR_LOWER); m_auiEncounter[0] = uiData; } @@ -124,7 +117,7 @@ void instance_uldaman::SetData(uint32 uiType, uint32 uiData) if (pWarden && pWarden->isAlive()) pWarden->ForcedDespawn(); } - DoUseDoorOrButton(m_uiAncientVaultGUID); + DoUseDoorOrButton(GO_ANCIENT_VAULT); } m_auiEncounter[1] = uiData; break; @@ -138,7 +131,7 @@ void instance_uldaman::SetData(uint32 uiType, uint32 uiData) saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } @@ -171,7 +164,7 @@ void instance_uldaman::SetData64(uint32 uiData, uint64 uiGuid) switch(uiData) { case DATA_EVENT_STARTER: - m_uiPlayerGUID = uiGuid; + m_playerGuid = ObjectGuid(uiGuid); break; } } @@ -191,14 +184,14 @@ uint64 instance_uldaman::GetData64(uint32 uiData) switch(uiData) { case DATA_EVENT_STARTER: - return m_uiPlayerGUID; + return m_playerGuid.GetRawValue(); } return 0; } void instance_uldaman::StartEvent(uint32 uiEventId, Player* pPlayer) { - m_uiPlayerGUID = pPlayer->GetGUID(); + m_playerGuid = pPlayer->GetObjectGuid(); if (uiEventId == EVENT_ID_ALTAR_KEEPER) { @@ -214,7 +207,7 @@ void instance_uldaman::DoResetKeeperEvent() m_auiEncounter[0] = NOT_STARTED; m_uiStoneKeepersFallen = 0; - for (std::map::iterator itr = m_mKeeperMap.begin(); itr != m_mKeeperMap.end(); ++itr) + for (std::map::iterator itr = m_mKeeperMap.begin(); itr != m_mKeeperMap.end(); ++itr) { if (Creature* pKeeper = instance->GetCreature(itr->first)) { @@ -276,7 +269,7 @@ void instance_uldaman::Update(uint32 uiDiff) if (!m_mKeeperMap.empty()) { - for(std::map::iterator itr = m_mKeeperMap.begin(); itr != m_mKeeperMap.end(); ++itr) + for(std::map::iterator itr = m_mKeeperMap.begin(); itr != m_mKeeperMap.end(); ++itr) { // died earlier if (!itr->second) @@ -286,7 +279,7 @@ void instance_uldaman::Update(uint32 uiDiff) { if (pKeeper->isAlive() && !pKeeper->getVictim()) { - if (Player* pPlayer = pKeeper->GetMap()->GetPlayer(m_uiPlayerGUID)) + if (Player* pPlayer = pKeeper->GetMap()->GetPlayer(m_playerGuid)) { // we should use group instead, event starter can be dead while group is still fighting if (pPlayer->isAlive() && !pPlayer->isInCombat()) diff --git a/scripts/eastern_kingdoms/uldaman/uldaman.h b/scripts/eastern_kingdoms/uldaman/uldaman.h index 4468ffc..b7c8cd0 100644 --- a/scripts/eastern_kingdoms/uldaman/uldaman.h +++ b/scripts/eastern_kingdoms/uldaman/uldaman.h @@ -57,23 +57,20 @@ class MANGOS_DLL_DECL instance_uldaman : public ScriptedInstance Creature* GetClosestDwarfNotInCombat(Creature* pSearcher, uint32 uiPhase); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + std::string m_strInstData; - uint64 m_uiTempleDoorUpperGUID; - uint64 m_uiTempleDoorLowerGUID; - uint64 m_uiAncientVaultGUID; - uint64 m_uiPlayerGUID; + ObjectGuid m_playerGuid; uint32 m_uiKeeperCooldown; uint32 m_uiStoneKeepersFallen; GUIDList m_lWardens; - std::map m_mKeeperMap; + std::map m_mKeeperMap; }; #endif diff --git a/scripts/eastern_kingdoms/zulaman/boss_akilzon.cpp b/scripts/eastern_kingdoms/zulaman/boss_akilzon.cpp index 2ff6fd6..6d5b154 100644 --- a/scripts/eastern_kingdoms/zulaman/boss_akilzon.cpp +++ b/scripts/eastern_kingdoms/zulaman/boss_akilzon.cpp @@ -89,6 +89,9 @@ struct MANGOS_DLL_DECL boss_akilzonAI : public ScriptedAI void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); + + if (m_pInstance) + m_pInstance->SetData(TYPE_AKILZON, IN_PROGRESS); } void KilledUnit(Unit* pVictim) @@ -106,6 +109,12 @@ struct MANGOS_DLL_DECL boss_akilzonAI : public ScriptedAI m_pInstance->SetData(TYPE_AKILZON, DONE); } + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->SetData(TYPE_AKILZON, FAIL); + } + void JustSummoned(Creature* pSummoned) { if (pSummoned->GetEntry() == NPC_SOARING_EAGLE) @@ -243,7 +252,7 @@ struct MANGOS_DLL_DECL mob_soaring_eagleAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pAzkil = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_AKILZON))) + if (Creature* pAzkil = m_pInstance->GetSingleCreatureFromStorage(NPC_AKILZON)) { float fX, fY, fZ; pAzkil->GetRandomPoint(pAzkil->GetPositionX(), pAzkil->GetPositionY(), pAzkil->GetPositionZ()+15.0f, 30.0f, fX, fY, fZ); diff --git a/scripts/eastern_kingdoms/zulaman/boss_halazzi.cpp b/scripts/eastern_kingdoms/zulaman/boss_halazzi.cpp index 3773246..57c4eca 100644 --- a/scripts/eastern_kingdoms/zulaman/boss_halazzi.cpp +++ b/scripts/eastern_kingdoms/zulaman/boss_halazzi.cpp @@ -107,14 +107,14 @@ struct MANGOS_DLL_DECL boss_halazziAI : public ScriptedAI if (m_pInstance) { - if (Creature* pSpiritLynx = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_SPIRIT_LYNX))) + if (Creature* pSpiritLynx = m_pInstance->GetSingleCreatureFromStorage(NPC_SPIRIT_LYNX)) pSpiritLynx->ForcedDespawn(); } } void JustReachedHome() { - m_pInstance->SetData(TYPE_HALAZZI, NOT_STARTED); + m_pInstance->SetData(TYPE_HALAZZI, FAIL); } void Aggro(Unit* pWho) @@ -197,7 +197,7 @@ struct MANGOS_DLL_DECL boss_halazziAI : public ScriptedAI } else { - Creature* pSpiritLynx = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_SPIRIT_LYNX)); + Creature* pSpiritLynx = m_pInstance->GetSingleCreatureFromStorage(NPC_SPIRIT_LYNX); if (m_creature->GetHealthPercent() < 10.0f || (pSpiritLynx && pSpiritLynx->GetHealthPercent() < 10.0f)) @@ -349,7 +349,7 @@ struct MANGOS_DLL_DECL boss_spirit_lynxAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pHalazzi = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_HALAZZI))) + if (Creature* pHalazzi = m_pInstance->GetSingleCreatureFromStorage(NPC_HALAZZI)) pHalazzi->AI()->KilledUnit(pVictim); } diff --git a/scripts/eastern_kingdoms/zulaman/boss_janalai.cpp b/scripts/eastern_kingdoms/zulaman/boss_janalai.cpp index 8c343bc..b94109f 100644 --- a/scripts/eastern_kingdoms/zulaman/boss_janalai.cpp +++ b/scripts/eastern_kingdoms/zulaman/boss_janalai.cpp @@ -139,8 +139,6 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI { boss_janalaiAI(Creature* pCreature) : ScriptedAI(pCreature) { - m_uiHatcher1GUID = 0; - m_uiHatcher2GUID = 0; m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); Reset(); } @@ -159,7 +157,6 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI uint32 m_uiEnrageTimer; uint32 m_uiHatcherTimer; - uint32 eggs; uint32 m_uiWipeTimer; bool m_bIsBombing; @@ -168,26 +165,26 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI bool m_bIsEnraged; bool m_bCanEnrage; - uint64 m_uiHatcher1GUID; - uint64 m_uiHatcher2GUID; + ObjectGuid m_hatcherOneGuid; + ObjectGuid m_hatcherTwoGuid; void Reset() { m_lBombsGUIDList.clear(); m_lEggsRemainingList.clear(); - if (Creature* pHatcher = m_creature->GetMap()->GetCreature(m_uiHatcher1GUID)) + if (Creature* pHatcher = m_creature->GetMap()->GetCreature(m_hatcherOneGuid)) { pHatcher->AI()->EnterEvadeMode(); pHatcher->SetDeathState(JUST_DIED); - m_uiHatcher1GUID = 0; + m_hatcherOneGuid.Clear(); } - if (Creature* pHatcher = m_creature->GetMap()->GetCreature(m_uiHatcher2GUID)) + if (Creature* pHatcher = m_creature->GetMap()->GetCreature(m_hatcherTwoGuid)) { pHatcher->AI()->EnterEvadeMode(); pHatcher->SetDeathState(JUST_DIED); - m_uiHatcher2GUID = 0; + m_hatcherTwoGuid.Clear(); } m_uiFireBreathTimer = 8000; @@ -210,7 +207,7 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI void JustReachedHome() { if (m_pInstance) - m_pInstance->SetData(TYPE_JANALAI, NOT_STARTED); + m_pInstance->SetData(TYPE_JANALAI, FAIL); } void JustDied(Unit* Killer) @@ -239,16 +236,16 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI switch(pSummoned->GetEntry()) { case NPC_AMANI_HATCHER_1: - m_uiHatcher1GUID = pSummoned->GetGUID(); + m_hatcherOneGuid = pSummoned->GetObjectGuid(); break; case NPC_AMANI_HATCHER_2: - m_uiHatcher2GUID = pSummoned->GetGUID(); + m_hatcherTwoGuid = pSummoned->GetObjectGuid(); break; case NPC_FIRE_BOMB: if (m_bIsBombing) { //store bombs in list to be used in BlowUpBombs() - m_lBombsGUIDList.push_back(pSummoned->GetGUID()); + m_lBombsGUIDList.push_back(pSummoned->GetObjectGuid()); if (pSummoned->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) pSummoned->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -363,16 +360,16 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI if (!m_pInstance) return; - if (uint32 uiEggsRemaining_Right = m_pInstance->GetData(DATA_J_EGGS_RIGHT)) + if (uint32 uiEggsRemaining_Right = m_pInstance->GetData(TYPE_J_EGGS_RIGHT)) { for(uint32 i = 0; i < uiEggsRemaining_Right; ++i) - m_pInstance->SetData(DATA_J_EGGS_RIGHT, SPECIAL); + m_pInstance->SetData(TYPE_J_EGGS_RIGHT, SPECIAL); } - if (uint32 uiEggsRemaining_Left = m_pInstance->GetData(DATA_J_EGGS_LEFT)) + if (uint32 uiEggsRemaining_Left = m_pInstance->GetData(TYPE_J_EGGS_LEFT)) { for(uint32 i = 0; i < uiEggsRemaining_Left; ++i) - m_pInstance->SetData(DATA_J_EGGS_LEFT, SPECIAL); + m_pInstance->SetData(TYPE_J_EGGS_LEFT, SPECIAL); } } } @@ -514,14 +511,14 @@ struct MANGOS_DLL_DECL boss_janalaiAI : public ScriptedAI { if (m_uiHatcherTimer < uiDiff) { - if (!m_pInstance || (m_pInstance->GetData(DATA_J_EGGS_LEFT) == 0 && m_pInstance->GetData(DATA_J_EGGS_RIGHT) == 0)) + if (!m_pInstance || (m_pInstance->GetData(TYPE_J_EGGS_LEFT) == 0 && m_pInstance->GetData(TYPE_J_EGGS_RIGHT) == 0)) m_bIsEggRemaining = false; else { DoScriptText(SAY_SUMMON_HATCHER, m_creature); - Creature* pHatcer1 = m_creature->GetMap()->GetCreature(m_uiHatcher1GUID); - Creature* pHatcer2 = m_creature->GetMap()->GetCreature(m_uiHatcher2GUID); + Creature* pHatcer1 = m_creature->GetMap()->GetCreature(m_hatcherOneGuid); + Creature* pHatcer2 = m_creature->GetMap()->GetCreature(m_hatcherTwoGuid); if (!pHatcer1 || (pHatcer1 && !pHatcer1->isAlive())) { @@ -644,7 +641,7 @@ struct MANGOS_DLL_DECL npc_amanishi_hatcherAI : public ScriptedAI void DoHatchEggs(uint32 uiCount) { - uint32 uiSaveRightOrLeft = m_creature->GetEntry() == NPC_AMANI_HATCHER_1 ? DATA_J_EGGS_RIGHT : DATA_J_EGGS_LEFT; + uint32 uiSaveRightOrLeft = m_creature->GetEntry() == NPC_AMANI_HATCHER_1 ? TYPE_J_EGGS_RIGHT : TYPE_J_EGGS_LEFT; for(uint32 i = 0; i < uiCount; ++i) { @@ -681,7 +678,7 @@ struct MANGOS_DLL_DECL npc_amanishi_hatcherAI : public ScriptedAI if (!m_pInstance) return; - uint32 uiEggsRemaining = m_creature->GetEntry() == NPC_AMANI_HATCHER_1 ? m_pInstance->GetData(DATA_J_EGGS_RIGHT) : m_pInstance->GetData(DATA_J_EGGS_LEFT); + uint32 uiEggsRemaining = m_creature->GetEntry() == NPC_AMANI_HATCHER_1 ? m_pInstance->GetData(TYPE_J_EGGS_RIGHT) : m_pInstance->GetData(TYPE_J_EGGS_LEFT); if (!uiEggsRemaining) { diff --git a/scripts/eastern_kingdoms/zulaman/boss_malacrass.cpp b/scripts/eastern_kingdoms/zulaman/boss_malacrass.cpp index 800b4e7..6f7c3ff 100644 --- a/scripts/eastern_kingdoms/zulaman/boss_malacrass.cpp +++ b/scripts/eastern_kingdoms/zulaman/boss_malacrass.cpp @@ -128,7 +128,6 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI boss_malacrassAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - memset(&m_auiAddGUIDs, 0, sizeof(m_auiAddGUIDs)); m_lAddsEntryList.clear(); Reset(); } @@ -136,7 +135,7 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI ScriptedInstance* m_pInstance; std::list m_lAddsEntryList; - uint64 m_auiAddGUIDs[MAX_ACTIVE_ADDS]; + ObjectGuid m_aAddGuid[MAX_ACTIVE_ADDS]; void Reset() { @@ -155,7 +154,7 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI for(uint8 i = 0; i < MAX_ACTIVE_ADDS; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiAddGUIDs[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aAddGuid[i])) pAdd->AI()->EnterEvadeMode(); } } @@ -179,7 +178,7 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI for(std::list::iterator itr = m_lAddsEntryList.begin(); itr != m_lAddsEntryList.end(); ++itr) { if (Creature* pAdd = m_creature->SummonCreature((*itr), m_afAddPosX[j], ADD_POS_Y, ADD_POS_Z, ADD_ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 0)) - m_auiAddGUIDs[j] = pAdd->GetGUID(); + m_aAddGuid[j] = pAdd->GetObjectGuid(); ++j; } @@ -188,13 +187,13 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI { for(std::list::iterator itr = m_lAddsEntryList.begin(); itr != m_lAddsEntryList.end(); ++itr) { - Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiAddGUIDs[j]); + Creature* pAdd = m_creature->GetMap()->GetCreature(m_aAddGuid[j]); //object already removed, not exist if (!pAdd) { if (pAdd = m_creature->SummonCreature((*itr), m_afAddPosX[j], ADD_POS_Y, ADD_POS_Z, ADD_ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 0)) - m_auiAddGUIDs[j] = pAdd->GetGUID(); + m_aAddGuid[j] = pAdd->GetObjectGuid(); } ++j; } @@ -216,7 +215,7 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI { for(uint8 i = 0; i < MAX_ACTIVE_ADDS; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiAddGUIDs[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aAddGuid[i])) { if (!pAdd->getVictim()) pAdd->AI()->AttackStart(pWho); @@ -247,14 +246,16 @@ struct MANGOS_DLL_DECL boss_malacrassAI : public ScriptedAI { for(uint8 i = 0; i < MAX_ACTIVE_ADDS; ++i) { - if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_auiAddGUIDs[i])) + if (Creature* pAdd = m_creature->GetMap()->GetCreature(m_aAddGuid[i])) { pAdd->AI()->EnterEvadeMode(); pAdd->SetDeathState(JUST_DIED); } } - memset(&m_auiAddGUIDs, 0, sizeof(m_auiAddGUIDs)); + for (uint8 i = 0; i < MAX_ACTIVE_ADDS; ++i) + m_aAddGuid[i].Clear(); + m_lAddsEntryList.clear(); } @@ -299,7 +300,7 @@ struct MANGOS_DLL_DECL boss_malacrass_addAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pMalacrass = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_MALACRASS))) + if (Creature* pMalacrass = m_pInstance->GetSingleCreatureFromStorage(NPC_MALACRASS)) pMalacrass->AI()->KilledUnit(pVictim); } @@ -308,7 +309,7 @@ struct MANGOS_DLL_DECL boss_malacrass_addAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pMalacrass = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_MALACRASS))) + if (Creature* pMalacrass = m_pInstance->GetSingleCreatureFromStorage(NPC_MALACRASS)) { switch(urand(0, 2)) { diff --git a/scripts/eastern_kingdoms/zulaman/boss_nalorakk.cpp b/scripts/eastern_kingdoms/zulaman/boss_nalorakk.cpp index 1ef77c2..ab7f5bb 100644 --- a/scripts/eastern_kingdoms/zulaman/boss_nalorakk.cpp +++ b/scripts/eastern_kingdoms/zulaman/boss_nalorakk.cpp @@ -101,6 +101,9 @@ struct MANGOS_DLL_DECL boss_nalorakkAI : public ScriptedAI void Aggro(Unit *who) { DoScriptText(SAY_AGGRO, m_creature); + + if (m_pInstance) + m_pInstance->SetData(TYPE_NALORAKK, IN_PROGRESS); } void KilledUnit(Unit* victim) @@ -118,6 +121,12 @@ struct MANGOS_DLL_DECL boss_nalorakkAI : public ScriptedAI m_pInstance->SetData(TYPE_NALORAKK, DONE); } + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->SetData(TYPE_NALORAKK, FAIL); + } + void UpdateAI(const uint32 diff) { //Return since we have no target diff --git a/scripts/eastern_kingdoms/zulaman/boss_zuljin.cpp b/scripts/eastern_kingdoms/zulaman/boss_zuljin.cpp index e9e01ee..40cdef7 100644 --- a/scripts/eastern_kingdoms/zulaman/boss_zuljin.cpp +++ b/scripts/eastern_kingdoms/zulaman/boss_zuljin.cpp @@ -112,6 +112,15 @@ struct MANGOS_DLL_DECL boss_zuljinAI : public ScriptedAI void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); + + if (m_pInstance) + m_pInstance->SetData(TYPE_ZULJIN, IN_PROGRESS); + } + + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->SetData(TYPE_ZULJIN, FAIL); } void KilledUnit(Unit* pVictim) diff --git a/scripts/eastern_kingdoms/zulaman/instance_zulaman.cpp b/scripts/eastern_kingdoms/zulaman/instance_zulaman.cpp index 918147d..ed132f9 100644 --- a/scripts/eastern_kingdoms/zulaman/instance_zulaman.cpp +++ b/scripts/eastern_kingdoms/zulaman/instance_zulaman.cpp @@ -16,338 +16,385 @@ /* ScriptData SDName: Instance_Zulaman -SD%Complete: 25 -SDComment: +SD%Complete: 50 +SDComment: Support for Quests and Mini-Events still TODO SDCategory: Zul'Aman EndScriptData */ #include "precompiled.h" #include "zulaman.h" -struct MANGOS_DLL_DECL instance_zulaman : public ScriptedInstance -{ - instance_zulaman(Map* pMap) : ScriptedInstance(pMap) {Initialize();} - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint32 m_auiRandVendor[MAX_VENDOR]; - std::string strInstData; - - uint32 m_uiEventTimer; - uint32 m_uiEventMinuteStep; - - uint32 m_uiGongCount; +instance_zulaman::instance_zulaman(Map* pMap) : ScriptedInstance(pMap), + m_uiEventTimer(MINUTE*IN_MILLISECONDS), + m_uiGongCount(0), - uint64 m_uiAkilzonGUID; - uint64 m_uiNalorakkGUID; - uint64 m_uiJanalaiGUID; - uint64 m_uiHalazziGUID; - uint64 m_uiSpiritLynxGUID; - uint64 m_uiZuljinGUID; - uint64 m_uiMalacrassGUID; - uint64 m_uiHarrisonGUID; - - uint64 m_uiStrangeGongGUID; - uint64 m_uiMassiveGateGUID; - uint64 m_uiMalacrassEntranceGUID; + m_uiEggsRemainingCount_Left(20), + m_uiEggsRemainingCount_Right(20) +{ + Initialize(); +} - GUIDList m_lEggsGUIDList; - uint32 m_uiEggsRemainingCount_Left; - uint32 m_uiEggsRemainingCount_Right; +void instance_zulaman::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + memset(&m_auiRandVendor, 0, sizeof(m_auiRandVendor)); +} - void Initialize() +bool instance_zulaman::IsEncounterInProgress() const +{ + // Skip Time-Event and Time-Event timer + for (uint8 i = 1; i < MAX_ENCOUNTER - 1; ++i) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&m_auiRandVendor, 0, sizeof(m_auiRandVendor)); - - m_uiEventTimer = MINUTE*IN_MILLISECONDS; - m_uiEventMinuteStep = MINUTE/3; - - m_uiGongCount = 0; - - m_uiAkilzonGUID = 0; - m_uiNalorakkGUID = 0; - m_uiJanalaiGUID = 0; - m_uiHalazziGUID = 0; - m_uiSpiritLynxGUID = 0; - m_uiZuljinGUID = 0; - m_uiMalacrassGUID = 0; - m_uiHarrisonGUID = 0; - - m_uiStrangeGongGUID = 0; - m_uiMassiveGateGUID = 0; - m_uiMalacrassEntranceGUID = 0; - - m_lEggsGUIDList.clear(); - m_uiEggsRemainingCount_Left = 20; - m_uiEggsRemainingCount_Right = 20; + if (m_auiEncounter[i] == IN_PROGRESS) + return true; } - void OnCreatureCreate(Creature* pCreature) + return false; +} + +void instance_zulaman::OnCreatureCreate(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - switch(pCreature->GetEntry()) - { - case 23574: m_uiAkilzonGUID = pCreature->GetGUID(); break; - case 23576: m_uiNalorakkGUID = pCreature->GetGUID(); break; - case 23578: m_uiJanalaiGUID = pCreature->GetGUID(); break; - case 23577: m_uiHalazziGUID = pCreature->GetGUID(); break; - case 23863: m_uiZuljinGUID = pCreature->GetGUID(); break; - case 24239: m_uiMalacrassGUID = pCreature->GetGUID(); break; - case 24358: m_uiHarrisonGUID = pCreature->GetGUID(); break; - case NPC_SPIRIT_LYNX: m_uiSpiritLynxGUID = pCreature->GetGUID(); break; - case NPC_EGG: - if (m_auiEncounter[3] != DONE) - m_lEggsGUIDList.push_back(pCreature->GetGUID()); - break; - } + case NPC_AKILZON: + case NPC_HALAZZI: + case NPC_MALACRASS: + case NPC_HARRISON: + case NPC_SPIRIT_LYNX: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + + case NPC_TANZAR: m_aEventNpcInfo[INDEX_NALORAKK].npGuid = pCreature->GetObjectGuid(); break; + case NPC_KRAZ: m_aEventNpcInfo[INDEX_JANALAI].npGuid = pCreature->GetObjectGuid(); break; + case NPC_ASHLI: m_aEventNpcInfo[INDEX_HALAZZI].npGuid = pCreature->GetObjectGuid(); break; + case NPC_HARKOR: m_aEventNpcInfo[INDEX_AKILZON].npGuid = pCreature->GetObjectGuid(); break; + + case NPC_EGG: + if (m_auiEncounter[3] != DONE) + m_lEggsGUIDList.push_back(pCreature->GetObjectGuid()); + break; } +} - void OnObjectCreate(GameObject* pGo) +void instance_zulaman::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - switch(pGo->GetEntry()) - { - case 187359: - m_uiStrangeGongGUID = pGo->GetGUID(); - break; - case 186728: - m_uiMassiveGateGUID = pGo->GetGUID(); - if (m_auiEncounter[0] == IN_PROGRESS || m_auiEncounter[0] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case 186305: - m_uiMalacrassEntranceGUID = pGo->GetGUID(); - break; - } + case GO_STRANGE_GONG: + break; + case GO_MASSIVE_GATE: + if (m_auiEncounter[0] == DONE || m_auiEncounter[0] == FAIL) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_WIND_DOOR: + break; + case GO_LYNX_TEMPLE_ENTRANCE: + break; + case GO_LYNX_TEMPLE_EXIT: + if (m_auiEncounter[4] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_HEXLORD_ENTRANCE: + if (GetKilledPreBosses() == 4) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_WOODEN_DOOR: + if (m_auiEncounter[5] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_FIRE_DOOR: + break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); +} - void SetData(uint32 uiType, uint32 uiData) - { - debug_log("SD2: Instance Zulaman: SetData received for type %u with data %u",uiType,uiData); +void instance_zulaman::SetData(uint32 uiType, uint32 uiData) +{ + debug_log("SD2: Instance Zulaman: SetData received for type %u with data %u",uiType,uiData); - switch(uiType) - { - case TYPE_EVENT_RUN: - if (uiData == SPECIAL) - { - ++m_uiGongCount; - if (m_uiGongCount == 5) - m_auiEncounter[0] = uiData; - } - if (uiData == IN_PROGRESS) - { - DoUseDoorOrButton(m_uiMassiveGateGUID); - DoUpdateWorldState(WORLD_STATE_COUNTER,m_uiEventMinuteStep); - DoUpdateWorldState(WORLD_STATE_ID,1); + switch(uiType) + { + case TYPE_EVENT_RUN: + if (uiData == SPECIAL) + { + ++m_uiGongCount; + if (m_uiGongCount == 5) m_auiEncounter[0] = uiData; - } - break; - case TYPE_AKILZON: - if (uiData == DONE) + return; + } + if (uiData == IN_PROGRESS) + { + DoTimeRunSay(RUN_START); + DoUseDoorOrButton(GO_MASSIVE_GATE); + if (m_auiEncounter[7]) + SetData(TYPE_RUN_EVENT_TIME, m_auiEncounter[7]); + else + SetData(TYPE_RUN_EVENT_TIME, 20); // 20 Minutes as default time + DoUpdateWorldState(WORLD_STATE_ID, 1); + } + if (uiData == FAIL) + { + DoTimeRunSay(RUN_FAIL); + DoUpdateWorldState(WORLD_STATE_ID, 0); + // Kill remaining Event NPCs + for (uint8 i = 0; i < MAX_CHESTS; ++i) { - if (m_auiEncounter[0] == IN_PROGRESS) + // Not yet rescued, so too late + if (!m_aEventNpcInfo[i].uiSavePosition) { - m_uiEventMinuteStep += MINUTE/6; //add 10 minutes - DoUpdateWorldState(WORLD_STATE_COUNTER,m_uiEventMinuteStep); + if (Creature* pCreature = instance->GetCreature(m_aEventNpcInfo[i].npGuid)) + pCreature->ForcedDespawn(); } } - m_auiEncounter[1] = uiData; - break; - case TYPE_NALORAKK: - if (uiData == DONE) + } + if (uiData == DONE) + { + DoTimeRunSay(RUN_DONE); + DoUpdateWorldState(WORLD_STATE_ID, 0); + } + m_auiEncounter[0] = uiData; + break; + case TYPE_AKILZON: + DoUseDoorOrButton(GO_WIND_DOOR); + if (uiData == DONE) + { + if (m_auiEncounter[0] == IN_PROGRESS) { - if (m_auiEncounter[0] == IN_PROGRESS) - { - m_uiEventMinuteStep += MINUTE/4; //add 15 minutes - DoUpdateWorldState(WORLD_STATE_COUNTER,m_uiEventMinuteStep); - } + m_auiEncounter[7] += 10; // Add 10 minutes + SetData(TYPE_RUN_EVENT_TIME, m_auiEncounter[7]); + DoChestEvent(INDEX_AKILZON); } - m_auiEncounter[2] = uiData; - break; - case TYPE_JANALAI: - if (uiData == NOT_STARTED) + } + m_auiEncounter[1] = uiData; + break; + case TYPE_NALORAKK: + if (uiData == DONE) + { + if (m_auiEncounter[0] == IN_PROGRESS) { - m_uiEggsRemainingCount_Left = 20; - m_uiEggsRemainingCount_Right = 20; + m_auiEncounter[7] += 15; // Add 15 minutes + SetData(TYPE_RUN_EVENT_TIME, m_auiEncounter[7]); + DoChestEvent(INDEX_NALORAKK); + } + } + m_auiEncounter[2] = uiData; + break; + case TYPE_JANALAI: + if (uiData == NOT_STARTED) + { + m_uiEggsRemainingCount_Left = 20; + m_uiEggsRemainingCount_Right = 20; - if (!m_lEggsGUIDList.empty()) + if (!m_lEggsGUIDList.empty()) + { + for(GUIDList::const_iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) { - for(GUIDList::const_iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) + if (Creature* pEgg = instance->GetCreature(*itr)) { - if (Creature* pEgg = instance->GetCreature(*itr)) - { - if (!pEgg->isAlive()) - pEgg->Respawn(); - } + if (!pEgg->isAlive()) + pEgg->Respawn(); } } } - if (uiData == DONE) - m_lEggsGUIDList.clear(); - - m_auiEncounter[3] = uiData; - break; - case TYPE_HALAZZI: - m_auiEncounter[4] = uiData; - break; - case TYPE_ZULJIN: - m_auiEncounter[5] = uiData; - break; - case TYPE_MALACRASS: - m_auiEncounter[6] = uiData; - break; - - case DATA_J_EGGS_RIGHT: - --m_uiEggsRemainingCount_Right; - break; - case DATA_J_EGGS_LEFT: - --m_uiEggsRemainingCount_Left; - break; - - case TYPE_RAND_VENDOR_1: - m_auiRandVendor[0] = uiData; - break; - case TYPE_RAND_VENDOR_2: - m_auiRandVendor[1] = uiData; - break; - default: - error_log("SD2: Instance Zulaman: ERROR SetData = %u for type %u does not exist/not implemented.",uiType,uiData); - break; - } + } + if (uiData == DONE) + { + m_lEggsGUIDList.clear(); + + if (m_auiEncounter[0] == IN_PROGRESS) + DoChestEvent(INDEX_JANALAI); + } + m_auiEncounter[3] = uiData; + break; + case TYPE_HALAZZI: + DoUseDoorOrButton(GO_LYNX_TEMPLE_ENTRANCE); + if (uiData == DONE) + { + DoUseDoorOrButton(GO_LYNX_TEMPLE_EXIT); + if (m_auiEncounter[0] == IN_PROGRESS) + DoChestEvent(INDEX_HALAZZI); + } + m_auiEncounter[4] = uiData; + break; + case TYPE_MALACRASS: + DoUseDoorOrButton(GO_HEXLORD_ENTRANCE); + if (uiData == DONE) + DoUseDoorOrButton(GO_WOODEN_DOOR); + m_auiEncounter[5] = uiData; + break; + case TYPE_ZULJIN: + DoUseDoorOrButton(GO_FIRE_DOOR); + m_auiEncounter[6] = uiData; + break; + case TYPE_J_EGGS_RIGHT: + --m_uiEggsRemainingCount_Right; + break; + case TYPE_J_EGGS_LEFT: + --m_uiEggsRemainingCount_Left; + break; + case TYPE_RAND_VENDOR_1: + m_auiRandVendor[0] = uiData; + break; + case TYPE_RAND_VENDOR_2: + m_auiRandVendor[1] = uiData; + break; + + case TYPE_RUN_EVENT_TIME: + m_auiEncounter[7] = uiData; + DoUpdateWorldState(WORLD_STATE_COUNTER, m_auiEncounter[7]); + break; + + default: + error_log("SD2: Instance Zulaman: ERROR SetData = %u for type %u does not exist/not implemented.",uiType,uiData); + return; + } - if (m_auiEncounter[1] == DONE && m_auiEncounter[2] == DONE && m_auiEncounter[3] == DONE && - m_auiEncounter[4] == DONE && m_auiEncounter[5] != IN_PROGRESS) - DoUseDoorOrButton(m_uiMalacrassEntranceGUID); + if (uiData == DONE && GetKilledPreBosses() == 4 && (uiType == TYPE_AKILZON || uiType == TYPE_NALORAKK || uiType == TYPE_JANALAI || uiType == TYPE_HALAZZI)) + { + DoUseDoorOrButton(GO_HEXLORD_ENTRANCE); + if (m_auiEncounter[0] == IN_PROGRESS) + SetData(TYPE_EVENT_RUN, DONE); + } - if (uiData == DONE || (uiType == TYPE_EVENT_RUN && uiData == IN_PROGRESS)) - { - OUT_SAVE_INST_DATA; + if (uiData == DONE || uiType == TYPE_RUN_EVENT_TIME || uiType == TYPE_EVENT_RUN) + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " - << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " - << m_auiEncounter[6]; + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " + << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " + << m_auiEncounter[6] << " " << m_auiEncounter[7]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - const char* Save() +void instance_zulaman::Load(const char* chrIn) +{ + if (!chrIn) { - return strInstData.c_str(); + OUT_LOAD_INST_DATA_FAIL; + return; } - void Load(const char* chrIn) - { - if (!chrIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } + OUT_LOAD_INST_DATA(chrIn); - OUT_LOAD_INST_DATA(chrIn); + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] + >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] >> m_auiEncounter[7]; - std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] - >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6]; + // Skip m_auiEncounter[7], to start the time event properly if needed + for (uint8 i = 0; i < MAX_ENCOUNTER - 1; ++i) + { + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; + } - //not changing m_uiEncounter[0], TYPE_EVENT_RUN must not reset to NOT_STARTED - for(uint8 i = 1; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } + // Restart TYPE_EVENT_RUN if was already started + if (m_auiEncounter[7] != 0 && m_auiEncounter[0] != DONE && m_auiEncounter[0] != FAIL) + SetData(TYPE_EVENT_RUN, IN_PROGRESS); - OUT_LOAD_INST_DATA_COMPLETE; - } + OUT_LOAD_INST_DATA_COMPLETE; +} - uint32 GetData(uint32 uiType) +uint32 instance_zulaman::GetData(uint32 uiType) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_EVENT_RUN: - return m_auiEncounter[0]; - case TYPE_AKILZON: - return m_auiEncounter[1]; - case TYPE_NALORAKK: - return m_auiEncounter[2]; - case TYPE_JANALAI: - return m_auiEncounter[3]; - case TYPE_HALAZZI: - return m_auiEncounter[4]; - case TYPE_ZULJIN: - return m_auiEncounter[5]; - case TYPE_MALACRASS: - return m_auiEncounter[6]; - - case DATA_J_EGGS_LEFT: - return m_uiEggsRemainingCount_Left; - case DATA_J_EGGS_RIGHT: - return m_uiEggsRemainingCount_Right; - - case TYPE_RAND_VENDOR_1: - return m_auiRandVendor[0]; - case TYPE_RAND_VENDOR_2: - return m_auiRandVendor[1]; - } - return 0; + case TYPE_EVENT_RUN: return m_auiEncounter[0]; + case TYPE_AKILZON: return m_auiEncounter[1]; + case TYPE_NALORAKK: return m_auiEncounter[2]; + case TYPE_JANALAI: return m_auiEncounter[3]; + case TYPE_HALAZZI: return m_auiEncounter[4]; + case TYPE_ZULJIN: return m_auiEncounter[5]; + case TYPE_MALACRASS: return m_auiEncounter[6]; + case TYPE_J_EGGS_LEFT: return m_uiEggsRemainingCount_Left; + case TYPE_J_EGGS_RIGHT: return m_uiEggsRemainingCount_Right; + case TYPE_RAND_VENDOR_1: return m_auiRandVendor[0]; + case TYPE_RAND_VENDOR_2: return m_auiRandVendor[1]; + + default: + return 0; } +} + +uint8 instance_zulaman::GetKilledPreBosses() +{ + return (GetData(TYPE_AKILZON) == DONE ? 1 : 0) + (GetData(TYPE_NALORAKK) == DONE ? 1 : 0) + (GetData(TYPE_JANALAI) == DONE ? 1 : 0) + (GetData(TYPE_HALAZZI) == DONE ? 1 : 0); +} - uint64 GetData64(uint32 uiData) +void instance_zulaman::DoTimeRunSay(RunEventSteps uiData) +{ + switch (uiData) { - switch(uiData) - { - case DATA_AKILZON: - return m_uiAkilzonGUID; - case DATA_NALORAKK: - return m_uiNalorakkGUID; - case DATA_JANALAI: - return m_uiJanalaiGUID; - case DATA_HALAZZI: - return m_uiHalazziGUID; - case DATA_SPIRIT_LYNX: - return m_uiSpiritLynxGUID; - case DATA_ZULJIN: - return m_uiZuljinGUID; - case DATA_MALACRASS: - return m_uiMalacrassGUID; - case DATA_HARRISON: - return m_uiHarrisonGUID; - case DATA_GO_GONG: - return m_uiStrangeGongGUID; - case DATA_GO_ENTRANCE: - return m_uiMassiveGateGUID; - case DATA_GO_MALACRASS_GATE: - return m_uiMalacrassEntranceGUID; - } - return 0; + case RUN_START: DoOrSimulateScriptTextForThisInstance(SAY_INST_BEGIN, NPC_MALACRASS); break; + case RUN_FAIL: DoOrSimulateScriptTextForThisInstance(urand(0, 1) ? SAY_INST_SACRIF1 : SAY_INST_SACRIF2, NPC_MALACRASS); break; + case RUN_DONE: DoOrSimulateScriptTextForThisInstance(SAY_INST_COMPLETE, NPC_MALACRASS); break; + case RUN_PROGRESS: + // This function is on progress called before the data is set to the array + switch (GetKilledPreBosses() + 1) + { + case 1: DoOrSimulateScriptTextForThisInstance(SAY_INST_PROGRESS_1, NPC_MALACRASS); break; + case 2: DoOrSimulateScriptTextForThisInstance(SAY_INST_PROGRESS_2, NPC_MALACRASS); break; + case 3: DoOrSimulateScriptTextForThisInstance(SAY_INST_PROGRESS_3, NPC_MALACRASS); break; + } + break; + case RUN_FAIL_SOON: + switch (GetKilledPreBosses()) + { + case 0: DoOrSimulateScriptTextForThisInstance(SAY_INST_WARN_1, NPC_MALACRASS); break; + case 1: DoOrSimulateScriptTextForThisInstance(SAY_INST_WARN_2, NPC_MALACRASS); break; + case 2: DoOrSimulateScriptTextForThisInstance(SAY_INST_WARN_3, NPC_MALACRASS); break; + case 3: DoOrSimulateScriptTextForThisInstance(SAY_INST_WARN_4, NPC_MALACRASS); break; + } + break; } +} - void Update(uint32 uiDiff) +void instance_zulaman::DoChestEvent(BossToChestIndex uiIndex) +{ + // Store Order of this kill + m_aEventNpcInfo[uiIndex].uiSavePosition = GetKilledPreBosses() + 1; + + // Do Yell + DoTimeRunSay(RUN_PROGRESS); + + // related NPC: m_aEventNpcInfo[uiIndex].npGuid + // related Chest: m_aEventNpcInfo[uiIndex] // Not yet stored, because likely unneeded +} + +void instance_zulaman::Update(uint32 uiDiff) +{ + if (GetData(TYPE_EVENT_RUN) == IN_PROGRESS) { - if (GetData(TYPE_EVENT_RUN) == IN_PROGRESS) + if (m_uiEventTimer <= uiDiff) { - if (m_uiEventTimer <= uiDiff) + if (m_auiEncounter[7] == 5) // TODO, verify 5min for warning texts + DoTimeRunSay(RUN_FAIL_SOON); + + if (m_auiEncounter[7] == 0) { - if (m_uiEventMinuteStep == 0) - { - debug_log("SD2: Instance Zulaman: event time reach end, event failed."); - m_auiEncounter[0] = FAIL; - return; - } + debug_log("SD2: Instance Zulaman: event time reach end, event failed."); + SetData(TYPE_EVENT_RUN, FAIL); + return; + } - --m_uiEventMinuteStep; - DoUpdateWorldState(WORLD_STATE_COUNTER, m_uiEventMinuteStep); - debug_log("SD2: Instance Zulaman: minute decrease to %u.",m_uiEventMinuteStep); + --m_auiEncounter[7]; + SetData(TYPE_RUN_EVENT_TIME, m_auiEncounter[7]); + debug_log("SD2: Instance Zulaman: minute decrease to %u.", m_auiEncounter[7]); - m_uiEventTimer = MINUTE*IN_MILLISECONDS; - } - else - m_uiEventTimer -= uiDiff; + m_uiEventTimer = MINUTE*IN_MILLISECONDS; } + else + m_uiEventTimer -= uiDiff; } -}; +} InstanceData* GetInstanceData_instance_zulaman(Map* pMap) { @@ -357,6 +404,7 @@ InstanceData* GetInstanceData_instance_zulaman(Map* pMap) void AddSC_instance_zulaman() { Script* pNewScript; + pNewScript = new Script; pNewScript->Name = "instance_zulaman"; pNewScript->GetInstanceData = &GetInstanceData_instance_zulaman; diff --git a/scripts/eastern_kingdoms/zulaman/zulaman.cpp b/scripts/eastern_kingdoms/zulaman/zulaman.cpp index 3ae18db..99a1ee3 100644 --- a/scripts/eastern_kingdoms/zulaman/zulaman.cpp +++ b/scripts/eastern_kingdoms/zulaman/zulaman.cpp @@ -59,7 +59,7 @@ struct MANGOS_DLL_DECL npc_forest_frogAI : public ScriptedAI uint32 cEntry = 0; switch(urand(0, 10)) { - case 0: cEntry = 24024; break; //Kraz + case 0: cEntry = 24024; break; //Kraz // wrong here? case 1: cEntry = 24397; break; //Mannuth case 2: cEntry = 24403; break; //Deez case 3: cEntry = 24404; break; //Galathryn @@ -143,7 +143,7 @@ struct MANGOS_DLL_DECL npc_harrison_jones_zaAI : public npc_escortAI case 1: DoScriptText(SAY_AT_GONG, m_creature); - if (GameObject* pEntranceDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(DATA_GO_GONG))) + if (GameObject* pEntranceDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_STRANGE_GONG)) pEntranceDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); //Start bang gong for 2min @@ -223,7 +223,7 @@ bool GOUse_go_strange_gong(Player* pPlayer, GameObject* pGo) if (pInstance->GetData(TYPE_EVENT_RUN) == SPECIAL) { - if (Creature* pCreature = pGo->GetMap()->GetCreature(pInstance->GetData64(DATA_HARRISON))) + if (Creature* pCreature = pInstance->GetSingleCreatureFromStorage(NPC_HARRISON)) { if (npc_harrison_jones_zaAI* pHarrisonAI = dynamic_cast(pCreature->AI())) pHarrisonAI->SetHoldState(false); diff --git a/scripts/eastern_kingdoms/zulaman/zulaman.h b/scripts/eastern_kingdoms/zulaman/zulaman.h index 1996052..2d68045 100644 --- a/scripts/eastern_kingdoms/zulaman/zulaman.h +++ b/scripts/eastern_kingdoms/zulaman/zulaman.h @@ -7,10 +7,11 @@ enum InstanceZA { - MAX_ENCOUNTER = 7, + MAX_ENCOUNTER = 8, MAX_VENDOR = 2, + MAX_CHESTS = 4, - SAY_INST_RELEASE = -1568067, + SAY_INST_RELEASE = -1568067, // TODO Event NYI SAY_INST_BEGIN = -1568068, SAY_INST_PROGRESS_1 = -1568069, SAY_INST_PROGRESS_2 = -1568070, @@ -37,24 +38,109 @@ enum InstanceZA TYPE_RAND_VENDOR_1 = 8, TYPE_RAND_VENDOR_2 = 9, - DATA_AKILZON = 10, - DATA_NALORAKK = 11, - DATA_JANALAI = 12, - DATA_HALAZZI = 13, - DATA_MALACRASS = 14, - DATA_ZULJIN = 15, - DATA_HARRISON = 16, - DATA_SPIRIT_LYNX = 17, + TYPE_RUN_EVENT_TIME = 10, - DATA_J_EGGS_RIGHT = 19, - DATA_J_EGGS_LEFT = 20, + TYPE_J_EGGS_RIGHT = 11, + TYPE_J_EGGS_LEFT = 12, - DATA_GO_GONG = 21, - DATA_GO_MALACRASS_GATE = 22, - DATA_GO_ENTRANCE = 23, + NPC_AKILZON = 23574, + // NPC_NALORAKK = 23576, + // NPC_JANALAI = 23578, + NPC_HALAZZI = 23577, + NPC_MALACRASS = 24239, + // NPC_ZULJIN = 23863, NPC_EGG = 23817, - NPC_SPIRIT_LYNX = 24143 + NPC_SPIRIT_LYNX = 24143, + + NPC_HARRISON = 24358, + // Time Run Event NPCs + NPC_TANZAR = 23790, // at bear + NPC_KRAZ = 24024, // at phoenix + NPC_ASHLI = 24001, // at lynx + NPC_HARKOR = 23999, // at eagle + // unused (TODO or TODO with DB-tools) + NPC_TANZAR_CORPSE = 24442, + NPC_KRAZ_CORPSE = 24444, + NPC_ASHIL_CORPSE = 24441, + NPC_HARKOR_CORPSE = 24443, + + GO_STRANGE_GONG = 187359, + GO_MASSIVE_GATE = 186728, + GO_WIND_DOOR = 186858, + GO_LYNX_TEMPLE_ENTRANCE = 186304, + GO_LYNX_TEMPLE_EXIT = 186303, + GO_HEXLORD_ENTRANCE = 186305, + GO_WOODEN_DOOR = 186306, + GO_FIRE_DOOR = 186859, + + // unused, expected to be possible to handle within Database! + GO_TANZARS_TRUNK = 186648, + GO_KRAZS_PACKAGE = 186667, + GO_ASHLIS_BAG = 186672, + GO_HARKORS_SATCHEL = 187021, +}; + +enum BossToChestIndex +{ + INDEX_NALORAKK = 0, + INDEX_JANALAI = 1, + INDEX_HALAZZI = 2, + INDEX_AKILZON = 3 +}; + +enum RunEventSteps +{ + RUN_START = 1, + RUN_FAIL = 2, + RUN_DONE = 3, + RUN_PROGRESS = 4, + RUN_FAIL_SOON = 5 +}; + +struct TimeEventNpcInfo +{ + TimeEventNpcInfo() : uiSavePosition(0) {} + + uint8 uiSavePosition; // stores in what order this npc was saved (0 means unsaved) + ObjectGuid npGuid; +}; + +class MANGOS_DLL_DECL instance_zulaman : public ScriptedInstance +{ + public: + instance_zulaman(Map* pMap); + + void Initialize(); + bool IsEncounterInProgress() const; + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + const char* Save() { return m_strInstData.c_str(); } + void Load(const char* chrIn); + + void Update(uint32 uiDiff); + + private: + uint8 GetKilledPreBosses(); + void DoTimeRunSay(RunEventSteps uiData); + void DoChestEvent(BossToChestIndex uiIndex); + + std::string m_strInstData; + uint32 m_auiEncounter[MAX_ENCOUNTER]; + uint32 m_auiRandVendor[MAX_VENDOR]; + TimeEventNpcInfo m_aEventNpcInfo[MAX_CHESTS]; + + uint32 m_uiEventTimer; + uint32 m_uiGongCount; + + GUIDList m_lEggsGUIDList; + uint32 m_uiEggsRemainingCount_Left; + uint32 m_uiEggsRemainingCount_Right; }; #endif diff --git a/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp b/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp index e9b2077..8054463 100644 --- a/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp +++ b/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp @@ -76,7 +76,7 @@ struct MANGOS_DLL_DECL boss_arlokkAI : public ScriptedAI uint32 m_uiSummon_Timer; uint32 m_uiSummonCount; - uint64 m_uiMarkedGUID; + ObjectGuid m_markedGuid; bool m_bIsPhaseTwo; bool m_bIsVanished; @@ -96,7 +96,7 @@ struct MANGOS_DLL_DECL boss_arlokkAI : public ScriptedAI m_bIsPhaseTwo = false; m_bIsVanished = false; - m_uiMarkedGUID = 0; + m_markedGuid.Clear(); m_creature->SetDisplayId(MODEL_ID_NORMAL); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -129,7 +129,7 @@ struct MANGOS_DLL_DECL boss_arlokkAI : public ScriptedAI void DoSummonPhanters() { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiMarkedGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_markedGuid)) { if (pPlayer->isAlive()) DoScriptText(SAY_FEAST_PANTHER, m_creature, pPlayer); @@ -141,7 +141,7 @@ struct MANGOS_DLL_DECL boss_arlokkAI : public ScriptedAI void JustSummoned(Creature* pSummoned) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiMarkedGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_markedGuid)) { if (pPlayer->isAlive()) pSummoned->AI()->AttackStart(pPlayer); @@ -172,13 +172,11 @@ struct MANGOS_DLL_DECL boss_arlokkAI : public ScriptedAI if (Player* pMark = pTarget->GetCharmerOrOwnerPlayerOrPlayerItself()) { DoCastSpellIfCan(pMark, SPELL_MARK); - m_uiMarkedGUID = pMark->GetGUID(); + m_markedGuid = pMark->GetObjectGuid(); } else { - if (m_uiMarkedGUID) - m_uiMarkedGUID = 0; - + m_markedGuid.Clear(); error_log("SD2: boss_arlokk could not accuire a new target to mark."); } } diff --git a/scripts/eastern_kingdoms/zulgurub/boss_mandokir.cpp b/scripts/eastern_kingdoms/zulgurub/boss_mandokir.cpp index 2201ac4..96a16f8 100644 --- a/scripts/eastern_kingdoms/zulgurub/boss_mandokir.cpp +++ b/scripts/eastern_kingdoms/zulgurub/boss_mandokir.cpp @@ -91,7 +91,6 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI boss_mandokirAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - m_uiOhganGUID = 0; Reset(); } @@ -110,8 +109,8 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI bool m_bMandokirDownstairs; float m_fTargetThreat; - uint64 m_uiWatchTarget; - uint64 m_uiOhganGUID; + ObjectGuid m_watchTargetGuid; + ObjectGuid m_ohganGuid; void Reset() { @@ -128,9 +127,9 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI m_bMandokirDownstairs = false; m_fTargetThreat = 0.0f; - m_uiWatchTarget = 0; + m_watchTargetGuid.Clear(); - if (Creature* pOhgan = m_creature->GetMap()->GetCreature(m_uiOhganGUID)) + if (Creature* pOhgan = m_creature->GetMap()->GetCreature(m_ohganGuid)) pOhgan->ForcedDespawn(); } @@ -167,7 +166,7 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI if (m_pInstance) { - if (Creature* pJindo = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_JINDO))) + if (Creature* pJindo = m_pInstance->GetSingleCreatureFromStorage(NPC_JINDO)) { if (pJindo->isAlive()) DoScriptText(SAY_GRATS_JINDO, pJindo); @@ -207,7 +206,7 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI { if (pSummoned->GetEntry() == NPC_OHGAN) { - m_uiOhganGUID = pSummoned->GetGUID(); + m_ohganGuid = pSummoned->GetObjectGuid(); if (m_creature->getVictim()) pSummoned->AI()->AttackStart(m_creature->getVictim()); @@ -217,7 +216,7 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI void SummonedCreatureDespawn(Creature* pSummoned) { if (pSummoned->GetEntry() == NPC_OHGAN) - m_uiOhganGUID = 0; + m_ohganGuid.Clear(); } void SpellHitTarget(Unit* pTarget, const SpellEntry* pSpell) @@ -227,7 +226,7 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI DoScriptText(SAY_WATCH, m_creature, pTarget); DoScriptText(SAY_WATCH_WHISPER, m_creature, pTarget); - m_uiWatchTarget = pTarget->GetGUID(); + m_watchTargetGuid = pTarget->GetObjectGuid(); m_fTargetThreat = m_creature->getThreatManager().getThreat(pTarget); m_uiWatch_Timer = 6000; @@ -267,9 +266,9 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI if (m_uiWatch_Timer < uiDiff) { //If someone is watched - if (m_uiWatchTarget) + if (m_watchTargetGuid) { - Player* pWatchTarget = m_creature->GetMap()->GetPlayer(m_uiWatchTarget); + Player* pWatchTarget = m_creature->GetMap()->GetPlayer(m_watchTargetGuid); //If threat is higher that previously saved, mandokir will act if (pWatchTarget && pWatchTarget->isAlive() && m_creature->getThreatManager().getThreat(pWatchTarget) > m_fTargetThreat) @@ -280,7 +279,7 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI DoCastSpellIfCan(pWatchTarget, SPELL_CHARGE); } - m_uiWatchTarget = 0; + m_watchTargetGuid.Clear(); } else { @@ -296,7 +295,7 @@ struct MANGOS_DLL_DECL boss_mandokirAI : public ScriptedAI else m_uiWatch_Timer -= uiDiff; - if (!m_uiWatchTarget) + if (!m_watchTargetGuid) { //Cleave if (m_uiCleave_Timer < uiDiff) diff --git a/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp b/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp index 2586217..c8e011b 100644 --- a/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp +++ b/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp @@ -191,9 +191,9 @@ struct MANGOS_DLL_DECL boss_thekalAI : public boss_thekalBaseAI m_pInstance->SetData(TYPE_THEKAL, DONE); // remove the two adds - if (Creature* pZath = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_ZATH))) + if (Creature* pZath = m_pInstance->GetSingleCreatureFromStorage(NPC_ZATH)) pZath->ForcedDespawn(); - if (Creature* pLorkhan = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LORKHAN))) + if (Creature* pLorkhan = m_pInstance->GetSingleCreatureFromStorage(NPC_LORKHAN)) pLorkhan->ForcedDespawn(); } @@ -211,12 +211,12 @@ struct MANGOS_DLL_DECL boss_thekalAI : public boss_thekalBaseAI return false; // Else Prevent them Resurrecting - if (Creature* pLorkhan = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LORKHAN))) + if (Creature* pLorkhan = m_pInstance->GetSingleCreatureFromStorage(NPC_LORKHAN)) { if (boss_thekalBaseAI* pFakerAI = dynamic_cast(pLorkhan->AI())) pFakerAI->PreventRevive(); } - Creature* pZath = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_ZATH)); + if (Creature* pZath = m_pInstance->GetSingleCreatureFromStorage(NPC_ZATH)) { if (boss_thekalBaseAI* pFakerAI = dynamic_cast(pZath->AI())) pFakerAI->PreventRevive(); @@ -455,8 +455,8 @@ struct MANGOS_DLL_DECL mob_zealot_lorkhanAI : public boss_thekalBaseAI { if (m_pInstance) { - Creature* pThekal = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_THEKAL)); - Creature* pZath = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_ZATH)); + Creature* pThekal = m_pInstance->GetSingleCreatureFromStorage(NPC_THEKAL); + Creature* pZath = m_pInstance->GetSingleCreatureFromStorage(NPC_ZATH); switch(urand(0, 1)) { diff --git a/scripts/eastern_kingdoms/zulgurub/instance_zulgurub.cpp b/scripts/eastern_kingdoms/zulgurub/instance_zulgurub.cpp index 9ae3320..9a77eca 100644 --- a/scripts/eastern_kingdoms/zulgurub/instance_zulgurub.cpp +++ b/scripts/eastern_kingdoms/zulgurub/instance_zulgurub.cpp @@ -25,11 +25,6 @@ EndScriptData */ #include "zulgurub.h" instance_zulgurub::instance_zulgurub(Map* pMap) : ScriptedInstance(pMap), - m_uiLorKhanGUID(0), - m_uiZathGUID(0), - m_uiThekalGUID(0), - m_uiJindoGUID(0), - m_uiHakkarGUID(0), m_bHasIntroYelled(false), m_bHasAltarYelled(false) { @@ -45,19 +40,13 @@ void instance_zulgurub::DoYellAtTriggerIfCan(uint32 uiTriggerId) { if (uiTriggerId == AREATRIGGER_ENTER && !m_bHasIntroYelled) { - if (Creature* pHakkar = instance->GetCreature(m_uiHakkarGUID)) - { - DoScriptText(SAY_HAKKAR_PROTECT, pHakkar); - m_bHasIntroYelled = true; - } + DoOrSimulateScriptTextForThisInstance(SAY_HAKKAR_PROTECT, NPC_HAKKAR); + m_bHasIntroYelled = true; } else if (uiTriggerId == AREATRIGGER_ALTAR && !m_bHasAltarYelled) { - if (Creature* pHakkar = instance->GetCreature(m_uiHakkarGUID)) - { - DoScriptText(SAY_MINION_DESTROY, pHakkar); - m_bHasAltarYelled = true; - } + DoOrSimulateScriptTextForThisInstance(SAY_MINION_DESTROY, NPC_HAKKAR); + m_bHasAltarYelled = true; } } @@ -66,19 +55,11 @@ void instance_zulgurub::OnCreatureCreate(Creature* pCreature) switch(pCreature->GetEntry()) { case NPC_LORKHAN: - m_uiLorKhanGUID = pCreature->GetGUID(); - break; case NPC_ZATH: - m_uiZathGUID = pCreature->GetGUID(); - break; case NPC_THEKAL: - m_uiThekalGUID = pCreature->GetGUID(); - break; case NPC_JINDO: - m_uiJindoGUID = pCreature->GetGUID(); - break; case NPC_HAKKAR: - m_uiHakkarGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); break; } } @@ -122,7 +103,7 @@ void instance_zulgurub::SetData(uint32 uiType, uint32 uiData) // Each time High Priest dies lower Hakkar's HP void instance_zulgurub::DoLowerHakkarHitPoints() { - if (Creature* pHakkar = instance->GetCreature(m_uiHakkarGUID)) + if (Creature* pHakkar = GetSingleCreatureFromStorage(NPC_HAKKAR)) { if (pHakkar->isAlive() && pHakkar->GetMaxHealth() > HP_LOSS_PER_PRIEST) { @@ -163,20 +144,6 @@ uint32 instance_zulgurub::GetData(uint32 uiType) return 0; } -uint64 instance_zulgurub::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_LORKHAN: return m_uiLorKhanGUID; - case NPC_ZATH: return m_uiZathGUID; - case NPC_THEKAL: return m_uiThekalGUID; - case NPC_JINDO: return m_uiJindoGUID; - case NPC_HAKKAR: return m_uiHakkarGUID; - default: - return 0; - } -} - InstanceData* GetInstanceData_instance_zulgurub(Map* pMap) { return new instance_zulgurub(pMap); diff --git a/scripts/eastern_kingdoms/zulgurub/zulgurub.h b/scripts/eastern_kingdoms/zulgurub/zulgurub.h index db72b38..0d481dd 100644 --- a/scripts/eastern_kingdoms/zulgurub/zulgurub.h +++ b/scripts/eastern_kingdoms/zulgurub/zulgurub.h @@ -47,7 +47,6 @@ class MANGOS_DLL_DECL instance_zulgurub : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -60,12 +59,6 @@ class MANGOS_DLL_DECL instance_zulgurub : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiLorKhanGUID; - uint64 m_uiZathGUID; - uint64 m_uiThekalGUID; - uint64 m_uiJindoGUID; - uint64 m_uiHakkarGUID; - bool m_bHasIntroYelled; bool m_bHasAltarYelled; }; diff --git a/scripts/kalimdor/azuremyst_isle.cpp b/scripts/kalimdor/azuremyst_isle.cpp index 8c473e4..f7e69f2 100644 --- a/scripts/kalimdor/azuremyst_isle.cpp +++ b/scripts/kalimdor/azuremyst_isle.cpp @@ -103,7 +103,7 @@ struct MANGOS_DLL_DECL npc_draenei_survivorAI : public ScriptedAI void SpellHit(Unit* pCaster, const SpellEntry* pSpell) { - if (pSpell->SpellFamilyFlags2 & 0x080000000) + if (pSpell->IsFitToFamilyMask(UI64LIT(0x0000000000000000), 0x080000000)) { m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); m_creature->SetStandState(UNIT_STAND_STATE_STAND); diff --git a/scripts/kalimdor/blackfathom_deeps/blackfathom_deeps.h b/scripts/kalimdor/blackfathom_deeps/blackfathom_deeps.h index ab45423..cf14df7 100644 --- a/scripts/kalimdor/blackfathom_deeps/blackfathom_deeps.h +++ b/scripts/kalimdor/blackfathom_deeps/blackfathom_deeps.h @@ -112,8 +112,6 @@ class MANGOS_DLL_DECL instance_blackfathom_deeps : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiKelrisGUID; - uint64 m_uiPortalGUID; uint32 m_uiSpawnMobsTimer[MAX_FIRES]; uint8 m_uiWaveCounter; diff --git a/scripts/kalimdor/blackfathom_deeps/instance_blackfathom_deeps.cpp b/scripts/kalimdor/blackfathom_deeps/instance_blackfathom_deeps.cpp index 7eade5c..9acf43a 100644 --- a/scripts/kalimdor/blackfathom_deeps/instance_blackfathom_deeps.cpp +++ b/scripts/kalimdor/blackfathom_deeps/instance_blackfathom_deeps.cpp @@ -30,8 +30,6 @@ EndScriptData */ */ instance_blackfathom_deeps::instance_blackfathom_deeps(Map* pMap) : ScriptedInstance(pMap), - m_uiKelrisGUID(0), - m_uiPortalGUID(0), m_uiWaveCounter(0) { Initialize(); @@ -46,7 +44,7 @@ void instance_blackfathom_deeps::Initialize() void instance_blackfathom_deeps::OnCreatureCreate(Creature* pCreature) { if (pCreature->GetEntry() == NPC_KELRIS) - m_uiKelrisGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[NPC_KELRIS] = pCreature->GetObjectGuid(); } void instance_blackfathom_deeps::OnObjectCreate(GameObject* pGo) @@ -57,7 +55,7 @@ void instance_blackfathom_deeps::OnObjectCreate(GameObject* pGo) if (m_auiEncounter[1] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - m_uiPortalGUID = pGo->GetGUID(); + m_mGoEntryGuidStore[GO_PORTAL_DOOR] = pGo->GetObjectGuid(); break; case GO_SHRINE_1: case GO_SHRINE_2: @@ -71,7 +69,7 @@ void instance_blackfathom_deeps::OnObjectCreate(GameObject* pGo) void instance_blackfathom_deeps::DoSpawnMobs(uint8 uiWaveIndex) { - Creature* pKelris = instance->GetCreature(m_uiKelrisGUID); + Creature* pKelris = GetSingleCreatureFromStorage(NPC_KELRIS); if (!pKelris) return; @@ -125,7 +123,7 @@ void instance_blackfathom_deeps::SetData(uint32 uiType, uint32 uiData) ++m_uiWaveCounter; } else if (uiData == DONE) - DoUseDoorOrButton(m_uiPortalGUID); + DoUseDoorOrButton(GO_PORTAL_DOOR); break; } diff --git a/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.cpp b/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.cpp index 0157515..192a751 100644 --- a/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.cpp +++ b/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.cpp @@ -299,10 +299,10 @@ struct MANGOS_DLL_DECL npc_time_riftAI : public ScriptedAI // uncomment the following if something doesn't work correctly, otherwise just delete // m_creature->UpdateAllowedPositionZ(x, y, z); - if (Unit *Summon = m_creature->SummonCreature(creature_entry, x, y, z, m_creature->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + if (Unit* pSummon = m_creature->SummonCreature(creature_entry, x, y, z, m_creature->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { - if (Creature *temp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MEDIVH))) - Summon->AddThreat(temp); + if (Creature* pMedivh = m_pInstance->GetSingleCreatureFromStorage(NPC_MEDIVH)) + pSummon->AddThreat(pMedivh); } } diff --git a/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.h b/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.h index 5435100..d03dc0a 100644 --- a/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.h +++ b/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.h @@ -52,7 +52,6 @@ class MANGOS_DLL_DECL instance_dark_portal : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); void Update(uint32 uiDiff); @@ -72,8 +71,6 @@ class MANGOS_DLL_DECL instance_dark_portal : public ScriptedInstance uint8 m_uiRiftWaveId; uint32 m_uiNextPortalTimer; - - uint64 m_uiMedivhGUID; uint8 m_uiCurrentRiftId; }; diff --git a/scripts/kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp b/scripts/kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp index 18b4566..af5b87e 100644 --- a/scripts/kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp +++ b/scripts/kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp @@ -50,8 +50,7 @@ static Wave RiftWaves[]= {NPC_AEONUS, 0} }; -instance_dark_portal::instance_dark_portal(Map* pMap) : ScriptedInstance(pMap), - m_uiMedivhGUID(0) +instance_dark_portal::instance_dark_portal(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -93,7 +92,7 @@ void instance_dark_portal::OnPlayerEnter(Player* pPlayer) void instance_dark_portal::OnCreatureCreate(Creature* pCreature) { if (pCreature->GetEntry() == NPC_MEDIVH) - m_uiMedivhGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[NPC_MEDIVH] = pCreature->GetObjectGuid(); } // what other conditions to check? @@ -135,7 +134,7 @@ void instance_dark_portal::SetData(uint32 uiType, uint32 uiData) if (!m_uiShieldPercent) { - if (Creature* pMedivh = instance->GetCreature(m_uiMedivhGUID)) + if (Creature* pMedivh = GetSingleCreatureFromStorage(NPC_MEDIVH)) { if (pMedivh->isAlive()) { @@ -208,14 +207,6 @@ uint32 instance_dark_portal::GetData(uint32 uiType) } } -uint64 instance_dark_portal::GetData64(uint32 uiData) -{ - if (uiData == NPC_MEDIVH) - return m_uiMedivhGUID; - - return 0; -} - Creature* instance_dark_portal::SummonedPortalBoss(Creature* pSource) { uint32 uiEntry = RiftWaves[GetRiftWaveId()].PortalBoss; @@ -239,7 +230,7 @@ Creature* instance_dark_portal::SummonedPortalBoss(Creature* pSource) void instance_dark_portal::DoSpawnPortal() { - if (Creature* pMedivh = instance->GetCreature(m_uiMedivhGUID)) + if (Creature* pMedivh = GetSingleCreatureFromStorage(NPC_MEDIVH)) { uint8 uiTmp = urand(0, 2); diff --git a/scripts/kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp b/scripts/kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp index 19f5c33..623747a 100644 --- a/scripts/kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp +++ b/scripts/kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp @@ -76,21 +76,15 @@ struct mob_ancient_wispAI : public ScriptedAI mob_ancient_wispAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - ArchimondeGUID = 0; Reset(); } ScriptedInstance* m_pInstance; - uint64 ArchimondeGUID; uint32 CheckTimer; void Reset() { CheckTimer = 1000; - - if (m_pInstance) - ArchimondeGUID = m_pInstance->GetData64(DATA_ARCHIMONDE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -98,9 +92,12 @@ struct mob_ancient_wispAI : public ScriptedAI void UpdateAI(const uint32 diff) { + if (!m_pInstance) + return; + if (CheckTimer < diff) { - if (Creature* Archimonde = m_creature->GetMap()->GetCreature(ArchimondeGUID)) + if (Creature* Archimonde = m_pInstance->GetSingleCreatureFromStorage(NPC_ARCHIMONDE)) { if (Archimonde->GetHealthPercent() < 2.0f || !Archimonde->isAlive()) DoCastSpellIfCan(m_creature, SPELL_DENOUEMENT_WISP); @@ -130,33 +127,33 @@ struct MANGOS_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI { mob_doomfire_targettingAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - uint64 TargetGUID; - uint32 ChangeTargetTimer; + ObjectGuid m_targetGuid; + uint32 m_uiChangeTargetTimer; void Reset() { - TargetGUID = 0; - ChangeTargetTimer = 5000; + m_targetGuid.Clear(); + m_uiChangeTargetTimer = 5000; } - void MoveInLineOfSight(Unit* who) + void MoveInLineOfSight(Unit* pWwho) { - //will update once TargetGUID is 0. In case noone actually moves(not likely) and this is 0 + //will update once m_targetGuid is 0. In case noone actually moves(not likely) and this is 0 //when UpdateAI needs it, it will be forced to select randomPoint - if (!TargetGUID && who->GetTypeId() == TYPEID_PLAYER) - TargetGUID = who->GetGUID(); + if (!m_targetGuid && pWwho->GetTypeId() == TYPEID_PLAYER) + m_targetGuid = pWwho->GetObjectGuid(); } - void DamageTaken(Unit *done_by, uint32 &damage) { damage = 0; } + void DamageTaken(Unit* pDealer, uint32& uiDamage) { uiDamage = 0; } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (ChangeTargetTimer < diff) + if (m_uiChangeTargetTimer < uiDiff) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(TargetGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_targetGuid)) { m_creature->GetMotionMaster()->MoveFollow(pPlayer, 0.0f, 0.0f); - TargetGUID = 0; + m_targetGuid.Clear(); } else { @@ -165,8 +162,8 @@ struct MANGOS_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI m_creature->GetMotionMaster()->MovePoint(0, x, y, z); } - ChangeTargetTimer = 5000; - }else ChangeTargetTimer -= diff; + m_uiChangeTargetTimer = 5000; + }else m_uiChangeTargetTimer -= uiDiff; } }; @@ -188,8 +185,8 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 DoomfireSpiritGUID; - uint64 WorldTreeGUID; + ObjectGuid m_doomfireSpiritGuid; + ObjectGuid m_worldTreeGuid; uint32 DrainNordrassilTimer; uint32 FearTimer; @@ -210,17 +207,14 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI void Reset() { - if (m_pInstance) - m_pInstance->SetData(TYPE_ARCHIMONDE, NOT_STARTED); - - DoomfireSpiritGUID = 0; - WorldTreeGUID = 0; + m_doomfireSpiritGuid.Clear(); + m_worldTreeGuid.Clear(); DrainNordrassilTimer = 0; - FearTimer = 30000; - AirBurstTimer = 20000; - GripOfTheLegionTimer = urand(5000, 15000); - DoomfireTimer = 15000; + FearTimer = 42000; + AirBurstTimer = 30000; + GripOfTheLegionTimer = urand(5000, 25000); + DoomfireTimer = 20000; MeleeRangeCheckTimer = 15000; HandOfDeathTimer = 2000; WispCount = 0; // When ~30 wisps are summoned, Archimonde dies @@ -237,9 +231,6 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI { m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL); DoScriptText(SAY_AGGRO, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_ARCHIMONDE, IN_PROGRESS); } void KilledUnit(Unit* pVictim) @@ -277,9 +268,6 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI void JustDied(Unit *victim) { DoScriptText(SAY_DEATH, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_ARCHIMONDE, DONE); } bool CanUseFingerOfDeath() @@ -332,7 +320,7 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI if (pSummoned->GetEntry() == CREATURE_DOOMFIRE_SPIRIT) { - DoomfireSpiritGUID = pSummoned->GetGUID(); + m_doomfireSpiritGuid = pSummoned->GetObjectGuid(); } if (pSummoned->GetEntry() == CREATURE_DOOMFIRE) @@ -340,10 +328,10 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI pSummoned->CastSpell(pSummoned,SPELL_DOOMFIRE_SPAWN,false); pSummoned->CastSpell(pSummoned, SPELL_DOOMFIRE, true, NULL, NULL, m_creature->GetObjectGuid()); - if (Creature* pDoomfireSpirit = m_creature->GetMap()->GetCreature(DoomfireSpiritGUID)) + if (Creature* pDoomfireSpirit = m_creature->GetMap()->GetCreature(m_doomfireSpiritGuid)) { pSummoned->GetMotionMaster()->MoveFollow(pDoomfireSpirit,0.0f,0.0f); - DoomfireSpiritGUID = 0; + m_doomfireSpiritGuid.Clear(); } } } @@ -353,11 +341,11 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI { m_creature->SummonCreature(CREATURE_DOOMFIRE_SPIRIT, target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, - TEMPSUMMON_TIMED_DESPAWN, 35000); + TEMPSUMMON_TIMED_DESPAWN, 27000); m_creature->SummonCreature(CREATURE_DOOMFIRE, target->GetPositionX()-15.0,target->GetPositionY()-15.0,target->GetPositionZ(),0, - TEMPSUMMON_TIMED_DESPAWN, 35000); + TEMPSUMMON_TIMED_DESPAWN, 27000); } void UpdateAI(const uint32 diff) @@ -386,9 +374,9 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI Creature *temp = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1200000); if (temp) - WorldTreeGUID = temp->GetGUID(); + m_worldTreeGuid = temp->GetObjectGuid(); - if (Creature *Nordrassil = m_creature->GetMap()->GetCreature(WorldTreeGUID)) + if (Creature *Nordrassil = m_creature->GetMap()->GetCreature(m_worldTreeGuid)) { Nordrassil->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Nordrassil->SetDisplayId(11686); @@ -397,7 +385,7 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI } } - if (Creature *Nordrassil = m_creature->GetMap()->GetCreature(WorldTreeGUID)) + if (Creature *Nordrassil = m_creature->GetMap()->GetCreature(m_worldTreeGuid)) { Nordrassil->CastSpell(m_creature, SPELL_DRAIN_WORLD_TREE_2, true); DrainNordrassilTimer = 1000; @@ -452,7 +440,7 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI m_creature->GetMotionMaster()->MoveIdle(); //all members of raid must get this buff - DoCastSpellIfCan(m_creature, SPELL_PROTECTION_OF_ELUNE); + DoCastSpellIfCan(m_creature->getVictim(), SPELL_PROTECTION_OF_ELUNE); HasProtected = true; Enraged = true; } @@ -472,7 +460,7 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI { if (HandOfDeathTimer < diff) { - DoCastSpellIfCan(m_creature, SPELL_HAND_OF_DEATH); + DoCastSpellIfCan(m_creature->getVictim(), SPELL_HAND_OF_DEATH); HandOfDeathTimer = 2000; }else HandOfDeathTimer -= diff; return; // Don't do anything after this point. @@ -483,7 +471,7 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) DoCastSpellIfCan(pTarget, SPELL_GRIP_OF_THE_LEGION); - GripOfTheLegionTimer = urand(5000, 15000); + GripOfTheLegionTimer = urand(5000, 25000); }else GripOfTheLegionTimer -= diff; if (AirBurstTimer < diff) @@ -495,13 +483,13 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1)) DoCastSpellIfCan(pTarget, SPELL_AIR_BURST); - AirBurstTimer = urand(15000, 20000); + AirBurstTimer = urand(25000, 40000); }else AirBurstTimer -= diff; if (FearTimer < diff) { - DoCastSpellIfCan(m_creature, SPELL_FEAR); - FearTimer = 30000; + DoCastSpellIfCan(m_creature->getVictim(), SPELL_FEAR); + FearTimer = 42000; }else FearTimer -= diff; if (DoomfireTimer < diff) @@ -519,7 +507,7 @@ struct MANGOS_DLL_DECL boss_archimondeAI : public ScriptedAI SummonDoomfire(temp); //supposedly three doomfire can be up at the same time - DoomfireTimer = urand(10000, 15000); + DoomfireTimer = 20000; }else DoomfireTimer -= diff; if (MeleeRangeCheckTimer < diff) diff --git a/scripts/kalimdor/caverns_of_time/hyjal/hyjal.cpp b/scripts/kalimdor/caverns_of_time/hyjal/hyjal.cpp index 8afe4ca..1f715bd 100644 --- a/scripts/kalimdor/caverns_of_time/hyjal/hyjal.cpp +++ b/scripts/kalimdor/caverns_of_time/hyjal/hyjal.cpp @@ -192,7 +192,7 @@ bool GossipHello_npc_tyrande_whisperwind(Player* pPlayer, Creature* pCreature) if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature->GetInstanceData()) { // Only let them get item if Azgalor is dead. - if (pInstance->GetData(TYPE_AZGALOR) == DONE && !pPlayer->HasItemCount(ITEM_TEAR_OF_GODDESS,1)) + if (pInstance->GetData(TYPE_AZGALOR) == DONE && !pPlayer->HasItemCount(ITEM_TEAR_OF_GODDESS, 1)) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); } diff --git a/scripts/kalimdor/caverns_of_time/hyjal/hyjal.h b/scripts/kalimdor/caverns_of_time/hyjal/hyjal.h index 4c0d83c..f285528 100644 --- a/scripts/kalimdor/caverns_of_time/hyjal/hyjal.h +++ b/scripts/kalimdor/caverns_of_time/hyjal/hyjal.h @@ -5,67 +5,86 @@ #ifndef DEF_HYJAL_H #define DEF_HYJAL_H -#define ERROR_INST_DATA "SD2: Instance data not set properly for Mount Hyjal. Encounters will be buggy" - -enum eNPC +enum { - NPC_JAINA = 17772, - NPC_THRALL = 17852, - NPC_TYRANDE = 17948, + MAX_ENCOUNTER = 5, + + TYPE_WINTERCHILL = 0, + TYPE_ANETHERON = 1, + // TYPE_ANETHERON_OLD = 2, // Used in Acid + TYPE_KAZROGAL = 3, + TYPE_AZGALOR = 4, + TYPE_ARCHIMONDE = 5, + + // TYPE_AZGALOR_OLD = 6, // Used in Acid + TYPE_TRASH_COUNT = 7, + TYPE_RETREAT = 8, + + // ACID scripted, don't touch id's (or provide update for ACID), in Acid scripted SetData types: 11, 2, 9, 6 and 14 + // TYPE_WINTERCHILL_OLD = 11, + // DATA_TRASH_OLD = 14, + // TYPE_KAZROGAL_OLD = 9, + + WORLD_STATE_WAVES = 2842, + WORLD_STATE_ENEMY = 2453, + WORLD_STATE_ENEMYCOUNT = 2454, + + NPC_JAINA = 17772, + NPC_THRALL = 17852, + NPC_TYRANDE = 17948, // Bosses summoned after every 8 waves - NPC_WINTERCHILL = 17767, - NPC_ANETHERON = 17808, - NPC_KAZROGAL = 17888, - NPC_AZGALOR = 17842, - NPC_ARCHIMONDE = 17968, + NPC_WINTERCHILL = 17767, + NPC_ANETHERON = 17808, + NPC_KAZROGAL = 17888, + NPC_AZGALOR = 17842, + NPC_ARCHIMONDE = 17968, // Trash Mobs summoned in waves - NPC_NECRO = 17899, - NPC_ABOMI = 17898, - NPC_GHOUL = 17895, - NPC_BANSH = 17905, - NPC_CRYPT = 17897, - NPC_GARGO = 17906, - NPC_FROST = 17907, - NPC_GIANT = 17908, - NPC_STALK = 17916, - - NPC_WATER_ELEMENTAL = 18001, - NPC_DIRE_WOLF = 17854, - - GO_ANCIENT_GEM = 185557 + NPC_NECRO = 17899, + NPC_ABOMI = 17898, + NPC_GHOUL = 17895, + NPC_BANSH = 17905, + NPC_CRYPT = 17897, + NPC_GARGO = 17906, + NPC_FROST = 17907, + NPC_GIANT = 17908, + NPC_STALK = 17916, + + NPC_WATER_ELEMENTAL = 18001, + NPC_DIRE_WOLF = 17854, + + GO_ANCIENT_GEM = 185557, }; -enum +class MANGOS_DLL_DECL instance_mount_hyjal : public ScriptedInstance { - MAX_ENCOUNTER = 5, + public: + instance_mount_hyjal(Map* pMap); - WORLD_STATE_WAVES = 2842, - WORLD_STATE_ENEMY = 2453, - WORLD_STATE_ENEMYCOUNT = 2454, + void Initialize(); + bool IsEncounterInProgress() const; + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + + void OnCreatureEnterCombat(Creature* pCreature); + void OnCreatureEvade(Creature* pCreature); + void OnCreatureDeath(Creature* pCreature); - // ACID scripted, don't touch id's (or provide update for ACID) - TYPE_WINTERCHILL = 11, - TYPE_ANETHERON = 2, - TYPE_KAZROGAL = 9, - TYPE_AZGALOR = 6, + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); - TYPE_ARCHIMONDE = 4, + const char* Save() { return m_strSaveData.c_str(); } + void Load(const char* chrIn); - DATA_ANETHERON = 1, - DATA_RAGEWINTERCHILL = 10, - DATA_AZGALOR = 5, - DATA_KAZROGAL = 8, + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + std::string m_strSaveData; - DATA_ARCHIMONDE = 3, - DATA_JAINAPROUDMOORE = 7, - DATA_THRALL = 12, - DATA_TYRANDEWHISPERWIND = 13, + GUIDList lAncientGemGUIDList; - DATA_TRASH = 14, - DATA_RESET_TRASH_COUNT = 15, - TYPE_RETREAT = 16 + uint32 m_uiTrashCount; }; #endif diff --git a/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.cpp b/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.cpp index e7a152c..19dacf3 100644 --- a/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.cpp +++ b/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.cpp @@ -82,9 +82,9 @@ sHyjalYells m_aHyjalYell[]= void hyjalAI::Reset() { - // GUIDs - m_uiBossGUID[0] = 0; - m_uiBossGUID[1] = 0; + // BossGuids + m_aBossGuid[0].Clear(); + m_aBossGuid[1].Clear(); // Timers m_uiNextWaveTimer = 10000; @@ -126,11 +126,11 @@ void hyjalAI::Reset() if (!m_pInstance) return; - m_bIsFirstBossDead = m_uiBase ? m_pInstance->GetData(TYPE_KAZROGAL) : m_pInstance->GetData(TYPE_WINTERCHILL); - m_bIsSecondBossDead = m_uiBase ? m_pInstance->GetData(TYPE_AZGALOR) : m_pInstance->GetData(TYPE_ANETHERON); + m_bIsFirstBossDead = m_uiBase ? m_pInstance->GetData(TYPE_KAZROGAL) == DONE : m_pInstance->GetData(TYPE_WINTERCHILL) == DONE; + m_bIsSecondBossDead = m_uiBase ? m_pInstance->GetData(TYPE_AZGALOR) == DONE : m_pInstance->GetData(TYPE_ANETHERON) == DONE; // Reset Instance Data for trash count - m_pInstance->SetData(DATA_RESET_TRASH_COUNT, 0); + m_pInstance->SetData(TYPE_TRASH_COUNT, 0); } void hyjalAI::EnterEvadeMode() @@ -151,8 +151,8 @@ void hyjalAI::JustReachedHome() if (m_uiBase == BASE_ALLY) DoCastSpellIfCan(m_creature, SPELL_BRILLIANCE_AURA, CAST_TRIGGERED); - m_bIsFirstBossDead = m_uiBase ? m_pInstance->GetData(TYPE_KAZROGAL) : m_pInstance->GetData(TYPE_WINTERCHILL); - m_bIsSecondBossDead = m_uiBase ? m_pInstance->GetData(TYPE_AZGALOR) : m_pInstance->GetData(TYPE_ANETHERON); + m_bIsFirstBossDead = m_uiBase ? m_pInstance->GetData(TYPE_KAZROGAL) == DONE : m_pInstance->GetData(TYPE_WINTERCHILL) == DONE; + m_bIsSecondBossDead = m_uiBase ? m_pInstance->GetData(TYPE_AZGALOR) == DONE : m_pInstance->GetData(TYPE_ANETHERON) == DONE; } void hyjalAI::Aggro(Unit *who) @@ -188,7 +188,7 @@ void hyjalAI::SpawnCreatureForWave(uint32 uiMobEntry) } if (pSpawn) - m_creature->SummonCreature(uiMobEntry, pSpawn->m_fX, pSpawn->m_fY, pSpawn->m_fZ, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000); + m_creature->SummonCreature(uiMobEntry, pSpawn->m_fX, pSpawn->m_fY, pSpawn->m_fZ, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); } void hyjalAI::JustSummoned(Creature* pSummoned) @@ -226,14 +226,14 @@ void hyjalAI::JustSummoned(Creature* pSummoned) if (pSummoned->IsWorldBoss()) { if (!m_bIsFirstBossDead) - m_uiBossGUID[0] = pSummoned->GetGUID(); + m_aBossGuid[0] = pSummoned->GetObjectGuid(); else - m_uiBossGUID[1] = pSummoned->GetGUID(); + m_aBossGuid[1] = pSummoned->GetObjectGuid(); m_uiCheckTimer = 5000; } else - lWaveMobGUIDList.push_back(pSummoned->GetGUID()); + lWaveMobGUIDList.push_back(pSummoned->GetObjectGuid()); } void hyjalAI::SummonNextWave() @@ -243,10 +243,7 @@ void hyjalAI::SummonNextWave() DoTalk(RALLY); if (!m_pInstance) - { - error_log(ERROR_INST_DATA); return; - } sHyjalWave* pWaveData = m_uiBase ? &m_aHyjalWavesHorde[m_uiWaveCount] : &m_aHyjalWavesAlliance[m_uiWaveCount]; @@ -256,7 +253,7 @@ void hyjalAI::SummonNextWave() return; } - m_uiEnemyCount = m_pInstance->GetData(DATA_TRASH); + m_uiEnemyCount = m_pInstance->GetData(TYPE_TRASH_COUNT); for(uint8 i = 0; i < MAX_WAVE_MOB; ++i) { @@ -276,7 +273,7 @@ void hyjalAI::SummonNextWave() // Enable world state m_pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 1); - m_pInstance->SetData(DATA_TRASH, m_uiEnemyCount); // Send data for instance script to update count + m_pInstance->SetData(TYPE_TRASH_COUNT, m_uiEnemyCount); // Send data for instance script to update count if (!m_bDebugMode) m_uiNextWaveTimer = pWaveData->m_uiWaveTimer; @@ -390,7 +387,7 @@ void hyjalAI::UpdateAI(const uint32 uiDiff) if (m_uiWaveMoveTimer < uiDiff) { // Skip the master timer, and start next wave in 5. Clear the list, it should not be any here now. - if (!m_pInstance->GetData(DATA_TRASH)) + if (!m_pInstance->GetData(TYPE_TRASH_COUNT)) { lWaveMobGUIDList.clear(); m_uiNextWaveTimer = 5000; @@ -425,18 +422,18 @@ void hyjalAI::UpdateAI(const uint32 uiDiff) { for(uint8 i = 0; i < 2; ++i) { - if (m_uiBossGUID[i]) + if (m_aBossGuid[i]) { - Creature* pBoss = m_creature->GetMap()->GetCreature(m_uiBossGUID[i]); + Creature* pBoss = m_creature->GetMap()->GetCreature(m_aBossGuid[i]); if (pBoss && !pBoss->isAlive()) { - if (m_uiBossGUID[i] == m_uiBossGUID[0]) + if (m_aBossGuid[i] == m_aBossGuid[0]) { DoTalk(INCOMING); m_bIsFirstBossDead = true; } - else if (m_uiBossGUID[i] == m_uiBossGUID[1]) + else if (m_aBossGuid[i] == m_aBossGuid[1]) { DoTalk(SUCCESS); m_bIsSecondBossDead = true; @@ -447,7 +444,7 @@ void hyjalAI::UpdateAI(const uint32 uiDiff) m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - m_uiBossGUID[i] = 0; + m_aBossGuid[i].Clear(); // Reset world state for enemies to disable it m_pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); diff --git a/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.h b/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.h index 29edabc..1ad9ccd 100644 --- a/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.h +++ b/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.h @@ -167,7 +167,7 @@ struct MANGOS_DLL_DECL hyjalAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 m_uiBossGUID[2]; + ObjectGuid m_aBossGuid[2]; uint32 m_uiNextWaveTimer; uint32 m_uiWaveCount; diff --git a/scripts/kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp b/scripts/kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp index 8219874..8da2d37 100644 --- a/scripts/kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp +++ b/scripts/kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp @@ -32,202 +32,192 @@ EndScriptData */ 4 - Archimonde event */ -struct MANGOS_DLL_DECL instance_mount_hyjal : public ScriptedInstance +instance_mount_hyjal::instance_mount_hyjal(Map* pMap) : ScriptedInstance(pMap), + m_uiTrashCount(0) { - instance_mount_hyjal(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strSaveData; - - GUIDList lAncientGemGUIDList; - - uint64 m_uiRageWinterchill; - uint64 m_uiAnetheron; - uint64 m_uiKazrogal; - uint64 m_uiAzgalor; - uint64 m_uiArchimonde; - uint64 m_uiJainaProudmoore; - uint64 m_uiThrall; - uint64 m_uiTyrandeWhisperwind; - - uint32 m_uiTrashCount; - - void Initialize() - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + Initialize(); +} - lAncientGemGUIDList.clear(); +void instance_mount_hyjal::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - m_uiRageWinterchill = 0; - m_uiAnetheron = 0; - m_uiKazrogal = 0; - m_uiAzgalor = 0; - m_uiArchimonde = 0; - m_uiJainaProudmoore = 0; - m_uiThrall = 0; - m_uiTyrandeWhisperwind = 0; +bool instance_mount_hyjal::IsEncounterInProgress() const +{ + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) return true; - m_uiTrashCount = 0; - } + return false; +} - bool IsEncounterInProgress() const - { - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; +void instance_mount_hyjal::OnCreatureCreate(Creature* pCreature) +{ + if (pCreature->GetEntry() == NPC_ARCHIMONDE) + m_mNpcEntryGuidStore[NPC_ARCHIMONDE] == pCreature->GetObjectGuid(); +} - return false; - } +void instance_mount_hyjal::OnObjectCreate(GameObject* pGo) +{ + if (pGo->GetEntry() == GO_ANCIENT_GEM) + lAncientGemGUIDList.push_back(pGo->GetObjectGuid()); +} - void OnCreatureCreate(Creature* pCreature) +void instance_mount_hyjal::OnCreatureEnterCombat(Creature* pCreature) +{ + switch (pCreature->GetEntry()) { - switch(pCreature->GetEntry()) - { - case NPC_WINTERCHILL: m_uiRageWinterchill = pCreature->GetGUID(); break; - case NPC_ANETHERON: m_uiAnetheron = pCreature->GetGUID(); break; - case NPC_KAZROGAL: m_uiKazrogal = pCreature->GetGUID(); break; - case NPC_AZGALOR: m_uiAzgalor = pCreature->GetGUID(); break; - case NPC_ARCHIMONDE: m_uiArchimonde = pCreature->GetGUID(); break; - case NPC_JAINA: m_uiJainaProudmoore = pCreature->GetGUID(); break; - case NPC_THRALL: m_uiThrall = pCreature->GetGUID(); break; - case NPC_TYRANDE: m_uiTyrandeWhisperwind = pCreature->GetGUID(); break; - } + case NPC_WINTERCHILL: SetData(TYPE_WINTERCHILL, IN_PROGRESS); break; + case NPC_ANETHERON: SetData(TYPE_ANETHERON, IN_PROGRESS); break; + case NPC_KAZROGAL: SetData(TYPE_KAZROGAL, IN_PROGRESS); break; + case NPC_AZGALOR: SetData(TYPE_AZGALOR, IN_PROGRESS); break; + case NPC_ARCHIMONDE: SetData(TYPE_ARCHIMONDE, IN_PROGRESS); break; } +} - void OnObjectCreate(GameObject* pGo) +void instance_mount_hyjal::OnCreatureEvade(Creature* pCreature) +{ + switch (pCreature->GetEntry()) { - if (pGo->GetEntry() == GO_ANCIENT_GEM) - lAncientGemGUIDList.push_back(pGo->GetGUID()); + case NPC_WINTERCHILL: SetData(TYPE_WINTERCHILL, FAIL); break; + case NPC_ANETHERON: SetData(TYPE_ANETHERON, FAIL); break; + case NPC_KAZROGAL: SetData(TYPE_KAZROGAL, FAIL); break; + case NPC_AZGALOR: SetData(TYPE_AZGALOR, FAIL); break; + case NPC_ARCHIMONDE: SetData(TYPE_ARCHIMONDE, FAIL); break; } +} - uint64 GetData64(uint32 uiData) +void instance_mount_hyjal::OnCreatureDeath(Creature* pCreature) +{ + switch (pCreature->GetEntry()) { - switch(uiData) - { - case DATA_RAGEWINTERCHILL: return m_uiRageWinterchill; - case DATA_ANETHERON: return m_uiAnetheron; - case DATA_KAZROGAL: return m_uiKazrogal; - case DATA_AZGALOR: return m_uiAzgalor; - case DATA_ARCHIMONDE: return m_uiArchimonde; - case DATA_JAINAPROUDMOORE: return m_uiJainaProudmoore; - case DATA_THRALL: return m_uiThrall; - case DATA_TYRANDEWHISPERWIND: return m_uiTyrandeWhisperwind; - } - - return 0; + case NPC_WINTERCHILL: SetData(TYPE_WINTERCHILL, DONE); break; + case NPC_ANETHERON: SetData(TYPE_ANETHERON, DONE); break; + case NPC_KAZROGAL: SetData(TYPE_KAZROGAL, DONE); break; + case NPC_AZGALOR: SetData(TYPE_AZGALOR, DONE); break; + case NPC_ARCHIMONDE: SetData(TYPE_ARCHIMONDE, DONE); break; + + // Trash Mobs summoned in waves + case NPC_NECRO: + case NPC_ABOMI: + case NPC_GHOUL: + case NPC_BANSH: + case NPC_CRYPT: + case NPC_GARGO: + case NPC_FROST: + case NPC_GIANT: + case NPC_STALK: + // Decrease counter, and update world-state + if (m_uiTrashCount) + { + --m_uiTrashCount; + DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, m_uiTrashCount); + } + break; } +} - void SetData(uint32 uiType, uint32 uiData) +void instance_mount_hyjal::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_WINTERCHILL: - if (m_auiEncounter[0] == DONE) - return; - m_auiEncounter[0] = uiData; - break; - case TYPE_ANETHERON: - if (m_auiEncounter[1] == DONE) - return; - m_auiEncounter[1] = uiData; - break; - case TYPE_KAZROGAL: - if (m_auiEncounter[2] == DONE) - return; - m_auiEncounter[2] = uiData; - break; - case TYPE_AZGALOR: - if (m_auiEncounter[3] == DONE) - return; - m_auiEncounter[3] = uiData; - break; - case TYPE_ARCHIMONDE: - m_auiEncounter[4] = uiData; - break; - - case DATA_RESET_TRASH_COUNT: - m_uiTrashCount = 0; - break; - - case DATA_TRASH: - if (uiData) - m_uiTrashCount = uiData; - else - --m_uiTrashCount; - - DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, m_uiTrashCount); - break; - - case TYPE_RETREAT: - if (uiData == SPECIAL) + case TYPE_WINTERCHILL: + if (m_auiEncounter[0] == DONE) + return; + m_auiEncounter[0] = uiData; + break; + case TYPE_ANETHERON: + if (m_auiEncounter[1] == DONE) + return; + m_auiEncounter[1] = uiData; + break; + case TYPE_KAZROGAL: + if (m_auiEncounter[2] == DONE) + return; + m_auiEncounter[2] = uiData; + break; + case TYPE_AZGALOR: + if (m_auiEncounter[3] == DONE) + return; + m_auiEncounter[3] = uiData; + break; + case TYPE_ARCHIMONDE: + m_auiEncounter[4] = uiData; + break; + + case TYPE_TRASH_COUNT: + m_uiTrashCount = uiData; + DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, m_uiTrashCount); + break; + + case TYPE_RETREAT: + if (uiData == SPECIAL) + { + if (!lAncientGemGUIDList.empty()) { - if (!lAncientGemGUIDList.empty()) + for(GUIDList::const_iterator itr = lAncientGemGUIDList.begin(); itr != lAncientGemGUIDList.end(); ++itr) { - for(GUIDList::const_iterator itr = lAncientGemGUIDList.begin(); itr != lAncientGemGUIDList.end(); ++itr) - { - //don't know how long it expected - DoRespawnGameObject(*itr,DAY); - } + //don't know how long it expected + DoRespawnGameObject(*itr, DAY); } } - break; - } + } + break; + } - debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)", uiType, uiData); + debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)", uiType, uiData); - if (uiData == DONE) - { - OUT_SAVE_INST_DATA; + if (uiData == DONE) + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " - << m_auiEncounter[3] << " " << m_auiEncounter[4]; + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " + << m_auiEncounter[3] << " " << m_auiEncounter[4]; - strSaveData = saveStream.str(); + m_strSaveData = saveStream.str(); - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - uint32 GetData(uint32 uiType) +uint32 instance_mount_hyjal::GetData(uint32 uiType) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_WINTERCHILL: return m_auiEncounter[0]; - case TYPE_ANETHERON: return m_auiEncounter[1]; - case TYPE_KAZROGAL: return m_auiEncounter[2]; - case TYPE_AZGALOR: return m_auiEncounter[3]; - case TYPE_ARCHIMONDE: return m_auiEncounter[4]; - case DATA_TRASH: return m_uiTrashCount; - } - return 0; - } + case TYPE_WINTERCHILL: return m_auiEncounter[0]; + case TYPE_ANETHERON: return m_auiEncounter[1]; + case TYPE_KAZROGAL: return m_auiEncounter[2]; + case TYPE_AZGALOR: return m_auiEncounter[3]; + case TYPE_ARCHIMONDE: return m_auiEncounter[4]; - const char* Save() - { - return strSaveData.c_str(); + case TYPE_TRASH_COUNT: return m_uiTrashCount; + + default: + return 0; } +} - void Load(const char* in) +void instance_mount_hyjal::Load(const char* chrIn) +{ + if (!chrIn) { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_LOAD_INST_DATA(in); + OUT_LOAD_INST_DATA(chrIn); - std::istringstream loadStream(in); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> m_auiEncounter[4]; + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> m_auiEncounter[4]; - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as IN_PROGRESS - reset it instead. - m_auiEncounter[i] = NOT_STARTED; + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as IN_PROGRESS - reset it instead. + m_auiEncounter[i] = NOT_STARTED; - OUT_LOAD_INST_DATA_COMPLETE; - } -}; + OUT_LOAD_INST_DATA_COMPLETE; +} InstanceData* GetInstanceData_instance_mount_hyjal(Map* pMap) { @@ -236,9 +226,10 @@ InstanceData* GetInstanceData_instance_mount_hyjal(Map* pMap) void AddSC_instance_mount_hyjal() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_hyjal"; - newscript->GetInstanceData = &GetInstanceData_instance_mount_hyjal; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_hyjal"; + pNewScript->GetInstanceData = &GetInstanceData_instance_mount_hyjal; + pNewScript->RegisterSelf(); } diff --git a/scripts/kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp b/scripts/kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp index 474535c..fa53d80 100644 --- a/scripts/kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp +++ b/scripts/kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp @@ -26,11 +26,7 @@ EndScriptData */ instance_old_hillsbrad::instance_old_hillsbrad(Map* pMap) : ScriptedInstance(pMap), m_uiBarrelCount(0), - m_uiThrallEventCount(0), - m_uiThrallGUID(0), - m_uiTarethaGUID(0), - m_uiScarlocGUID(0), - m_uiEpochGUID(0) + m_uiThrallEventCount(0) { Initialize(); } @@ -45,13 +41,9 @@ void instance_old_hillsbrad::OnCreatureCreate(Creature* pCreature) switch(pCreature->GetEntry()) { case NPC_THRALL: - m_uiThrallGUID = pCreature->GetGUID(); - break; case NPC_TARETHA: - m_uiTarethaGUID = pCreature->GetGUID(); - break; case NPC_EPOCH: - m_uiEpochGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); break; } } @@ -61,14 +53,14 @@ void instance_old_hillsbrad::OnCreatureDeath(Creature* pCreature) if (pCreature->GetEntry() == NPC_EPOCH) { // notify thrall so he can continue - if (Creature* pThrall = instance->GetCreature(m_uiThrallGUID)) + if (Creature* pThrall = GetSingleCreatureFromStorage(NPC_THRALL)) pThrall->AI()->KilledUnit(pCreature); } } void instance_old_hillsbrad::HandleThrallRelocation() { - if (Creature* pThrall = instance->GetCreature(m_uiThrallGUID)) + if (Creature* pThrall = GetSingleCreatureFromStorage(NPC_THRALL)) { debug_log("SD2: Instance Old Hillsbrad: Thrall relocation"); @@ -201,11 +193,6 @@ uint32 instance_old_hillsbrad::GetData(uint32 uiData) } } -uint64 instance_old_hillsbrad::GetData64(uint32 uiData) -{ - return 0; -} - void instance_old_hillsbrad::UpdateLodgeQuestCredit() { Map::PlayerList const& players = instance->GetPlayers(); diff --git a/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp b/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp index f1fe3dc..7f2dd69 100644 --- a/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp +++ b/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp @@ -37,7 +37,7 @@ struct MANGOS_DLL_DECL npc_tarethaAI : public npc_escortAI npc_tarethaAI(Creature* pCreature); instance_old_hillsbrad* m_pInstance; - uint64 m_uiErozionGUID; + ObjectGuid m_erozionGuid; uint32 m_uiErozionEventTimer; uint32 m_uiErozionPhase; @@ -256,15 +256,11 @@ struct MANGOS_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI instance_old_hillsbrad* m_pInstance; - uint64 m_uiScarlocMountGUID; - bool m_bIsLowHp; bool m_bHadMount; void Reset() { - m_uiScarlocMountGUID = 0; - m_bIsLowHp = false; if (m_bHadMount) @@ -520,9 +516,7 @@ struct MANGOS_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI case NPC_BARN_GUARDSMAN: case NPC_BARN_PROTECTOR: case NPC_BARN_LOOKOUT: - break; case NPC_SKARLOC_MOUNT: - m_uiScarlocMountGUID = pSummoned->GetGUID(); break; default: pSummoned->AI()->AttackStart(m_creature); @@ -721,7 +715,6 @@ enum npc_tarethaAI::npc_tarethaAI(Creature* pCreature) : npc_escortAI(pCreature) { m_pInstance = (instance_old_hillsbrad*)pCreature->GetInstanceData(); - m_uiErozionGUID = 0; m_uiErozionEventTimer = 5000; m_uiErozionPhase = 0; Reset(); @@ -730,7 +723,7 @@ npc_tarethaAI::npc_tarethaAI(Creature* pCreature) : npc_escortAI(pCreature) void npc_tarethaAI::JustSummoned(Creature* pSummoned) { if (pSummoned->GetEntry() == NPC_EROZION) - m_uiErozionGUID = pSummoned->GetGUID(); + m_erozionGuid = pSummoned->GetObjectGuid(); else DoScriptText(SAY_EPOCH_ENTER1, pSummoned); } @@ -778,23 +771,23 @@ void npc_tarethaAI::UpdateEscortAI(const uint32 uiDiff) DoScriptText(SAY_TR_THEN_WHO, pThrall); break; case 4: - if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_uiErozionGUID)) + if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_erozionGuid)) DoScriptText(SAY_PRE_WIPE, pErozion); break; case 5: - //if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_uiErozionGUID)) + //if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_erozionGuid)) //pErozion->AI()->DoCastSpellIfCan(); break; case 6: - if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_uiErozionGUID)) + if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_erozionGuid)) DoScriptText(SAY_WIPE_MEMORY, pErozion); break; case 7: - if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_uiErozionGUID)) + if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_erozionGuid)) DoScriptText(SAY_ABOUT_TARETHA, pErozion); break; case 8: - if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_uiErozionGUID)) + if (Creature* pErozion = m_creature->GetMap()->GetCreature(m_erozionGuid)) DoScriptText(SAY_AFTER_WIPE, pErozion); break; case 9: diff --git a/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h b/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h index 8fcf89d..87247e2 100644 --- a/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h +++ b/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h @@ -43,26 +43,20 @@ class MANGOS_DLL_DECL instance_old_hillsbrad : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); void HandleThrallRelocation(); void UpdateLodgeQuestCredit(); - Creature* GetThrall() { return instance->GetCreature(m_uiThrallGUID); } - Creature* GetTaretha() { return instance->GetCreature(m_uiTarethaGUID); } - Creature* GetScarloc() { return instance->GetCreature(m_uiScarlocGUID); } - Creature* GetEpoch() { return instance->GetCreature(m_uiEpochGUID); } + Creature* GetThrall() { return GetSingleCreatureFromStorage(NPC_THRALL); } + Creature* GetTaretha() { return GetSingleCreatureFromStorage(NPC_TARETHA); } + Creature* GetEpoch() { return GetSingleCreatureFromStorage(NPC_EPOCH); } protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; uint32 m_uiBarrelCount; uint32 m_uiThrallEventCount; - uint64 m_uiThrallGUID; - uint64 m_uiTarethaGUID; - uint64 m_uiScarlocGUID; - uint64 m_uiEpochGUID; }; #endif diff --git a/scripts/kalimdor/dire_maul/dire_maul.h b/scripts/kalimdor/dire_maul/dire_maul.h index 64540e6..efdf549 100644 --- a/scripts/kalimdor/dire_maul/dire_maul.h +++ b/scripts/kalimdor/dire_maul/dire_maul.h @@ -89,7 +89,6 @@ class MANGOS_DLL_DECL instance_dire_maul : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); void OnCreatureEnterCombat(Creature* pCreature); void OnCreatureDeath(Creature* pCreature); @@ -100,37 +99,22 @@ class MANGOS_DLL_DECL instance_dire_maul : public ScriptedInstance protected: bool CheckAllGeneratorsDestroyed(); void ProcessForceFieldOpening(); + void SortPylonGuards(); + void PylonGuardJustDied(Creature* pCreature); uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; // East bool m_bWallDestroyed; - - uint64 m_uiCrumbleWallGUID; - uint64 m_uiCorruptVineGUID; - uint64 m_uiConservatoryDoorGUID; - uint64 m_uiOldIronbarkGUID; - GUIDList m_lFelvineShardGUIDs; // West - uint64 m_auiCrystalGeneratorGUID[MAX_GENERATORS]; - - uint64 m_uiPrinceTortheldrinGUID; - uint64 m_uiImmolTharGUID; - uint64 m_uiForcefieldGUID; - uint64 m_uiPrincesChestAuraGUID; - uint64 m_uiTendrisWarpwoodDoorGUID; + ObjectGuid m_aCrystalGeneratorGuid[MAX_GENERATORS]; GUIDList m_luiHighborneSummonerGUIDs; GUIDList m_lGeneratorGuardGUIDs; std::set m_sSortedGeneratorGuards[MAX_GENERATORS]; - - // North - uint64 m_uiGordokGUID; - uint64 m_uiChoRushGUID; - uint64 m_uiMizzleGUID; }; #endif diff --git a/scripts/kalimdor/dire_maul/instance_dire_maul.cpp b/scripts/kalimdor/dire_maul/instance_dire_maul.cpp index 49fc6a2..3b3af37 100644 --- a/scripts/kalimdor/dire_maul/instance_dire_maul.cpp +++ b/scripts/kalimdor/dire_maul/instance_dire_maul.cpp @@ -25,24 +25,7 @@ EndScriptData */ #include "dire_maul.h" instance_dire_maul::instance_dire_maul(Map* pMap) : ScriptedInstance(pMap), - // East - m_bWallDestroyed(false), - m_uiCrumbleWallGUID(0), - m_uiCorruptVineGUID(0), - m_uiConservatoryDoorGUID(0), - m_uiOldIronbarkGUID(0), - - // West - m_uiPrinceTortheldrinGUID(0), - m_uiImmolTharGUID(0), - m_uiForcefieldGUID(0), - m_uiPrincesChestAuraGUID(0), - m_uiTendrisWarpwoodDoorGUID(0), - - // North - m_uiGordokGUID(0), - m_uiChoRushGUID(0), - m_uiMizzleGUID(0) + m_bWallDestroyed(false) { Initialize(); } @@ -50,11 +33,6 @@ instance_dire_maul::instance_dire_maul(Map* pMap) : ScriptedInstance(pMap), void instance_dire_maul::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&m_auiCrystalGeneratorGUID, 0, sizeof(m_auiCrystalGeneratorGUID)); - - m_lFelvineShardGUIDs.clear(); - m_luiHighborneSummonerGUIDs.clear(); - m_lGeneratorGuardGUIDs.clear(); } void instance_dire_maul::OnCreatureCreate(Creature* pCreature) @@ -63,37 +41,33 @@ void instance_dire_maul::OnCreatureCreate(Creature* pCreature) { // East case NPC_OLD_IRONBARK: - m_uiOldIronbarkGUID = pCreature->GetGUID(); break; // West case NPC_PRINCE_TORTHELDRIN: - m_uiPrinceTortheldrinGUID = pCreature->GetGUID(); if (m_auiEncounter[TYPE_IMMOLTHAR] == DONE) pCreature->setFaction(FACTION_HOSTILE); break; case NPC_ARCANE_ABERRATION: case NPC_MANA_REMNANT: - m_lGeneratorGuardGUIDs.push_back(pCreature->GetGUID()); - break; + m_lGeneratorGuardGUIDs.push_back(pCreature->GetObjectGuid()); + return; case NPC_IMMOLTHAR: - m_uiImmolTharGUID = pCreature->GetGUID(); break; case NPC_HIGHBORNE_SUMMONER: - m_luiHighborneSummonerGUIDs.push_back(pCreature->GetGUID()); - break; + m_luiHighborneSummonerGUIDs.push_back(pCreature->GetObjectGuid()); + return; // North case NPC_CHORUSH: - m_uiChoRushGUID = pCreature->GetGUID(); - break; case NPC_KING_GORDOK: - m_uiGordokGUID = pCreature->GetGUID(); - break; case NPC_MIZZLE_THE_CRAFTY: - m_uiMizzleGUID = pCreature->GetGUID(); break; + + default: + return; } + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); } void instance_dire_maul::OnObjectCreate(GameObject* pGo) @@ -102,59 +76,58 @@ void instance_dire_maul::OnObjectCreate(GameObject* pGo) { // East case GO_CONSERVATORY_DOOR: - m_uiConservatoryDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_IRONBARK] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_CRUMBLE_WALL: - m_uiCrumbleWallGUID = pGo->GetGUID(); if (m_bWallDestroyed || m_auiEncounter[TYPE_ALZZIN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_CORRUPT_VINE: - m_uiCorruptVineGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_ALZZIN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_FELVINE_SHARD: - m_lFelvineShardGUIDs.push_back(pGo->GetGUID()); + m_lFelvineShardGUIDs.push_back(pGo->GetObjectGuid()); break; // West case GO_CRYSTAL_GENERATOR_1: - m_auiCrystalGeneratorGUID[0] = pGo->GetGUID(); + m_aCrystalGeneratorGuid[0] = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_PYLON_1] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_CRYSTAL_GENERATOR_2: - m_auiCrystalGeneratorGUID[1] = pGo->GetGUID(); + m_aCrystalGeneratorGuid[1] = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_PYLON_2] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_CRYSTAL_GENERATOR_3: - m_auiCrystalGeneratorGUID[2] = pGo->GetGUID(); + m_aCrystalGeneratorGuid[2] = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_PYLON_3] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_CRYSTAL_GENERATOR_4: - m_auiCrystalGeneratorGUID[3] = pGo->GetGUID(); + m_aCrystalGeneratorGuid[3] = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_PYLON_4] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_CRYSTAL_GENERATOR_5: - m_auiCrystalGeneratorGUID[4] = pGo->GetGUID(); + m_aCrystalGeneratorGuid[4] = pGo->GetObjectGuid(); if (m_auiEncounter[TYPE_PYLON_5] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); - break; + return; case GO_FORCEFIELD: - m_uiForcefieldGUID = pGo->GetGUID(); if (CheckAllGeneratorsDestroyed()) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PRINCES_CHEST_AURA: - m_uiPrincesChestAuraGUID = pGo->GetGUID(); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_dire_maul::SetData(uint32 uiType, uint32 uiData) @@ -166,7 +139,7 @@ void instance_dire_maul::SetData(uint32 uiType, uint32 uiData) if (uiData == DONE) { // Update Old Ironbark so he can open the conservatory door - if (Creature* pIronbark = instance->GetCreature(m_uiOldIronbarkGUID)) + if (Creature* pIronbark = GetSingleCreatureFromStorage(NPC_OLD_IRONBARK)) { DoScriptText(SAY_IRONBARK_REDEEM, pIronbark); pIronbark->UpdateEntry(NPC_IRONBARK_REDEEMED); @@ -182,11 +155,11 @@ void instance_dire_maul::SetData(uint32 uiType, uint32 uiData) { if (!m_bWallDestroyed) { - DoUseDoorOrButton(m_uiCrumbleWallGUID); + DoUseDoorOrButton(GO_CRUMBLE_WALL); m_bWallDestroyed = true; } - DoUseDoorOrButton(m_uiCorruptVineGUID); + DoUseDoorOrButton(GO_CORRUPT_VINE); if (!m_lFelvineShardGUIDs.empty()) { @@ -196,7 +169,7 @@ void instance_dire_maul::SetData(uint32 uiType, uint32 uiData) } else if (uiData == SPECIAL && !m_bWallDestroyed) { - DoUseDoorOrButton(m_uiCrumbleWallGUID); + DoUseDoorOrButton(GO_CRUMBLE_WALL); m_bWallDestroyed = true; } m_auiEncounter[uiType] = uiData; @@ -206,12 +179,12 @@ void instance_dire_maul::SetData(uint32 uiType, uint32 uiData) case TYPE_IMMOLTHAR: if (uiData == DONE) { - if (Creature* pPrince = instance->GetCreature(m_uiPrinceTortheldrinGUID)) + if (Creature* pPrince = GetSingleCreatureFromStorage(NPC_PRINCE_TORTHELDRIN)) { DoScriptText(SAY_FREE_IMMOLTHAR, pPrince); pPrince->setFaction(FACTION_HOSTILE); // Despawn Chest-Aura - if (GameObject* pChestAura = instance->GetGameObject(m_uiPrincesChestAuraGUID)) + if (GameObject* pChestAura = GetSingleGameObjectFromStorage(GO_PRINCES_CHEST_AURA)) pChestAura->Use(pPrince); } } @@ -228,7 +201,7 @@ void instance_dire_maul::SetData(uint32 uiType, uint32 uiData) m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - DoUseDoorOrButton(m_auiCrystalGeneratorGUID[uiType - TYPE_PYLON_1]); + DoUseDoorOrButton(m_aCrystalGeneratorGuid[uiType - TYPE_PYLON_1]); if (CheckAllGeneratorsDestroyed()) ProcessForceFieldOpening(); } @@ -275,17 +248,6 @@ uint32 instance_dire_maul::GetData(uint32 uiType) return 0; } -uint64 instance_dire_maul::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_CHORUSH: return m_uiChoRushGUID; - case NPC_KING_GORDOK: return m_uiGordokGUID; - default: - return 0; - } -} - void instance_dire_maul::OnCreatureEnterCombat(Creature* pCreature) { switch (pCreature->GetEntry()) @@ -294,35 +256,7 @@ void instance_dire_maul::OnCreatureEnterCombat(Creature* pCreature) // - Handling of guards of generators case NPC_ARCANE_ABERRATION: case NPC_MANA_REMNANT: - if (!m_lGeneratorGuardGUIDs.empty()) - { - for (uint8 i = 0; i < MAX_GENERATORS; ++i) - { - GameObject* pGenerator = instance->GetGameObject(m_auiCrystalGeneratorGUID[i]); - // Skip non-existing or finished generators - if (!pGenerator || GetData(TYPE_PYLON_1 + i) == DONE) - continue; - - // Sort all remaining (alive) NPCs to unfinished generators - for (GUIDList::iterator itr = m_lGeneratorGuardGUIDs.begin(); itr != m_lGeneratorGuardGUIDs.end();) - { - Creature* pGuard = instance->GetCreature(*itr); - if (!pGuard || pGuard->isDead()) // Remove invalid guids and dead guards - { - m_lGeneratorGuardGUIDs.erase(itr++); - continue; - } - - if (pGuard->IsWithinDistInMap(pGenerator, 20.0f)) - { - m_sSortedGeneratorGuards[i].insert(pGuard->GetGUIDLow()); - m_lGeneratorGuardGUIDs.erase(itr++); - } - else - ++itr; - } - } - } + SortPylonGuards(); break; // - Set InstData for ImmolThar case NPC_IMMOLTHAR: @@ -348,22 +282,8 @@ void instance_dire_maul::OnCreatureDeath(Creature* pCreature) // - Handling of guards of generators case NPC_ARCANE_ABERRATION: case NPC_MANA_REMNANT: - for (uint8 i = 0; i < MAX_GENERATORS; ++i) - { - // Skip already activated generators - if (GetData(TYPE_PYLON_1 + i) == DONE) - continue; - - // Only process generator where the npc is sorted in - if (m_sSortedGeneratorGuards[i].find(pCreature->GetGUIDLow()) != m_sSortedGeneratorGuards[i].end()) - { - m_sSortedGeneratorGuards[i].erase(pCreature->GetGUIDLow()); - if (m_sSortedGeneratorGuards[i].empty()) - SetData(TYPE_PYLON_1 + i, DONE); + PylonGuardJustDied(pCreature); - break; - } - } break; // - Set InstData for ImmolThar case NPC_IMMOLTHAR: @@ -417,10 +337,10 @@ bool instance_dire_maul::CheckAllGeneratorsDestroyed() void instance_dire_maul::ProcessForceFieldOpening() { // 'Open' the force field - DoUseDoorOrButton(m_uiForcefieldGUID); + DoUseDoorOrButton(GO_FORCEFIELD); // Let the summoners attack Immol'Thar - Creature* pImmolThar = instance->GetCreature(m_uiImmolTharGUID); + Creature* pImmolThar = GetSingleCreatureFromStorage(NPC_IMMOLTHAR); if (!pImmolThar || pImmolThar->isDead()) return; @@ -443,6 +363,59 @@ void instance_dire_maul::ProcessForceFieldOpening() m_luiHighborneSummonerGUIDs.clear(); } +void instance_dire_maul::SortPylonGuards() +{ + if (!m_lGeneratorGuardGUIDs.empty()) + { + for (uint8 i = 0; i < MAX_GENERATORS; ++i) + { + GameObject* pGenerator = instance->GetGameObject(m_aCrystalGeneratorGuid[i]); + // Skip non-existing or finished generators + if (!pGenerator || GetData(TYPE_PYLON_1 + i) == DONE) + continue; + + // Sort all remaining (alive) NPCs to unfinished generators + for (GUIDList::iterator itr = m_lGeneratorGuardGUIDs.begin(); itr != m_lGeneratorGuardGUIDs.end();) + { + Creature* pGuard = instance->GetCreature(*itr); + if (!pGuard || pGuard->isDead()) // Remove invalid guids and dead guards + { + m_lGeneratorGuardGUIDs.erase(itr++); + continue; + } + + if (pGuard->IsWithinDistInMap(pGenerator, 20.0f)) + { + m_sSortedGeneratorGuards[i].insert(pGuard->GetGUIDLow()); + m_lGeneratorGuardGUIDs.erase(itr++); + } + else + ++itr; + } + } + } +} + +void instance_dire_maul::PylonGuardJustDied(Creature* pCreature) +{ + for (uint8 i = 0; i < MAX_GENERATORS; ++i) + { + // Skip already activated generators + if (GetData(TYPE_PYLON_1 + i) == DONE) + continue; + + // Only process generator where the npc is sorted in + if (m_sSortedGeneratorGuards[i].find(pCreature->GetGUIDLow()) != m_sSortedGeneratorGuards[i].end()) + { + m_sSortedGeneratorGuards[i].erase(pCreature->GetGUIDLow()); + if (m_sSortedGeneratorGuards[i].empty()) + SetData(TYPE_PYLON_1 + i, DONE); + + break; + } + } +} + InstanceData* GetInstanceData_instance_dire_maul(Map* pMap) { return new instance_dire_maul(pMap); diff --git a/scripts/kalimdor/dustwallow_marsh.cpp b/scripts/kalimdor/dustwallow_marsh.cpp index 66aee3e..274c5eb 100644 --- a/scripts/kalimdor/dustwallow_marsh.cpp +++ b/scripts/kalimdor/dustwallow_marsh.cpp @@ -50,7 +50,6 @@ enum NPC_RISEN_SPIRIT = 23554 }; - struct MANGOS_DLL_DECL mobs_risen_husk_spiritAI : public ScriptedAI { mobs_risen_husk_spiritAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} diff --git a/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp b/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp index 5e56bea..07011a5 100644 --- a/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp +++ b/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp @@ -220,10 +220,10 @@ struct MANGOS_DLL_DECL boss_onyxiaAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pTrigger = m_pInstance->instance->GetCreature(m_pInstance->GetOnyxiaTriggerGUID())) + if (Creature* pTrigger = m_pInstance->GetSingleCreatureFromStorage(NPC_ONYXIA_TRIGGER)) { m_creature->GetMap()->CreatureRelocation(m_creature, m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ, m_creature->GetAngle(pTrigger)); - m_creature->SendMonsterMove(m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ, SPLINETYPE_FACINGTARGET, m_creature->GetSplineFlags(), 1, NULL, pTrigger->GetGUID()); + m_creature->SendMonsterMove(m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ, SPLINETYPE_FACINGTARGET, m_creature->GetSplineFlags(), 1, NULL, pTrigger->GetObjectGuid().GetRawValue()); } } } @@ -247,7 +247,7 @@ struct MANGOS_DLL_DECL boss_onyxiaAI : public ScriptedAI if (m_uiPhase == PHASE_BREATH) { - if (Creature* pTrigger = m_pInstance->instance->GetCreature(m_pInstance->GetOnyxiaTriggerGUID())) + if (Creature* pTrigger = m_pInstance->GetSingleCreatureFromStorage(NPC_ONYXIA_TRIGGER)) m_creature->SetFacingToObject(pTrigger); } } diff --git a/scripts/kalimdor/onyxias_lair/instance_onyxias_lair.cpp b/scripts/kalimdor/onyxias_lair/instance_onyxias_lair.cpp index 79064dd..bc1e556 100644 --- a/scripts/kalimdor/onyxias_lair/instance_onyxias_lair.cpp +++ b/scripts/kalimdor/onyxias_lair/instance_onyxias_lair.cpp @@ -25,7 +25,6 @@ EndScriptData */ #include "onyxias_lair.h" instance_onyxias_lair::instance_onyxias_lair(Map* pMap) : ScriptedInstance(pMap), - m_uiOnyxTriggerGUID(0), m_uiAchievWhelpsCount(0) { Initialize(); @@ -47,7 +46,7 @@ void instance_onyxias_lair::OnCreatureCreate(Creature* pCreature) switch(pCreature->GetEntry()) { case NPC_ONYXIA_TRIGGER: - m_uiOnyxTriggerGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[NPC_ONYXIA_TRIGGER] = pCreature->GetObjectGuid(); break; case NPC_ONYXIA_WHELP: if (m_uiEncounter >= DATA_LIFTOFF && time_t(m_tPhaseTwoStart + TIME_LIMIT_MANY_WHELPS) >= time(NULL)) @@ -63,7 +62,10 @@ void instance_onyxias_lair::SetData(uint32 uiType, uint32 uiData) m_uiEncounter = uiData; if (uiData == IN_PROGRESS) + { + DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_ONYXIA_ID); m_uiAchievWhelpsCount = 0; + } if (uiData == DATA_LIFTOFF) m_tPhaseTwoStart = time(NULL); diff --git a/scripts/kalimdor/onyxias_lair/onyxias_lair.h b/scripts/kalimdor/onyxias_lair/onyxias_lair.h index ef5cb19..24b66ce 100644 --- a/scripts/kalimdor/onyxias_lair/onyxias_lair.h +++ b/scripts/kalimdor/onyxias_lair/onyxias_lair.h @@ -24,6 +24,8 @@ enum ACHIEV_CRIT_MANY_WHELPS_H = 12568, ACHIEV_CRIT_NO_BREATH_N = 12566, // Acheivements 4404, 4407 ACHIEV_CRIT_NO_BREATH_H = 12569, + + ACHIEV_START_ONYXIA_ID = 6601, }; class MANGOS_DLL_DECL instance_onyxias_lair : public ScriptedInstance @@ -42,15 +44,11 @@ class MANGOS_DLL_DECL instance_onyxias_lair : public ScriptedInstance bool CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/); - uint64 GetOnyxiaTriggerGUID() { return m_uiOnyxTriggerGUID; } - protected: uint32 m_uiEncounter; uint32 m_uiAchievWhelpsCount; time_t m_tPhaseTwoStart; - - uint64 m_uiOnyxTriggerGUID; }; #endif diff --git a/scripts/kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp b/scripts/kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp index 1639977..d35e93f 100644 --- a/scripts/kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp +++ b/scripts/kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp @@ -25,7 +25,6 @@ EndScriptData */ #include "razorfen_kraul.h" instance_razorfen_kraul::instance_razorfen_kraul(Map* pMap) : ScriptedInstance(pMap), - m_uiAgathelosWardGUID(0), m_uiWardKeepersRemaining(0) { Initialize(); @@ -41,9 +40,9 @@ void instance_razorfen_kraul::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_AGATHELOS_WARD: - m_uiAgathelosWardGUID = pGo->GetGUID(); + m_mGoEntryGuidStore[GO_AGATHELOS_WARD] = pGo->GetObjectGuid(); if (m_auiEncounter[0] == DONE) - DoUseDoorOrButton(m_uiAgathelosWardGUID); + pGo->SetGoState(GO_STATE_ACTIVE); break; } @@ -68,7 +67,7 @@ void instance_razorfen_kraul::SetData(uint32 uiType, uint32 uiData) if (!m_uiWardKeepersRemaining) { m_auiEncounter[0] = uiData; - DoUseDoorOrButton(m_uiAgathelosWardGUID); + DoUseDoorOrButton(GO_AGATHELOS_WARD); } break; } @@ -80,7 +79,7 @@ void instance_razorfen_kraul::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; saveStream << m_auiEncounter[0]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -126,9 +125,10 @@ InstanceData* GetInstanceData_instance_razorfen_kraul(Map* pMap) void AddSC_instance_razorfen_kraul() { - Script* newscript; - newscript = new Script; - newscript->Name = "instance_razorfen_kraul"; - newscript->GetInstanceData = &GetInstanceData_instance_razorfen_kraul; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_razorfen_kraul"; + pNewScript->GetInstanceData = &GetInstanceData_instance_razorfen_kraul; + pNewScript->RegisterSelf(); } diff --git a/scripts/kalimdor/razorfen_kraul/razorfen_kraul.h b/scripts/kalimdor/razorfen_kraul/razorfen_kraul.h index c11c5c0..f64f3c3 100644 --- a/scripts/kalimdor/razorfen_kraul/razorfen_kraul.h +++ b/scripts/kalimdor/razorfen_kraul/razorfen_kraul.h @@ -30,14 +30,13 @@ class MANGOS_DLL_DECL instance_razorfen_kraul : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + std::string m_strInstData; - uint64 m_uiAgathelosWardGUID; uint8 m_uiWardKeepersRemaining; }; #endif diff --git a/scripts/kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp b/scripts/kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp index 072d429..b0dc06f 100644 --- a/scripts/kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp +++ b/scripts/kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp @@ -24,19 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "ruins_of_ahnqiraj.h" -instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj(Map* pMap) : ScriptedInstance(pMap), - m_uiOssirianGUID(0), - m_uiBuruGUID(0), - m_uiKurinnaxxGUID(0), - m_uiAndorovGUID(0), - m_uiQeezGUID(0), - m_uiTuubidGUID(0), - m_uiDrennGUID(0), - m_uiXurremGUID(0), - m_uiYeggethGUID(0), - m_uiPakkonGUID(0), - m_uiZerranGUID(0), - m_uiRajaxxGUID(0) +instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -56,18 +44,10 @@ void instance_ruins_of_ahnqiraj::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_OSSIRIAN: m_uiOssirianGUID = pCreature->GetGUID(); break; - case NPC_BURU: m_uiBuruGUID = pCreature->GetGUID(); break; - case NPC_KURINNAXX: m_uiKurinnaxxGUID = pCreature->GetGUID(); break; - case NPC_GENERAL_ANDOROV: m_uiAndorovGUID = pCreature->GetGUID(); break; - case NPC_CAPTAIN_QEEZ: m_uiQeezGUID = pCreature->GetGUID(); break; - case NPC_CAPTAIN_TUUBID: m_uiTuubidGUID = pCreature->GetGUID(); break; - case NPC_CAPTAIN_DRENN: m_uiDrennGUID = pCreature->GetGUID(); break; - case NPC_CAPTAIN_XURREM: m_uiXurremGUID = pCreature->GetGUID(); break; - case NPC_MAJOR_YEGGETH: m_uiYeggethGUID = pCreature->GetGUID(); break; - case NPC_MAJOR_PAKKON: m_uiPakkonGUID = pCreature->GetGUID(); break; - case NPC_COLONEL_ZERRAN: m_uiZerranGUID = pCreature->GetGUID(); break; - case NPC_RAJAXX: m_uiRajaxxGUID = pCreature->GetGUID(); break; + case NPC_OSSIRIAN: + case NPC_GENERAL_ANDOROV: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -75,8 +55,10 @@ void instance_ruins_of_ahnqiraj::OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { - // Make them unusable temporarily - case GO_OSSIRIAN_CRYSTAL: pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); break; + case GO_OSSIRIAN_CRYSTAL: + // Make them unusable temporarily + pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + break; } } @@ -129,8 +111,7 @@ void instance_ruins_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) DoSapwnAndorovIfCan(); // Yell after kurinnaxx - if (Creature* pOssirian = instance->GetCreature(m_uiOssirianGUID)) - DoScriptText(SAY_OSSIRIAN_INTRO, pOssirian); + DoOrSimulateScriptTextForThisInstance(SAY_OSSIRIAN_INTRO, NPC_OSSIRIAN); } m_auiEncounter[uiType] = uiData; break; @@ -172,7 +153,7 @@ void instance_ruins_of_ahnqiraj::DoSapwnAndorovIfCan() if (m_auiEncounter[TYPE_KURINNAXX] != DONE) return; - if (m_uiAndorovGUID) + if (GetSingleCreatureFromStorage(NPC_GENERAL_ANDOROV)) return; Player* pPlayer = GetPlayerInMap(); @@ -183,28 +164,6 @@ void instance_ruins_of_ahnqiraj::DoSapwnAndorovIfCan() pPlayer->SummonCreature(aAndorovSpawnLocs[i].m_uiEntry, aAndorovSpawnLocs[i].m_fX, aAndorovSpawnLocs[i].m_fY, aAndorovSpawnLocs[i].m_fZ, aAndorovSpawnLocs[i].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0); } -uint64 instance_ruins_of_ahnqiraj::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_OSSIRIAN: return m_uiOssirianGUID; - case NPC_BURU: return m_uiBuruGUID; - case NPC_GENERAL_ANDOROV: return m_uiAndorovGUID; - case NPC_KURINNAXX: return m_uiKurinnaxxGUID; - case NPC_CAPTAIN_QEEZ: return m_uiQeezGUID; - case NPC_CAPTAIN_TUUBID: return m_uiTuubidGUID; - case NPC_CAPTAIN_DRENN: return m_uiDrennGUID; - case NPC_CAPTAIN_XURREM: return m_uiXurremGUID; - case NPC_MAJOR_YEGGETH: return m_uiYeggethGUID; - case NPC_MAJOR_PAKKON: return m_uiPakkonGUID; - case NPC_COLONEL_ZERRAN: return m_uiZerranGUID; - case NPC_RAJAXX: return m_uiRajaxxGUID; - - default: - return 0; - } -} - void instance_ruins_of_ahnqiraj::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h b/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h index 1a4533b..e943023 100644 --- a/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h +++ b/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h @@ -25,13 +25,13 @@ enum NPC_GENERAL_ANDOROV = 15471, // The general and the kaldorei are escorted for the rajaxx encounter NPC_KALDOREI_ELITE = 15473, NPC_RAJAXX = 15341, // All of the following are used in the rajaxx encounter - NPC_COLONEL_ZERRAN = 15385, - NPC_MAJOR_PAKKON = 15388, - NPC_MAJOR_YEGGETH = 15386, - NPC_CAPTAIN_XURREM = 15390, - NPC_CAPTAIN_DRENN = 15389, - NPC_CAPTAIN_TUUBID = 15392, - NPC_CAPTAIN_QEEZ = 15391, + // NPC_COLONEL_ZERRAN = 15385, + // NPC_MAJOR_PAKKON = 15388, + // NPC_MAJOR_YEGGETH = 15386, + // NPC_CAPTAIN_XURREM = 15390, + // NPC_CAPTAIN_DRENN = 15389, + // NPC_CAPTAIN_TUUBID = 15392, + // NPC_CAPTAIN_QEEZ = 15391, GO_OSSIRIAN_CRYSTAL = 180619, // Used in the ossirian encounter @@ -44,15 +44,13 @@ struct SpawnLocation float m_fX, m_fY, m_fZ, m_fO; }; -// These positions are likely wrong, and the npcs need some movement to these coords -// TODO Research proper positions static const SpawnLocation aAndorovSpawnLocs[MAX_HELPERS] = { - {NPC_GENERAL_ANDOROV, -8876.97f, 1651.96f, 21.57f, 5.52f}, - {NPC_KALDOREI_ELITE, -8875.47f, 1653.51f, 21.57f, 5.32f}, - {NPC_KALDOREI_ELITE, -8873.96f, 1655.06f, 21.57f, 5.13f}, - {NPC_KALDOREI_ELITE, -8878.26f, 1650.63f, 21.57f, 5.7f}, - {NPC_KALDOREI_ELITE, -8879.46f, 1649.39f, 21.57f, 5.85f} + {NPC_GENERAL_ANDOROV, -8660.4f, 1510.29f, 32.449f, 2.2184f}, + {NPC_KALDOREI_ELITE, -8655.84f, 1509.78f, 32.462f, 2.33341f}, + {NPC_KALDOREI_ELITE, -8657.39f, 1506.28f, 32.418f, 2.33346f}, + {NPC_KALDOREI_ELITE, -8660.96f, 1504.9f, 32.1567f, 2.33306f}, + {NPC_KALDOREI_ELITE, -8664.45f, 1506.44f, 32.0944f, 2.33302f} }; class MANGOS_DLL_DECL instance_ruins_of_ahnqiraj : public ScriptedInstance @@ -75,7 +73,6 @@ class MANGOS_DLL_DECL instance_ruins_of_ahnqiraj : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -85,18 +82,5 @@ class MANGOS_DLL_DECL instance_ruins_of_ahnqiraj : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - - uint64 m_uiOssirianGUID; - uint64 m_uiBuruGUID; - uint64 m_uiKurinnaxxGUID; - uint64 m_uiAndorovGUID; - uint64 m_uiRajaxxGUID; - uint64 m_uiQeezGUID; - uint64 m_uiTuubidGUID; - uint64 m_uiDrennGUID; - uint64 m_uiXurremGUID; - uint64 m_uiYeggethGUID; - uint64 m_uiPakkonGUID; - uint64 m_uiZerranGUID; }; #endif diff --git a/scripts/kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp b/scripts/kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp index a0605af..24f0502 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp @@ -254,8 +254,8 @@ struct MANGOS_DLL_DECL boss_yaujAI : public ScriptedAI { if (m_pInstance) { - Creature* pKri = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KRI)); - Creature* pVem = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VEM)); + Creature* pKri = m_pInstance->GetSingleCreatureFromStorage(NPC_KRI); + Creature* pVem = m_pInstance->GetSingleCreatureFromStorage(NPC_VEM); switch(urand(0, 2)) { diff --git a/scripts/kalimdor/temple_of_ahnqiraj/boss_cthun.cpp b/scripts/kalimdor/temple_of_ahnqiraj/boss_cthun.cpp index 30d68dc..7a27c61 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/boss_cthun.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/boss_cthun.cpp @@ -24,65 +24,57 @@ EndScriptData */ #include "precompiled.h" #include "temple_of_ahnqiraj.h" -//Text emote -#define EMOTE_WEAKENED -1531011 - -#define PI 3.14 - -//****** Out of Combat ****** -//Random Wispers - No txt only sound -#define RANDOM_SOUND_WHISPER 8663 - -//***** Phase 1 ******** - -//Mobs -#define BOSS_EYE_OF_CTHUN 15589 -#define MOB_CLAW_TENTACLE 15725 -#define MOB_EYE_TENTACLE 15726 -#define MOB_SMALL_PORTAL 15904 - -//Eye Spells -#define SPELL_GREEN_BEAM 26134 -#define SPELL_DARK_GLARE 26029 -#define SPELL_RED_COLORATION 22518 //Probably not the right spell but looks similar - -//Eye Tentacles Spells -#define SPELL_MIND_FLAY 26143 - -//Claw Tentacles Spells -#define SPELL_GROUND_RUPTURE 26139 -#define SPELL_HAMSTRING 26141 - -#define MOB_ - -//*****Phase 2****** -//Body spells -//#define SPELL_CARAPACE_CTHUN 26156 //Was removed from client dbcs -#define SPELL_TRANSFORM 26232 - -//Eye Tentacles Spells -//SAME AS PHASE1 - -//Giant Claw Tentacles -#define SPELL_MASSIVE_GROUND_RUPTURE 26100 - -//Also casts Hamstring -#define SPELL_THRASH 3391 - -//Giant Eye Tentacles -//CHAIN CASTS "SPELL_GREEN_BEAM" - -//Stomach Spells -#define SPELL_MOUTH_TENTACLE 26332 -#define SPELL_EXIT_STOMACH_KNOCKBACK 25383 -#define SPELL_DIGESTIVE_ACID 26476 - -//Mobs -#define MOB_BODY_OF_CTHUN 15809 -#define MOB_GIANT_CLAW_TENTACLE 15728 -#define MOB_GIANT_EYE_TENTACLE 15334 -#define MOB_FLESH_TENTACLE 15802 -#define MOB_GIANT_PORTAL 15910 +enum +{ + EMOTE_WEAKENED = -1531011, + + // ****** Out of Combat ****** + // Random Wispers - No text only sound, maybe handle them in instance script! + RANDOM_SOUND_WHISPER = 8663, + + // ***** Phase 1 ******** + NPC_EYE_OF_CTHUN = 15589, + MOB_CLAW_TENTACLE = 15725, + MOB_EYE_TENTACLE = 15726, + MOB_SMALL_PORTAL = 15904, + + SPELL_GREEN_BEAM = 26134, + SPELL_DARK_GLARE = 26029, + SPELL_RED_COLORATION = 22518, // Probably not the right spell but looks similar + + // Eye Tentacles Spells + SPELL_MIND_FLAY = 26143, + + // Claw Tentacles Spells + SPELL_GROUND_RUPTURE = 26139, + SPELL_HAMSTRING = 26141, + + // *****Phase 2****** + // Body spells + // SPELL_CARAPACE_CTHUN = 26156, // Was removed from client dbcs + SPELL_TRANSFORM = 26232, + + // Giant Claw Tentacles + SPELL_MASSIVE_GROUND_RUPTURE = 26100, + + // Also casts Hamstring + SPELL_THRASH = 3391, + + // Giant Eye Tentacles + // CHAIN CASTS "SPELL_GREEN_BEAM" + + // Stomach Spells + SPELL_MOUTH_TENTACLE = 26332, + SPELL_EXIT_STOMACH_KNOCKBACK = 25383, + SPELL_DIGESTIVE_ACID = 26476, + + // Mobs + MOB_BODY_OF_CTHUN = 15809, + MOB_GIANT_CLAW_TENTACLE = 15728, + MOB_GIANT_EYE_TENTACLE = 15334, + MOB_FLESH_TENTACLE = 15802, + MOB_GIANT_PORTAL = 15910, +}; //Stomach Teleport positions #define STOMACH_X -8562.0f @@ -101,30 +93,30 @@ EndScriptData */ #define TENTACLE_POS2_Z -98.0f #define TENTACLE_POS2_O 2.12f -//Kick out position +//Kick out position -- unneeded - replace this with areatrigger handling of trigger [Trigger 4033]! #define KICK_X -8545.0f #define KICK_Y 1984.0f #define KICK_Z -96.0f struct MANGOS_DLL_DECL flesh_tentacleAI : public ScriptedAI { - flesh_tentacleAI(Creature* pCreature) : ScriptedAI(pCreature), Parent(0) + flesh_tentacleAI(Creature* pCreature) : ScriptedAI(pCreature) { SetCombatMovement(false); Reset(); } - uint64 Parent; - uint32 CheckTimer; + ObjectGuid m_cThunGuid; + uint32 m_uiCheckTimer; - void SpawnedByCthun(uint64 p) + void SpawnedByCthun(Creature* pCThun) { - Parent = p; + m_cThunGuid = pCThun->GetObjectGuid(); } void Reset() { - CheckTimer = 1000; + m_uiCheckTimer = 1000; } void UpdateAI(const uint32 diff); @@ -147,114 +139,120 @@ struct MANGOS_DLL_DECL eye_of_cthunAI : public ScriptedAI ScriptedInstance* m_pInstance; - //Global variables - uint32 PhaseTimer; + // Global variables + uint32 m_uiPhaseTimer; - //Eye beam phase - uint32 BeamTimer; - uint32 EyeTentacleTimer; - uint32 ClawTentacleTimer; + // Eye beam phase + uint32 m_uiBeamTimer; + uint32 m_uiEyeTentacleTimer; + uint32 m_uiClawTentacleTimer; - //Dark Glare phase - uint32 DarkGlareTick; - uint32 DarkGlareTickTimer; - float DarkGlareAngle; - bool ClockWise; + // Dark Glare phase + uint32 m_uiDarkGlareTick; + uint32 m_uiDarkGlareTickTimer; + float m_fDarkGlareAngle; + bool m_bClockWise; void Reset() { - //Phase information - PhaseTimer = 50000; //First dark glare in 50 seconds + // Phase information + m_uiPhaseTimer = 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 durring Dark beam) + // Eye beam phase 50 seconds + m_uiBeamTimer = 3000; + m_uiEyeTentacleTimer = 45000; // Always spawns 5 seconds before Dark Beam + m_uiClawTentacleTimer = 12500; // 4 per Eye beam phase (unsure if they spawn durring Dark beam) - //Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks) - DarkGlareTick = 0; - DarkGlareTickTimer = 1000; - DarkGlareAngle = 0; - ClockWise = false; + // Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks) + m_uiDarkGlareTick = 0; + m_uiDarkGlareTickTimer = 1000; + m_fDarkGlareAngle = 0; + m_bClockWise = false; - //Reset flags + // Reset flags m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + } - //Reset Phase - if (m_pInstance) - m_pInstance->SetData(TYPE_CTHUN_PHASE, 0); + void JustSummoned(Creature* pSummoned) + { + if (pSummoned->GetEntry() == MOB_EYE_TENTACLE) + { + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + pSummoned->AI()->AttackStart(pTarget); + } } void SpawnEyeTentacle(float x, float y) { - Creature* Spawned; - Spawned = (Creature*)m_creature->SummonCreature(MOB_EYE_TENTACLE,m_creature->GetPositionX()+x,m_creature->GetPositionY()+y,m_creature->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500); - if (Spawned) - { - Unit* target; - target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); + m_creature->SummonCreature(MOB_EYE_TENTACLE, m_creature->GetPositionX()+x ,m_creature->GetPositionY()+y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500); + } - if (target) - Spawned->AI()->AttackStart(target); - } + void Aggro(Unit* pWho) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_EYE_NORMAL); } - void UpdateAI(const uint32 diff) + void EnterEvadeMode() { - //Check if we have a target + if (m_pInstance) + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_NOT_STARTED); + + ScriptedAI::EnterEvadeMode(); + } + + void UpdateAI(const uint32 uiDiff) + { + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //No instance + // No instance if (!m_pInstance) return; switch (m_pInstance->GetData(TYPE_CTHUN_PHASE)) { - case 0: + case PHASE_EYE_NORMAL: { - //BeamTimer - if (BeamTimer < diff) + // m_uiBeamTimer + if (m_uiBeamTimer < uiDiff) { - //SPELL_GREEN_BEAM - Unit* target = NULL; - target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); - if (target) + // SPELL_GREEN_BEAM + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { m_creature->InterruptNonMeleeSpells(false); - DoCastSpellIfCan(target,SPELL_GREEN_BEAM); + DoCastSpellIfCan(pTarget, SPELL_GREEN_BEAM); - //Correctly update our target - m_creature->SetTargetGuid(target->GetObjectGuid()); + // Correctly update our target + m_creature->SetTargetGuid(pTarget->GetObjectGuid()); } //Beam every 3 seconds - BeamTimer = 3000; - }else BeamTimer -= diff; + m_uiBeamTimer = 3000; + } + else + m_uiBeamTimer -= uiDiff; - //ClawTentacleTimer - if (ClawTentacleTimer < diff) + // m_uiClawTentacleTimer + if (m_uiClawTentacleTimer < uiDiff) { - Unit* target = NULL; - target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); - if (target) + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { - Creature* Spawned = NULL; - - //Spawn claw tentacle on the random target - Spawned = (Creature*)m_creature->SummonCreature(MOB_CLAW_TENTACLE,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500); - - if (Spawned) - Spawned->AI()->AttackStart(target); + // Spawn claw tentacle on the random target + if (Creature* pSummoned = m_creature->SummonCreature(MOB_CLAW_TENTACLE, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500)) + pSummoned->AI()->AttackStart(pTarget); } - //One claw tentacle every 12.5 seconds - ClawTentacleTimer = 12500; - }else ClawTentacleTimer -= diff; + // One claw tentacle every 12.5 seconds + m_uiClawTentacleTimer = 12500; + } + else + m_uiClawTentacleTimer -= uiDiff; - //EyeTentacleTimer - if (EyeTentacleTimer < diff) + // m_uiEyeTentacleTimer + if (m_uiEyeTentacleTimer < uiDiff) { //Spawn the 8 Eye Tentacles in the corret spots SpawnEyeTentacle(0, 20); //south @@ -267,159 +265,172 @@ struct MANGOS_DLL_DECL eye_of_cthunAI : public ScriptedAI SpawnEyeTentacle(-20, 0); // east SpawnEyeTentacle(-10, 10); // south east - //No point actually putting a timer here since - //These shouldn't trigger agian until after phase shifts - EyeTentacleTimer = 45000; - }else EyeTentacleTimer -= diff; + // No point actually putting a timer here since + // These shouldn't trigger agian until after phase shifts + m_uiEyeTentacleTimer = 45000; + } + else + m_uiEyeTentacleTimer -= uiDiff; - //PhaseTimer - if (PhaseTimer < diff) + // m_uiPhaseTimer + if (m_uiPhaseTimer < uiDiff) { //Switch to Dark Beam - m_pInstance->SetData(TYPE_CTHUN_PHASE, 1); + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_EYE_DARK_GLARE); m_creature->InterruptNonMeleeSpells(false); - //Select random target for dark beam to start on - Unit* target = NULL; - target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); - - if (target) + // Select random target for dark beam to start on + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { - //Correctly update our target - m_creature->SetTargetGuid(target->GetObjectGuid()); - - //Face our target - DarkGlareAngle = m_creature->GetAngle(target); - DarkGlareTickTimer = 1000; - DarkGlareTick = 0; - ClockWise = urand(0, 1); + // Correctly update our target + m_creature->SetTargetGuid(pTarget->GetObjectGuid()); + + // Face our target + m_fDarkGlareAngle = m_creature->GetAngle(pTarget); + m_uiDarkGlareTickTimer = 1000; + m_uiDarkGlareTick = 0; + m_bClockWise = urand(0, 1); } - //Add red coloration to C'thun - DoCastSpellIfCan(m_creature,SPELL_RED_COLORATION); + // Add red coloration to C'thun + DoCastSpellIfCan(m_creature, SPELL_RED_COLORATION); - //Freeze animation + // Freeze animation - //Darkbeam for 35 seconds - PhaseTimer = 35000; - }else PhaseTimer -= diff; + // Darkbeam for 35 seconds + m_uiPhaseTimer = 35000; + } + else + m_uiPhaseTimer -= uiDiff; + break; } - break; - case 1: + case PHASE_EYE_DARK_GLARE: { - //EyeTentacleTimer - if (DarkGlareTick < 35) - if (DarkGlareTickTimer < diff) + // Dark Glare + if (m_uiDarkGlareTick < 35) { - //Remove any target - m_creature->SetTargetGuid(ObjectGuid()); + if (m_uiDarkGlareTickTimer < uiDiff) + { + // Remove any target + m_creature->SetTargetGuid(ObjectGuid()); - //Set angle and cast - if (ClockWise) - m_creature->SetOrientation(DarkGlareAngle + ((float)DarkGlareTick*PI/35)); - else m_creature->SetOrientation(DarkGlareAngle - ((float)DarkGlareTick*PI/35)); + // Set angle and cast + m_creature->SetOrientation(m_fDarkGlareAngle + (m_bClockWise ? 1 : -1) * ((float)m_uiDarkGlareTick*M_PI_F/35)); - m_creature->StopMoving(); + m_creature->StopMoving(); - //Actual dark glare cast, maybe something missing here? - m_creature->CastSpell(NULL, SPELL_DARK_GLARE, false); + // Actual dark glare cast, maybe something missing here? + DoCastSpellIfCan(m_creature, SPELL_DARK_GLARE); - //Increase tick - ++DarkGlareTick; + // Increase tick + ++m_uiDarkGlareTick; - //1 second per tick - DarkGlareTickTimer = 1000; - }else DarkGlareTickTimer -= diff; + // 1 second per tick + m_uiDarkGlareTickTimer = 1000; + } + else + m_uiDarkGlareTickTimer -= uiDiff; + } - //PhaseTimer - if (PhaseTimer < diff) + // m_uiPhaseTimer + if (m_uiPhaseTimer < uiDiff) { - //Switch to Eye Beam - m_pInstance->SetData(TYPE_CTHUN_PHASE, 0); + // Switch to Eye Beam + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_EYE_NORMAL); - BeamTimer = 3000; - EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam - ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn durring Dark beam) + m_uiBeamTimer = 3000; + m_uiEyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam + m_uiClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn durring Dark beam) m_creature->InterruptNonMeleeSpells(false); - //Remove Red coloration from c'thun + // Remove Red coloration from C'thun m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION); - //Freeze animation + // Freeze animation m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, 0); - //Eye Beam for 50 seconds - PhaseTimer = 50000; - }else PhaseTimer -= diff; - }break; + // Eye Beam for 50 seconds + m_uiPhaseTimer = 50000; + } + else + m_uiPhaseTimer -= uiDiff; - //Transition phase - case 2: + break; + } + // Transition phase + case PHASE_TRANSITION: { - //Remove any target + // Remove any target m_creature->SetTargetGuid(ObjectGuid()); m_creature->SetHealth(0); + + // Do not kill yet, to be able to reset on evade + break; } - //Dead phase - case 5: + // Dead phase + case PHASE_FINISH: { m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); + return; } } } - void DamageTaken(Unit *done_by, uint32 &damage) + void DamageTaken(Unit* pDealer, uint32& uiDamage) { - //No instance + // No instance if (!m_pInstance) return; switch (m_pInstance->GetData(TYPE_CTHUN_PHASE)) { - case 0: - case 1: + case PHASE_EYE_NORMAL: + case PHASE_EYE_DARK_GLARE: { - //Only if it will kill - if (damage < m_creature->GetHealth()) + // Only if it will kill + if (uiDamage < m_creature->GetHealth()) return; - //Fake death in phase 0 or 1 (green beam or dark glare phase) + // Fake death in phase 0 or 1 (green beam or dark glare phase) m_creature->InterruptNonMeleeSpells(false); - //Remove Red coloration from c'thun + // Remove Red coloration from c'thun m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION); - //Reset to normal emote state and prevent select and attack + // Reset to normal emote state and prevent select and attack m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - //Remove Target field + // Remove Target field m_creature->SetTargetGuid(ObjectGuid()); - //Death animation/respawning; - m_pInstance->SetData(TYPE_CTHUN_PHASE, 2); + // Death animation/ respawning; + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_TRANSITION); + // Ensure CThun is in combat + if (Creature* pCThun = m_pInstance->GetSingleCreatureFromStorage(NPC_CTHUN)) + pCThun->AI()->AttackStart(pDealer); m_creature->SetHealth(0); - damage = 0; + uiDamage = 0; m_creature->InterruptNonMeleeSpells(true); m_creature->RemoveAllAuras(); - } - break; - case 5: + break; + } + case PHASE_FINISH: { - //Allow death here + // Allow death here return; } default: { - //Prevent death in this phase - damage = 0; + // Prevent death in this phase + uiDamage = 0; return; } break; @@ -442,26 +453,24 @@ struct MANGOS_DLL_DECL cthunAI : public ScriptedAI ScriptedInstance* m_pInstance; - //Out of combat whisper timer - uint32 WisperTimer; + // Out of combat whisper timer + uint32 m_uiWisperTimer; - //Global variables - uint32 PhaseTimer; + // Global variables + uint32 m_uiPhaseTimer; //------------------- - //Phase transition - uint64 HoldPlayer; + // Body Phase + uint32 m_uiEyeTentacleTimer; + uint8 m_uiFleshTentaclesKilled; + uint32 m_uiGiantClawTentacleTimer; + uint32 m_uiGiantEyeTentacleTimer; + uint32 m_uiStomachAcidTimer; + uint32 m_uiStomachEnterTimer; + uint32 m_uiStomachEnterVisTimer; - //Body Phase - uint32 EyeTentacleTimer; - uint8 FleshTentaclesKilled; - uint32 GiantClawTentacleTimer; - uint32 GiantEyeTentacleTimer; - uint32 StomachAcidTimer; - uint32 StomachEnterTimer; - uint32 StomachEnterVisTimer; - uint64 StomachEnterTarget; + ObjectGuid m_stomachEnterTargetGuid; // Stomach map, bool = true then in stomach typedef UNORDERED_MAP StomachMap; @@ -469,347 +478,332 @@ struct MANGOS_DLL_DECL cthunAI : public ScriptedAI void Reset() { - //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 - - //Clear players in stomach and outside + // One random wisper every 90 - 300 seconds + m_uiWisperTimer = 90000; + + // Phase information + m_uiPhaseTimer = 10000; // Emerge in 10 seconds + + // Body Phase + m_uiEyeTentacleTimer = 30000; + m_uiFleshTentaclesKilled = 0; + m_uiGiantClawTentacleTimer = 15000; // 15 seconds into body phase (1 min repeat) + m_uiGiantEyeTentacleTimer = 45000; // 15 seconds into body phase (1 min repeat) + m_uiStomachAcidTimer = 4000; // Every 4 seconds + m_uiStomachEnterTimer = 10000; // Every 10 seconds + m_uiStomachEnterVisTimer = 0; // Always 3.5 seconds after Stomach Enter Timer + m_stomachEnterTargetGuid.Clear(); // Target to be teleported to stomach + + // Clear players in stomach and outside m_mStomachMap.clear(); - //Reset flags + // Reset flags m_creature->RemoveAurasDueToSpell(SPELL_TRANSFORM); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - - if (m_pInstance) - m_pInstance->SetData(TYPE_CTHUN_PHASE, 0); } - void SpawnEyeTentacle(float x, float y) + void JustSummoned(Creature* pSummoned) { - Creature* Spawned; - Spawned = (Creature*)m_creature->SummonCreature(MOB_EYE_TENTACLE,m_creature->GetPositionX()+x,m_creature->GetPositionY()+y,m_creature->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500); - if (Spawned) + if (pSummoned->GetEntry() == MOB_EYE_TENTACLE) { - Unit* target; - - target = SelectRandomNotStomach(); - - if (target) - Spawned->AI()->AttackStart(target); + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + pSummoned->AI()->AttackStart(pTarget); } } - Unit* SelectRandomNotStomach() + void SpawnEyeTentacle(float x, float y) + { + m_creature->SummonCreature(MOB_EYE_TENTACLE, m_creature->GetPositionX()+x ,m_creature->GetPositionY()+y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500); + } + + Player* SelectRandomNotStomach() { if (m_mStomachMap.empty()) return NULL; - StomachMap::iterator i = m_mStomachMap.begin(); + std::vector vTempTargets; + vTempTargets.reserve(m_mStomachMap.size()); - std::list temp; - std::list::iterator j; - - //Get all players in map - while (i != m_mStomachMap.end()) + // Get all players in map + for (StomachMap::const_iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { - //Check for valid player - Unit* pUnit = m_creature->GetMap()->GetUnit(i->first); + // Check for valid player + Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); - //Only units out of stomach - if (pUnit && i->second == false) - { - temp.push_back(pUnit); - } - ++i; + // Only units out of stomach + if (pPlayer && itr->second == false) + vTempTargets.push_back(pPlayer); } - if (temp.empty()) + if (vTempTargets.empty()) return NULL; - j = temp.begin(); - - //Get random but only if we have more than one unit on threat list - if (temp.size() > 1) - advance (j , rand() % (temp.size() - 1)); - - return (*j); + // Get random but only if we have more than one unit on threat list + return vTempTargets[urand(0, vTempTargets.size()- 1)]; } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - //Check if we have a target + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { - //No target so we'll use this section to do our random wispers instance wide - //WisperTimer - if (WisperTimer < diff) + // No target so we'll use this section to do our random wispers instance wide + // WisperTimer + if (m_uiWisperTimer < uiDiff) { - Map *map = m_creature->GetMap(); - if (!map->IsDungeon()) + if (!m_creature->GetMap()->IsDungeon()) return; - //Play random sound to the zone - Map::PlayerList const &PlayerList = map->GetPlayers(); - - if (!PlayerList.isEmpty()) - { - for(Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) - { - if (Player* pPlr = itr->getSource()) - pPlr->PlayDirectSound(RANDOM_SOUND_WHISPER,pPlr); - } - } + // Play random sound to the map + m_creature->GetMap()->PlayDirectSoundToMap(RANDOM_SOUND_WHISPER); - //One random wisper every 90 - 300 seconds - WisperTimer = urand(90000, 300000); - }else WisperTimer -= diff; + // One random wisper every 90 - 300 seconds + m_uiWisperTimer = urand(90000, 300000); + } + else + m_uiWisperTimer -= uiDiff; return; } m_creature->SetTargetGuid(ObjectGuid()); - //No instance + // No instance if (!m_pInstance) return; switch (m_pInstance->GetData(TYPE_CTHUN_PHASE)) { - //Transition phase - case 2: + // Transition phase + case PHASE_TRANSITION: { - //PhaseTimer - if (PhaseTimer < diff) + // PhaseTimer + if (m_uiPhaseTimer < uiDiff) { - //Switch - m_pInstance->SetData(TYPE_CTHUN_PHASE, 3); + // Switch + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_CTHUN); - //Switch to c'thun model + // Switch to C'thun model m_creature->InterruptNonMeleeSpells(false); DoCastSpellIfCan(m_creature, SPELL_TRANSFORM); m_creature->SetHealth(m_creature->GetMaxHealth()); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - //Emerging phase + // Emerging phase m_creature->SetInCombatWithZone(); - //Place all units in threat list on outside of stomach + // Place all units in threat list on outside of stomach m_mStomachMap.clear(); ThreatList const& tList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator i = tList.begin();i != tList.end(); ++i) { - //Outside stomach - m_mStomachMap[(*i)->getUnitGuid()] = false; + // Outside stomach, only players + if ((*i)->getUnitGuid().IsPlayer()) + m_mStomachMap[(*i)->getUnitGuid()] = false; } - //Spawn 2 flesh tentacles - FleshTentaclesKilled = 0; + // Spawn 2 flesh tentacles + m_uiFleshTentaclesKilled = 0; - //Spawn flesh tentacle + // Spawn flesh tentacle Creature* pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS1_X, TENTACLE_POS1_Y, TENTACLE_POS1_Z, TENTACLE_POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) - ++FleshTentaclesKilled; + ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast(pSpawned->AI())) - pTentacleAI->SpawnedByCthun(m_creature->GetGUID()); + pTentacleAI->SpawnedByCthun(m_creature); } - //Spawn flesh tentacle + // Spawn flesh tentacle pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS2_X, TENTACLE_POS2_Y, TENTACLE_POS2_Z, TENTACLE_POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) - ++FleshTentaclesKilled; + ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast(pSpawned->AI())) - pTentacleAI->SpawnedByCthun(m_creature->GetGUID()); + pTentacleAI->SpawnedByCthun(m_creature); } - PhaseTimer = 0; - }else PhaseTimer -= diff; + m_uiPhaseTimer = 0; + } + else + m_uiPhaseTimer -= uiDiff; - }break; + break; - //Body Phase - case 3: + } + // Body Phase + case PHASE_CTHUN: { - //Remove Target field - m_creature->SetTargetGuid(ObjectGuid()); - - //Weaken - if (FleshTentaclesKilled > 1) + // Weaken + if (m_uiFleshTentaclesKilled > 1) { - m_pInstance->SetData(TYPE_CTHUN_PHASE, 4); + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_CTHUN_WEAKENED); DoScriptText(EMOTE_WEAKENED, m_creature); - PhaseTimer = 45000; + m_uiPhaseTimer = 45000; DoCastSpellIfCan(m_creature, SPELL_RED_COLORATION, CAST_TRIGGERED); - StomachMap::iterator i = m_mStomachMap.begin(); - - //Kick all players out of stomach - while (i != m_mStomachMap.end()) + // Kick all players out of stomach + for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { - //Check for valid player - Unit* pUnit = m_creature->GetMap()->GetUnit(i->first); + // Check for valid player + Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); - //Only move units in stomach - if (pUnit && i->second == true) + if (pPlayer && itr->second == true) { - //Teleport each player out - DoTeleportPlayer(pUnit, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6); + // Teleport each player out + DoTeleportPlayer(pPlayer, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6); - //Cast knockback on them - DoCastSpellIfCan(pUnit, SPELL_EXIT_STOMACH_KNOCKBACK, CAST_TRIGGERED); + // Cast knockback on them + DoCastSpellIfCan(pPlayer, SPELL_EXIT_STOMACH_KNOCKBACK, CAST_TRIGGERED); - //Remove the acid debuff - pUnit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); + // Remove the acid debuff + pPlayer->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); - i->second = false; + itr->second = false; } - ++i; } return; } - //Stomach acid - if (StomachAcidTimer < diff) + // Stomach acid + if (m_uiStomachAcidTimer < uiDiff) { - //Apply aura to all players in stomach - StomachMap::iterator i = m_mStomachMap.begin(); - - while (i != m_mStomachMap.end()) + // Apply aura to all players in stomach + for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { - //Check for valid player - Unit* pUnit = m_creature->GetMap()->GetUnit(i->first); + // Check for valid player + Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); - //Only apply to units in stomach - if (pUnit && i->second == true) + // Only apply to units in stomach + if (pPlayer && itr->second == true) { - //Cast digestive acid on them - DoCastSpellIfCan(pUnit, SPELL_DIGESTIVE_ACID, CAST_TRIGGERED); + // Cast digestive acid on them + DoCastSpellIfCan(pPlayer, SPELL_DIGESTIVE_ACID, CAST_TRIGGERED); - //Check if player should be kicked from stomach - if (pUnit->IsWithinDist3d(KICK_X, KICK_Y, KICK_Z, 15.0f)) + // Check if player should be kicked from stomach + if (pPlayer->IsWithinDist3d(KICK_X, KICK_Y, KICK_Z, 10.0f)) { - //Teleport each player out - DoTeleportPlayer(pUnit, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6); + // Teleport each player out + DoTeleportPlayer(pPlayer, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6); - //Cast knockback on them - DoCastSpellIfCan(pUnit, SPELL_EXIT_STOMACH_KNOCKBACK, CAST_TRIGGERED); + // Cast knockback on them + DoCastSpellIfCan(pPlayer, SPELL_EXIT_STOMACH_KNOCKBACK, CAST_TRIGGERED); - //Remove the acid debuff - pUnit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); + // Remove the acid debuff + pPlayer->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); - i->second = false; + itr->second = false; } } - ++i; } - StomachAcidTimer = 4000; - }else StomachAcidTimer -= diff; + m_uiStomachAcidTimer = 4000; + } + else + m_uiStomachAcidTimer -= uiDiff; - //Stomach Enter Timer - if (StomachEnterTimer < diff) + // Stomach Enter Timer + if (m_uiStomachEnterTimer < uiDiff) { - Unit* target = NULL; - target = SelectRandomNotStomach(); - - if (target) + if (Player* pTarget = SelectRandomNotStomach()) { - //Set target in stomach - m_mStomachMap[target->GetObjectGuid()] = true; - target->InterruptNonMeleeSpells(false); - target->CastSpell(target, SPELL_MOUTH_TENTACLE, true, NULL, NULL, m_creature->GetObjectGuid()); - StomachEnterTarget = target->GetGUID(); - StomachEnterVisTimer = 3800; + // Set target in stomach + m_mStomachMap[pTarget->GetObjectGuid()] = true; + pTarget->InterruptNonMeleeSpells(false); + pTarget->CastSpell(pTarget, SPELL_MOUTH_TENTACLE, true, NULL, NULL, m_creature->GetObjectGuid()); + m_stomachEnterTargetGuid = pTarget->GetObjectGuid(); + m_uiStomachEnterVisTimer = 3800; } - StomachEnterTimer = 13800; - }else StomachEnterTimer -= diff; + m_uiStomachEnterTimer = 13800; + } + else + m_uiStomachEnterTimer -= uiDiff; - if (StomachEnterVisTimer && StomachEnterTarget) - if (StomachEnterVisTimer <= diff) + if (m_uiStomachEnterVisTimer && m_stomachEnterTargetGuid) { - //Check for valid player - Unit* pUnit = m_creature->GetMap()->GetUnit(StomachEnterTarget); - - if (pUnit) + if (m_uiStomachEnterVisTimer <= uiDiff) { - DoTeleportPlayer(pUnit, STOMACH_X, STOMACH_Y, STOMACH_Z, STOMACH_O); - } + // Check for valid player + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_stomachEnterTargetGuid)) + DoTeleportPlayer(pPlayer, STOMACH_X, STOMACH_Y, STOMACH_Z, STOMACH_O); - StomachEnterTarget = 0; - StomachEnterVisTimer = 0; - }else StomachEnterVisTimer -= diff; + m_stomachEnterTargetGuid.Clear(); + m_uiStomachEnterVisTimer = 0; - //GientClawTentacleTimer - if (GiantClawTentacleTimer < diff) + // Note that actually C'Thun cannot be soloed, so kill all players, if no player left outside of stomach + bool bKillAllPlayer = true; + for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) + { + Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); + if (itr->second == false && pPlayer) + { + bKillAllPlayer = false; + break; + } + } + if (bKillAllPlayer) + { + for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) + { + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first)) + m_creature->DealDamage(pPlayer, pPlayer->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); + } + EnterEvadeMode(); + return; + } + } + else + m_uiStomachEnterVisTimer -= uiDiff; + } + + // GientClawTentacleTimer + if (m_uiGiantClawTentacleTimer < uiDiff) { - Unit* target = NULL; - target = SelectRandomNotStomach(); - if (target) + if (Player* pTarget = SelectRandomNotStomach()) { Creature* Spawned = NULL; - //Spawn claw tentacle on the random target - Spawned = (Creature*)m_creature->SummonCreature(MOB_GIANT_CLAW_TENTACLE,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500); - - if (Spawned) - Spawned->AI()->AttackStart(target); + // Spawn claw tentacle on the random target + if (Creature* pSummoned = m_creature->SummonCreature(MOB_GIANT_CLAW_TENTACLE, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500)) + pSummoned->AI()->AttackStart(pTarget); } - //One giant claw tentacle every minute - GiantClawTentacleTimer = 60000; - }else GiantClawTentacleTimer -= diff; + // One giant claw tentacle every minute + m_uiGiantClawTentacleTimer = 60000; + } + else + m_uiGiantClawTentacleTimer -= uiDiff; - //GiantEyeTentacleTimer - if (GiantEyeTentacleTimer < diff) + // GiantEyeTentacleTimer + if (m_uiGiantEyeTentacleTimer < uiDiff) { - Unit* target = NULL; - target = SelectRandomNotStomach(); - if (target) + if (Player* pTarget = SelectRandomNotStomach()) { - - Creature* Spawned = NULL; - - //Spawn claw tentacle on the random target - Spawned = (Creature*)m_creature->SummonCreature(MOB_GIANT_EYE_TENTACLE,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500); - - if (Spawned) - Spawned->AI()->AttackStart(target); + // Spawn claw tentacle on the random target + if (Creature* pSummoned = m_creature->SummonCreature(MOB_GIANT_EYE_TENTACLE, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500)) + pSummoned->AI()->AttackStart(pTarget); } - //One giant eye tentacle every minute - GiantEyeTentacleTimer = 60000; - }else GiantEyeTentacleTimer -= diff; + // One giant eye tentacle every minute + m_uiGiantEyeTentacleTimer = 60000; + } + else + m_uiGiantEyeTentacleTimer -= uiDiff; - //EyeTentacleTimer - if (EyeTentacleTimer < diff) + // EyeTentacleTimer + if (m_uiEyeTentacleTimer < uiDiff) { - //Spawn the 8 Eye Tentacles in the corret spots + // Spawn the 8 Eye Tentacles in the corret spots SpawnEyeTentacle(0, 25); //south SpawnEyeTentacle(12, 12); //south west SpawnEyeTentacle(25, 0); //west @@ -821,98 +815,113 @@ struct MANGOS_DLL_DECL cthunAI : public ScriptedAI SpawnEyeTentacle(-12, 12); // south east //These spawn at every 30 seconds - EyeTentacleTimer = 30000; - }else EyeTentacleTimer -= diff; + m_uiEyeTentacleTimer = 30000; + } + else + m_uiEyeTentacleTimer -= uiDiff; - }break; + break; - //Weakened state - case 4: + } + // Weakened state + case PHASE_CTHUN_WEAKENED: { - //PhaseTimer - if (PhaseTimer < diff) + // PhaseTimer + if (m_uiPhaseTimer < uiDiff) { - //Switch - m_pInstance->SetData(TYPE_CTHUN_PHASE, 3); + // Switch + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_CTHUN); - //Remove red coloration + // Remove red coloration m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION); - //Spawn 2 flesh tentacles - FleshTentaclesKilled = 0; + // Spawn 2 flesh tentacles + m_uiFleshTentaclesKilled = 0; - //Spawn flesh tentacle + // Spawn flesh tentacle Creature* pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS1_X, TENTACLE_POS1_Y, TENTACLE_POS1_Z, TENTACLE_POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) - ++FleshTentaclesKilled; + ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast(pSpawned->AI())) - pTentacleAI->SpawnedByCthun(m_creature->GetGUID()); + pTentacleAI->SpawnedByCthun(m_creature); } - //Spawn flesh tentacle + pSpawned = NULL; + // Spawn flesh tentacle pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS2_X, TENTACLE_POS2_Y, TENTACLE_POS2_Z, TENTACLE_POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) - ++FleshTentaclesKilled; + ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast(pSpawned->AI())) - pTentacleAI->SpawnedByCthun(m_creature->GetGUID()); + pTentacleAI->SpawnedByCthun(m_creature); } - PhaseTimer = 0; - }else PhaseTimer -= diff; + m_uiPhaseTimer = 0; + } + else + m_uiPhaseTimer -= uiDiff; } } } void JustDied(Unit* pKiller) { - //Switch + // Switch if (m_pInstance) - m_pInstance->SetData(TYPE_CTHUN_PHASE, 5); + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_FINISH); } - void DamageTaken(Unit *done_by, uint32 &damage) + void EnterEvadeMode() { - //No instance + if (m_pInstance) + m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_NOT_STARTED); + + ScriptedAI::EnterEvadeMode(); + } + + void DamageTaken(Unit* pDealer, uint32& uiDamage) + { + // No instance if (!m_pInstance) return; switch (m_pInstance->GetData(TYPE_CTHUN_PHASE)) { - case 3: + case PHASE_CTHUN: { - //Not weakened so reduce damage by 99% - if (damage / 99 > 0) damage/= 99; - else damage = 1; + // Not weakened so reduce damage by 99% + if (uiDamage / 99 > 0) uiDamage/= 99; + else + uiDamage = 1; - //Prevent death in non-weakened state - if (damage >= m_creature->GetHealth()) - damage = 0; + // Prevent death in non-weakened state + if (uiDamage >= m_creature->GetHealth()) + uiDamage = 0; return; } break; - case 4: + case PHASE_CTHUN_WEAKENED: { //Weakened - takes normal damage return; } default: - damage = 0; + uiDamage = 0; break; } } void FleshTentcleKilled() { - ++FleshTentaclesKilled; + ++m_uiFleshTentaclesKilled; } }; @@ -924,26 +933,26 @@ struct MANGOS_DLL_DECL eye_tentacleAI : public ScriptedAI Reset(); if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) - Portal = pPortal->GetGUID(); + m_portalGuid = pPortal->GetObjectGuid(); } - uint32 MindflayTimer; - uint32 KillSelfTimer; - uint64 Portal; + uint32 m_uiMindflayTimer; + uint32 m_uiKillSelfTimer; + ObjectGuid m_portalGuid; void JustDied(Unit*) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(Portal)) + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_portalGuid)) pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); } void Reset() { - //Mind flay half a second after we spawn - MindflayTimer = 500; + // Mind flay half a second after we spawn + m_uiMindflayTimer = 500; - //This prevents eyes from overlapping - KillSelfTimer = 35000; + // This prevents eyes from overlapping + m_uiKillSelfTimer = 35000; } void Aggro(Unit* pWho) @@ -951,31 +960,35 @@ struct MANGOS_DLL_DECL eye_tentacleAI : public ScriptedAI m_creature->SetInCombatWithZone(); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - //Check if we have a target + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //KillSelfTimer - if (KillSelfTimer < diff) + // KillSelfTimer + if (m_uiKillSelfTimer < uiDiff) { m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); return; - }else KillSelfTimer -= diff; + } + else + m_uiKillSelfTimer -= uiDiff; - //MindflayTimer - if (MindflayTimer < diff) + // MindflayTimer + if (m_uiMindflayTimer < uiDiff) { Unit* target = NULL; - target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); + target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); if (target && !target->HasAura(SPELL_DIGESTIVE_ACID, EFFECT_INDEX_0)) - DoCastSpellIfCan(target,SPELL_MIND_FLAY); + DoCastSpellIfCan(target, SPELL_MIND_FLAY); //Mindflay every 10 seconds - MindflayTimer = 10100; - }else MindflayTimer -= diff; + m_uiMindflayTimer = 10100; + } + else + m_uiMindflayTimer -= uiDiff; } }; @@ -987,26 +1000,26 @@ struct MANGOS_DLL_DECL claw_tentacleAI : public ScriptedAI Reset(); if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) - Portal = pPortal->GetGUID(); + m_portalGuid = pPortal->GetObjectGuid(); } - uint32 GroundRuptureTimer; - uint32 HamstringTimer; - uint32 EvadeTimer; - uint64 Portal; + uint32 m_uiGroundRuptureTimer; + uint32 m_uiHamstringTimer; + uint32 m_uiEvadeTimer; + ObjectGuid m_portalGuid; void JustDied(Unit*) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(Portal)) + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_portalGuid)) pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); } void Reset() { - //First rupture should happen half a second after we spawn - GroundRuptureTimer = 500; - HamstringTimer = 2000; - EvadeTimer = 5000; + // First rupture should happen half a second after we spawn + m_uiGroundRuptureTimer = 500; + m_uiHamstringTimer = 2000; + m_uiEvadeTimer = 5000; } void Aggro(Unit* pWho) @@ -1014,59 +1027,66 @@ struct MANGOS_DLL_DECL claw_tentacleAI : public ScriptedAI m_creature->SetInCombatWithZone(); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - //Check if we have a target + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //EvadeTimer + // EvadeTimer if (!m_creature->CanReachWithMeleeAttack(m_creature->getVictim())) - if (EvadeTimer < diff) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(Portal)) - pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); - - //Dissapear and reappear at new position - m_creature->SetVisibility(VISIBILITY_OFF); - - Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); - if (!target) + if (m_uiEvadeTimer < uiDiff) { - m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); - return; - } + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_portalGuid)) + pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); - if (!target->HasAura(SPELL_DIGESTIVE_ACID, EFFECT_INDEX_0)) - { - m_creature->GetMap()->CreatureRelocation(m_creature, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0); + // Dissapear and reappear at new position + m_creature->SetVisibility(VISIBILITY_OFF); - if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) - Portal = pPortal->GetGUID(); + Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); + if (!pTarget) + { + m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); + return; + } - GroundRuptureTimer = 500; - HamstringTimer = 2000; - EvadeTimer = 5000; - AttackStart(target); - } + if (!pTarget->HasAura(SPELL_DIGESTIVE_ACID, EFFECT_INDEX_0)) + { + m_creature->GetMap()->CreatureRelocation(m_creature, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0); - m_creature->SetVisibility(VISIBILITY_ON); + if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) + m_portalGuid = pPortal->GetObjectGuid(); - }else EvadeTimer -= diff; + m_uiGroundRuptureTimer = 500; + m_uiHamstringTimer = 2000; + m_uiEvadeTimer = 5000; + AttackStart(pTarget); + } - //GroundRuptureTimer - if (GroundRuptureTimer < diff) + m_creature->SetVisibility(VISIBILITY_ON); + } + else + m_uiEvadeTimer -= uiDiff; + } + + // GroundRuptureTimer + if (m_uiGroundRuptureTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(),SPELL_GROUND_RUPTURE); - GroundRuptureTimer = 30000; - }else GroundRuptureTimer -= diff; + m_uiGroundRuptureTimer = 30000; + } + else + m_uiGroundRuptureTimer -= uiDiff; - //HamstringTimer - if (HamstringTimer < diff) + // HamstringTimer + if (m_uiHamstringTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(),SPELL_HAMSTRING); - HamstringTimer = 5000; - }else HamstringTimer -= diff; + m_uiHamstringTimer = 5000; + } + else + m_uiHamstringTimer -= uiDiff; DoMeleeAttackIfReady(); } @@ -1080,28 +1100,28 @@ struct MANGOS_DLL_DECL giant_claw_tentacleAI : public ScriptedAI Reset(); if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) - Portal = pPortal->GetGUID(); + m_portalGuid = pPortal->GetObjectGuid(); } - uint32 GroundRuptureTimer; - uint32 ThrashTimer; - uint32 HamstringTimer; - uint32 EvadeTimer; - uint64 Portal; + uint32 m_uiGroundRuptureTimer; + uint32 m_uiThrashTimer; + uint32 m_uiHamstringTimer; + uint32 m_uiEvadeTimer; + ObjectGuid m_portalGuid; void JustDied(Unit*) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(Portal)) + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_portalGuid)) pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); } void Reset() { //First rupture should happen half a second after we spawn - GroundRuptureTimer = 500; - HamstringTimer = 2000; - ThrashTimer = 5000; - EvadeTimer = 5000; + m_uiGroundRuptureTimer = 500; + m_uiHamstringTimer = 2000; + m_uiThrashTimer = 5000; + m_uiEvadeTimer = 5000; } void Aggro(Unit* pWho) @@ -1109,68 +1129,78 @@ struct MANGOS_DLL_DECL giant_claw_tentacleAI : public ScriptedAI m_creature->SetInCombatWithZone(); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - //Check if we have a target + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //EvadeTimer + // EvadeTimer if (m_creature->CanReachWithMeleeAttack(m_creature->getVictim())) - if (EvadeTimer < diff) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(Portal)) - pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); + if (m_uiEvadeTimer < uiDiff) + { + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_portalGuid)) + pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); - //Dissapear and reappear at new position - m_creature->SetVisibility(VISIBILITY_OFF); + // Dissapear and reappear at new position + m_creature->SetVisibility(VISIBILITY_OFF); - Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); + Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); - if (!target) - { - m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); - return; - } + if (!target) + { + m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); + return; + } - if (!target->HasAura(SPELL_DIGESTIVE_ACID, EFFECT_INDEX_0)) - { - m_creature->GetMap()->CreatureRelocation(m_creature, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0); + if (!target->HasAura(SPELL_DIGESTIVE_ACID, EFFECT_INDEX_0)) + { + m_creature->GetMap()->CreatureRelocation(m_creature, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0); - if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) - Portal = pPortal->GetGUID(); + if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) + m_portalGuid = pPortal->GetObjectGuid(); - GroundRuptureTimer = 500; - HamstringTimer = 2000; - ThrashTimer = 5000; - EvadeTimer = 5000; - AttackStart(target); - } + m_uiGroundRuptureTimer = 500; + m_uiHamstringTimer = 2000; + m_uiThrashTimer = 5000; + m_uiEvadeTimer = 5000; + AttackStart(target); + } - m_creature->SetVisibility(VISIBILITY_ON); + m_creature->SetVisibility(VISIBILITY_ON); - }else EvadeTimer -= diff; + } + else + m_uiEvadeTimer -= uiDiff; + } - //GroundRuptureTimer - if (GroundRuptureTimer < diff) + // GroundRuptureTimer + if (m_uiGroundRuptureTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(),SPELL_GROUND_RUPTURE); - GroundRuptureTimer = 30000; - }else GroundRuptureTimer -= diff; + m_uiGroundRuptureTimer = 30000; + } + else + m_uiGroundRuptureTimer -= uiDiff; - //ThrashTimer - if (ThrashTimer < diff) + // ThrashTimer + if (m_uiThrashTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(),SPELL_THRASH); - ThrashTimer = 10000; - }else ThrashTimer -= diff; + m_uiThrashTimer = 10000; + } + else + m_uiThrashTimer -= uiDiff; - //HamstringTimer - if (HamstringTimer < diff) + // HamstringTimer + if (m_uiHamstringTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(),SPELL_HAMSTRING); - HamstringTimer = 10000; - }else HamstringTimer -= diff; + m_uiHamstringTimer = 10000; + } + else + m_uiHamstringTimer -= uiDiff; DoMeleeAttackIfReady(); } @@ -1184,22 +1214,22 @@ struct MANGOS_DLL_DECL giant_eye_tentacleAI : public ScriptedAI Reset(); if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) - Portal = pPortal->GetGUID(); + m_portalGuid = pPortal->GetObjectGuid(); } - uint32 BeamTimer; - uint64 Portal; + uint32 m_uiBeamTimer; + ObjectGuid m_portalGuid; void JustDied(Unit*) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(Portal)) + if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_portalGuid)) pCreature->DealDamage(pCreature, pCreature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); } void Reset() { //Green Beam half a second after we spawn - BeamTimer = 500; + m_uiBeamTimer = 500; } void Aggro(Unit* pWho) @@ -1207,59 +1237,65 @@ struct MANGOS_DLL_DECL giant_eye_tentacleAI : public ScriptedAI m_creature->SetInCombatWithZone(); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - //Check if we have a target + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //BeamTimer - if (BeamTimer < diff) + // BeamTimer + if (m_uiBeamTimer < uiDiff) { Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); if (target && !target->HasAura(SPELL_DIGESTIVE_ACID, EFFECT_INDEX_0)) DoCastSpellIfCan(target,SPELL_GREEN_BEAM); - //Beam every 2 seconds - BeamTimer = 2100; - }else BeamTimer -= diff; + // Beam every 2 seconds + m_uiBeamTimer = 2100; + } + else + m_uiBeamTimer -= uiDiff; } }; -//Flesh tentacle functions -void flesh_tentacleAI::UpdateAI(const uint32 diff) +// Flesh tentacle functions +void flesh_tentacleAI::UpdateAI(const uint32 uiDiff) { - //Check if we have a target + // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (Parent) - if (CheckTimer < diff) + if (m_cThunGuid) { - Creature* pParent = m_creature->GetMap()->GetCreature(Parent); - - if (!pParent || !pParent->isAlive() || !pParent->isInCombat()) + if (m_uiCheckTimer < uiDiff) { - Parent = 0; - m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); - return; - } + Creature* pParent = m_creature->GetMap()->GetCreature(m_cThunGuid); + + if (!pParent || !pParent->isAlive() || !pParent->isInCombat()) + { + m_cThunGuid.Clear(); + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); + return; + } - CheckTimer = 1000; - }else CheckTimer -= diff; + m_uiCheckTimer = 1000; + } + else + m_uiCheckTimer -= uiDiff; + } DoMeleeAttackIfReady(); } void flesh_tentacleAI::JustDied(Unit* killer) { - if (!Parent) + if (!m_cThunGuid) { - error_log("SD2: flesh_tentacle: No Parent variable"); + error_log("SD2: flesh_tentacle: No m_cThunGuid variable"); return; } - if (Creature* pCthun = m_creature->GetMap()->GetCreature(Parent)) + if (Creature* pCthun = m_creature->GetMap()->GetCreature(m_cThunGuid)) { if (cthunAI* pCthunAI = dynamic_cast(pCthun->AI())) pCthunAI->FleshTentcleKilled(); @@ -1268,7 +1304,7 @@ void flesh_tentacleAI::JustDied(Unit* killer) error_log("SD2: flesh_tentacle: No Cthun"); } -//GetAIs +// GetAIs CreatureAI* GetAI_eye_of_cthun(Creature* pCreature) { return new eye_of_cthunAI(pCreature); @@ -1306,41 +1342,41 @@ CreatureAI* GetAI_flesh_tentacle(Creature* pCreature) void AddSC_boss_cthun() { - Script *newscript; + Script* pNewScript; //Eye - newscript = new Script; - newscript->Name = "boss_eye_of_cthun"; - newscript->GetAI = &GetAI_eye_of_cthun; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "boss_cthun"; - newscript->GetAI = &GetAI_cthun; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_eye_tentacle"; - newscript->GetAI = &GetAI_eye_tentacle; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_claw_tentacle"; - newscript->GetAI = &GetAI_claw_tentacle; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_giant_claw_tentacle"; - newscript->GetAI = &GetAI_giant_claw_tentacle; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_giant_eye_tentacle"; - newscript->GetAI = &GetAI_giant_eye_tentacle; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_giant_flesh_tentacle"; - newscript->GetAI = &GetAI_flesh_tentacle; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "boss_eye_of_cthun"; + pNewScript->GetAI = &GetAI_eye_of_cthun; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "boss_cthun"; + pNewScript->GetAI = &GetAI_cthun; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_eye_tentacle"; + pNewScript->GetAI = &GetAI_eye_tentacle; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_claw_tentacle"; + pNewScript->GetAI = &GetAI_claw_tentacle; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_giant_claw_tentacle"; + pNewScript->GetAI = &GetAI_giant_claw_tentacle; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_giant_eye_tentacle"; + pNewScript->GetAI = &GetAI_giant_eye_tentacle; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_giant_flesh_tentacle"; + pNewScript->GetAI = &GetAI_flesh_tentacle; + pNewScript->RegisterSelf(); } diff --git a/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp b/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp index a6e1ccd..223cebf 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp @@ -298,7 +298,6 @@ struct MANGOS_DLL_DECL boss_skeramAI : public ScriptedAI Image2->AI()->AttackStart(target); } - Invisible = true; delete place1; delete place2; diff --git a/scripts/kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp b/scripts/kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp index e719837..f6e91d6 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp @@ -92,11 +92,11 @@ struct MANGOS_DLL_DECL boss_twinemperorsAI : public ScriptedAI EnrageTimer = 15*60000; } - Creature *GetOtherBoss() + Creature* GetOtherBoss() { if (m_pInstance) { - return m_creature->GetMap()->GetCreature(m_pInstance->GetData64(IAmVeklor() ? NPC_VEKNILASH : NPC_VEKLOR)); + return m_pInstance->GetSingleCreatureFromStorage(IAmVeklor() ? NPC_VEKNILASH : NPC_VEKLOR); } else { diff --git a/scripts/kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp b/scripts/kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp index 319a207..7cf3feb 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp @@ -23,10 +23,26 @@ EndScriptData */ #include "precompiled.h" -#define SPELL_POISON_SHOCK 25993 -#define SPELL_POISONBOLT_VOLLEY 25991 +enum +{ + // Timer spells + SPELL_POISON_SHOCK = 25993, + SPELL_POISONBOLT_VOLLEY = 25991, + SPELL_TOXIN = 26575, // Triggers toxin cloud + SPELL_TOXIN_CLOUD = 25989, + + // Debuffs gained by the boss on frost damage + SPELL_VISCIDUS_SLOWED = 26034, + SPELL_VISCIDUS_SLOWED_MORE = 26036, + SPELL_VISCIDUS_FREEZE = 25937, + + // When frost damage exceeds a certain limit, then boss explodes + SPELL_REJOIN_VISCIDUS = 25896, + SPELL_VISCIDUS_EXPLODE = 25938, // Casts a lot of spells in the same time: 25865 to 25884; All spells have target coords + SPELL_VISCIDUS_SUICIDE = 26003, -#define SPELL_TOXIN_CLOUD 25989 + NPC_GLOB_OF_VISCIDUS = 15667 +}; void AddSC_boss_viscidus() { diff --git a/scripts/kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp b/scripts/kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp index a438d92..7b70fc0 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp @@ -25,16 +25,7 @@ EndScriptData */ #include "temple_of_ahnqiraj.h" instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj(Map* pMap) : ScriptedInstance(pMap), - m_uiSkeramGUID(0), - m_uiVemGUID(0), - m_uiKriGUID(0), - m_uiVeklorGUID(0), - m_uiVeknilashGUID(0), - m_uiBugTrioDeathCount(0), - m_uiCthunPhase(0), - m_uiSkeramGateGUID(0), - m_uiTwinsEnterDoorGUID(0), - m_uiTwinsExitDoorGUID(0) + m_uiBugTrioDeathCount(0) { Initialize(); }; @@ -48,11 +39,13 @@ void instance_temple_of_ahnqiraj::OnCreatureCreate (Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_SKERAM: m_uiSkeramGUID = pCreature->GetGUID(); break; - case NPC_VEM: m_uiVemGUID = pCreature->GetGUID(); break; - case NPC_KRI: m_uiKriGUID = pCreature->GetGUID(); break; - case NPC_VEKLOR: m_uiVeklorGUID = pCreature->GetGUID(); break; - case NPC_VEKNILASH: m_uiVeknilashGUID = pCreature->GetGUID(); break; + case NPC_VEM: + case NPC_KRI: + case NPC_VEKLOR: + case NPC_VEKNILASH: + case NPC_CTHUN: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -61,19 +54,21 @@ void instance_temple_of_ahnqiraj::OnObjectCreate(GameObject* pGo) switch (pGo->GetEntry()) { case GO_SKERAM_GATE: - m_uiSkeramGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_SKERAM] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_TWINS_ENTER_DOOR: - m_uiTwinsEnterDoorGUID = pGo->GetGUID(); break; case GO_TWINS_EXIT_DOOR: - m_uiTwinsExitDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_TWINS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; + + default: + return; } + + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } bool instance_temple_of_ahnqiraj::IsEncounterInProgress() const @@ -89,7 +84,7 @@ void instance_temple_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) case TYPE_SKERAM: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiSkeramGateGUID); + DoUseDoorOrButton(GO_SKERAM_GATE); break; case TYPE_VEM: m_auiEncounter[uiType] = uiData; @@ -100,19 +95,18 @@ void instance_temple_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) return; m_auiEncounter[uiType] = uiData; - DoUseDoorOrButton(m_uiTwinsEnterDoorGUID); + DoUseDoorOrButton(GO_TWINS_ENTER_DOOR); if (uiData == DONE) - DoUseDoorOrButton(m_uiTwinsExitDoorGUID); + DoUseDoorOrButton(GO_TWINS_EXIT_DOOR); + break; + case TYPE_CTHUN_PHASE: + m_auiEncounter[uiType] = uiData; break; // The following temporarily datas are not to be saved case DATA_BUG_TRIO_DEATH: ++m_uiBugTrioDeathCount; return; - - case TYPE_CTHUN_PHASE: - m_uiCthunPhase = uiData; - return; } if (uiData == DONE) @@ -120,7 +114,7 @@ void instance_temple_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2]; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; m_strInstData = saveStream.str(); @@ -140,7 +134,7 @@ void instance_temple_of_ahnqiraj::Load(const char* chrIn) OUT_LOAD_INST_DATA(chrIn); std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2]; + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) { @@ -156,25 +150,12 @@ uint32 instance_temple_of_ahnqiraj::GetData(uint32 uiType) switch(uiType) { case TYPE_VEM: - return m_auiEncounter[0]; - case DATA_BUG_TRIO_DEATH: - return m_uiBugTrioDeathCount; + return m_auiEncounter[1]; case TYPE_CTHUN_PHASE: - return m_uiCthunPhase; - default: - return 0; - } -} + return m_auiEncounter[3];; -uint64 instance_temple_of_ahnqiraj::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_SKERAM: return m_uiSkeramGUID; - case NPC_VEM: return m_uiVemGUID; - case NPC_KRI: return m_uiKriGUID; - case NPC_VEKLOR: return m_uiVeklorGUID; - case NPC_VEKNILASH: return m_uiVeknilashGUID; + case DATA_BUG_TRIO_DEATH: + return m_uiBugTrioDeathCount; default: return 0; } diff --git a/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp b/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp index b4c578c..1c338e3 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp +++ b/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp @@ -65,7 +65,7 @@ struct MANGOS_DLL_DECL npc_anubisath_sentinelAI : public ScriptedAI { for(GUIDList::const_iterator itr = m_lAssistList.begin(); itr != m_lAssistList.end(); ++itr) { - if (*itr == m_creature->GetGUID()) + if (*itr == m_creature->GetObjectGuid()) continue; if (Creature* pBuddy = m_creature->GetMap()->GetCreature(*itr)) @@ -112,7 +112,7 @@ struct MANGOS_DLL_DECL npc_anubisath_sentinelAI : public ScriptedAI { if (Creature* pBuddy = m_creature->GetMap()->GetCreature(*itr)) { - if (*itr == m_creature->GetGUID()) + if (*itr == m_creature->GetObjectGuid()) continue; if (!pBuddy->isAlive()) @@ -130,7 +130,7 @@ struct MANGOS_DLL_DECL npc_anubisath_sentinelAI : public ScriptedAI { for(GUIDList::const_iterator itr = m_lAssistList.begin(); itr != m_lAssistList.end(); ++itr) { - if (*itr == m_creature->GetGUID()) + if (*itr == m_creature->GetObjectGuid()) continue; if (Creature* pBuddy = m_creature->GetMap()->GetCreature(*itr)) @@ -151,9 +151,9 @@ struct MANGOS_DLL_DECL npc_anubisath_sentinelAI : public ScriptedAI for(std::list::iterator iter = lAssistList.begin(); iter != lAssistList.end(); ++iter) { - m_lAssistList.push_back((*iter)->GetGUID()); + m_lAssistList.push_back((*iter)->GetObjectGuid()); - if ((*iter)->GetGUID() == m_creature->GetGUID()) + if ((*iter)->GetObjectGuid() == m_creature->GetObjectGuid()) continue; (*iter)->AI()->AttackStart(pTarget); diff --git a/scripts/kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h b/scripts/kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h index 8755dfc..17c78aa 100644 --- a/scripts/kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h +++ b/scripts/kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h @@ -7,25 +7,36 @@ enum { - MAX_ENCOUNTER = 3, + MAX_ENCOUNTER = 4, TYPE_SKERAM = 0, TYPE_VEM = 1, TYPE_TWINS = 2, + TYPE_CTHUN_PHASE = 3, - NPC_SKERAM = 15263, + // NPC_SKERAM = 15263, NPC_KRI = 15511, NPC_VEM = 15544, NPC_VEKLOR = 15276, NPC_VEKNILASH = 15275, + NPC_CTHUN = 15727, GO_SKERAM_GATE = 180636, GO_TWINS_ENTER_DOOR = 180634, GO_TWINS_EXIT_DOOR = 180635, DATA_BUG_TRIO_DEATH = 10, +}; - TYPE_CTHUN_PHASE = 20 +enum CThunPhase +{ + PHASE_NOT_STARTED = 0, + PHASE_EYE_NORMAL = 1, + PHASE_EYE_DARK_GLARE = 2, + PHASE_TRANSITION = 3, + PHASE_CTHUN = 4, + PHASE_CTHUN_WEAKENED = 5, + PHASE_FINISH = 6, }; class MANGOS_DLL_DECL instance_temple_of_ahnqiraj : public ScriptedInstance @@ -42,7 +53,6 @@ class MANGOS_DLL_DECL instance_temple_of_ahnqiraj : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -51,21 +61,7 @@ class MANGOS_DLL_DECL instance_temple_of_ahnqiraj : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - // Storing Skeram, Vem and Kri. - uint64 m_uiSkeramGUID; - uint64 m_uiVemGUID; - uint64 m_uiKriGUID; - uint64 m_uiVeklorGUID; - uint64 m_uiVeknilashGUID; - - // Doors - uint64 m_uiSkeramGateGUID; - uint64 m_uiTwinsEnterDoorGUID; - uint64 m_uiTwinsExitDoorGUID; - uint32 m_uiBugTrioDeathCount; - - uint32 m_uiCthunPhase; }; #endif diff --git a/scripts/kalimdor/wailing_caverns/instance_wailing_caverns.cpp b/scripts/kalimdor/wailing_caverns/instance_wailing_caverns.cpp index 5f4fd79..8ae9fb3 100644 --- a/scripts/kalimdor/wailing_caverns/instance_wailing_caverns.cpp +++ b/scripts/kalimdor/wailing_caverns/instance_wailing_caverns.cpp @@ -24,9 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "wailing_caverns.h" -instance_wailing_caverns::instance_wailing_caverns(Map* pMap) : ScriptedInstance(pMap), - m_uiNaralexGUID(0), - m_uiDiscipleGUID(0) +instance_wailing_caverns::instance_wailing_caverns(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -40,8 +38,10 @@ void instance_wailing_caverns::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_NARALEX: m_uiNaralexGUID = pCreature->GetGUID(); break; - case NPC_DISCIPLE: m_uiDiscipleGUID = pCreature->GetGUID(); break; + case NPC_NARALEX: + case NPC_DISCIPLE: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -75,7 +75,7 @@ void instance_wailing_caverns::SetData(uint32 uiType, uint32 uiData) // Yell intro text; only the first time if (m_auiEncounter[4] == NOT_STARTED) { - if (Creature* pDisciple = instance->GetCreature(m_uiDiscipleGUID)) + if (Creature* pDisciple = GetSingleCreatureFromStorage(NPC_DISCIPLE)) DoScriptText(SAY_INTRO, pDisciple); } @@ -91,7 +91,7 @@ void instance_wailing_caverns::SetData(uint32 uiType, uint32 uiData) saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } @@ -134,15 +134,6 @@ uint32 instance_wailing_caverns::GetData(uint32 uiType) return 0; } -uint64 instance_wailing_caverns::GetData64(uint32 uiData) -{ - switch (uiData) - { - case NPC_NARALEX: return m_uiNaralexGUID; - } - return 0; -} - InstanceData* GetInstanceData_instance_wailing_caverns(Map* pMap) { return new instance_wailing_caverns(pMap); @@ -150,9 +141,10 @@ InstanceData* GetInstanceData_instance_wailing_caverns(Map* pMap) void AddSC_instance_wailing_caverns() { - Script* newscript; - newscript = new Script; - newscript->Name = "instance_wailing_caverns"; - newscript->GetInstanceData = &GetInstanceData_instance_wailing_caverns; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_wailing_caverns"; + pNewScript->GetInstanceData = &GetInstanceData_instance_wailing_caverns; + pNewScript->RegisterSelf(); } diff --git a/scripts/kalimdor/wailing_caverns/wailing_caverns.cpp b/scripts/kalimdor/wailing_caverns/wailing_caverns.cpp index 58c27a7..9fa7cc4 100644 --- a/scripts/kalimdor/wailing_caverns/wailing_caverns.cpp +++ b/scripts/kalimdor/wailing_caverns/wailing_caverns.cpp @@ -187,7 +187,7 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI DoScriptText(SAY_NARALEX_CHAMBER, m_creature); break; case 32: - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) m_creature->SetFacingToObject(pNaralex); m_creature->SetStandState(UNIT_STAND_STATE_KNEEL); @@ -306,7 +306,7 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI ++m_uiSubeventPhase; break; case 2: - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) DoScriptText(EMOTE_NARALEX_AWAKE, pNaralex); m_uiEventTimer = 5000; ++m_uiSubeventPhase; @@ -327,14 +327,14 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI break; case 5: // Advance only when all mobs are dead - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) DoScriptText(EMOTE_BREAK_THROUGH, pNaralex); ++m_uiSubeventPhase; m_uiEventTimer = 10000; break; case 6: // Mutanus - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) DoScriptText(EMOTE_VISION, pNaralex); DoSpawnMob(NPC_MUTANUS, aSummonPositions[4][0], aSummonPositions[4][1]); m_uiEventTimer = 0; @@ -342,7 +342,7 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI break; case 7: // Awaken Naralex after mutanus is defeated - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) { pNaralex->SetStandState(UNIT_STAND_STATE_SIT); DoScriptText(SAY_NARALEX_AWAKE, pNaralex); @@ -359,7 +359,7 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI ++m_uiSubeventPhase; break; case 9: - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) { DoScriptText(SAY_NARALEX_THANKYOU, pNaralex); pNaralex->SetStandState(UNIT_STAND_STATE_STAND); @@ -369,7 +369,7 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI break; case 10: // Shapeshift into a bird - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) { DoScriptText(SAY_FAREWELL, pNaralex); pNaralex->CastSpell(pNaralex, SPELL_SHAPESHIFT, false); @@ -383,7 +383,7 @@ struct MANGOS_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI m_creature->AddSplineFlag(SPLINEFLAG_FLYING); SetRun(); // Send them flying somewhere outside of the room - if (Creature* pNaralex = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_NARALEX))) + if (Creature* pNaralex = m_pInstance->GetSingleCreatureFromStorage(NPC_NARALEX)) { // ToDo: Make Naralex fly // sort of a hack, compare to boss_onyxia diff --git a/scripts/kalimdor/wailing_caverns/wailing_caverns.h b/scripts/kalimdor/wailing_caverns/wailing_caverns.h index d2fd227..b6bc999 100644 --- a/scripts/kalimdor/wailing_caverns/wailing_caverns.h +++ b/scripts/kalimdor/wailing_caverns/wailing_caverns.h @@ -33,16 +33,12 @@ class MANGOS_DLL_DECL instance_wailing_caverns : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiNaralexGUID; - uint64 m_uiDiscipleGUID; + std::string m_strInstData; }; #endif diff --git a/scripts/kalimdor/zulfarrak/instance_zulfarrak.cpp b/scripts/kalimdor/zulfarrak/instance_zulfarrak.cpp index 3e564da..678a53f 100644 --- a/scripts/kalimdor/zulfarrak/instance_zulfarrak.cpp +++ b/scripts/kalimdor/zulfarrak/instance_zulfarrak.cpp @@ -24,8 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "zulfarrak.h" -instance_zulfarrak::instance_zulfarrak(Map* pMap) : ScriptedInstance(pMap), - m_uiAntuSulGUID(0) +instance_zulfarrak::instance_zulfarrak(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -39,7 +38,9 @@ void instance_zulfarrak::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_ANTUSUL: m_uiAntuSulGUID = pCreature->GetGUID(); break; + case NPC_ANTUSUL: + m_mNpcEntryGuidStore[NPC_ANTUSUL] = pCreature->GetObjectGuid(); + break; } } @@ -69,7 +70,7 @@ void instance_zulfarrak::SetData(uint32 uiType, uint32 uiData) saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6] << " " << m_auiEncounter[7]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -107,16 +108,6 @@ uint32 instance_zulfarrak::GetData(uint32 uiType) return 0; } -uint64 instance_zulfarrak::GetData64(uint32 uiData) -{ - switch (uiData) - { - case NPC_ANTUSUL: return m_uiAntuSulGUID; - default: - return 0; - } -} - void instance_zulfarrak::OnCreatureEnterCombat(Creature* pCreature) { switch (pCreature->GetEntry()) diff --git a/scripts/kalimdor/zulfarrak/zulfarrak.cpp b/scripts/kalimdor/zulfarrak/zulfarrak.cpp index 4aeee64..22b0d25 100644 --- a/scripts/kalimdor/zulfarrak/zulfarrak.cpp +++ b/scripts/kalimdor/zulfarrak/zulfarrak.cpp @@ -250,7 +250,7 @@ bool AreaTrigger_at_zulfarrak(Player* pPlayer, AreaTriggerEntry const* pAt) if (pInstance->GetData(TYPE_ANTUSUL) == NOT_STARTED || pInstance->GetData(TYPE_ANTUSUL) == FAIL) { - if (Creature* pAntuSul = pInstance->instance->GetCreature(pInstance->GetData64(NPC_ANTUSUL))) + if (Creature* pAntuSul = pInstance->GetSingleCreatureFromStorage(NPC_ANTUSUL)) { if (pAntuSul->isAlive()) pAntuSul->AI()->AttackStart(pPlayer); diff --git a/scripts/kalimdor/zulfarrak/zulfarrak.h b/scripts/kalimdor/zulfarrak/zulfarrak.h index 3326112..022bb3f 100644 --- a/scripts/kalimdor/zulfarrak/zulfarrak.h +++ b/scripts/kalimdor/zulfarrak/zulfarrak.h @@ -46,16 +46,13 @@ class MANGOS_DLL_DECL instance_zulfarrak : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiAntuSulGUID; + std::string m_strInstData; }; #endif diff --git a/scripts/northrend/azjol-nerub/ahnkahet/ahnkahet.h b/scripts/northrend/azjol-nerub/ahnkahet/ahnkahet.h index 99b0e2a..f574773 100644 --- a/scripts/northrend/azjol-nerub/ahnkahet/ahnkahet.h +++ b/scripts/northrend/azjol-nerub/ahnkahet/ahnkahet.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2011 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software licensed under GPL version 2 * Please see the included DOCS/LICENSE.TXT for more information */ @@ -27,6 +27,7 @@ enum GO_VORTEX = 193564, NPC_ELDER_NADOX = 29309, + NPC_TALDARAM = 29308, NPC_JEDOGA_SHADOWSEEKER = 29310, ACHIEV_CRITERIA_VOLUNTEER_WORK = 7359, diff --git a/scripts/northrend/borean_tundra.cpp b/scripts/northrend/borean_tundra.cpp index ae9a62c..8312b85 100644 --- a/scripts/northrend/borean_tundra.cpp +++ b/scripts/northrend/borean_tundra.cpp @@ -458,37 +458,37 @@ struct MANGOS_DLL_DECL npc_sinkhole_kill_creditAI : public ScriptedAI { npc_sinkhole_kill_creditAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - ObjectGuid m_uiCartGUID; - ObjectGuid m_uiWormGUID; + ObjectGuid m_cartGuid; + ObjectGuid m_wormGuid; uint32 m_uiCartTimer; uint32 m_uiCartPhase; void Reset() { - m_uiCartGUID.Clear(); - m_uiWormGUID.Clear(); + m_cartGuid.Clear(); + m_wormGuid.Clear(); m_uiCartTimer = 2000; m_uiCartPhase = 0; } void JustSummoned(Creature* pSummoned) { - m_uiWormGUID = pSummoned->GetObjectGuid(); + m_wormGuid = pSummoned->GetObjectGuid(); } void JustSummoned(GameObject* pGo) { // Go is not really needed, but ok to use as a check point so only one "event" can be processed at a time - if (!m_uiCartGUID.IsEmpty()) + if (m_cartGuid) return; // Expecting summoned from mangos dummy effect 46797 - m_uiCartGUID = pGo->GetObjectGuid(); + m_cartGuid = pGo->GetObjectGuid(); } void UpdateAI(const uint32 uiDiff) { - if (!m_uiCartGUID.IsEmpty()) + if (m_cartGuid) { if (m_uiCartTimer <= uiDiff) { @@ -509,7 +509,7 @@ struct MANGOS_DLL_DECL npc_sinkhole_kill_creditAI : public ScriptedAI m_uiCartTimer = 2000; break; case 3: - if (Creature* pWorm = m_creature->GetMap()->GetCreature(m_uiWormGUID)) + if (Creature* pWorm = m_creature->GetMap()->GetCreature(m_wormGuid)) { pWorm->SetDeathState(JUST_DIED); pWorm->SetHealth(0); @@ -517,7 +517,7 @@ struct MANGOS_DLL_DECL npc_sinkhole_kill_creditAI : public ScriptedAI m_uiCartTimer = 10000; break; case 4: - if (Creature* pWorm = m_creature->GetMap()->GetCreature(m_uiWormGUID)) + if (Creature* pWorm = m_creature->GetMap()->GetCreature(m_wormGuid)) pWorm->RemoveCorpse(); Reset(); @@ -1019,4 +1019,19 @@ void AddSC_borean_tundra() pNewScript->GetAI = &GetAI_npc_lurgglbr; pNewScript->pQuestAcceptNPC = &QuestAccept_npc_lurgglbr; pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "go_scourge_cage"; + pNewScript->pGOUse = &GOHello_go_scourge_cage; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "npc_nexus_drake"; + pNewScript->GetAI = &GetAI_npc_nexus_drake; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "npc_beryl_sorcerer"; + pNewScript->GetAI = &GetAI_npc_beryl_sorcerer; + pNewScript->RegisterSelf(); } diff --git a/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp b/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp index c69a1a4..726d842 100644 --- a/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp +++ b/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp @@ -551,11 +551,11 @@ struct MANGOS_DLL_DECL mob_toc5_hunterAI : public ScriptedAI { if (!m_creature->IsWithinDistInMap(m_creature->getVictim(), 8) && m_creature->IsWithinDistInMap(m_creature->getVictim(), 30)) { - m_creature->SetSpeedRate(MOVE_RUN, 0.0001f); + m_creature->SetSpeedRate(MOVE_RUN, 0.0001); } else { - m_creature->SetSpeedRate(MOVE_RUN, 1.2f); + m_creature->SetSpeedRate(MOVE_RUN, 1.2); } enemy_check = 100; }else enemy_check -= diff; diff --git a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_northrend_beasts.cpp b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_northrend_beasts.cpp index 5d0f23c..aba87c5 100644 --- a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_northrend_beasts.cpp +++ b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_northrend_beasts.cpp @@ -164,7 +164,7 @@ struct MANGOS_DLL_DECL mob_snobold_vassalAI : public BSWScriptedAI defaultTarget = NULL; m_creature->SetInCombatWithZone(); m_creature->SetRespawnDelay(DAY); - pBoss = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_GORMOK)); + pBoss = m_pInstance->GetSingleCreatureFromStorage(NPC_GORMOK); if (pBoss) doCast(SPELL_RISING_ANGER,pBoss); } @@ -236,7 +236,7 @@ struct MANGOS_DLL_DECL boss_acidmawAI : public BSWScriptedAI void JustDied(Unit* pKiller) { if (!m_pInstance) return; - if (Creature* pSister = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DREADSCALE))) + if (Creature* pSister = m_pInstance->GetSingleCreatureFromStorage(NPC_DREADSCALE)) if (!pSister->isAlive()) m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_DONE); else m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_SPECIAL); @@ -347,7 +347,7 @@ struct MANGOS_DLL_DECL boss_dreadscaleAI : public BSWScriptedAI void JustDied(Unit* pKiller) { if (!m_pInstance) return; - if (Creature* pSister = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_ACIDMAW))) + if (Creature* pSister = m_pInstance->GetSingleCreatureFromStorage(NPC_ACIDMAW)) if (!pSister->isAlive()) m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_DONE); else m_pInstance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_SPECIAL); diff --git a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_twin_valkyr.cpp b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_twin_valkyr.cpp index 100c0a9..2715913 100644 --- a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_twin_valkyr.cpp +++ b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_twin_valkyr.cpp @@ -104,7 +104,7 @@ struct MANGOS_DLL_DECL boss_fjolaAI : public BSWScriptedAI { if (!m_pInstance) return; DoScriptText(-1713547,m_creature); - if (Creature* pSister = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DARKBANE))) + if (Creature* pSister = m_pInstance->GetSingleCreatureFromStorage(NPC_DARKBANE)) if (!pSister->isAlive()) m_pInstance->SetData(TYPE_VALKIRIES, DONE); else m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL); @@ -135,7 +135,7 @@ struct MANGOS_DLL_DECL boss_fjolaAI : public BSWScriptedAI if (!m_creature || !m_creature->isAlive()) return; - if(pDoneBy->GetGUID() == m_creature->GetGUID()) return; + if(pDoneBy->GetObjectGuid() == m_creature->GetObjectGuid()) return; if(pDoneBy->GetTypeId() == TYPEID_PLAYER) { @@ -263,7 +263,7 @@ struct MANGOS_DLL_DECL boss_eydisAI : public BSWScriptedAI { if (!m_pInstance) return; DoScriptText(-1713547,m_creature); - if (Creature* pSister = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LIGHTBANE))) + if (Creature* pSister = m_pInstance->GetSingleCreatureFromStorage(NPC_LIGHTBANE)) if (!pSister->isAlive()) m_pInstance->SetData(TYPE_VALKIRIES, DONE); else m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL); @@ -293,7 +293,7 @@ struct MANGOS_DLL_DECL boss_eydisAI : public BSWScriptedAI if (!m_creature || !m_creature->isAlive()) return; - if(pDoneBy->GetGUID() == m_creature->GetGUID()) return; + if(pDoneBy->GetObjectGuid() == m_creature->GetObjectGuid()) return; if(pDoneBy->GetTypeId() == TYPEID_PLAYER) { @@ -432,7 +432,7 @@ bool GossipHello_mob_light_essence(Player *player, Creature* pCreature) { ScriptedInstance *pInstance = (ScriptedInstance *) pCreature->GetInstanceData(); if(!pInstance) return true; - player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID()); + player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetObjectGuid()); player->RemoveAurasDueToSpell(SPELL_DARK_ESSENCE); // player->CastSpell(player,SPELL_REMOVE_TOUCH,false); // Not worked now player->CastSpell(player,SPELL_LIGHT_ESSENCE,false); @@ -484,7 +484,7 @@ bool GossipHello_mob_dark_essence(Player *player, Creature* pCreature) { ScriptedInstance *pInstance = (ScriptedInstance *) pCreature->GetInstanceData(); if(!pInstance) return true; - player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID()); + player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetObjectGuid()); player->RemoveAurasDueToSpell(SPELL_LIGHT_ESSENCE); // player->CastSpell(player,SPELL_REMOVE_TOUCH,false); // Not worked now player->CastSpell(player,SPELL_DARK_ESSENCE,false); @@ -512,8 +512,8 @@ struct MANGOS_DLL_DECL mob_unleashed_darkAI : public ScriptedAI SetCombatMovement(false); m_creature->GetMotionMaster()->MoveRandom(); m_uiRangeCheck_Timer = 1000; - pboss1 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DARKBANE)); - pboss2 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LIGHTBANE)); + pboss1 = m_pInstance->GetSingleCreatureFromStorage(NPC_DARKBANE); + pboss2 = m_pInstance->GetSingleCreatureFromStorage(NPC_LIGHTBANE); } void AttackStart(Unit *pWho) @@ -582,8 +582,8 @@ struct MANGOS_DLL_DECL mob_unleashed_lightAI : public ScriptedAI SetCombatMovement(false); m_creature->GetMotionMaster()->MoveRandom(); m_uiRangeCheck_Timer = 1000; - pboss1 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_DARKBANE)); - pboss2 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LIGHTBANE)); + pboss1 = m_pInstance->GetSingleCreatureFromStorage(NPC_DARKBANE); + pboss2 = m_pInstance->GetSingleCreatureFromStorage(NPC_LIGHTBANE); } void AttackStart(Unit *pWho) diff --git a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/instance_trial_of_the_crusader.cpp b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/instance_trial_of_the_crusader.cpp index f9d9021..6c840b0 100644 --- a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/instance_trial_of_the_crusader.cpp +++ b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/instance_trial_of_the_crusader.cpp @@ -24,9 +24,9 @@ EndScriptData */ #include "precompiled.h" #include "trial_of_the_crusader.h" -struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public ScriptedInstance +struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public BSWScriptedInstance { - instance_trial_of_the_crusader(Map* pMap) : ScriptedInstance(pMap) { + instance_trial_of_the_crusader(Map* pMap) : BSWScriptedInstance(pMap) { Difficulty = pMap->GetDifficulty(); Initialize(); } @@ -43,108 +43,27 @@ struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public ScriptedInstance uint32 m_uiDataDamageEydis; uint32 m_uiValkyrsCasting; - uint32 m_auiCrusadersCount; - - uint64 m_uiBarrentGUID; - uint64 m_uiTirionGUID; - uint64 m_uiFizzlebangGUID; - uint64 m_uiGarroshGUID; - uint64 m_uiRinnGUID; - uint64 m_uiLich0GUID; - uint64 m_uiLich1GUID; - - uint64 m_uiGormokGUID; - uint64 m_uiAcidmawGUID; - uint64 m_uiDreadscaleGUID; - uint64 m_uiIcehowlGUID; - uint64 m_uiJaraxxusGUID; - uint64 m_uiDarkbaneGUID; - uint64 m_uiLightbaneGUID; - uint64 m_uiAnubarakGUID; - - uint64 m_uiCrusader11Guid; - uint64 m_uiCrusader12Guid; - uint64 m_uiCrusader13Guid; - uint64 m_uiCrusader14Guid; - uint64 m_uiCrusader15Guid; - uint64 m_uiCrusader16Guid; - uint64 m_uiCrusader17Guid; - uint64 m_uiCrusader18Guid; - uint64 m_uiCrusader19Guid; - uint64 m_uiCrusader1aGuid; - uint64 m_uiCrusader1bGuid; - uint64 m_uiCrusader1cGuid; - uint64 m_uiCrusader1dGuid; - uint64 m_uiCrusader1eGuid; - - uint64 m_uiCrusader21Guid; - uint64 m_uiCrusader22Guid; - uint64 m_uiCrusader23Guid; - uint64 m_uiCrusader24Guid; - uint64 m_uiCrusader25Guid; - uint64 m_uiCrusader26Guid; - uint64 m_uiCrusader27Guid; - uint64 m_uiCrusader28Guid; - uint64 m_uiCrusader29Guid; - uint64 m_uiCrusader2aGuid; - uint64 m_uiCrusader2bGuid; - uint64 m_uiCrusader2cGuid; - uint64 m_uiCrusader2dGuid; - uint64 m_uiCrusader2eGuid; - - uint64 m_uiCrusader01Guid; - uint64 m_uiCrusader02Guid; - - uint64 m_uiCrusadersCacheGUID; - uint64 m_uiFloorGUID; - - uint64 m_uiTC10h25GUID; - uint64 m_uiTC10h45GUID; - uint64 m_uiTC10h50GUID; - uint64 m_uiTC10h99GUID; - - uint64 m_uiTC25h25GUID; - uint64 m_uiTC25h45GUID; - uint64 m_uiTC25h50GUID; - uint64 m_uiTC25h99GUID; - - uint64 m_uiTributeChest1GUID; - uint64 m_uiTributeChest2GUID; - uint64 m_uiTributeChest3GUID; - uint64 m_uiTributeChest4GUID; - - uint64 m_uiMainGateDoorGUID; - - uint64 m_uiWestPortcullisGUID; - uint64 m_uiNorthPortcullisGUID; - uint64 m_uiSouthPortcullisGUID; + uint32 m_uiCrusadersCache; + uint32 m_uiTributeChest1; + uint32 m_uiTributeChest2; + uint32 m_uiTributeChest3; + uint32 m_uiTributeChest4; + uint32 m_auiCrusadersCount; void Initialize() { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - m_auiEncounter[i] = NOT_STARTED; - - m_auiEncounter[0] = 0; - m_auiEncounter[7] = 50; - m_auiEncounter[8] = 0; - - m_uiTributeChest1GUID = 0; - m_uiTributeChest2GUID = 0; - m_uiTributeChest3GUID = 0; - m_uiTributeChest4GUID = 0; - m_uiDataDamageFjola = 0; - m_uiDataDamageEydis = 0; - m_uiLich0GUID = 0; - m_uiLich1GUID = 0; - - m_auiNorthrendBeasts = NOT_STARTED; - - m_auiEventTimer = 1000; + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + m_auiEncounter[i] = NOT_STARTED; - m_auiCrusadersCount = 6; + m_auiEncounter[0] = 0; + m_auiEncounter[7] = 50; + m_auiEncounter[8] = 0; - needsave = false; + m_auiNorthrendBeasts = NOT_STARTED; + m_auiEventTimer = 1000; + m_auiCrusadersCount = 6; + needsave = false; } bool IsEncounterInProgress() const @@ -166,146 +85,51 @@ struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public ScriptedInstance bool IsRaidWiped() { - Map::PlayerList const &players = instance->GetPlayers(); - - for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) - { - if(Player* pPlayer = i->getSource()) - { - if(pPlayer->isAlive()) - return false; - } - } - return true; - } + Map::PlayerList const &players = instance->GetPlayers(); - void OpenDoor(uint64 guid) - { - if(!guid) return; - GameObject* pGo = instance->GetGameObject(guid); - if(pGo) pGo->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) + { + if(Player* pPlayer = i->getSource()) + { + if(pPlayer->isAlive()) + return false; + } + } + return true; } - void CloseDoor(uint64 guid) + void OnCreatureCreate(Creature* pCreature) { - if(!guid) return; - GameObject* pGo = instance->GetGameObject(guid); - if(pGo) pGo->SetGoState(GO_STATE_READY); - } - - void OnCreatureCreate(Creature* pCreature) - { - switch(pCreature->GetEntry()) - { - case NPC_BARRENT: m_uiBarrentGUID = pCreature->GetGUID(); break; - case NPC_TIRION: m_uiTirionGUID = pCreature->GetGUID(); break; - case NPC_FIZZLEBANG: m_uiFizzlebangGUID = pCreature->GetGUID(); break; - case NPC_GARROSH: m_uiGarroshGUID = pCreature->GetGUID(); break; - case NPC_RINN: m_uiRinnGUID = pCreature->GetGUID(); break; - case NPC_LICH_KING_0: m_uiLich0GUID = pCreature->GetGUID(); break; - case NPC_LICH_KING_1: m_uiLich1GUID = pCreature->GetGUID(); break; - - case NPC_GORMOK: m_uiGormokGUID = pCreature->GetGUID(); break; - case NPC_ACIDMAW: m_uiAcidmawGUID = pCreature->GetGUID(); break; - case NPC_DREADSCALE: m_uiDreadscaleGUID = pCreature->GetGUID(); break; - case NPC_ICEHOWL: m_uiIcehowlGUID = pCreature->GetGUID(); break; - case NPC_JARAXXUS: m_uiJaraxxusGUID = pCreature->GetGUID(); break; - case NPC_DARKBANE: m_uiDarkbaneGUID = pCreature->GetGUID(); break; - case NPC_LIGHTBANE: m_uiLightbaneGUID = pCreature->GetGUID(); break; - case NPC_ANUBARAK: m_uiAnubarakGUID = pCreature->GetGUID(); break; - - case NPC_CRUSADER_1_1: m_uiCrusader11Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_2: m_uiCrusader12Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_3: m_uiCrusader13Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_4: m_uiCrusader14Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_5: m_uiCrusader15Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_6: m_uiCrusader16Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_7: m_uiCrusader17Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_8: m_uiCrusader18Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_9: m_uiCrusader19Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_10: m_uiCrusader1aGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_11: m_uiCrusader1bGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_12: m_uiCrusader1cGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_13: m_uiCrusader1dGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_1_14: m_uiCrusader1eGuid = pCreature->GetGUID(); break; - - case NPC_CRUSADER_2_1: m_uiCrusader21Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_2: m_uiCrusader22Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_3: m_uiCrusader23Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_4: m_uiCrusader24Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_5: m_uiCrusader25Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_6: m_uiCrusader26Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_7: m_uiCrusader27Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_8: m_uiCrusader28Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_9: m_uiCrusader29Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_10: m_uiCrusader2aGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_11: m_uiCrusader2bGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_12: m_uiCrusader2cGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_13: m_uiCrusader2dGuid = pCreature->GetGUID(); break; - case NPC_CRUSADER_2_14: m_uiCrusader2eGuid = pCreature->GetGUID(); break; - - case NPC_CRUSADER_0_1: m_uiCrusader01Guid = pCreature->GetGUID(); break; - case NPC_CRUSADER_0_2: m_uiCrusader02Guid = pCreature->GetGUID(); break; - } + if (!pCreature) + return; + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); } void OnObjectCreate(GameObject *pGo) { - switch(pGo->GetEntry()) - { - case GO_CRUSADERS_CACHE_10: - if(Difficulty == RAID_DIFFICULTY_10MAN_NORMAL) - m_uiCrusadersCacheGUID = pGo->GetGUID(); - break; - case GO_CRUSADERS_CACHE_25: - if(Difficulty == RAID_DIFFICULTY_25MAN_NORMAL) - m_uiCrusadersCacheGUID = pGo->GetGUID(); - break; - case GO_CRUSADERS_CACHE_10_H: - if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) - m_uiCrusadersCacheGUID = pGo->GetGUID(); - break; - case GO_CRUSADERS_CACHE_25_H: - if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC) - m_uiCrusadersCacheGUID = pGo->GetGUID(); - break; - case GO_ARGENT_COLISEUM_FLOOR: - m_uiFloorGUID = pGo->GetGUID(); - break; - case GO_MAIN_GATE_DOOR: m_uiMainGateDoorGUID = pGo->GetGUID(); break; - - case GO_SOUTH_PORTCULLIS: m_uiSouthPortcullisGUID = pGo->GetGUID(); break; - case GO_WEST_PORTCULLIS: m_uiWestPortcullisGUID = pGo->GetGUID(); break; - case GO_NORTH_PORTCULLIS: m_uiNorthPortcullisGUID = pGo->GetGUID(); break; - - case GO_TRIBUTE_CHEST_10H_25: m_uiTC10h25GUID = pGo->GetGUID(); break; - case GO_TRIBUTE_CHEST_10H_45: m_uiTC10h45GUID = pGo->GetGUID(); break; - case GO_TRIBUTE_CHEST_10H_50: m_uiTC10h50GUID = pGo->GetGUID(); break; - case GO_TRIBUTE_CHEST_10H_99: m_uiTC10h99GUID = pGo->GetGUID(); break; - - case GO_TRIBUTE_CHEST_25H_25: m_uiTC25h25GUID = pGo->GetGUID(); break; - case GO_TRIBUTE_CHEST_25H_45: m_uiTC25h45GUID = pGo->GetGUID(); break; - case GO_TRIBUTE_CHEST_25H_50: m_uiTC25h50GUID = pGo->GetGUID(); break; - case GO_TRIBUTE_CHEST_25H_99: m_uiTC25h99GUID = pGo->GetGUID(); break; - } + if (!pGo) + return; + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void SetData(uint32 uiType, uint32 uiData) { switch(uiType) { - case TYPE_STAGE: m_auiEncounter[0] = uiData; break; - case TYPE_BEASTS: m_auiEncounter[1] = uiData; break; - case TYPE_JARAXXUS: m_auiEncounter[2] = uiData; break; - case TYPE_CRUSADERS: if (uiData == FAIL && (m_auiEncounter[3] == FAIL || m_auiEncounter[3] == NOT_STARTED)) - m_auiEncounter[3] = NOT_STARTED; - else m_auiEncounter[3] = uiData; - if (uiData == DONE) { - if (GameObject* pChest = instance->GetGameObject(m_uiCrusadersCacheGUID)) - if (pChest && !pChest->isSpawned()) - pChest->SetRespawnTime(7*DAY); - }; - break; + case TYPE_STAGE: m_auiEncounter[0] = uiData; break; + case TYPE_BEASTS: m_auiEncounter[1] = uiData; break; + case TYPE_JARAXXUS: m_auiEncounter[2] = uiData; break; + case TYPE_CRUSADERS:if (uiData == FAIL && (m_auiEncounter[3] == FAIL || m_auiEncounter[3] == NOT_STARTED)) + m_auiEncounter[3] = NOT_STARTED; + else + m_auiEncounter[3] = uiData; + if (uiData == DONE) + { + if (GameObject* pChest = GetSingleGameObjectFromStorage(m_uiCrusadersCache)) + if (pChest && !pChest->isSpawned()) + pChest->SetRespawnTime(7*DAY); + }; + break; case TYPE_CRUSADERS_COUNT: if (uiData == 0) --m_auiCrusadersCount; else m_auiCrusadersCount = uiData; break; @@ -314,31 +138,32 @@ struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public ScriptedInstance case TYPE_LICH_KING: m_auiEncounter[5] = uiData; break; case TYPE_ANUBARAK: m_auiEncounter[6] = uiData; if (uiData == DONE) { - if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC){ - if ( m_auiEncounter[7] >= 25) m_uiTributeChest1GUID = m_uiTC10h25GUID; - if ( m_auiEncounter[7] >= 45) m_uiTributeChest2GUID = m_uiTC10h45GUID; - if ( m_auiEncounter[7] >= 49) m_uiTributeChest3GUID = m_uiTC10h50GUID; - m_uiTributeChest4GUID = m_uiTC10h99GUID; + if (Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) + { + if ( m_auiEncounter[7] >= 25) m_uiTributeChest1 = GO_TRIBUTE_CHEST_10H_25; + if ( m_auiEncounter[7] >= 45) m_uiTributeChest2 = GO_TRIBUTE_CHEST_10H_45; + if ( m_auiEncounter[7] >= 49) m_uiTributeChest3 = GO_TRIBUTE_CHEST_10H_50; + m_uiTributeChest4 = GO_TRIBUTE_CHEST_10H_99; } - if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC){ - if ( m_auiEncounter[7] >= 25) m_uiTributeChest1GUID = m_uiTC25h25GUID; - if ( m_auiEncounter[7] >= 45) m_uiTributeChest2GUID = m_uiTC25h45GUID; - if ( m_auiEncounter[7] >= 49) m_uiTributeChest3GUID = m_uiTC25h50GUID; - m_uiTributeChest4GUID = m_uiTC25h99GUID; + if (Difficulty == RAID_DIFFICULTY_25MAN_HEROIC){ + if ( m_auiEncounter[7] >= 25) m_uiTributeChest1 = GO_TRIBUTE_CHEST_25H_25; + if ( m_auiEncounter[7] >= 45) m_uiTributeChest2 = GO_TRIBUTE_CHEST_25H_45; + if ( m_auiEncounter[7] >= 49) m_uiTributeChest3 = GO_TRIBUTE_CHEST_25H_50; + m_uiTributeChest4 = GO_TRIBUTE_CHEST_25H_99; } // Attention! It is (may be) not off-like, but spawning all Tribute Chests is real // reward for clearing TOC instance - if (m_uiTributeChest1GUID) - if (GameObject* pChest1 = instance->GetGameObject(m_uiTributeChest1GUID)) + if (m_uiTributeChest1) + if (GameObject* pChest1 = GetSingleGameObjectFromStorage(m_uiTributeChest1)) if (pChest1 && !pChest1->isSpawned()) pChest1->SetRespawnTime(7*DAY); - if (m_uiTributeChest2GUID) - if (GameObject* pChest2 = instance->GetGameObject(m_uiTributeChest2GUID)) + if (m_uiTributeChest2) + if (GameObject* pChest2 = GetSingleGameObjectFromStorage(m_uiTributeChest2)) if (pChest2 && !pChest2->isSpawned()) pChest2->SetRespawnTime(7*DAY); - if (m_uiTributeChest3GUID) - if (GameObject* pChest3 = instance->GetGameObject(m_uiTributeChest3GUID)) + if (m_uiTributeChest3) + if (GameObject* pChest3 = GetSingleGameObjectFromStorage(m_uiTributeChest3)) if (pChest3 && !pChest3->isSpawned()) pChest3->SetRespawnTime(7*DAY); - if (m_uiTributeChest4GUID) - if (GameObject* pChest4 = instance->GetGameObject(m_uiTributeChest4GUID)) + if (m_uiTributeChest4) + if (GameObject* pChest4 = GetSingleGameObjectFromStorage(m_uiTributeChest4)) if (pChest4 && !pChest4->isSpawned()) pChest4->SetRespawnTime(7*DAY); }; break; @@ -351,16 +176,18 @@ struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public ScriptedInstance case DATA_CASTING_VALKYRS: m_uiValkyrsCasting = uiData; uiData = NOT_STARTED; break; } - if (IsEncounterInProgress()) { - CloseDoor(GetData64(GO_WEST_PORTCULLIS)); - CloseDoor(GetData64(GO_NORTH_PORTCULLIS)); -// CloseDoor(GetData64(GO_SOUTH_PORTCULLIS)); - } - else { - OpenDoor(GetData64(GO_WEST_PORTCULLIS)); - OpenDoor(GetData64(GO_NORTH_PORTCULLIS)); -// OpenDoor(GetData64(GO_SOUTH_PORTCULLIS)); - }; + if (IsEncounterInProgress()) + { + DoCloseDoor(GetData64(GO_WEST_PORTCULLIS)); + DoCloseDoor(GetData64(GO_NORTH_PORTCULLIS)); +// DoCloseDoor(GetData64(GO_SOUTH_PORTCULLIS)); + } + else + { + DoOpenDoor(GetData64(GO_WEST_PORTCULLIS)); + DoOpenDoor(GetData64(GO_NORTH_PORTCULLIS)); +// DoOpenDoor(GetData64(GO_SOUTH_PORTCULLIS)); + }; if (uiData == FAIL && uiType != TYPE_STAGE && uiType != TYPE_EVENT @@ -392,71 +219,6 @@ struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public ScriptedInstance } } - uint64 GetData64(uint32 uiData) - { - switch(uiData) - { - case NPC_BARRENT: return m_uiBarrentGUID; - case NPC_TIRION: return m_uiTirionGUID; - case NPC_FIZZLEBANG: return m_uiFizzlebangGUID; - case NPC_GARROSH: return m_uiGarroshGUID; - case NPC_RINN: return m_uiRinnGUID; - case NPC_LICH_KING_0: return m_uiLich0GUID; - case NPC_LICH_KING_1: return m_uiLich1GUID; - - case NPC_GORMOK: return m_uiGormokGUID; - case NPC_ACIDMAW: return m_uiAcidmawGUID; - case NPC_DREADSCALE: return m_uiDreadscaleGUID; - case NPC_ICEHOWL: return m_uiIcehowlGUID; - case NPC_JARAXXUS: return m_uiJaraxxusGUID; - case NPC_DARKBANE: return m_uiDarkbaneGUID; - case NPC_LIGHTBANE: return m_uiLightbaneGUID; - case NPC_ANUBARAK: return m_uiAnubarakGUID; - - case NPC_CRUSADER_1_1: return m_uiCrusader11Guid; - case NPC_CRUSADER_1_2: return m_uiCrusader12Guid; - case NPC_CRUSADER_1_3: return m_uiCrusader13Guid; - case NPC_CRUSADER_1_4: return m_uiCrusader14Guid; - case NPC_CRUSADER_1_5: return m_uiCrusader15Guid; - case NPC_CRUSADER_1_6: return m_uiCrusader16Guid; - case NPC_CRUSADER_1_7: return m_uiCrusader17Guid; - case NPC_CRUSADER_1_8: return m_uiCrusader18Guid; - case NPC_CRUSADER_1_9: return m_uiCrusader19Guid; - case NPC_CRUSADER_1_10: return m_uiCrusader1aGuid; - case NPC_CRUSADER_1_11: return m_uiCrusader1bGuid; - case NPC_CRUSADER_1_12: return m_uiCrusader1cGuid; - case NPC_CRUSADER_1_13: return m_uiCrusader1dGuid; - case NPC_CRUSADER_1_14: return m_uiCrusader1eGuid; - - case NPC_CRUSADER_2_1: return m_uiCrusader21Guid; - case NPC_CRUSADER_2_2: return m_uiCrusader22Guid; - case NPC_CRUSADER_2_3: return m_uiCrusader23Guid; - case NPC_CRUSADER_2_4: return m_uiCrusader24Guid; - case NPC_CRUSADER_2_5: return m_uiCrusader25Guid; - case NPC_CRUSADER_2_6: return m_uiCrusader26Guid; - case NPC_CRUSADER_2_7: return m_uiCrusader27Guid; - case NPC_CRUSADER_2_8: return m_uiCrusader28Guid; - case NPC_CRUSADER_2_9: return m_uiCrusader29Guid; - case NPC_CRUSADER_2_10: return m_uiCrusader2aGuid; - case NPC_CRUSADER_2_11: return m_uiCrusader2bGuid; - case NPC_CRUSADER_2_12: return m_uiCrusader2cGuid; - case NPC_CRUSADER_2_13: return m_uiCrusader2dGuid; - case NPC_CRUSADER_2_14: return m_uiCrusader2eGuid; - - case NPC_CRUSADER_0_1: return m_uiCrusader01Guid; - case NPC_CRUSADER_0_2: return m_uiCrusader02Guid; - - case GO_ARGENT_COLISEUM_FLOOR: return m_uiFloorGUID; - case GO_MAIN_GATE_DOOR: return m_uiMainGateDoorGUID; - - case GO_SOUTH_PORTCULLIS: return m_uiSouthPortcullisGUID; - case GO_WEST_PORTCULLIS: return m_uiWestPortcullisGUID; - case GO_NORTH_PORTCULLIS: return m_uiNorthPortcullisGUID; - - } - return 0; - } - uint32 GetData(uint32 uiType) { switch(uiType) diff --git a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.cpp b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.cpp index 8cf9934..82231d6 100644 --- a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.cpp +++ b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.cpp @@ -236,7 +236,7 @@ bool GossipHello_npc_toc_announcer(Player* pPlayer, Creature* pCreature) } }; - pPlayer->SEND_GOSSIP_MENU(_GossipMessage[i].msgnum, pCreature->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(_GossipMessage[i].msgnum, pCreature->GetObjectGuid()); return true; } @@ -281,7 +281,7 @@ switch(uiAction) { case GOSSIP_ACTION_INFO_DEF+5: { if (pInstance->GetData(TYPE_LICH_KING) != DONE) return false; - if (GameObject* pGoFloor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) + if (GameObject* pGoFloor = pInstance->GetSingleGameObjectFromStorage(GO_ARGENT_COLISEUM_FLOOR)) { pGoFloor->SetUInt32Value(GAMEOBJECT_DISPLAYID,9060); pGoFloor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); @@ -289,7 +289,7 @@ switch(uiAction) { } pCreature->CastSpell(pCreature,69016,false); - Creature* pTemp = pCreature->GetMap()->GetCreature(pInstance->GetData64(NPC_ANUBARAK)); + Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_ANUBARAK); if (!pTemp || !pTemp->isAlive()) pCreature->SummonCreature(NPC_ANUBARAK, SpawnLoc[19].x, SpawnLoc[19].y, SpawnLoc[19].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); if (pTemp) { @@ -445,7 +445,7 @@ struct MANGOS_DLL_DECL boss_lich_king_tocAI : public ScriptedAI pInstance->SetData(TYPE_EVENT,5080); break; case 5080: - if (GameObject* pGoFloor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) + if (GameObject* pGoFloor = pInstance->GetSingleGameObjectFromStorage(GO_ARGENT_COLISEUM_FLOOR)) { pGoFloor->SetUInt32Value(GAMEOBJECT_DISPLAYID,9060); pGoFloor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); @@ -456,7 +456,7 @@ struct MANGOS_DLL_DECL boss_lich_king_tocAI : public ScriptedAI pInstance->SetData(TYPE_ANUBARAK,IN_PROGRESS); m_creature->SummonCreature(NPC_ANUBARAK, SpawnLoc[19].x, SpawnLoc[19].y, SpawnLoc[19].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_ANUBARAK))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_ANUBARAK)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[20].x, SpawnLoc[20].y, SpawnLoc[20].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); @@ -499,11 +499,11 @@ struct MANGOS_DLL_DECL npc_fizzlebang_tocAI : public ScriptedAI { npc_fizzlebang_tocAI(Creature* pCreature) : ScriptedAI(pCreature) { - pInstance = (ScriptedInstance*)m_creature->GetInstanceData(); + pInstance = (BSWScriptedInstance*)m_creature->GetInstanceData(); Reset(); } - InstanceData* pInstance; + BSWScriptedInstance* pInstance; uint32 UpdateTimer; Creature* pPortal; Creature* pTrigger; @@ -581,11 +581,12 @@ struct MANGOS_DLL_DECL npc_fizzlebang_tocAI : public ScriptedAI break; case 1140: pInstance->SetData(TYPE_STAGE,4); - m_creature->SummonCreature(NPC_JARAXXUS, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_JARAXXUS))) { - pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - pTemp->CastSpell(pTemp, SPELL_JARAXXUS_CHAINS, false); - } + m_creature->SummonCreature(NPC_JARAXXUS, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_JARAXXUS)) + { + pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pTemp->CastSpell(pTemp, SPELL_JARAXXUS_CHAINS, false); + } pInstance->SetData(TYPE_EVENT, 1142); UpdateTimer = 5000; break; @@ -600,7 +601,7 @@ struct MANGOS_DLL_DECL npc_fizzlebang_tocAI : public ScriptedAI UpdateTimer = 5000; break; case 1150: - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_JARAXXUS))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_JARAXXUS)) { pTemp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pTemp->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); pTemp->SetInCombatWithZone(); @@ -668,20 +669,20 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI DoScriptText(-1713500, m_creature); UpdateTimer = 12000; pInstance->SetData(TYPE_EVENT,120); -// pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_WEST_PORTCULLIS)); +// pInstance->DoUseDoorOrButton(GO_WEST_PORTCULLIS); break; case 140: m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_TALK); DoScriptText(-1713501, m_creature); UpdateTimer = 10000; pInstance->SetData(TYPE_EVENT,150); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 150: m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); if (pInstance->GetData(TYPE_BEASTS) != DONE) { m_creature->SummonCreature(NPC_GORMOK, SpawnLoc[26].x, SpawnLoc[26].y, SpawnLoc[26].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_GORMOK))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_GORMOK)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); @@ -689,7 +690,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI } UpdateTimer = 10000; pInstance->SetData(TYPE_EVENT,160); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); pInstance->SetData(TYPE_STAGE,1); pInstance->SetData(TYPE_BEASTS,IN_PROGRESS); break; @@ -703,19 +704,19 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI case 205: UpdateTimer = 8000; pInstance->SetData(TYPE_EVENT,210); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 210: if (pInstance->GetData(TYPE_BEASTS) != DONE){ m_creature->SummonCreature(NPC_DREADSCALE, SpawnLoc[3].x, SpawnLoc[3].y, SpawnLoc[3].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); m_creature->SummonCreature(NPC_ACIDMAW, SpawnLoc[4].x, SpawnLoc[4].y, SpawnLoc[4].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_DREADSCALE))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_DREADSCALE)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); } - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_ACIDMAW))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_ACIDMAW)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); @@ -723,7 +724,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI } UpdateTimer = 10000; pInstance->SetData(TYPE_EVENT,220); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 300: DoScriptText(-1713505, m_creature); @@ -733,12 +734,12 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI case 305: UpdateTimer = 8000; pInstance->SetData(TYPE_EVENT,310); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 310: if (pInstance->GetData(TYPE_BEASTS) != DONE) { m_creature->SummonCreature(NPC_ICEHOWL, SpawnLoc[26].x, SpawnLoc[26].y, SpawnLoc[26].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_ICEHOWL))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_ICEHOWL)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); @@ -746,13 +747,13 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI } UpdateTimer = 10000; pInstance->SetData(TYPE_EVENT,320); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 400: DoScriptText(-1713509, m_creature); UpdateTimer = 5000; pInstance->SetData(TYPE_EVENT,0); -// pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_WEST_PORTCULLIS)); +// pInstance->DoUseDoorOrButton(GO_WEST_PORTCULLIS); break; case 666: @@ -760,7 +761,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI UpdateTimer = 5000; pInstance->SetData(TYPE_EVENT,0); pInstance->SetData(TYPE_NORTHREND_BEASTS,NOT_STARTED); -// pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_WEST_PORTCULLIS)); +// pInstance->DoUseDoorOrButton(GO_WEST_PORTCULLIS); break; case 1010: @@ -943,7 +944,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI for(uint8 i = 0; i < crusaderscount; ++i) { m_creature->SummonCreature(crusader[i], SpawnLoc[i+2].x, SpawnLoc[i+2].y, SpawnLoc[i+2].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(crusader[i]))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(crusader[i])) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); } @@ -951,7 +952,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI pInstance->SetData(TYPE_CRUSADERS_COUNT,crusaderscount); UpdateTimer = 3000; pInstance->SetData(TYPE_EVENT,0); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); pInstance->SetData(TYPE_CRUSADERS,IN_PROGRESS); break; @@ -1092,7 +1093,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI for(uint8 i = 0; i < crusaderscount; ++i) { m_creature->SummonCreature(crusader[i], SpawnLoc[i+2].x, SpawnLoc[i+2].y, SpawnLoc[i+2].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(crusader[i]))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(crusader[i])) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); } @@ -1100,7 +1101,7 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI pInstance->SetData(TYPE_CRUSADERS_COUNT,crusaderscount); UpdateTimer = 3000; pInstance->SetData(TYPE_EVENT,0); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); pInstance->SetData(TYPE_CRUSADERS,IN_PROGRESS); break; @@ -1120,27 +1121,27 @@ struct MANGOS_DLL_DECL npc_tirion_tocAI : public ScriptedAI DoScriptText(-1713537, m_creature); UpdateTimer = 10000; pInstance->SetData(TYPE_EVENT,4015); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 4015: pInstance->SetData(TYPE_STAGE,7); pInstance->SetData(TYPE_VALKIRIES,IN_PROGRESS); m_creature->SummonCreature(NPC_LIGHTBANE, SpawnLoc[3].x, SpawnLoc[3].y, SpawnLoc[3].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_LIGHTBANE))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_LIGHTBANE)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); } m_creature->SummonCreature(NPC_DARKBANE, SpawnLoc[4].x, SpawnLoc[4].y, SpawnLoc[4].z, 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_DARKBANE))) { + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_DARKBANE)) { pTemp->GetMotionMaster()->MovePoint(0, SpawnLoc[1].x, SpawnLoc[1].y, SpawnLoc[1].z); pTemp->AddSplineFlag(SPLINEFLAG_WALKMODE); pTemp->SetInCombatWithZone(); } UpdateTimer = 10000; pInstance->SetData(TYPE_EVENT,4016); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 4040: @@ -1261,7 +1262,7 @@ struct MANGOS_DLL_DECL npc_garrosh_tocAI : public ScriptedAI DoScriptText(-1713734, m_creature); UpdateTimer = 5000; pInstance->SetData(TYPE_EVENT,3091); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 4030: DoScriptText(-1713748, m_creature); @@ -1341,7 +1342,7 @@ struct MANGOS_DLL_DECL npc_rinn_tocAI : public ScriptedAI DoScriptText(-1713534, m_creature); UpdateTimer = 5000; pInstance->SetData(TYPE_EVENT,3090); - pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_MAIN_GATE_DOOR)); + pInstance->DoUseDoorOrButton(GO_MAIN_GATE_DOOR); break; case 4020: DoScriptText(-1713548, m_creature); diff --git a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.h b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.h index f5f5f71..d263a01 100644 --- a/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.h +++ b/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.h @@ -5,6 +5,7 @@ #ifndef DEF_CRUSADER_H #define DEF_CRUSADER_H #include "BSW_ai.h" +#include "BSW_instance.h" enum { diff --git a/scripts/northrend/draktharon_keep/draktharon_keep.h b/scripts/northrend/draktharon_keep/draktharon_keep.h index 690c9e9..5e03882 100644 --- a/scripts/northrend/draktharon_keep/draktharon_keep.h +++ b/scripts/northrend/draktharon_keep/draktharon_keep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2010 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software licensed under GPL version 2 * Please see the included DOCS/LICENSE.TXT for more information */ @@ -25,6 +25,7 @@ enum NPC_CRYSTAL_CHANNEL_TARGET = 26710, NPC_CRYSTAL_CHANNEL = 26712, + NPC_TRIGGER_TARGET = 26714, NPC_NOVOS = 26631, NPC_CRYSTAL_HANDLER = 26627, @@ -59,12 +60,12 @@ class MANGOS_DLL_DECL instance_draktharon_keep : public ScriptedInstance bool CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + std::string m_strInstData; uint32 m_uiDreadAddsKilled; bool m_bNovosAddGrounded; diff --git a/scripts/northrend/draktharon_keep/instance_draktharon_keep.cpp b/scripts/northrend/draktharon_keep/instance_draktharon_keep.cpp index c569cb3..f4a96dd 100644 --- a/scripts/northrend/draktharon_keep/instance_draktharon_keep.cpp +++ b/scripts/northrend/draktharon_keep/instance_draktharon_keep.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2011 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -52,7 +52,7 @@ void instance_draktharon_keep::OnCreatureEvade(Creature* pCreature) void instance_draktharon_keep::OnCreatureDeath(Creature* pCreature) { if ((pCreature->GetEntry() == NPC_DRAKKARI_GUTRIPPER || pCreature->GetEntry() == NPC_DRAKKARI_SCYTHECLAW) && m_auiEncounter[TYPE_KING_DRED] == IN_PROGRESS) - m_uiDreadAddsKilled++; + ++m_uiDreadAddsKilled; if (pCreature->GetEntry() == NPC_KING_DRED) SetData(TYPE_KING_DRED, DONE); @@ -105,7 +105,7 @@ void instance_draktharon_keep::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_bronjahm.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_bronjahm.cpp index 24df960..b6a4b9f 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_bronjahm.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_bronjahm.cpp @@ -186,16 +186,16 @@ struct MANGOS_DLL_DECL mob_soul_fragmentAI : public ScriptedAI } ScriptedInstance *m_pInstance; - Creature* pBoss; uint32 m_uiRangeCheck_Timer; void Reset() { m_uiRangeCheck_Timer = 1000; if (!m_pInstance) return; - pBoss = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_BRONJAHM)); + Creature* pBoss = m_pInstance->GetSingleCreatureFromStorage(NPC_BRONJAHM); m_creature->SetSpeedRate(MOVE_RUN, 0.2f); - m_creature->GetMotionMaster()->MoveChase(pBoss); + if (Creature* pBoss = m_pInstance->GetSingleCreatureFromStorage(NPC_BRONJAHM)) + m_creature->GetMotionMaster()->MoveChase(pBoss); m_creature->SetRespawnDelay(DAY); } @@ -210,11 +210,16 @@ struct MANGOS_DLL_DECL mob_soul_fragmentAI : public ScriptedAI if (m_uiRangeCheck_Timer < uiDiff) { - if (pBoss->IsWithinDistInMap(m_creature, 2.0f)) + if (Creature* pBoss = m_pInstance->GetSingleCreatureFromStorage(NPC_BRONJAHM)) { - pBoss->CastSpell(pBoss, SPELL_CONSUME_SOUL, false); + if (pBoss->IsWithinDistInMap(m_creature, 2.0f)) + { + pBoss->CastSpell(pBoss, SPELL_CONSUME_SOUL, false); + m_creature->ForcedDespawn(); + } else m_creature->GetMotionMaster()->MoveChase(pBoss); + } + else m_creature->ForcedDespawn(); - } else m_creature->GetMotionMaster()->MoveChase(pBoss); m_uiRangeCheck_Timer = 1000; } diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_devourer_of_souls.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_devourer_of_souls.cpp index 8ab9fbd..aa69bf5 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_devourer_of_souls.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_devourer_of_souls.cpp @@ -357,7 +357,7 @@ struct MANGOS_DLL_DECL npc_unleashed_soulAI : public ScriptedAI { if (m_pInstance) { - if (Creature* pDevourer = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_DEVOURER))) + if (Creature* pDevourer = m_pInstance->GetSingleCreatureFromStorage(NPC_DEVOURER)) if (pDevourer && pDevourer->isAlive()) AttackStart(pDevourer->getVictim()); } diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.cpp index bab17e7..08a84a7 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.cpp @@ -187,7 +187,7 @@ bool StartEvent; { DoScriptText(SAY_JAINA_FS08, m_creature); StepTimer = 5000; - } + } ++Step; break; } @@ -198,7 +198,7 @@ bool StartEvent; bool GossipHello_npc_jaina_and_sylvana_FSintro(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) - pPlayer->PrepareQuestMenu( pCreature->GetGUID()); + pPlayer->PrepareQuestMenu( pCreature->GetObjectGuid()); switch(pCreature->GetEntry()) { case 37597: @@ -211,7 +211,7 @@ bool GossipHello_npc_jaina_and_sylvana_FSintro(Player* pPlayer, Creature* pCreat break; } - pPlayer->PlayerTalkClass->SendGossipMenu(907,pCreature->GetGUID()); //907 + pPlayer->PlayerTalkClass->SendGossipMenu(907,pCreature->GetObjectGuid()); //907 return true; } diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.h b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.h index 2c5385f..40ab357 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.h +++ b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.h @@ -102,27 +102,23 @@ class MANGOS_DLL_DECL instance_forge_of_souls : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); void SetData64(uint32 uiType, uint64 uiData); void OnPlayerEnter(Player* pPlayer); void ProcessEventNpcs(Player* pPlayer, bool bChanged); bool CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + std::string m_strInstData; bool m_bCriteriaPhantomBlastFailed; uint32 m_uiTeam; // Team of first entered player, used to set if Jaina or Silvana to spawn - uint64 m_uiBronjahmGUID; - uint64 m_uiDevourerOrSoulsGUID; - GUIDList m_luiSoulFragmentAliveGUIDs; GUIDList m_lEventMobGUIDs; }; diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/instance_forge_of_souls.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/instance_forge_of_souls.cpp index 32f8ce3..74713e8 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/instance_forge_of_souls.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/instance_forge_of_souls.cpp @@ -26,9 +26,7 @@ EndScriptData */ instance_forge_of_souls::instance_forge_of_souls(Map* pMap) : ScriptedInstance(pMap), m_bCriteriaPhantomBlastFailed(false), - m_uiTeam(0), - m_uiBronjahmGUID(0), - m_uiDevourerOrSoulsGUID(0) + m_uiTeam(0) { Initialize(); } @@ -40,11 +38,16 @@ void instance_forge_of_souls::Initialize() void instance_forge_of_souls::OnCreatureCreate(Creature* pCreature) { - switch(pCreature->GetEntry()) + switch (pCreature->GetEntry()) { - case NPC_BRONJAHM: m_uiBronjahmGUID = pCreature->GetGUID(); break; - case NPC_DEVOURER: m_uiDevourerOrSoulsGUID = pCreature->GetGUID(); break; - case NPC_CORRUPTED_SOUL_FRAGMENT: m_luiSoulFragmentAliveGUIDs.push_back(pCreature->GetGUID()); break; + case NPC_DEVOURER: + case NPC_BRONJAHM: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + + case NPC_CORRUPTED_SOUL_FRAGMENT: + m_luiSoulFragmentAliveGUIDs.push_back(pCreature->GetObjectGuid()); + break; } } @@ -69,7 +72,7 @@ void instance_forge_of_souls::ProcessEventNpcs(Player* pPlayer, bool bChanged) { if (Creature* pSummon = pPlayer->SummonCreature(m_uiTeam == HORDE ? aEventBeginLocations[i].uiEntryHorde : aEventBeginLocations[i].uiEntryAlliance, aEventBeginLocations[i].fSpawnX, aEventBeginLocations[i].fSpawnY, aEventBeginLocations[i].fSpawnZ, aEventBeginLocations[i].fSpawnO, TEMPSUMMON_DEAD_DESPAWN, 24*HOUR*IN_MILLISECONDS)) - m_lEventMobGUIDs.push_back(pSummon->GetGUID()); + m_lEventMobGUIDs.push_back(pSummon->GetObjectGuid()); } } else @@ -147,7 +150,7 @@ void instance_forge_of_souls::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -189,23 +192,10 @@ uint32 instance_forge_of_souls::GetData(uint32 uiType) } } -uint64 instance_forge_of_souls::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_BRONJAHM: - return m_uiBronjahmGUID; - case NPC_DEVOURER: - return m_uiDevourerOrSoulsGUID; - default: - return 0; - } -} - void instance_forge_of_souls::SetData64(uint32 uiType, uint64 uiData) { if (uiType == DATA_SOULFRAGMENT_REMOVE) - m_luiSoulFragmentAliveGUIDs.remove(uiData); + m_luiSoulFragmentAliveGUIDs.remove(ObjectGuid(uiData)); } InstanceData* GetInstanceData_instance_forge_of_souls(Map* pMap) diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_falric.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_falric.cpp index efac480..4117fcf 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_falric.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_falric.cpp @@ -150,7 +150,7 @@ struct MANGOS_DLL_DECL boss_falricAI : public BSWScriptedAI if(Creature* Summon = m_creature->SummonCreature(pSummon, SpawnLoc[m_uiLocNo].x, SpawnLoc[m_uiLocNo].y, SpawnLoc[m_uiLocNo].z, SpawnLoc[m_uiLocNo].o, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000)) { - m_uiSummonGUID[i] = Summon->GetGUID(); + m_uiSummonGUID[i] = Summon->GetObjectGuid(); Summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Summon->setFaction(974); } diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_lich_king.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_lich_king.cpp index 7cd7edc..25ec230 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_lich_king.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_lich_king.cpp @@ -140,7 +140,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI || m_pInstance->GetData(TYPE_FROST_GENERAL) != DONE) return; - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_ICECROWN_DOOR_2)); + m_pInstance->DoOpenDoor(GO_ICECROWN_DOOR_2); Team team; if (Group* pGroup = pPlayer->GetGroup()) @@ -166,9 +166,9 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI pNewLeader->SetSpeedRate(MOVE_RUN, 1.0f, true); pNewLeader->SetRespawnDelay(DAY); pNewLeader->SetHealth(pNewLeader->GetMaxHealth()/10); - m_pInstance->SetData64(DATA_ESCAPE_LIDER, pNewLeader->GetObjectGuid().GetRawValue()); + m_pInstance->SetData(DATA_ESCAPE_LIDER, pNewLeader->GetEntry()); } - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_ICECROWN_DOOR_2)); + m_pInstance->DoOpenDoor(GO_ICECROWN_DOOR_2); m_pInstance->SetData(TYPE_PHASE, 4); m_pInstance->SetNextEvent(100,GetLeader(),500); } @@ -183,7 +183,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI DoCast(m_creature, SPELL_LICH_KING_CAST); m_pInstance->SetData(TYPE_LICH_KING, SPECIAL); DoScriptText(SAY_LICH_KING_END_DUN, m_creature); - if(Creature* pLider = (m_creature->GetMap()->GetCreature( m_pInstance->GetData64(DATA_ESCAPE_LIDER)))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) { pLider->CastSpell(pLider, SPELL_SILENCE, false); pLider->AddSplineFlag(SPLINEFLAG_FLYING); @@ -245,7 +245,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI m_pInstance->SetData(DATA_SUMMONS, 1); - if (Creature* pLider = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_ESCAPE_LIDER))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) { summoned->GetMotionMaster()->MoveChase(pLider); summoned->AddThreat(pLider, 100.0f); @@ -255,7 +255,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI uint32 GetLeader() { - if (Creature* pLider = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_ESCAPE_LIDER))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) return pLider->GetEntry(); else return 0; @@ -269,7 +269,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI case 101: if(GetLeader() == NPC_JAINA_OUTRO) DoScriptText((GetLeader() == NPC_JAINA_OUTRO ? SAY_LICH_KING_AGGRO_A : SAY_LICH_KING_AGGRO_H), m_creature); - if (Creature* pLider = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_ESCAPE_LIDER))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) AttackStart(pLider); m_pInstance->SetNextEvent(102,GetLeader(),3000); break; @@ -395,7 +395,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI break; case 900: - if (Creature* pLider = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_ESCAPE_LIDER))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) m_creature->DealDamage(pLider, pLider->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); m_pInstance->SetData(TYPE_LICH_KING, FAIL); m_creature->SetActiveObjectState(false); @@ -444,7 +444,7 @@ struct MANGOS_DLL_DECL boss_lich_king_hrAI : public npc_escortAI pEscortAI->Start(); } if (m_pInstance->GetData(TYPE_PHASE) == 5) - if (Creature* pLider = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_ESCAPE_LIDER))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) if (pLider->isAlive() && pLider->IsWithinDistInMap(m_creature, 2.0f)) { m_pInstance->SetData(TYPE_PHASE,7); @@ -489,7 +489,7 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI uint32 GetLeader() { - if (Creature* pLider = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_ESCAPE_LIDER))) + if (Creature* pLider = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetData(DATA_ESCAPE_LIDER))) return pLider->GetEntry(); else return 0; @@ -500,7 +500,7 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI switch(m_pInstance->GetEvent(m_creature->GetEntry())) { case 24: - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_IMPENETRABLE_DOOR)); + m_pInstance->DoOpenDoor(GO_IMPENETRABLE_DOOR); m_pInstance->SetNextEvent(25,GetLeader(),1000); break; case 25: @@ -508,17 +508,17 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI m_pInstance->SetNextEvent(26,m_creature->GetEntry(),3000); break; case 26: - m_pInstance->DoCloseDoor(m_pInstance->GetData64(GO_IMPENETRABLE_DOOR)); + m_pInstance->DoCloseDoor(GO_IMPENETRABLE_DOOR); m_pInstance->SetNextEvent(27,m_creature->GetEntry(),7000); break; case 27: DoScriptText(SAY_LICH_KING_17, m_creature); - if (Creature* pUther = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_UTHER)))) + if (Creature* pUther = (m_pInstance->GetSingleCreatureFromStorage(NPC_UTHER))) pUther->CastSpell(pUther, SPELL_UTHER_DESPAWN, false); m_pInstance->SetNextEvent(28,m_creature->GetEntry(),1500); break; case 28: - if (Creature* pUther = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_UTHER)))) + if (Creature* pUther = (m_pInstance->GetSingleCreatureFromStorage(NPC_UTHER))) pUther->ForcedDespawn(); m_pInstance->SetNextEvent(29,m_creature->GetEntry(),10000); break; @@ -528,11 +528,11 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI break; case 30: m_creature->CastSpell(m_creature, SPELL_TAKE_FROSTMOURNE, false); - m_pInstance->DoCloseDoor(m_pInstance->GetData64(GO_FROSTMOURNE)); + m_pInstance->DoCloseDoor(GO_FROSTMOURNE); m_pInstance->SetNextEvent(31,m_creature->GetEntry(),1500); break; case 31: - if (GameObject* pFrostmourne = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_FROSTMOURNE))) + if (GameObject* pFrostmourne = m_pInstance->GetSingleGameObjectFromStorage(GO_FROSTMOURNE)) pFrostmourne->SetPhaseMask(0, true); m_creature->CastSpell(m_creature, SPELL_FROSTMOURNE_VISUAL, false); m_pInstance->SetNextEvent(31,GetLeader(),500); @@ -542,13 +542,13 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI m_pInstance->SetNextEvent(33,m_creature->GetEntry(),9000); break; case 33: - if (Creature* pFalric = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_FALRIC)))) + if (Creature* pFalric = (m_pInstance->GetSingleCreatureFromStorage(NPC_FALRIC))) { pFalric->SetVisibility(VISIBILITY_ON); pFalric->CastSpell(pFalric, SPELL_BOSS_SPAWN_AURA, false); pFalric->GetMotionMaster()->MovePoint(0, 5283.309f, 2031.173f, 709.319f); } - if (Creature* pMarwyn = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MARWYN)))) + if (Creature* pMarwyn = (m_pInstance->GetSingleCreatureFromStorage(NPC_MARWYN))) { pMarwyn->SetVisibility(VISIBILITY_ON); pMarwyn->CastSpell(pMarwyn, SPELL_BOSS_SPAWN_AURA, false); @@ -558,17 +558,17 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI m_pInstance->SetNextEvent(34,m_creature->GetEntry(),1000); break; case 34: - if (Creature* pFalric = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_FALRIC)))) + if (Creature* pFalric = (m_pInstance->GetSingleCreatureFromStorage(NPC_FALRIC))) DoScriptText(SAY_FALRIC_INTRO, pFalric); - if (Creature* pMarwyn = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MARWYN)))) + if (Creature* pMarwyn = (m_pInstance->GetSingleCreatureFromStorage(NPC_MARWYN))) DoScriptText(SAY_MARWYN_INTRO, pMarwyn); m_pInstance->SetData(TYPE_EVENT, 5); m_pInstance->SetNextEvent(35,m_creature->GetEntry(),3000); break; case 35: - if (GameObject* pGate = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_IMPENETRABLE_DOOR))) + if (GameObject* pGate = m_pInstance->GetSingleGameObjectFromStorage(GO_IMPENETRABLE_DOOR)) pGate->SetGoState(GO_STATE_ACTIVE); - if (Creature* pFalric = (m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_FALRIC)))) + if (Creature* pFalric = m_pInstance->GetSingleCreatureFromStorage(NPC_FALRIC)) DoScriptText(SAY_FALRIC_INTRO2, pFalric); m_pInstance->SetData(TYPE_FALRIC, SPECIAL); m_pInstance->SetNextEvent(36,GetLeader(),4000); @@ -584,7 +584,7 @@ struct MANGOS_DLL_DECL boss_lich_king_intro_horAI : public ScriptedAI m_pInstance->SetNextEvent(38,m_creature->GetEntry(),8000); break; case 38: - m_pInstance->DoCloseDoor(m_pInstance->GetData64(GO_IMPENETRABLE_DOOR)); + m_pInstance->DoCloseDoor(GO_IMPENETRABLE_DOOR); m_pInstance->SetNextEvent(39,m_creature->GetEntry(),5000); break; case 39: diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_marwyn.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_marwyn.cpp index 96bdbcd..73472d4 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_marwyn.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_marwyn.cpp @@ -118,7 +118,7 @@ struct MANGOS_DLL_DECL boss_marwynAI : public BSWScriptedAI if(Creature* Summon = m_creature->SummonCreature(pSummon, SpawnLoc[m_uiLocNo].x, SpawnLoc[m_uiLocNo].y, SpawnLoc[m_uiLocNo].z, SpawnLoc[m_uiLocNo].o, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000)) { - m_uiSummonGUID[i] = Summon->GetGUID(); + m_uiSummonGUID[i] = Summon->GetObjectGuid(); Summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Summon->setFaction(974); } diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/halls_of_reflection.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/halls_of_reflection.cpp index 940a621..17b4261 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/halls_of_reflection.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/halls_of_reflection.cpp @@ -232,7 +232,7 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRintroAI : public ScriptedAI break; case 8: DoCast(m_creature, SPELL_FROSTMOURNE_SOUNDS); - if(GameObject* pFrostmourne = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_FROSTMOURNE))) + if(GameObject* pFrostmourne = m_pInstance->GetSingleGameObjectFromStorage(GO_FROSTMOURNE)) pFrostmourne->SetGoState(GO_STATE_ACTIVE); if(m_creature->GetEntry() == NPC_JAINA) m_pInstance->SetNextEvent(9,m_creature->GetEntry(),12000); @@ -478,7 +478,7 @@ bool GossipHello_npc_jaina_and_sylvana_HRintro(Player* pPlayer, Creature* pCreat BSWScriptedInstance* m_pInstance = (BSWScriptedInstance*)pCreature->GetInstanceData(); if(pCreature->isQuestGiver()) - pPlayer->PrepareQuestMenu( pCreature->GetGUID()); + pPlayer->PrepareQuestMenu( pCreature->GetObjectGuid()); switch(pCreature->GetEntry()) { @@ -492,7 +492,7 @@ bool GossipHello_npc_jaina_and_sylvana_HRintro(Player* pPlayer, Creature* pCreat break; } - pPlayer->PlayerTalkClass->SendGossipMenu(907,pCreature->GetGUID()); + pPlayer->PlayerTalkClass->SendGossipMenu(907,pCreature->GetObjectGuid()); return true; } @@ -518,7 +518,7 @@ bool GossipSelect_npc_jaina_and_sylvana_HRintro(Player* pPlayer, Creature* pCrea m_pInstance->SetNextEvent(1, pCreature->GetEntry(), 500); - m_pInstance->SetData64(DATA_ESCAPE_LIDER,pCreature->GetGUID()); + m_pInstance->SetData(DATA_ESCAPE_LIDER,pCreature->GetEntry()); return true; } @@ -614,7 +614,7 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI void DoDestructWall() { - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_ICE_WALL)); + m_pInstance->DoOpenDoor(GO_ICE_WALL); if (Creature* pWallTarget = m_creature->GetMap()->GetCreature(wallTarget)) { pWallTarget->ForcedDespawn(); @@ -765,7 +765,7 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI { case 100: m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) { if (m_creature->GetEntry() == NPC_SYLVANA_OUTRO) AttackStart(pLichKing); @@ -790,7 +790,7 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI case 104: if(m_creature->GetEntry() == NPC_SYLVANA_OUTRO) { - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) m_creature->CastSpell(pLichKing, SPELL_SYLVANA_STEP, false); m_pInstance->SetNextEvent(105,m_creature->GetEntry(),3000); } @@ -809,7 +809,7 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI break; case 106: Fight = true; - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) m_creature->CastSpell(pLichKing,(m_creature->GetEntry() == NPC_JAINA_OUTRO ? SPELL_ICE_PRISON : SPELL_DARK_ARROW),true); m_pInstance->SetNextEvent(107,m_creature->GetEntry(),2500); break; @@ -817,14 +817,14 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI m_creature->RemoveAurasDueToSpell(SPELL_ICE_BARRIER); if(m_creature->GetEntry() == NPC_JAINA_OUTRO) { - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) if (!pLichKing->HasAura(SPELL_ICE_PRISON)) pLichKing->CastSpell(pLichKing,SPELL_ICE_PRISON,true); DoScriptText(SAY_JAINA_AGGRO, m_creature); } else if(m_creature->GetEntry() == NPC_SYLVANA_OUTRO) { - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) if (!pLichKing->HasAura(SPELL_DARK_ARROW)) pLichKing->CastSpell(pLichKing,SPELL_DARK_ARROW,true); DoScriptText(SAY_SYLVANA_AGGRO, m_creature); @@ -835,7 +835,8 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI break; case 108: m_creature->GetMotionMaster()->MovePoint(0, 5577.187f, 2236.003f, 733.012f); - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, m_pInstance->GetData64(BOSS_LICH_KING)); + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) + m_creature->SetGuidValue(UNIT_FIELD_TARGET, pLichKing->GetObjectGuid()); m_pInstance->SetNextEvent(109,m_creature->GetEntry(),10000); break; case 109: @@ -858,7 +859,7 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI m_pInstance->SetNextEvent(611,m_creature->GetEntry(),6000); break; case 611: - if (GameObject* pCave = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_CAVE))) + if (GameObject* pCave = m_pInstance->GetSingleGameObjectFromStorage(GO_CAVE)) pCave->SetGoState(GO_STATE_READY); m_creature->RemoveAurasDueToSpell(SPELL_SILENCE); m_creature->RemoveSplineFlag(SPLINEFLAG_FLYING); @@ -929,22 +930,22 @@ struct MANGOS_DLL_DECL npc_jaina_and_sylvana_HRextroAI : public npc_escortAI { case 1: DoDestructWall(); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) DoScriptText(SAY_LICH_KING_WALL_02, pLichKing); break; case 2: DoDestructWall(); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) DoScriptText(SAY_LICH_KING_WALL_03, pLichKing); break; case 3: DoDestructWall(); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) DoScriptText(SAY_LICH_KING_WALL_04, pLichKing); break; case 4: DoDestructWall(); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(BOSS_LICH_KING))) + if (Creature* pLichKing = m_pInstance->GetSingleCreatureFromStorage(BOSS_LICH_KING)) { pLichKing->RemoveAurasDueToSpell(SPELL_WINTER); pLichKing->SetSpeedRate(MOVE_WALK, 2.5f, true); @@ -973,11 +974,11 @@ bool GossipHello_npc_jaina_and_sylvana_HRextro(Player* pPlayer, Creature* pCreat if(m_pInstance->GetData(TYPE_LICH_KING) == DONE) return false; if(pCreature->isQuestGiver()) - pPlayer->PrepareQuestMenu( pCreature->GetGUID()); + pPlayer->PrepareQuestMenu( pCreature->GetObjectGuid()); pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, -3594540, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetObjectGuid()); return true; } @@ -996,7 +997,7 @@ bool GossipSelect_npc_jaina_and_sylvana_HRextro(Player* pPlayer, Creature* pCrea if(m_pInstance) { - m_pInstance->SetData64(DATA_ESCAPE_LIDER, pCreature->GetGUID()); + m_pInstance->SetData(DATA_ESCAPE_LIDER, pCreature->GetEntry()); m_pInstance->SetData(TYPE_LICH_KING, IN_PROGRESS); m_pInstance->SetData(TYPE_PHASE, 5); } @@ -1247,19 +1248,19 @@ struct MANGOS_DLL_DECL npc_queldelar_horAI : public ScriptedAI return; else if (m_pInstance->GetData(TYPE_FROST_GENERAL) == DONE) { - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_IMPENETRABLE_DOOR)); - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_ICECROWN_DOOR_2)); + m_pInstance->DoOpenDoor(GO_IMPENETRABLE_DOOR); + m_pInstance->DoOpenDoor(GO_ICECROWN_DOOR_2); m_pInstance->SetData(TYPE_PHASE, 3); return; } else if (m_pInstance->GetData(TYPE_MARWYN) == DONE) { - m_pInstance->DoOpenDoor(m_pInstance->GetData64(GO_IMPENETRABLE_DOOR)); + m_pInstance->DoOpenDoor(GO_IMPENETRABLE_DOOR); return; } else if (m_pInstance->GetData(TYPE_FALRIC) == DONE) { - if (Creature* pMarwyn = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MARWYN))) + if (Creature* pMarwyn = m_pInstance->GetSingleCreatureFromStorage(NPC_MARWYN)) { pMarwyn->SetVisibility(VISIBILITY_ON); pMarwyn->CastSpell(pMarwyn, SPELL_BOSS_SPAWN_AURA, false); diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/instance_halls_of_reflection.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/instance_halls_of_reflection.cpp index 18156f3..6a1438a 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/instance_halls_of_reflection.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/instance_halls_of_reflection.cpp @@ -44,27 +44,8 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance uint32 m_auiLeader; - ObjectGuid m_uiFalricGUID; - ObjectGuid m_uiMarwynGUID; - ObjectGuid m_uiLichKingGUID; - ObjectGuid m_uiLiderGUID; - ObjectGuid m_uiUtherGUID; - - ObjectGuid m_uiQuelDelarGUID; - - ObjectGuid m_uiMainGateGUID; - ObjectGuid m_uiExitGateGUID; - ObjectGuid m_uiDoor2GUID; - ObjectGuid m_uiDoor3GUID; - - ObjectGuid m_uiFrostGeneralGUID; ObjectGuid m_uiCaptainsChestHordeGUID; ObjectGuid m_uiCaptainsChestAllianceGUID; - ObjectGuid m_uiFrostmourneGUID; - ObjectGuid m_uiFrostmourneAltarGUID; - ObjectGuid m_uiPortalGUID; - ObjectGuid m_uiIceWallGUID; - ObjectGuid m_uiCaveGUID; void Initialize() { @@ -77,23 +58,19 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance { switch(pCreature->GetEntry()) { + case NPC_JAINA: + case NPC_SYLVANA: + case NPC_JAINA_OUTRO: + case NPC_SYLVANA_OUTRO: + case NPC_ALTAR_TARGET: + case NPC_LICH_KING: case NPC_FALRIC: - m_uiFalricGUID = pCreature->GetObjectGuid(); - break; case NPC_MARWYN: - m_uiMarwynGUID = pCreature->GetObjectGuid(); - break; case BOSS_LICH_KING: - m_uiLichKingGUID = pCreature->GetObjectGuid(); - break; case NPC_FROST_GENERAL: - m_uiFrostGeneralGUID = pCreature->GetObjectGuid(); - break; case NPC_QUEL_DELAR: - m_uiQuelDelarGUID = pCreature->GetObjectGuid(); - break; case NPC_UTHER: - m_uiUtherGUID = pCreature->GetObjectGuid(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); break; } } @@ -102,18 +79,12 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance { switch(pGo->GetEntry()) { - case GO_IMPENETRABLE_DOOR: m_uiMainGateGUID = pGo->GetObjectGuid(); - if (GetData(TYPE_MARWYN) == DONE) - DoOpenDoor(m_uiMainGateGUID); + case GO_IMPENETRABLE_DOOR: if (GetData(TYPE_MARWYN) == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); break; - case GO_FROSTMOURNE: m_uiFrostmourneGUID = pGo->GetObjectGuid(); break; - case GO_ICECROWN_DOOR: m_uiExitGateGUID = pGo->GetObjectGuid(); break; - case GO_ICECROWN_DOOR_2: m_uiDoor2GUID = pGo->GetObjectGuid(); - if (GetData(TYPE_FROST_GENERAL) == DONE) - DoOpenDoor(m_uiDoor2GUID); + case GO_ICECROWN_DOOR_2: if (GetData(TYPE_FROST_GENERAL) == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); break; - case GO_ICECROWN_DOOR_3: m_uiDoor3GUID = pGo->GetObjectGuid(); break; - case GO_PORTAL: m_uiPortalGUID = pGo->GetObjectGuid(); break; case GO_CAPTAIN_CHEST_1: if (Difficulty == RAID_DIFFICULTY_10MAN_NORMAL) m_uiCaptainsChestHordeGUID = pGo->GetObjectGuid(); @@ -131,13 +102,14 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance m_uiCaptainsChestAllianceGUID = pGo->GetObjectGuid(); break; - case GO_ICE_WALL: m_uiIceWallGUID = pGo->GetObjectGuid(); + case GO_ICE_WALL: pGo->SetPhaseMask(65535, true); break; - case GO_CAVE: m_uiCaveGUID = pGo->GetObjectGuid(); - DoOpenDoor(m_uiCaveGUID); + case GO_CAVE: + pGo->SetGoState(GO_STATE_ACTIVE);; break; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void SetData(uint32 uiType, uint32 uiData) @@ -150,28 +122,28 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance break; case TYPE_FALRIC: m_auiEncounter[uiType] = uiData; if (uiData == SPECIAL) - DoCloseDoor(m_uiExitGateGUID); + DoCloseDoor(GO_ICECROWN_DOOR); else if (uiData == FAIL) - DoOpenDoor(m_uiExitGateGUID); + DoOpenDoor(GO_ICECROWN_DOOR); break; case TYPE_MARWYN: m_auiEncounter[uiType] = uiData; if (uiData == SPECIAL) - DoCloseDoor(m_uiExitGateGUID); + DoCloseDoor(GO_ICECROWN_DOOR); else if (uiData == FAIL) - DoOpenDoor(m_uiExitGateGUID); + DoOpenDoor(GO_ICECROWN_DOOR); else if (uiData == DONE) { - DoOpenDoor(m_uiMainGateGUID); - DoOpenDoor(m_uiExitGateGUID); + DoOpenDoor(GO_IMPENETRABLE_DOOR); + DoOpenDoor(GO_ICECROWN_DOOR); } break; case TYPE_FROST_GENERAL: m_auiEncounter[uiType] = uiData; if(uiData == DONE) - DoOpenDoor(m_uiDoor2GUID); + DoOpenDoor(GO_ICECROWN_DOOR_2); break; case TYPE_LICH_KING: m_auiEncounter[uiType] = uiData; if(uiData == IN_PROGRESS) - DoOpenDoor(m_uiDoor3GUID); + DoOpenDoor(GO_ICECROWN_DOOR_3); if(uiData == DONE) { if (GameObject* pChest = instance->GetGameObject(m_uiCaptainsChestAllianceGUID)) @@ -184,7 +156,7 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance { pChest->SetRespawnTime(DAY); }; - if (GameObject* pPortal = instance->GetGameObject(m_uiPortalGUID)) + if (GameObject* pPortal = GetSingleGameObjectFromStorage(GO_PORTAL)) if (pPortal && !pPortal->isSpawned()) { pPortal->SetRespawnTime(DAY); @@ -204,7 +176,7 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance if (m_waveCount > 0 && m_waveCount < 10) { DoUpdateWorldState(WORLD_STATE_HOR, 1); - DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, m_waveCount-1); + DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, m_waveCount); } else DoUpdateWorldState(WORLD_STATE_HOR, 0); @@ -252,38 +224,6 @@ struct MANGOS_DLL_DECL instance_halls_of_reflection : public BSWScriptedInstance return 0; } - void SetData64(uint32 uiData, uint64 uiGuid) - { - switch(uiData) - { - case DATA_ESCAPE_LIDER: - m_uiLiderGUID = uiGuid; - break; - } - } - - uint64 GetData64(uint32 uiData) - { - switch(uiData) - { - case GO_IMPENETRABLE_DOOR: return m_uiMainGateGUID.GetRawValue(); - case GO_FROSTMOURNE: return m_uiFrostmourneGUID.GetRawValue(); - case NPC_FALRIC: return m_uiFalricGUID.GetRawValue(); - case NPC_MARWYN: return m_uiMarwynGUID.GetRawValue(); - case NPC_UTHER: return m_uiUtherGUID.GetRawValue(); - case BOSS_LICH_KING: return m_uiLichKingGUID.GetRawValue(); - case DATA_ESCAPE_LIDER: return m_uiLiderGUID.GetRawValue(); - case NPC_FROST_GENERAL: return m_uiFrostGeneralGUID.GetRawValue(); - case NPC_QUEL_DELAR: return m_uiQuelDelarGUID.GetRawValue(); - case GO_ICECROWN_DOOR: return m_uiExitGateGUID.GetRawValue(); - case GO_ICECROWN_DOOR_2: return m_uiDoor2GUID.GetRawValue(); - case GO_ICECROWN_DOOR_3: return m_uiDoor3GUID.GetRawValue(); - case GO_ICE_WALL: return m_uiIceWallGUID.GetRawValue(); - case GO_CAVE: return m_uiCaveGUID.GetRawValue(); - } - return 0; - } - void Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_krick_and_ick.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_krick_and_ick.cpp index 0bf790d..3d20fcf 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_krick_and_ick.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_krick_and_ick.cpp @@ -94,7 +94,7 @@ struct MANGOS_DLL_DECL boss_ickAI : public ScriptedAI void KilledUnit(Unit* pVictim) { - if(Creature* pKrick = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KRICK))) + if(Creature* pKrick = m_pInstance->GetSingleCreatureFromStorage(NPC_KRICK)) DoScriptText(urand(0, 1) ? SAY_SLAY_1 : SAY_SLAY_2, pKrick); } @@ -110,7 +110,7 @@ struct MANGOS_DLL_DECL boss_ickAI : public ScriptedAI m_pInstance->SetData(TYPE_KRICK, DONE); // ToDo - remove this when outro implemented - if(Creature* pKrick = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KRICK))) + if(Creature* pKrick = m_pInstance->GetSingleCreatureFromStorage(NPC_KRICK)) pKrick->DealDamage(pKrick, pKrick->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -129,7 +129,7 @@ struct MANGOS_DLL_DECL boss_ickAI : public ScriptedAI { if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_POISON_NOVA : SPELL_POISON_NOVA_H)) { - if(Creature* pKrick = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KRICK))) + if(Creature* pKrick = m_pInstance->GetSingleCreatureFromStorage(NPC_KRICK)) DoScriptText(SAY_ORDER_BLOW, pKrick); m_uiPoisonNovaTimer = 30000; } @@ -143,7 +143,7 @@ struct MANGOS_DLL_DECL boss_ickAI : public ScriptedAI { if (DoCastSpellIfCan(pTarget, SPELL_PURSUED) == CAST_OK) { - if(Creature* pKrick = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KRICK))) + if(Creature* pKrick = m_pInstance->GetSingleCreatureFromStorage(NPC_KRICK)) { switch (urand(0, 2)) { @@ -218,7 +218,7 @@ struct MANGOS_DLL_DECL boss_krickAI : public ScriptedAI if (m_uiToxicWasteTimer < uiDiff) { - if(Creature* pIck = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_ICK))) + if(Creature* pIck = m_pInstance->GetSingleCreatureFromStorage(NPC_ICK)) { if (Unit* pTarget = pIck->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { @@ -232,7 +232,7 @@ struct MANGOS_DLL_DECL boss_krickAI : public ScriptedAI if (m_uiShadowboltTimer < uiDiff) { - if(Creature* pIck = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_ICK))) + if(Creature* pIck = m_pInstance->GetSingleCreatureFromStorage(NPC_ICK)) { if (Unit* pTarget = pIck->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp index 11188fe..262f920 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp @@ -72,17 +72,17 @@ struct MANGOS_DLL_DECL boss_rimefangAI : public ScriptedAI uint32 m_uiHoarfrostTimer; uint32 m_uiIcyBlastTimer; uint32 m_uiIcyBlastSlowTimer; - uint64 m_uiMainTargetGUID; + ObjectGuid m_uiMainTargetGUID; void Reset() { m_uiHoarfrostTimer = 25000; m_uiIcyBlastTimer = 35000; m_uiIcyBlastSlowTimer = 30000; - m_uiMainTargetGUID = 0; + m_uiMainTargetGUID.Clear(); } - void SetMainTarget(uint64 m_uiTargetGUID) + void SetMainTarget(ObjectGuid m_uiTargetGUID) { m_uiMainTargetGUID = m_uiTargetGUID; } @@ -182,7 +182,7 @@ struct MANGOS_DLL_DECL boss_tyrannusAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); // Temp hack until outro is implemented - if (Creature* pRimefang = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_RIMEFANG))) + if (Creature* pRimefang = m_pInstance->GetSingleCreatureFromStorage(NPC_RIMEFANG)) { pRimefang->GetMotionMaster()->Clear(); pRimefang->GetMotionMaster()->MovePoint(0, 844.752f, 358.993f, 645.330f); @@ -239,8 +239,8 @@ struct MANGOS_DLL_DECL boss_tyrannusAI : public ScriptedAI { if (DoCastSpellIfCan(pTarget, SPELL_MARK_OF_RIMEFANG) == CAST_OK) { - if (Creature* pRimefang = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_RIMEFANG))) - ((boss_rimefangAI*)pRimefang->AI())->SetMainTarget(pTarget->GetGUID()); + if (Creature* pRimefang = m_pInstance->GetSingleCreatureFromStorage(NPC_RIMEFANG)) + ((boss_rimefangAI*)pRimefang->AI())->SetMainTarget(pTarget->GetObjectGuid()); DoScriptText(SAY_MARK, m_creature); m_uiMarkOfRimefangTimer = urand(30000, 40000); diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/instance_pit_of_saron.cpp b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/instance_pit_of_saron.cpp index f4c79c1..efa033d 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/instance_pit_of_saron.cpp +++ b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/instance_pit_of_saron.cpp @@ -24,15 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "pit_of_saron.h" -instance_pit_of_saron::instance_pit_of_saron(Map* pMap) : ScriptedInstance(pMap), - m_uiTyrannusIntroGUID(0), - m_uiGarfrostGUID(0), - m_uiKrickGUID(0), - m_uiIckGUID(0), - m_uiTyrannusGUID(0), - m_uiRimefangGUID(0), - m_uiIcewallGUID(0), - m_uiHallsPortGUID(0) +instance_pit_of_saron::instance_pit_of_saron(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -46,12 +38,14 @@ void instance_pit_of_saron::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_TYRANNUS_INTRO: m_uiTyrannusIntroGUID = pCreature->GetGUID(); break; - case NPC_GARFROST: m_uiGarfrostGUID = pCreature->GetGUID(); break; - case NPC_KRICK: m_uiKrickGUID = pCreature->GetGUID(); break; - case NPC_ICK: m_uiIckGUID = pCreature->GetGUID(); break; - case NPC_TYRANNUS: m_uiTyrannusGUID = pCreature->GetGUID(); break; - case NPC_RIMEFANG: m_uiRimefangGUID = pCreature->GetGUID(); break; + case NPC_TYRANNUS_INTRO: + case NPC_GARFROST: + case NPC_KRICK: + case NPC_ICK: + case NPC_TYRANNUS: + case NPC_RIMEFANG: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -60,14 +54,16 @@ void instance_pit_of_saron::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_ICEWALL: - m_uiIcewallGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_GARFROST] == DONE && m_auiEncounter[TYPE_KRICK] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HALLS_OF_REFLECT_PORT: - m_uiHallsPortGUID = pGo->GetGUID(); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_pit_of_saron::SetData(uint32 uiType, uint32 uiData) @@ -76,12 +72,12 @@ void instance_pit_of_saron::SetData(uint32 uiType, uint32 uiData) { case TYPE_GARFROST: if (uiData == DONE && m_auiEncounter[TYPE_KRICK] == DONE) - DoUseDoorOrButton(m_uiIcewallGUID); + DoUseDoorOrButton(GO_ICEWALL); m_auiEncounter[uiType] = uiData; break; case TYPE_KRICK: if (uiData == DONE && m_auiEncounter[TYPE_GARFROST] == DONE) - DoUseDoorOrButton(m_uiIcewallGUID); + DoUseDoorOrButton(GO_ICEWALL); m_auiEncounter[uiType] = uiData; break; case TYPE_TYRANNUS: @@ -98,7 +94,7 @@ void instance_pit_of_saron::SetData(uint32 uiType, uint32 uiData) std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; @@ -129,29 +125,10 @@ void instance_pit_of_saron::Load(const char* chrIn) uint32 instance_pit_of_saron::GetData(uint32 uiType) { - switch(uiType) - { - case TYPE_GARFROST: return m_auiEncounter[uiType]; - case TYPE_KRICK: return m_auiEncounter[uiType]; - case TYPE_TYRANNUS: return m_auiEncounter[uiType]; - default: - return 0; - } -} + if (uiType < MAX_ENCOUNTER) + return m_auiEncounter[uiType]; -uint64 instance_pit_of_saron::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_TYRANNUS_INTRO: return m_uiTyrannusIntroGUID; - case NPC_GARFROST: return m_uiGarfrostGUID; - case NPC_KRICK: return m_uiKrickGUID; - case NPC_ICK: return m_uiIckGUID; - case NPC_TYRANNUS: return m_uiTyrannusGUID; - case NPC_RIMEFANG: return m_uiRimefangGUID; - default: - return 0; - } + return 0; } bool AreaTrigger_at_tyrannus(Player* pPlayer, AreaTriggerEntry const* pAt) diff --git a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/pit_of_saron.h b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/pit_of_saron.h index fcb082f..f4c22ef 100644 --- a/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/pit_of_saron.h +++ b/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/pit_of_saron.h @@ -51,26 +51,13 @@ class MANGOS_DLL_DECL instance_pit_of_saron : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); - const char* Save() { return strInstData.c_str(); } + const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); protected: uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - // Creature GUIDs - uint64 m_uiTyrannusIntroGUID; - uint64 m_uiGarfrostGUID; - uint64 m_uiKrickGUID; - uint64 m_uiIckGUID; - uint64 m_uiTyrannusGUID; - uint64 m_uiRimefangGUID; - - // GameObject GUIDs - uint64 m_uiIcewallGUID; - uint64 m_uiHallsPortGUID; + std::string m_strInstData; }; #endif diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/blood_prince_council.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/blood_prince_council.cpp index 9ea4016..004b551 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/blood_prince_council.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/blood_prince_council.cpp @@ -142,8 +142,8 @@ struct MANGOS_DLL_DECL boss_valanar_iccAI : public BSWScriptedAI if (!m_pInstance) return; - pBrother1 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_TALDARAM)); - pBrother2 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KELESETH)); + pBrother1 = m_pInstance->GetSingleCreatureFromStorage(NPC_TALDARAM); + pBrother2 = m_pInstance->GetSingleCreatureFromStorage(NPC_KELESETH); if (pBrother1 && !pBrother1->isAlive()) pBrother1->Respawn(); @@ -294,8 +294,8 @@ struct MANGOS_DLL_DECL boss_taldaram_iccAI : public BSWScriptedAI if (!m_pInstance) return; - pBrother1 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VALANAR)); - pBrother2 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KELESETH)); + pBrother1 = m_pInstance->GetSingleCreatureFromStorage(NPC_VALANAR); + pBrother2 = m_pInstance->GetSingleCreatureFromStorage(NPC_KELESETH); if (pBrother1 && !pBrother1->isAlive()) pBrother1->Respawn(); if (pBrother2 && !pBrother2->isAlive()) @@ -457,8 +457,8 @@ struct MANGOS_DLL_DECL boss_keleseth_iccAI : public BSWScriptedAI { if (!m_pInstance) return; - pBrother1 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_TALDARAM)); - pBrother2 = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VALANAR)); + pBrother1 = m_pInstance->GetSingleCreatureFromStorage(NPC_TALDARAM); + pBrother2 = m_pInstance->GetSingleCreatureFromStorage(NPC_VALANAR); if (pBrother1 && !pBrother1->isAlive()) pBrother1->Respawn(); @@ -884,11 +884,11 @@ struct MANGOS_DLL_DECL boss_blood_queen_lanathel_introAI : public BSWScriptedAI } else { - if (Creature* pPrince = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_TALDARAM))) + if (Creature* pPrince = pInstance->GetSingleCreatureFromStorage(NPC_TALDARAM)) doCast(SPELL_FAKE_DEATH,pPrince); - if (Creature* pPrince = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_KELESETH))) + if (Creature* pPrince = pInstance->GetSingleCreatureFromStorage(NPC_KELESETH)) doCast(SPELL_FAKE_DEATH,pPrince); - if (Creature* pPrince = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_VALANAR))) + if (Creature* pPrince = pInstance->GetSingleCreatureFromStorage(NPC_VALANAR)) doCast(SPELL_FAKE_DEATH,pPrince); pInstance->SetData(TYPE_BLOOD_COUNCIL, NOT_STARTED); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -939,15 +939,15 @@ struct MANGOS_DLL_DECL boss_blood_queen_lanathel_introAI : public BSWScriptedAI break; case 810: DoScriptText(-1631311, m_creature); - if (Creature* pPrince = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_TALDARAM))) + if (Creature* pPrince = pInstance->GetSingleCreatureFromStorage(NPC_TALDARAM)) { doRemove(SPELL_FAKE_DEATH,pPrince); } - if (Creature* pPrince = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_KELESETH))) + if (Creature* pPrince = pInstance->GetSingleCreatureFromStorage(NPC_KELESETH)) { doRemove(SPELL_FAKE_DEATH,pPrince); } - if (Creature* pPrince = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_VALANAR))) + if (Creature* pPrince = pInstance->GetSingleCreatureFromStorage(NPC_VALANAR)) { doRemove(SPELL_FAKE_DEATH,pPrince); } diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_deathbringer_saurfang.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_deathbringer_saurfang.cpp index c69b166..e156555 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_deathbringer_saurfang.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_deathbringer_saurfang.cpp @@ -262,7 +262,7 @@ struct MANGOS_DLL_DECL mob_blood_beastAI : public BSWScriptedAI void Reset() { - pOwner = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_DEATHBRINGER_SAURFANG)); + pOwner = pInstance->GetSingleCreatureFromStorage(NPC_DEATHBRINGER_SAURFANG); resetTimers(); scentcasted = false; } diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_festergut.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_festergut.cpp index dc2396d..c04174f 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_festergut.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_festergut.cpp @@ -74,8 +74,8 @@ struct MANGOS_DLL_DECL boss_festergutAI : public BSWScriptedAI ScriptedInstance *pInstance; bool intro; bool pet; - uint64 blightTargetGUID; -// uint64 pPuddleStalkerGUID[3]; + ObjectGuid blightTargetGUID; +// ObjectGuid pPuddleStalkerGUID[3]; void Reset() { @@ -103,7 +103,7 @@ struct MANGOS_DLL_DECL boss_festergutAI : public BSWScriptedAI pBlightTarget->Respawn(); if (pBlightTarget) { - blightTargetGUID = pBlightTarget->GetGUID(); + blightTargetGUID = pBlightTarget->GetObjectGuid(); pBlightTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pBlightTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); doCast(SPELL_BLIGHT_VISUAL_1,pBlightTarget); @@ -211,7 +211,7 @@ struct MANGOS_DLL_DECL boss_festergutAI : public BSWScriptedAI if (!pet) { - if (Creature* pGuard = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_STINKY))) + if (Creature* pGuard = pInstance->GetSingleCreatureFromStorage(NPC_STINKY)) if (!pGuard->isAlive()) { pet = true; diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_professor_putricide.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_professor_putricide.cpp index 4161891..082650c 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_professor_putricide.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_professor_putricide.cpp @@ -15,7 +15,7 @@ */ /* ScriptData -SDName: boss_proffesor_putricide +SDName: boss_professor_putricide SD%Complete: 70% SDComment: by /dev/rsa SDCategory: Icecrown Citadel @@ -93,9 +93,9 @@ static Locations SpawnLoc[]= {4417.302246f, 3188.219971f, 389.332520f, 5.102f}, // 2 Putricide Rotface say o=5.102 }; -struct MANGOS_DLL_DECL boss_proffesor_putricideAI : public BSWScriptedAI +struct MANGOS_DLL_DECL boss_professor_putricideAI : public BSWScriptedAI { - boss_proffesor_putricideAI(Creature* pCreature) : BSWScriptedAI(pCreature) + boss_professor_putricideAI(Creature* pCreature) : BSWScriptedAI(pCreature) { pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); Reset(); @@ -411,9 +411,9 @@ struct MANGOS_DLL_DECL boss_proffesor_putricideAI : public BSWScriptedAI } }; -CreatureAI* GetAI_boss_proffesor_putricide(Creature* pCreature) +CreatureAI* GetAI_boss_professor_putricide(Creature* pCreature) { - return new boss_proffesor_putricideAI(pCreature); + return new boss_professor_putricideAI(pCreature); } struct MANGOS_DLL_DECL mob_icc_gas_cloudAI : public BSWScriptedAI @@ -726,12 +726,12 @@ CreatureAI* GetAI_mob_ooze_puddle(Creature* pCreature) return new mob_ooze_puddleAI(pCreature); } -void AddSC_boss_proffesor_putricide() +void AddSC_boss_professor_putricide() { Script *newscript; newscript = new Script; - newscript->Name = "boss_proffesor_putricide"; - newscript->GetAI = &GetAI_boss_proffesor_putricide; + newscript->Name = "boss_professor_putricide"; + newscript->GetAI = &GetAI_boss_professor_putricide; newscript->RegisterSelf(); newscript = new Script; diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_rotface.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_rotface.cpp index 3d3b2ae..0836006 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_rotface.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_rotface.cpp @@ -130,7 +130,7 @@ struct MANGOS_DLL_DECL boss_rotfaceAI : public BSWScriptedAI if (!pet) { - if (Creature* pGuard = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_PRECIOUS))) + if (Creature* pGuard = pInstance->GetSingleCreatureFromStorage(NPC_PRECIOUS)) if (!pGuard->isAlive()) { pet = true; diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_sindragosa.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_sindragosa.cpp index 358fbad..d4e343e 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_sindragosa.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_sindragosa.cpp @@ -102,8 +102,8 @@ struct MANGOS_DLL_DECL boss_sindragosaAI : public BSWScriptedAI m_creature->SetUInt32Value(UNIT_FIELD_BYTES_0, 0); m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Creature* pTemp1 = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_RIMEFANG)); - Creature* pTemp2 = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SPINESTALKER)); + Creature* pTemp1 = pInstance->GetSingleCreatureFromStorage(NPC_RIMEFANG); + Creature* pTemp2 = pInstance->GetSingleCreatureFromStorage(NPC_SPINESTALKER); if (pTemp1 && pTemp1->isAlive() && pTemp2 && pTemp2->isAlive()) m_creature->ForcedDespawn(); @@ -132,10 +132,10 @@ struct MANGOS_DLL_DECL boss_sindragosaAI : public BSWScriptedAI doRemoveFromAll(SPELL_ICY_TOMB); DoScriptText(-1631422,m_creature); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_RIMEFANG))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_RIMEFANG)) if (!pTemp->isAlive()) pTemp->SetRespawnDelay(HOUR); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SPINESTALKER))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_SPINESTALKER)) if (!pTemp->isAlive()) pTemp->SetRespawnDelay(HOUR); } @@ -176,9 +176,9 @@ struct MANGOS_DLL_DECL boss_sindragosaAI : public BSWScriptedAI pInstance->SetData(TYPE_SINDRAGOSA, DONE); DoScriptText(-1631423,m_creature,killer); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_RIMEFANG))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_RIMEFANG)) pTemp->SetRespawnDelay(7*DAY); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SPINESTALKER))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_SPINESTALKER)) pTemp->SetRespawnDelay(7*DAY); } @@ -373,12 +373,12 @@ struct MANGOS_DLL_DECL mob_ice_tombAI : public BSWScriptedAI } ScriptedInstance* m_pInstance; - uint64 victimGUID; + ObjectGuid victimGUID; void Reset() { SetCombatMovement(false); - victimGUID = 0; + victimGUID.Clear(); m_creature->SetRespawnDelay(7*DAY); } @@ -388,12 +388,12 @@ struct MANGOS_DLL_DECL mob_ice_tombAI : public BSWScriptedAI { if (pWho->HasAura(SPELL_ICY_TOMB)) { - victimGUID = pWho->GetGUID(); + victimGUID = pWho->GetObjectGuid(); m_creature->SetInCombatWith(pWho); } else if (Unit* pTarget = doSelectRandomPlayer(SPELL_ICY_TOMB,true,3.0f)) { - victimGUID = pTarget->GetGUID(); + victimGUID = pTarget->GetObjectGuid(); m_creature->SetInCombatWith(pTarget); } @@ -550,7 +550,7 @@ struct MANGOS_DLL_DECL mob_rimefangAI : public BSWScriptedAI { if(!pInstance) return; if (pInstance->GetData(TYPE_SINDRAGOSA) != DONE) pInstance->SetData(TYPE_SINDRAGOSA, IN_PROGRESS); - pBrother = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SPINESTALKER)); + pBrother = pInstance->GetSingleCreatureFromStorage(NPC_SPINESTALKER); if (pBrother && !pBrother->isAlive()) pBrother->Respawn(); if (pBrother) pBrother->SetInCombatWithZone(); } @@ -641,7 +641,7 @@ struct MANGOS_DLL_DECL mob_spinestalkerAI : public BSWScriptedAI { if(!pInstance) return; if (pInstance->GetData(TYPE_SINDRAGOSA) != DONE) pInstance->SetData(TYPE_SINDRAGOSA, IN_PROGRESS); - pBrother = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_RIMEFANG)); + pBrother = pInstance->GetSingleCreatureFromStorage(NPC_RIMEFANG); if (pBrother && !pBrother->isAlive()) pBrother->Respawn(); if (pBrother) pBrother->SetInCombatWithZone(); } diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_the_lich_king.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_the_lich_king.cpp index c054c4b..0003f70 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_the_lich_king.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_the_lich_king.cpp @@ -133,7 +133,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI bool finalphase; Creature* pTirion; Creature* pFrostmourne; - std::list mobsGUIDList; + std::list mobsGUIDList; void Reset() { @@ -152,7 +152,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI pInstance->DoCloseDoor(pInstance->GetData64(GO_ICESHARD_3)); pInstance->DoCloseDoor(pInstance->GetData64(GO_ICESHARD_4)); if (oldflag) - if (GameObject* pGoFloor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM))) + if (GameObject* pGoFloor = pInstance->GetSingleGameObjectFromStorage(GO_ARTHAS_PLATFORM)) { pGoFloor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); pGoFloor->SetUInt32Value(GAMEOBJECT_BYTES_1,oldflag); @@ -238,7 +238,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI summoned->SetInCombatWith(pTarget); summoned->AddThreat(pTarget,100.0f); } - mobsGUIDList.push_back(summoned->GetGUID()); + mobsGUIDList.push_back(summoned->GetObjectGuid()); } void DespawnMobs() @@ -246,7 +246,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI if (mobsGUIDList.empty()) return; - for(std::list::iterator itr = mobsGUIDList.begin(); itr != mobsGUIDList.end(); ++itr) + for(std::list::iterator itr = mobsGUIDList.begin(); itr != mobsGUIDList.end(); ++itr) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr)) if (pTemp->isAlive()) @@ -359,10 +359,11 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI finalphase = true; doCast(SPELL_FURY_OF_FROSTMOURNE); pInstance->SetData(TYPE_EVENT,13020); - if (pTirion = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_TIRION))) { - m_creature->SetInCombatWith(pTirion); - pTirion->AddThreat(m_creature, 1000.0f); - } + if (pTirion = pInstance->GetSingleCreatureFromStorage(NPC_TIRION)) + { + m_creature->SetInCombatWith(pTirion); + pTirion->AddThreat(m_creature, 1000.0f); + } m_creature->SetInCombatWithZone(); break; case 13020: @@ -421,9 +422,9 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI pInstance->SetData(TYPE_EVENT,13290); stage = 13; if (pFrostmourne) pFrostmourne->ForcedDespawn(); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_FROSTMOURNE_TRIGGER))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_FROSTMOURNE_TRIGGER)) pTemp->ForcedDespawn(); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_FROSTMOURNE_HOLDER))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_FROSTMOURNE_HOLDER)) pTemp->ForcedDespawn(); SetCombatMovement(true); battlestarted = true; @@ -508,7 +509,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI pInstance->DoOpenDoor(pInstance->GetData64(GO_ICESHARD_2)); pInstance->DoOpenDoor(pInstance->GetData64(GO_ICESHARD_3)); pInstance->DoOpenDoor(pInstance->GetData64(GO_ICESHARD_4)); - if (GameObject* pGoFloor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM))) + if (GameObject* pGoFloor = pInstance->GetSingleGameObjectFromStorage(GO_ARTHAS_PLATFORM)) { pGoFloor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); oldflag = pGoFloor->GetUInt32Value(GAMEOBJECT_BYTES_1); @@ -562,7 +563,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI break; case 7: // Platform restore if (movementstarted) return; - if (GameObject* pGoFloor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM))) + if (GameObject* pGoFloor = pInstance->GetSingleGameObjectFromStorage(GO_ARTHAS_PLATFORM)) { pGoFloor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); pGoFloor->SetUInt32Value(GAMEOBJECT_BYTES_1,oldflag); @@ -597,7 +598,7 @@ struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI case 9: // Platform destruct if (timedQuery(SPELL_QUAKE, diff)) { - if (GameObject* pGoFloor = pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM))) + if (GameObject* pGoFloor = pInstance->GetSingleGameObjectFromStorage(GO_ARTHAS_PLATFORM)) { pGoFloor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); oldflag = pGoFloor->GetUInt32Value(GAMEOBJECT_BYTES_1); @@ -672,7 +673,7 @@ struct MANGOS_DLL_DECL boss_tirion_iccAI : public ScriptedAI uint32 nextEvent; uint32 nextPoint; bool movementstarted; - uint64 MenethilGUID; + ObjectGuid MenethilGUID; void EnterEvadeMode() { @@ -823,7 +824,7 @@ struct MANGOS_DLL_DECL boss_tirion_iccAI : public ScriptedAI UpdateTimer = 12000; { Creature* pMenethil = m_creature->SummonCreature(NPC_MENETHIL, m_creature->GetPositionX()+5, m_creature->GetPositionY()+5, m_creature->GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 5000); - MenethilGUID = pMenethil->GetGUID(); + MenethilGUID = pMenethil->GetObjectGuid(); } pInstance->SetData(TYPE_EVENT,13250); DoScriptText(-1631560, m_creature->GetMap()->GetCreature(MenethilGUID)); @@ -841,7 +842,7 @@ struct MANGOS_DLL_DECL boss_tirion_iccAI : public ScriptedAI case 13270: UpdateTimer = 6000; pInstance->SetData(TYPE_EVENT,13280); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_LICH_KING))) + if (Creature* pLichKing = pInstance->GetSingleCreatureFromStorage(NPC_LICH_KING)) { m_creature->SetInCombatWith(pLichKing); pLichKing->SetInCombatWith(m_creature); @@ -879,7 +880,7 @@ struct MANGOS_DLL_DECL boss_tirion_iccAI : public ScriptedAI UpdateTimer =90000; pInstance->SetData(TYPE_EVENT,14030); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_LICH_KING))) + if (Creature* pLichKing = pInstance->GetSingleCreatureFromStorage(NPC_LICH_KING)) pLichKing->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); doSendCinematic(); break; @@ -891,7 +892,7 @@ struct MANGOS_DLL_DECL boss_tirion_iccAI : public ScriptedAI if (Creature* pMenethil = m_creature->GetMap()->GetCreature(MenethilGUID)) if (pMenethil->isAlive()) pMenethil->ForcedDespawn(); - if (Creature* pLichKing = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_LICH_KING))) + if (Creature* pLichKing = pInstance->GetSingleCreatureFromStorage(NPC_LICH_KING)) pLichKing->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } pInstance->SetData(TYPE_EVENT,0); @@ -920,12 +921,12 @@ bool GossipHello_boss_tirion_icc(Player* pPlayer, Creature* pCreature) if (pInstance->GetData(TYPE_LICH_KING) != NOT_STARTED && pInstance->GetData(TYPE_LICH_KING) != FAIL ) { - pPlayer->PlayerTalkClass->SendGossipMenu(721002, pCreature->GetGUID()); + pPlayer->PlayerTalkClass->SendGossipMenu(721002, pCreature->GetObjectGuid()); return true; }; pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, -3631608, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - pPlayer->PlayerTalkClass->SendGossipMenu(721001, pCreature->GetGUID()); + pPlayer->PlayerTalkClass->SendGossipMenu(721001, pCreature->GetObjectGuid()); return true; }; diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_valithria_dreamwalker.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_valithria_dreamwalker.cpp index ff69277..bb22cff 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_valithria_dreamwalker.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_valithria_dreamwalker.cpp @@ -74,7 +74,7 @@ struct MANGOS_DLL_DECL boss_valithria_dreamwalkerAI : public BSWScriptedAI uint8 currentDoor; uint8 currentDoor2; int8 portalscount; - std::list mobsGUIDList; + std::list mobsGUIDList; uint32 speedK; Creature* dummyTarget; @@ -96,26 +96,26 @@ struct MANGOS_DLL_DECL boss_valithria_dreamwalkerAI : public BSWScriptedAI currentDoor = 0; currentDoor2 = 0; mobsGUIDList.clear(); - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_VALITHRIA_QUEST))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_VALITHRIA_QUEST)) if (pTemp->GetVisibility() == VISIBILITY_ON) pTemp->SetVisibility(VISIBILITY_OFF); doCast(SPELL_CORRUPTION); } - uint64 GetDoor(uint8 doornum) + uint32 GetDoor(uint8 doornum) { switch (doornum) { case 1: - return pInstance->GetData64(GO_VALITHRIA_DOOR_1); + return GO_VALITHRIA_DOOR_1; break; case 2: - return pInstance->GetData64(GO_VALITHRIA_DOOR_2); + return GO_VALITHRIA_DOOR_2; break; case 3: - return pInstance->GetData64(GO_VALITHRIA_DOOR_3); + return GO_VALITHRIA_DOOR_3; break; case 4: - return pInstance->GetData64(GO_VALITHRIA_DOOR_4); + return GO_VALITHRIA_DOOR_4; break; default: return 0; @@ -158,7 +158,7 @@ struct MANGOS_DLL_DECL boss_valithria_dreamwalkerAI : public BSWScriptedAI default: randommob = NPC_RISEN_ARCHMAGE; break; } if (Unit* pTemp = doSummon(randommob, SpawnLoc[door].x, SpawnLoc[door].y, SpawnLoc[door].z, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000)) - mobsGUIDList.push_back(pTemp->GetGUID()); + mobsGUIDList.push_back(pTemp->GetObjectGuid()); } } @@ -207,7 +207,7 @@ struct MANGOS_DLL_DECL boss_valithria_dreamwalkerAI : public BSWScriptedAI battlestarted = true; pInstance->SetData(TYPE_VALITHRIA, IN_PROGRESS); m_creature->SetHealth(m_creature->GetMaxHealth()/2.0f); - dummyTarget = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_COMBAT_TRIGGER)); + dummyTarget = pInstance->GetSingleCreatureFromStorage(NPC_COMBAT_TRIGGER); if (!dummyTarget) dummyTarget = m_creature->SummonCreature(NPC_COMBAT_TRIGGER, SpawnLoc[0].x, SpawnLoc[0].y, SpawnLoc[0].z, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 1000); if (!dummyTarget->isAlive()) @@ -257,7 +257,7 @@ struct MANGOS_DLL_DECL boss_valithria_dreamwalkerAI : public BSWScriptedAI if (mobsGUIDList.empty()) return; - for(std::list::iterator itr = mobsGUIDList.begin(); itr != mobsGUIDList.end(); ++itr) + for(std::list::iterator itr = mobsGUIDList.begin(); itr != mobsGUIDList.end(); ++itr) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr)) if (pTemp->isAlive()) @@ -346,7 +346,7 @@ struct MANGOS_DLL_DECL boss_valithria_dreamwalkerAI : public BSWScriptedAI return; break; case 9: - if (Creature* pTemp = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_VALITHRIA_QUEST))) + if (Creature* pTemp = pInstance->GetSingleCreatureFromStorage(NPC_VALITHRIA_QUEST)) { pTemp->SetPhaseMask(65535,true); if (pTemp->HasAura(SPELL_CORRUPTION)) diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_citadel.h b/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_citadel.h index 0975ec1..89b22bd 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_citadel.h +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_citadel.h @@ -175,7 +175,6 @@ class MANGOS_DLL_DECL instance_icecrown_spire : public BSWScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiType); const char* Save() { return strSaveData.c_str(); } void Load(const char* chrIn); @@ -189,86 +188,6 @@ class MANGOS_DLL_DECL instance_icecrown_spire : public BSWScriptedInstance //Creatures GUID uint32 m_auiEncounter[MAX_ENCOUNTERS+1]; - uint64 m_uiMarrogwarGUID; - uint64 m_uiDeathWhisperGUID; - uint64 m_uiSaurfangGUID; - uint64 m_uiRotfaceGUID; - uint64 m_uiFestergutGUID; - uint64 m_uiPutricideGUID; - uint64 m_uiTaldaramGUID; - uint64 m_uiValanarGUID; - uint64 m_uiKelesethGUID; - uint64 m_uiLanathelGUID; - uint64 m_uiLanathelintroGUID; - uint64 m_uiValithriaGUID; - uint64 m_uiValithriaQuestGUID; - uint64 m_uiSindragosaGUID; - uint64 m_uiLichKingGUID; - uint64 m_uiGasReleaseValveGUID; - uint64 m_uiBloodOrbCtrlGUID; - - uint64 m_uiRimefangGUID; - uint64 m_uiSpinestalkerGUID; - - uint64 m_uiStinkyGUID; - uint64 m_uiPreciousGUID; - - uint64 m_uidummyTargetGUID; - - uint64 m_uiIcewall1GUID; - uint64 m_uiIcewall2GUID; - uint64 m_uiSaurfangDoorGUID; - uint64 m_uiOratoryDoorGUID; - uint64 m_uiDeathWhisperElevatorGUID; - uint64 m_uiOrangePlagueGUID; - uint64 m_uiGreenPlagueGUID; - uint64 m_uiSDoorGreenGUID; - uint64 m_uiSDoorOrangeGUID; - uint64 m_uiSDoorCollisionGUID; - uint64 m_uiScientistDoorGUID; - uint64 m_uiCrimsonDoorGUID; - uint64 m_uiBloodwingDoorGUID; - uint64 m_uiCounsilDoor1GUID; - uint64 m_uiCounsilDoor2GUID; - uint64 m_uiGreenDragonDoor1GUID; - uint64 m_uiGreenDragonDoor2GUID; - uint64 m_uiFrostwingDoorGUID; - - uint64 m_uiValithriaDoor1GUID; - uint64 m_uiValithriaDoor2GUID; - uint64 m_uiValithriaDoor3GUID; - uint64 m_uiValithriaDoor4GUID; - - uint64 m_uiSindragosaDoor1GUID; - uint64 m_uiSindragosaDoor2GUID; - - uint64 m_uiIceShard1GUID; - uint64 m_uiIceShard2GUID; - uint64 m_uiIceShard3GUID; - uint64 m_uiIceShard4GUID; - - uint64 m_uiFrostyWindGUID; - uint64 m_uiFrostyEdgeGUID; - uint64 m_uiSnowEdgeGUID; - uint64 m_uiArthasPlatformGUID; - uint64 m_uiArthasPrecipiceGUID; - - uint64 m_uiFrostmourneGUID; - uint64 m_uiFrostmourneTriggerGUID; - uint64 m_uiFrostmourneHolderGUID; - - uint64 m_uiSaurfangCacheGUID; - uint64 m_uiGunshipArmoryAGUID; - uint64 m_uiGunshipArmoryHGUID; - uint64 m_uiValitriaCacheGUID; - - uint64 m_uiGunshipArmoryH_ID; - uint64 m_uiGunshipArmoryA_ID; - - uint64 m_uiMarrogarDoor; - uint64 m_uiBloodPrinceDoor; - uint64 m_uiIceCrownGrate; - uint64 m_uiSindragosaEntrance; uint32 m_uiCouncilInvocation; @@ -278,7 +197,10 @@ class MANGOS_DLL_DECL instance_icecrown_spire : public BSWScriptedInstance uint32 m_uiStinkystate; uint32 m_uiPreciousstate; - + uint32 m_uiGunshipArmoryA_ID; + uint32 m_uiGunshipArmoryH_ID; + uint32 m_uiValithriaCache; + uint32 m_uiSaurfangCache; }; enum AchievementCriteriaIds diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_teleport.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_teleport.cpp index 895d2eb..7d9b765 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_teleport.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_teleport.cpp @@ -77,7 +77,7 @@ bool GOGossipHello_go_icecrown_teleporter(Player *pPlayer, GameObject* pGo) if (PortalLoc[i].active == true && (PortalLoc[i].state == true || pInstance->GetData(PortalLoc[i].encounter) == DONE || pPlayer->isGameMaster())) pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_TAXI, PortalLoc[i].textNum, GOSSIP_SENDER_MAIN, i); }; - pPlayer->SEND_GOSSIP_MENU(TELEPORT_GOSSIP_MESSAGE, pGo->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(TELEPORT_GOSSIP_MESSAGE, pGo->GetObjectGuid()); return true; } @@ -89,9 +89,9 @@ bool GOHello_go_plague_sigil(Player *player, GameObject* pGo) if (pInstance->GetData(TYPE_FESTERGUT) == DONE && pInstance->GetData(TYPE_ROTFACE) == DONE) { - pInstance->DoOpenDoor(pInstance->GetData64(GO_SCIENTIST_DOOR_ORANGE)); - pInstance->DoOpenDoor(pInstance->GetData64(GO_SCIENTIST_DOOR_GREEN)); - pInstance->DoOpenDoor(pInstance->GetData64(GO_SCIENTIST_DOOR_COLLISION)); + pInstance->DoOpenDoor(GO_SCIENTIST_DOOR_ORANGE); + pInstance->DoOpenDoor(GO_SCIENTIST_DOOR_GREEN); + pInstance->DoOpenDoor(GO_SCIENTIST_DOOR_COLLISION); }; return true; } @@ -102,7 +102,7 @@ bool GOHello_go_bloodwing_sigil(Player *player, GameObject* pGo) if(!pInstance) return false; if (pInstance->GetData(TYPE_SAURFANG) == DONE) - pInstance->DoOpenDoor(pInstance->GetData64(GO_BLOODWING_DOOR)); + pInstance->DoOpenDoor(GO_BLOODWING_DOOR); return true; } @@ -113,7 +113,7 @@ bool GOHello_go_frostwing_sigil(Player *player, GameObject* pGo) if(!pInstance) return false; if (pInstance->GetData(TYPE_SAURFANG) == DONE) - pInstance->DoOpenDoor(pInstance->GetData64(GO_FROSTWING_DOOR)); + pInstance->DoOpenDoor(GO_FROSTWING_DOOR); return true; } diff --git a/scripts/northrend/icecrown_citadel/icecrown_citadel/instance_icecrown_citadel.cpp b/scripts/northrend/icecrown_citadel/icecrown_citadel/instance_icecrown_citadel.cpp index 63612b6..351e29e 100644 --- a/scripts/northrend/icecrown_citadel/icecrown_citadel/instance_icecrown_citadel.cpp +++ b/scripts/northrend/icecrown_citadel/icecrown_citadel/instance_icecrown_citadel.cpp @@ -39,35 +39,43 @@ static Locations SpawnLoc[]= void instance_icecrown_spire::OpenAllDoors() { - if (m_auiEncounter[1] == DONE) { - DoOpenDoor(m_uiIcewall1GUID); - DoOpenDoor(m_uiIcewall2GUID); - DoOpenDoor( m_uiOratoryDoorGUID); - }; - if (m_auiEncounter[2] == DONE) { - if (GameObject* pGO = instance->GetGameObject(m_uiDeathWhisperElevatorGUID)) - { - pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0); - pGO->SetGoState(GO_STATE_READY); - } - }; - if (m_auiEncounter[4] == DONE) { - DoOpenDoor(m_uiSaurfangDoorGUID); - DoOpenDoor(m_uiBloodwingDoorGUID); - DoOpenDoor(m_uiFrostwingDoorGUID); - }; - if (m_auiEncounter[5] == DONE) DoOpenDoor(m_uiSDoorOrangeGUID); - if (m_auiEncounter[6] == DONE) DoOpenDoor(m_uiSDoorGreenGUID); - if (m_auiEncounter[6] == DONE && m_auiEncounter[5] == DONE) DoOpenDoor(m_uiSDoorCollisionGUID); - if (m_auiEncounter[8] == DONE) { - DoOpenDoor(m_uiCounsilDoor1GUID); - DoOpenDoor(m_uiCounsilDoor2GUID); - }; + if (m_auiEncounter[1] == DONE) + { + DoOpenDoor(GO_ICEWALL_1); + DoOpenDoor(GO_ICEWALL_2); + DoOpenDoor(GO_MARROWGAR_DOOR); + DoOpenDoor(GO_ORATORY_DOOR); + }; + if (m_auiEncounter[2] == DONE) + { + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_DEATHWHISPER_ELEVATOR)) + { + pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0); + pGO->SetGoState(GO_STATE_READY); + } + }; + if (m_auiEncounter[4] == DONE) + { + DoOpenDoor(GO_SAURFANG_DOOR); + DoOpenDoor(GO_BLOODWING_DOOR); + DoOpenDoor(GO_FROSTWING_DOOR); + }; + if (m_auiEncounter[5] == DONE) + DoOpenDoor(GO_SCIENTIST_DOOR_ORANGE); + if (m_auiEncounter[6] == DONE) + DoOpenDoor(GO_SCIENTIST_DOOR_GREEN); + if (m_auiEncounter[6] == DONE && m_auiEncounter[5] == DONE) + DoOpenDoor(GO_SCIENTIST_DOOR_COLLISION); + if (m_auiEncounter[8] == DONE) + { + DoOpenDoor(GO_COUNCIL_DOOR_1); + DoOpenDoor(GO_COUNCIL_DOOR_2); + }; if (m_auiEncounter[10] == DONE) { - DoOpenDoor(m_uiValithriaDoor2GUID); - DoOpenDoor(m_uiSindragosaDoor2GUID); - DoOpenDoor(m_uiSindragosaDoor1GUID); + DoOpenDoor(GO_GREEN_DRAGON_DOOR_2); + DoOpenDoor(GO_SINDRAGOSA_DOOR_1); + DoOpenDoor(GO_SINDRAGOSA_DOOR_2); }; } @@ -79,18 +87,6 @@ static Locations SpawnLoc[]= m_auiEncounter[0] = 0; - m_uiMarrogwarGUID = 0; - m_uiDeathWhisperGUID = 0; - m_uiSaurfangGUID = 0; - m_uiSaurfangCacheGUID = 0; - m_uiGunshipArmoryAGUID = 0; - m_uiGunshipArmoryHGUID = 0; - m_uiIcewall1GUID = 0; - m_uiIcewall2GUID = 0; - m_uiSDoorOrangeGUID = 0; - m_uiSDoorGreenGUID = 0; - m_uiBloodwingDoorGUID = 0; - m_uiSDoorCollisionGUID = 0; m_auiEvent = 0; m_auiEventTimer = 1000; m_uiCouncilInvocation = 0; @@ -98,28 +94,35 @@ static Locations SpawnLoc[]= m_uiStinkystate = NOT_STARTED; m_uiPreciousstate = NOT_STARTED; - switch (Difficulty) { - case RAID_DIFFICULTY_10MAN_NORMAL: - m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_10; - m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_10; - break; - case RAID_DIFFICULTY_10MAN_HEROIC: - m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_10H; - m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_10H; - break; - case RAID_DIFFICULTY_25MAN_NORMAL: - m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_25; - m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_25; - break; - case RAID_DIFFICULTY_25MAN_HEROIC: - m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_25H; - m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_25H; - break; - default: - m_uiGunshipArmoryH_ID = 0; - m_uiGunshipArmoryA_ID = 0; - break; - }; + switch (Difficulty) + { + case RAID_DIFFICULTY_10MAN_NORMAL: + m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_10; + m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_10; + m_uiValithriaCache = GO_DREAMWALKER_CACHE_10; + m_uiSaurfangCache = GO_SAURFANG_CACHE_10; + break; + case RAID_DIFFICULTY_10MAN_HEROIC: + m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_10H; + m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_10H; + m_uiValithriaCache = GO_DREAMWALKER_CACHE_10_H; + m_uiSaurfangCache = GO_SAURFANG_CACHE_10_H; + break; + case RAID_DIFFICULTY_25MAN_NORMAL: + m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_25; + m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_25; + m_uiValithriaCache = GO_DREAMWALKER_CACHE_25; + m_uiSaurfangCache = GO_SAURFANG_CACHE_25; + break; + case RAID_DIFFICULTY_25MAN_HEROIC: + m_uiGunshipArmoryH_ID = GO_GUNSHIP_ARMORY_H_25H; + m_uiGunshipArmoryA_ID = GO_GUNSHIP_ARMORY_A_25H; + m_uiValithriaCache = GO_DREAMWALKER_CACHE_25_H; + m_uiSaurfangCache = GO_SAURFANG_CACHE_25_H; + break; + default: + break; + }; } bool instance_icecrown_spire::IsEncounterInProgress() @@ -134,13 +137,13 @@ static Locations SpawnLoc[]= { OpenAllDoors(); - enum PhaseControl - { - HORDE_CONTROL_PHASE_SHIFT_1 = 55773, - HORDE_CONTROL_PHASE_SHIFT_2 = 60028, - ALLIANCE_CONTROL_PHASE_SHIFT_1 = 55774, - ALLIANCE_CONTROL_PHASE_SHIFT_2 = 60027, - }; + enum PhaseControl + { + HORDE_CONTROL_PHASE_SHIFT_1 = 55773, + HORDE_CONTROL_PHASE_SHIFT_2 = 60028, + ALLIANCE_CONTROL_PHASE_SHIFT_1 = 55774, + ALLIANCE_CONTROL_PHASE_SHIFT_2 = 60027, + }; /* if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GROUP)) return; @@ -166,74 +169,30 @@ static Locations SpawnLoc[]= switch(pCreature->GetEntry()) { case NPC_LORD_MARROWGAR: - m_uiMarrogwarGUID = pCreature->GetGUID(); - break; case NPC_LADY_DEATHWHISPER: - m_uiDeathWhisperGUID = pCreature->GetGUID(); - break; case NPC_DEATHBRINGER_SAURFANG: - m_uiSaurfangGUID = pCreature->GetGUID(); - break; case NPC_FESTERGUT: - m_uiFestergutGUID = pCreature->GetGUID(); - break; case NPC_ROTFACE: - m_uiRotfaceGUID = pCreature->GetGUID(); - break; case NPC_PROFESSOR_PUTRICIDE: - m_uiPutricideGUID = pCreature->GetGUID(); - break; case NPC_TALDARAM: - m_uiTaldaramGUID = pCreature->GetGUID(); - break; case NPC_VALANAR: - m_uiValanarGUID = pCreature->GetGUID(); - break; case NPC_KELESETH: - m_uiKelesethGUID = pCreature->GetGUID(); - break; case NPC_LANATHEL: - m_uiLanathelGUID = pCreature->GetGUID(); - break; case NPC_LANATHEL_INTRO: - m_uiLanathelintroGUID = pCreature->GetGUID(); - break; case NPC_VALITHRIA: - m_uiValithriaGUID = pCreature->GetGUID(); - break; case NPC_VALITHRIA_QUEST: - m_uiValithriaQuestGUID = pCreature->GetGUID(); - break; case NPC_SINDRAGOSA: - m_uiSindragosaGUID = pCreature->GetGUID(); - break; case NPC_LICH_KING: - m_uiLichKingGUID = pCreature->GetGUID(); - break; case NPC_RIMEFANG: - m_uiRimefangGUID = pCreature->GetGUID(); - break; case NPC_SPINESTALKER: - m_uiSpinestalkerGUID = pCreature->GetGUID(); - break; case NPC_STINKY: - m_uiStinkyGUID = pCreature->GetGUID(); - break; case NPC_PRECIOUS: - m_uiPreciousGUID = pCreature->GetGUID(); - break; case NPC_COMBAT_TRIGGER: - m_uidummyTargetGUID = pCreature->GetGUID(); - break; case NPC_FROSTMOURNE_TRIGGER: - m_uiFrostmourneTriggerGUID = pCreature->GetGUID(); - break; case NPC_FROSTMOURNE_HOLDER: - m_uiFrostmourneHolderGUID = pCreature->GetGUID(); - break; case NPC_BLOOD_ORB_CONTROL: - m_uiBloodOrbCtrlGUID = pCreature->GetGUID(); - break; + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -242,177 +201,62 @@ static Locations SpawnLoc[]= switch(pGo->GetEntry()) { case GO_ICEWALL_1: - m_uiIcewall1GUID = pGo->GetGUID(); - break; case GO_ICEWALL_2: - m_uiIcewall2GUID = pGo->GetGUID(); - break; case GO_ORATORY_DOOR: - m_uiOratoryDoorGUID = pGo->GetGUID(); - break; case GO_DEATHWHISPER_ELEVATOR: - m_uiDeathWhisperElevatorGUID = pGo->GetGUID(); - break; case GO_SAURFANG_DOOR: - m_uiSaurfangDoorGUID = pGo->GetGUID(); - break; case GO_ORANGE_PLAGUE: - m_uiOrangePlagueGUID = pGo->GetGUID(); - break; case GO_GREEN_PLAGUE: - m_uiGreenPlagueGUID = pGo->GetGUID(); - break; case GO_SCIENTIST_DOOR_GREEN: - m_uiSDoorGreenGUID = pGo->GetGUID(); - break; case GO_SCIENTIST_DOOR_ORANGE: - m_uiSDoorOrangeGUID = pGo->GetGUID(); - break; case GO_SCIENTIST_DOOR_COLLISION: - m_uiSDoorCollisionGUID = pGo->GetGUID(); - break; case GO_SCIENTIST_DOOR: - m_uiScientistDoorGUID = pGo->GetGUID(); - break; case GO_CRIMSON_HALL_DOOR: - m_uiCrimsonDoorGUID = pGo->GetGUID(); - break; case GO_BLOODWING_DOOR: - m_uiBloodwingDoorGUID = pGo->GetGUID(); - break; case GO_COUNCIL_DOOR_1: - m_uiCounsilDoor1GUID = pGo->GetGUID(); - break; case GO_COUNCIL_DOOR_2: - m_uiCounsilDoor2GUID = pGo->GetGUID(); - break; case GO_FROSTWING_DOOR: - m_uiFrostwingDoorGUID = pGo->GetGUID(); - break; case GO_GREEN_DRAGON_DOOR_1: - m_uiGreenDragonDoor1GUID = pGo->GetGUID(); - break; case GO_GREEN_DRAGON_DOOR_2: - m_uiGreenDragonDoor2GUID = pGo->GetGUID(); - break; case GO_VALITHRIA_DOOR_1: - m_uiValithriaDoor1GUID = pGo->GetGUID(); - break; case GO_VALITHRIA_DOOR_2: - m_uiValithriaDoor2GUID = pGo->GetGUID(); - break; case GO_VALITHRIA_DOOR_3: - m_uiValithriaDoor3GUID = pGo->GetGUID(); - break; case GO_VALITHRIA_DOOR_4: - m_uiValithriaDoor4GUID = pGo->GetGUID(); - break; case GO_SINDRAGOSA_DOOR_1: - m_uiSindragosaDoor1GUID = pGo->GetGUID(); - break; case GO_SINDRAGOSA_DOOR_2: - m_uiSindragosaDoor2GUID = pGo->GetGUID(); - break; case GO_SAURFANG_CACHE_10: - if(Difficulty == RAID_DIFFICULTY_10MAN_NORMAL) - m_uiSaurfangCacheGUID = pGo->GetGUID(); - break; case GO_SAURFANG_CACHE_25: - if(Difficulty == RAID_DIFFICULTY_25MAN_NORMAL) - m_uiSaurfangCacheGUID = pGo->GetGUID(); - break; case GO_SAURFANG_CACHE_10_H: - if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) - m_uiSaurfangCacheGUID = pGo->GetGUID(); - break; case GO_SAURFANG_CACHE_25_H: - if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC) - m_uiSaurfangCacheGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_A_10: - if(Difficulty == RAID_DIFFICULTY_10MAN_NORMAL) - m_uiGunshipArmoryAGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_A_25: - if(Difficulty == RAID_DIFFICULTY_25MAN_NORMAL) - m_uiGunshipArmoryAGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_A_10H: - if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) - m_uiGunshipArmoryAGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_A_25H: - if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC) - m_uiGunshipArmoryAGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_H_10: - if(Difficulty == RAID_DIFFICULTY_10MAN_NORMAL) - m_uiGunshipArmoryHGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_H_25: - if(Difficulty == RAID_DIFFICULTY_25MAN_NORMAL) - m_uiGunshipArmoryHGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_H_10H: - if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) - m_uiGunshipArmoryHGUID = pGo->GetGUID(); - break; case GO_GUNSHIP_ARMORY_H_25H: - if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC) - m_uiGunshipArmoryHGUID = pGo->GetGUID(); - break; case GO_DREAMWALKER_CACHE_10: - if(Difficulty == RAID_DIFFICULTY_10MAN_NORMAL) - m_uiValitriaCacheGUID = pGo->GetGUID(); - break; case GO_DREAMWALKER_CACHE_25: - if(Difficulty == RAID_DIFFICULTY_25MAN_NORMAL) - m_uiValitriaCacheGUID = pGo->GetGUID(); - break; case GO_DREAMWALKER_CACHE_10_H: - if(Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) - m_uiValitriaCacheGUID = pGo->GetGUID(); - break; case GO_DREAMWALKER_CACHE_25_H: - if(Difficulty == RAID_DIFFICULTY_25MAN_HEROIC) - m_uiValitriaCacheGUID = pGo->GetGUID(); - break; case GO_ICESHARD_1: - m_uiIceShard1GUID = pGo->GetGUID(); - break; case GO_ICESHARD_2: - m_uiIceShard2GUID = pGo->GetGUID(); - break; case GO_ICESHARD_3: - m_uiIceShard3GUID = pGo->GetGUID(); - break; case GO_ICESHARD_4: - m_uiIceShard4GUID = pGo->GetGUID(); - break; case GO_FROSTY_WIND: - m_uiFrostyWindGUID = pGo->GetGUID(); - break; case GO_FROSTY_EDGE: - m_uiFrostyEdgeGUID = pGo->GetGUID(); - break; case GO_SNOW_EDGE: - m_uiSnowEdgeGUID = pGo->GetGUID(); - break; case GO_ARTHAS_PLATFORM: - m_uiArthasPlatformGUID = pGo->GetGUID(); - break; case GO_ARTHAS_PRECIPICE: - m_uiArthasPrecipiceGUID = pGo->GetGUID(); - break; case GO_GAS_RELEASE_VALVE: - m_uiGasReleaseValveGUID = pGo->GetGUID(); - break; - case GO_MARROWGAR_DOOR: m_uiMarrogarDoor = pGo->GetGUID(); break; - case GO_BLOODPRINCE_DOOR: m_uiBloodPrinceDoor = pGo->GetGUID(); break; - case GO_ICECROWN_GRATE: m_uiIceCrownGrate = pGo->GetGUID(); break; - case GO_SINDRAGOSA_ENTRANCE: m_uiSindragosaEntrance = pGo->GetGUID(); break; - } - OpenAllDoors(); + case GO_MARROWGAR_DOOR: + case GO_BLOODPRINCE_DOOR: + case GO_ICECROWN_GRATE: + case GO_SINDRAGOSA_ENTRANCE: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; + } } void instance_icecrown_spire::SetData(uint32 uiType, uint32 uiData) @@ -424,25 +268,26 @@ static Locations SpawnLoc[]= case TYPE_MARROWGAR: m_auiEncounter[TYPE_MARROWGAR] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiMarrogarDoor); - else DoOpenDoor(m_uiMarrogarDoor); + DoCloseDoor(GO_MARROWGAR_DOOR); + else DoOpenDoor(GO_MARROWGAR_DOOR); if (uiData == DONE) { - DoOpenDoor(m_uiIcewall1GUID); - DoOpenDoor(m_uiIcewall2GUID); - DoOpenDoor(m_uiOratoryDoorGUID); + DoOpenDoor(GO_ICEWALL_1); + DoOpenDoor(GO_ICEWALL_2); + DoOpenDoor(GO_ORATORY_DOOR); } break; case TYPE_DEATHWHISPER: m_auiEncounter[TYPE_DEATHWHISPER] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiOratoryDoorGUID); - else DoOpenDoor(m_uiOratoryDoorGUID); + DoCloseDoor(GO_ORATORY_DOOR); + else + DoOpenDoor(GO_ORATORY_DOOR); if (uiData == DONE) { - if (GameObject* pGO = instance->GetGameObject(m_uiDeathWhisperElevatorGUID)) + if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_DEATHWHISPER_ELEVATOR)) { pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGO->SetGoState(GO_STATE_READY); @@ -450,73 +295,77 @@ static Locations SpawnLoc[]= } break; case TYPE_FLIGHT_WAR: - if (uiData == DONE && m_auiEncounter[TYPE_FLIGHT_WAR] != DONE ) { - if (GameObject* pChest = instance->GetGameObject(m_uiGunshipArmoryAGUID)) - if (pChest && !pChest->isSpawned()) { - pChest->SetRespawnTime(7*DAY); - }; - - if (GameObject* pChest = instance->GetGameObject(m_uiGunshipArmoryHGUID)) - if (pChest && !pChest->isSpawned()) { - pChest->SetRespawnTime(7*DAY); - }; - }; + if (uiData == DONE && m_auiEncounter[TYPE_FLIGHT_WAR] != DONE ) + { + if (GameObject* pChest = GetSingleGameObjectFromStorage(m_uiGunshipArmoryA_ID)) + if (pChest && !pChest->isSpawned()) + { + pChest->SetRespawnTime(7*DAY); + }; + + if (GameObject* pChest = GetSingleGameObjectFromStorage(m_uiGunshipArmoryH_ID)) + if (pChest && !pChest->isSpawned()) + { + pChest->SetRespawnTime(7*DAY); + }; + }; m_auiEncounter[3] = uiData; break; case TYPE_SAURFANG: m_auiEncounter[TYPE_SAURFANG] = uiData; if (uiData == DONE) { - DoOpenDoor(m_uiSaurfangDoorGUID); - DoOpenDoor(m_uiBloodwingDoorGUID); - DoOpenDoor(m_uiFrostwingDoorGUID); + DoOpenDoor(GO_SAURFANG_DOOR); + DoOpenDoor(GO_BLOODWING_DOOR); + DoOpenDoor(GO_FROSTWING_DOOR); - if (GameObject* pChest = instance->GetGameObject(m_uiSaurfangCacheGUID)) - if (pChest && !pChest->isSpawned()) - { - pChest->SetRespawnTime(7*DAY); - }; + if (GameObject* pChest = GetSingleGameObjectFromStorage(m_uiSaurfangCache)) + if (pChest && !pChest->isSpawned()) + { + pChest->SetRespawnTime(7*DAY); + }; }; break; case TYPE_FESTERGUT: m_auiEncounter[TYPE_FESTERGUT] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiOrangePlagueGUID); - else DoOpenDoor(m_uiOrangePlagueGUID); + DoCloseDoor(GO_ORANGE_PLAGUE); + else + DoOpenDoor(GO_ORANGE_PLAGUE); if (uiData == DONE) { - DoOpenDoor(m_uiSDoorOrangeGUID); + DoOpenDoor(GO_ORANGE_PLAGUE); if (m_auiEncounter[TYPE_ROTFACE] == DONE) { - DoOpenDoor(m_uiSDoorCollisionGUID); - DoOpenDoor(m_uiGreenPlagueGUID); + DoOpenDoor(GO_SCIENTIST_DOOR_COLLISION); + DoOpenDoor(GO_SCIENTIST_DOOR_GREEN); } } break; case TYPE_ROTFACE: m_auiEncounter[TYPE_ROTFACE] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiGreenPlagueGUID); + DoCloseDoor(GO_GREEN_PLAGUE); else - DoOpenDoor(m_uiGreenPlagueGUID); + DoOpenDoor(GO_GREEN_PLAGUE); if (uiData == DONE) { - DoOpenDoor(m_uiSDoorGreenGUID); + DoOpenDoor(GO_SCIENTIST_DOOR_GREEN); if (m_auiEncounter[TYPE_FESTERGUT] == DONE) { - DoOpenDoor(m_uiSDoorOrangeGUID); - DoOpenDoor(m_uiSDoorCollisionGUID); + DoOpenDoor(GO_SCIENTIST_DOOR_ORANGE); + DoOpenDoor(GO_SCIENTIST_DOOR_COLLISION); } } break; case TYPE_PUTRICIDE: m_auiEncounter[TYPE_PUTRICIDE] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiScientistDoorGUID); + DoCloseDoor(GO_SCIENTIST_DOOR); else - DoOpenDoor(m_uiScientistDoorGUID); + DoOpenDoor(GO_SCIENTIST_DOOR); if (uiData == DONE) { if (m_auiEncounter[TYPE_SINDRAGOSA] == DONE @@ -528,26 +377,26 @@ static Locations SpawnLoc[]= m_auiEncounter[TYPE_BLOOD_COUNCIL] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiCrimsonDoorGUID); + DoCloseDoor(GO_CRIMSON_HALL_DOOR); else - DoOpenDoor(m_uiCrimsonDoorGUID); + DoOpenDoor(GO_CRIMSON_HALL_DOOR); if (uiData == DONE) { - DoOpenDoor(m_uiCounsilDoor1GUID); - DoOpenDoor(m_uiCounsilDoor2GUID); + DoOpenDoor(GO_COUNCIL_DOOR_1); + DoOpenDoor(GO_COUNCIL_DOOR_2); } break; case TYPE_LANATHEL: m_auiEncounter[TYPE_LANATHEL] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiBloodPrinceDoor); - else DoOpenDoor(m_uiBloodPrinceDoor); + DoCloseDoor(GO_BLOODPRINCE_DOOR); + else DoOpenDoor(GO_BLOODPRINCE_DOOR); if (uiData == DONE) { - DoOpenDoor(m_uiIceCrownGrate); + DoOpenDoor(GO_ICECROWN_GRATE); if (m_auiEncounter[TYPE_PUTRICIDE] == DONE && m_auiEncounter[TYPE_SINDRAGOSA] == DONE) @@ -558,16 +407,16 @@ static Locations SpawnLoc[]= m_auiEncounter[TYPE_VALITHRIA] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiGreenDragonDoor1GUID); + DoCloseDoor(GO_GREEN_DRAGON_DOOR_1); else - DoOpenDoor(m_uiGreenDragonDoor1GUID); + DoOpenDoor(GO_GREEN_DRAGON_DOOR_1); if (uiData == DONE) { - DoOpenDoor(m_uiGreenDragonDoor2GUID); - DoOpenDoor(m_uiSindragosaDoor1GUID); - DoOpenDoor(m_uiSindragosaDoor2GUID); - if (GameObject* pChest = instance->GetGameObject(m_uiValitriaCacheGUID)) + DoOpenDoor(GO_GREEN_DRAGON_DOOR_2); + DoOpenDoor(GO_SINDRAGOSA_DOOR_1); + DoOpenDoor(GO_SINDRAGOSA_DOOR_2); + if (GameObject* pChest = GetSingleGameObjectFromStorage( m_uiValithriaCache)) if (pChest && !pChest->isSpawned()) { pChest->SetRespawnTime(7*DAY); @@ -578,9 +427,9 @@ static Locations SpawnLoc[]= m_auiEncounter[TYPE_SINDRAGOSA] = uiData; if (uiData == IN_PROGRESS) - DoCloseDoor(m_uiSindragosaEntrance); + DoCloseDoor(GO_SINDRAGOSA_ENTRANCE); else - DoOpenDoor(m_uiSindragosaEntrance); + DoOpenDoor(GO_SINDRAGOSA_ENTRANCE); if (uiData == DONE) { @@ -752,60 +601,6 @@ static Locations SpawnLoc[]= return 0; } - uint64 instance_icecrown_spire::GetData64(uint32 uiData) - { - switch(uiData) - { - case NPC_LORD_MARROWGAR: return m_uiMarrogwarGUID; - case NPC_LADY_DEATHWHISPER: return m_uiDeathWhisperGUID; - case NPC_DEATHBRINGER_SAURFANG: return m_uiSaurfangGUID; - case NPC_FESTERGUT: return m_uiFestergutGUID; - case NPC_ROTFACE: return m_uiRotfaceGUID; - case NPC_PROFESSOR_PUTRICIDE: return m_uiPutricideGUID; - case NPC_TALDARAM: return m_uiTaldaramGUID; - case NPC_VALANAR: return m_uiValanarGUID; - case NPC_KELESETH: return m_uiKelesethGUID; - case NPC_LANATHEL: return m_uiLanathelGUID; - case NPC_LANATHEL_INTRO: return m_uiLanathelintroGUID; - case NPC_VALITHRIA: return m_uiValithriaGUID; - case NPC_VALITHRIA_QUEST: return m_uiValithriaQuestGUID; - case NPC_SINDRAGOSA: return m_uiSindragosaGUID; - case NPC_LICH_KING: return m_uiLichKingGUID; - case NPC_RIMEFANG: return m_uiRimefangGUID; - case NPC_SPINESTALKER: return m_uiSpinestalkerGUID; - case NPC_STINKY: return m_uiStinkyGUID; - case NPC_PRECIOUS: return m_uiPreciousGUID; - case GO_SCIENTIST_DOOR_ORANGE: return m_uiSDoorOrangeGUID; - case GO_SCIENTIST_DOOR_GREEN: return m_uiSDoorGreenGUID; - case GO_SCIENTIST_DOOR_COLLISION: return m_uiSDoorCollisionGUID; - case GO_BLOODWING_DOOR: return m_uiBloodwingDoorGUID; - case GO_FROSTWING_DOOR: return m_uiFrostwingDoorGUID; - case GO_VALITHRIA_DOOR_1: return m_uiValithriaDoor1GUID; - case GO_VALITHRIA_DOOR_2: return m_uiValithriaDoor2GUID; - case GO_VALITHRIA_DOOR_3: return m_uiValithriaDoor3GUID; - case GO_VALITHRIA_DOOR_4: return m_uiValithriaDoor4GUID; - case GO_ICESHARD_1: return m_uiIceShard1GUID; - case GO_ICESHARD_2: return m_uiIceShard2GUID; - case GO_ICESHARD_3: return m_uiIceShard3GUID; - case GO_ICESHARD_4: return m_uiIceShard4GUID; - case GO_FROSTY_WIND: return m_uiFrostyWindGUID; - case GO_FROSTY_EDGE: return m_uiFrostyEdgeGUID; - case GO_SNOW_EDGE: return m_uiSnowEdgeGUID; - case GO_ARTHAS_PLATFORM: return m_uiArthasPlatformGUID; - case GO_ARTHAS_PRECIPICE: return m_uiArthasPrecipiceGUID; - case NPC_FROSTMOURNE_TRIGGER: return m_uiFrostmourneTriggerGUID; - case NPC_FROSTMOURNE_HOLDER: return m_uiFrostmourneHolderGUID; - case NPC_COMBAT_TRIGGER: return m_uidummyTargetGUID; - case GO_GAS_RELEASE_VALVE: return m_uiGasReleaseValveGUID; - case NPC_BLOOD_ORB_CONTROL: return m_uiBloodOrbCtrlGUID; - case GO_MARROWGAR_DOOR: return m_uiMarrogarDoor; - case GO_BLOODPRINCE_DOOR: return m_uiBloodPrinceDoor; - case GO_ICECROWN_GRATE: return m_uiIceCrownGrate; - case GO_SINDRAGOSA_ENTRANCE: return m_uiSindragosaEntrance; - } - return 0; - } - void instance_icecrown_spire::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp b/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp index 17c352f..14cac2c 100644 --- a/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp +++ b/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp @@ -241,7 +241,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI uint32 m_uiSpeechTimer; uint32 m_uiPortalNeedResTimer; uint8 m_uiVortexPhase; - std::list m_lSparkPortalGUIDList; + std::list m_lSparkPortalGUIDList; uint32 m_uiTimer; uint32 m_uiEnrageTimer; @@ -257,7 +257,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI uint32 m_uiCheckTimer; uint32 m_uiMovingSteps; - uint64 m_uiTargetSparkPortalGUID; + ObjectGuid m_uiTargetSparkPortalGUID; uint8 m_uiWP; bool m_bReadyForWPMove; @@ -288,7 +288,6 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI m_uiSurgeOfPowerTimer = 8000; m_uiCheckTimer = 1000; - m_uiTargetSparkPortalGUID = 0; m_uiWP = 0; m_uiSpeechCount = 0; m_uiSpeechTimer = 15000; @@ -308,7 +307,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI DespawnCreatures(NPC_STATIC_FIELD); if (!m_lSparkPortalGUIDList.empty()) - for (std::list::iterator itr = m_lSparkPortalGUIDList.begin(); itr != m_lSparkPortalGUIDList.end(); ++itr) + for (std::list::iterator itr = m_lSparkPortalGUIDList.begin(); itr != m_lSparkPortalGUIDList.end(); ++itr) if (Creature* pSparkPortal = m_creature->GetMap()->GetCreature(*itr)) pSparkPortal->Respawn(); @@ -326,7 +325,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI if (!lSparkPortalList.empty()) for (std::list::iterator itr = lSparkPortalList.begin(); itr != lSparkPortalList.end(); ++itr) if (*itr) - m_lSparkPortalGUIDList.push_back((*itr)->GetGUID()); + m_lSparkPortalGUIDList.push_back((*itr)->GetObjectGuid()); if (m_pInstance) m_pInstance->SetData(TYPE_MALYGOS, IN_PROGRESS); @@ -375,7 +374,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI if (pUnit->GetEntry() == NPC_ARCANE_OVERLOAD && pSpell->Id == SPELL_ARCANE_BOMB_MISSILE) { pUnit->CastSpell(pUnit, SPELL_ARCANE_BOMB_DAMAGE, true); - pUnit->CastSpell(pUnit, SPELL_ARCANE_OVERLOAD, false, 0, 0, m_creature->GetGUID()); + pUnit->CastSpell(pUnit, SPELL_ARCANE_OVERLOAD, false, 0, 0, m_creature->GetObjectGuid()); pUnit->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } } @@ -388,7 +387,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI if (uiEntry == NPC_STATIC_FIELD) { - pSummoned->CastSpell(m_creature, SPELL_STATIC_FIELD, false, 0, 0, m_creature->GetGUID()); + pSummoned->CastSpell(m_creature, SPELL_STATIC_FIELD, false, 0, 0, m_creature->GetObjectGuid()); pSummoned->ForcedDespawn(30000); } @@ -461,7 +460,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI { m_creature->SetFacingToObject(pSparkPortal); m_creature->CastSpell(pSparkPortal, SPELL_PORTAL_BEAM, true); - m_uiTargetSparkPortalGUID = pSparkPortal->GetGUID(); + m_uiTargetSparkPortalGUID = pSparkPortal->GetObjectGuid(); } m_bReadyForWPMove = true; @@ -527,7 +526,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI DoScriptText(SAY_ARCANE_PULSE_WARN, m_creature); if (Creature* pTemp = m_creature->SummonCreature(NPC_VORTEX, CENTER_X, CENTER_Y, FLOOR_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 9000)) - m_creature->CastSpell(m_creature, SPELL_SURGE_OF_POWER_BREATH, false, 0, 0, pTemp->GetGUID()); + m_creature->CastSpell(m_creature, SPELL_SURGE_OF_POWER_BREATH, false, 0, 0, pTemp->GetObjectGuid()); m_uiShellTimer = urand(2000, 4000); m_bReadyForWPMove = true; @@ -735,13 +734,13 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI if (m_uiPowerSparkTimer <= uiDiff) { DoScriptText(SAY_POWER_SPARK, m_creature); - std::list::iterator pTargetSparkPortalGUID = m_lSparkPortalGUIDList.begin(); + std::list::iterator pTargetSparkPortalGUID = m_lSparkPortalGUIDList.begin(); advance(pTargetSparkPortalGUID, urand(0, m_lSparkPortalGUIDList.size()-1)); if (Creature* pTargetSparkPortal = m_creature->GetMap()->GetCreature(*pTargetSparkPortalGUID)) if (Creature *pSpark = pTargetSparkPortal->SummonCreature(NPC_POWER_SPARK, pTargetSparkPortal->GetPositionX(), pTargetSparkPortal->GetPositionY(), pTargetSparkPortal->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000)) { pTargetSparkPortal->CastSpell(pTargetSparkPortal, SPELL_PORTAL_BEAM, true); - m_uiTargetSparkPortalGUID = pTargetSparkPortal->GetGUID(); + m_uiTargetSparkPortalGUID = pTargetSparkPortal->GetObjectGuid(); pTargetSparkPortal->ForcedDespawn(19500); m_uiPortalNeedResTimer = 19600; m_bPortalNeedRes = true; @@ -928,7 +927,7 @@ struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI if (m_uiTimer <= uiDiff) { if (m_pInstance) - if (GameObject* pPlatform = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_PLATFORM))) + if (GameObject* pPlatform = m_pInstance->GetSingleGameObjectFromStorage(GO_PLATFORM)) pPlatform->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED); @@ -1106,7 +1105,7 @@ struct MANGOS_DLL_DECL npc_power_sparkAI : public ScriptedAI if (m_uiCheckTimer <= uiDiff) { if (m_pInstance) - if (Creature* pMalygos = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_MALYGOS))) + if (Creature* pMalygos = m_pInstance->GetSingleCreatureFromStorage(NPC_MALYGOS)) { m_creature->GetMotionMaster()->Clear(); if (m_pInstance->GetData(TYPE_MALYGOS) != SPECIAL) @@ -1354,7 +1353,7 @@ struct MANGOS_DLL_DECL npc_alexstraszaAI : public ScriptedAI m_creature->SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_UNK_2); m_creature->AddSplineFlag(SPLINEFLAG_FLYING); if (m_pInstance) - if (Creature* pMalygos = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MALYGOS))) + if (Creature* pMalygos = m_pInstance->GetSingleCreatureFromStorage(NPC_MALYGOS)) m_creature->SetFacingToObject(pMalygos); } @@ -1375,7 +1374,7 @@ struct MANGOS_DLL_DECL npc_alexstraszaAI : public ScriptedAI { case 0: if (m_pInstance) - if (Creature* pMalygos = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MALYGOS))) + if (Creature* pMalygos = m_pInstance->GetSingleCreatureFromStorage(NPC_MALYGOS)) pMalygos->RemoveCorpse(); DoScriptText(SAY_OUTRO1, m_creature); m_uiTimer = 5000; @@ -1415,7 +1414,7 @@ bool GOHello_go_focusing_iris(Player* pPlayer, GameObject* pGo) { if (ScriptedInstance* pInstance = (ScriptedInstance*)pGo->GetInstanceData()) { - if (Unit* pMalygos = pGo->GetMap()->GetUnit(pInstance->GetData64(NPC_MALYGOS))) + if (Unit* pMalygos = pInstance->GetSingleCreatureFromStorage(NPC_MALYGOS)) { if (Creature* pSparkPortal = GetClosestCreatureWithEntry(pMalygos, NPC_SPARK_PORTAL, 100.0f)) if (pSparkPortal->HasAura(SPELL_PORTAL_BEAM)) @@ -1527,7 +1526,7 @@ struct MANGOS_DLL_DECL npc_whyrmrest_skytalonAI : public ScriptedAI { m_creature->setFaction(owner->getFaction()); owner->CastSpell(m_creature, SPELL_VEHICLE_HARDCODED, true); - if (Creature* pMalygos = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_MALYGOS))) + if (Creature* pMalygos = m_pInstance->GetSingleCreatureFromStorage(NPC_MALYGOS)) { pMalygos->SetInCombatWith(m_creature); pMalygos->AddThreat(m_creature); diff --git a/scripts/northrend/nexus/eye_of_eternity/instance_eye_of_eternity.cpp b/scripts/northrend/nexus/eye_of_eternity/instance_eye_of_eternity.cpp index 01296b9..3d6b369 100644 --- a/scripts/northrend/nexus/eye_of_eternity/instance_eye_of_eternity.cpp +++ b/scripts/northrend/nexus/eye_of_eternity/instance_eye_of_eternity.cpp @@ -27,28 +27,41 @@ EndScriptData */ struct MANGOS_DLL_DECL instance_eye_of_eternity : public ScriptedInstance { - instance_eye_of_eternity(Map* pMap) : ScriptedInstance(pMap) {Initialize();} + instance_eye_of_eternity(Map* pMap) : ScriptedInstance(pMap) + { + difficulty = pMap->GetDifficulty(); + Initialize(); + } std::string strInstData; uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint64 m_uiMalygosGUID; - uint64 m_uiPlatformGUID; - uint64 m_uiExitPortalGUID; - uint64 m_uiFocusingIrisGUID; - uint64 m_uiGiftGUID; - uint64 m_uiHeartGUID; + Difficulty difficulty; + + uint32 m_uiFocusingIrisGUID; + uint32 m_uiGiftGUID; + uint32 m_uiHeartGUID; void Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - m_uiMalygosGUID = 0; - m_uiPlatformGUID = 0; - m_uiExitPortalGUID = 0; - m_uiFocusingIrisGUID = 0; - m_uiGiftGUID = 0; - m_uiHeartGUID = 0; + switch (difficulty) + { + case RAID_DIFFICULTY_10MAN_NORMAL: + m_uiFocusingIrisGUID = GO_FOCUSING_IRIS; + m_uiGiftGUID = GO_ALEXSTRASZAS_GIFT; + m_uiHeartGUID = GO_HEART_OF_MAGIC; + break; + case RAID_DIFFICULTY_25MAN_NORMAL: + m_uiFocusingIrisGUID = GO_FOCUSING_IRIS_H; + m_uiGiftGUID = GO_ALEXSTRASZAS_GIFT_H; + m_uiHeartGUID = GO_HEART_OF_MAGIC_H; + break; + default: + break; + }; + } void OnCreatureCreate(Creature* pCreature) @@ -56,33 +69,25 @@ struct MANGOS_DLL_DECL instance_eye_of_eternity : public ScriptedInstance switch(pCreature->GetEntry()) { case NPC_MALYGOS: - m_uiMalygosGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); pCreature->SetActiveObjectState(true); break; } } - + void OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { case GO_PLATFORM: - m_uiPlatformGUID = pGo->GetGUID(); - break; case GO_EXIT_PORTAL: - m_uiExitPortalGUID = pGo->GetGUID(); - break; case GO_FOCUSING_IRIS: case GO_FOCUSING_IRIS_H: - m_uiFocusingIrisGUID = pGo->GetGUID(); - break; case GO_ALEXSTRASZAS_GIFT: case GO_ALEXSTRASZAS_GIFT_H: - m_uiGiftGUID = pGo->GetGUID(); - break; case GO_HEART_OF_MAGIC: case GO_HEART_OF_MAGIC_H: - m_uiHeartGUID = pGo->GetGUID(); + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); break; } } @@ -104,26 +109,26 @@ struct MANGOS_DLL_DECL instance_eye_of_eternity : public ScriptedInstance { if (uiData == NOT_STARTED) { - if (GameObject* pFocusingIris = instance->GetGameObject(m_uiFocusingIrisGUID)) + if (GameObject* pFocusingIris = GetSingleGameObjectFromStorage(m_uiFocusingIrisGUID)) { pFocusingIris->SetGoState(GO_STATE_READY); pFocusingIris->SetPhaseMask(1, true); } - if (GameObject* pExitPortal = instance->GetGameObject(m_uiExitPortalGUID)) + if (GameObject* pExitPortal = GetSingleGameObjectFromStorage(GO_EXIT_PORTAL)) pExitPortal->SetPhaseMask(1, true); - if (GameObject* pPlatform = instance->GetGameObject(m_uiPlatformGUID)) + if (GameObject* pPlatform = GetSingleGameObjectFromStorage(GO_PLATFORM)) pPlatform->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED); } if (uiData == IN_PROGRESS) { - if (GameObject* pFocusingIris = instance->GetGameObject(m_uiFocusingIrisGUID)) + if (GameObject* pFocusingIris = GetSingleGameObjectFromStorage(m_uiFocusingIrisGUID)) pFocusingIris->SetPhaseMask(2, true); - if (GameObject* pExitPortal = instance->GetGameObject(m_uiExitPortalGUID)) + if (GameObject* pExitPortal = GetSingleGameObjectFromStorage(GO_EXIT_PORTAL)) pExitPortal->SetPhaseMask(2, true); } if (uiData == DONE) { - if (GameObject* pExitPortal = instance->GetGameObject(m_uiExitPortalGUID)) + if (GameObject* pExitPortal = GetSingleGameObjectFromStorage(GO_EXIT_PORTAL)) pExitPortal->SetPhaseMask(1, true); DoRespawnGameObject(m_uiGiftGUID, HOUR*IN_MILLISECONDS); DoRespawnGameObject(m_uiHeartGUID, HOUR*IN_MILLISECONDS); @@ -179,17 +184,6 @@ struct MANGOS_DLL_DECL instance_eye_of_eternity : public ScriptedInstance return 0; } - uint64 GetData64(uint32 uiData) - { - switch(uiData) - { - case NPC_MALYGOS: - return m_uiMalygosGUID; - case GO_PLATFORM: - return m_uiPlatformGUID; - } - return 0; - } }; InstanceData* GetInstanceData_instance_eye_of_eternity(Map* pMap) diff --git a/scripts/northrend/nexus/nexus/boss_anomalus.cpp b/scripts/northrend/nexus/nexus/boss_anomalus.cpp index dc827b7..ef481df 100644 --- a/scripts/northrend/nexus/nexus/boss_anomalus.cpp +++ b/scripts/northrend/nexus/nexus/boss_anomalus.cpp @@ -75,14 +75,14 @@ struct MANGOS_DLL_DECL boss_anomalusAI : public ScriptedAI bool m_bChaoticRift; uint32 m_uiSparkTimer; uint32 m_uiCreateRiftTimer; - uint64 m_uiChaoticRiftGUID; + ObjectGuid m_chaoticRiftGuid; void Reset() { m_bChaoticRift = false; m_uiSparkTimer = 5000; m_uiCreateRiftTimer = 25000; - m_uiChaoticRiftGUID = 0; + m_chaoticRiftGuid.Clear(); } void Aggro(Unit* pWho) @@ -108,6 +108,8 @@ struct MANGOS_DLL_DECL boss_anomalusAI : public ScriptedAI { if (pSummoned->GetEntry() == NPC_CHAOTIC_RIFT) { + m_chaoticRiftGuid = pSummoned->GetObjectGuid(); + DoScriptText(SAY_RIFT, m_creature); if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) @@ -117,25 +119,23 @@ struct MANGOS_DLL_DECL boss_anomalusAI : public ScriptedAI void SummonedCreatureDespawn(Creature* pSummoned) { - if (pSummoned->GetGUID() == m_uiChaoticRiftGUID) + if (pSummoned->GetObjectGuid() == m_chaoticRiftGuid) { if (m_creature->HasAura(SPELL_RIFT_SHIELD)) m_creature->RemoveAurasDueToSpell(SPELL_RIFT_SHIELD); - m_uiChaoticRiftGUID = 0; + m_chaoticRiftGuid.Clear(); } } - uint64 CreateRiftAtRandomPoint() + void CreateRiftAtRandomPoint() { float fPosX, fPosY, fPosZ; m_creature->GetPosition(fPosX, fPosY, fPosZ); m_creature->GetRandomPoint(fPosX, fPosY, fPosZ, urand(15, 25), fPosX, fPosY, fPosZ); - Creature* pRift = m_creature->SummonCreature(NPC_CHAOTIC_RIFT, fPosX, fPosY, fPosZ, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 1000); + m_creature->SummonCreature(NPC_CHAOTIC_RIFT, fPosX, fPosY, fPosZ, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); DoScriptText(EMOTE_OPEN_RIFT, m_creature); - - return pRift?pRift->GetGUID():0; } void UpdateAI(const uint32 uiDiff) @@ -147,7 +147,7 @@ struct MANGOS_DLL_DECL boss_anomalusAI : public ScriptedAI if (!m_bChaoticRift && m_creature->GetHealthPercent() < 50.0f) { DoScriptText(EMOTE_SHIELD, m_creature); - m_uiChaoticRiftGUID = CreateRiftAtRandomPoint(); + CreateRiftAtRandomPoint(); DoScriptText(SAY_SHIELD, m_creature); DoCastSpellIfCan(m_creature, SPELL_RIFT_SHIELD); diff --git a/scripts/northrend/nexus/nexus/boss_keristrasza.cpp b/scripts/northrend/nexus/nexus/boss_keristrasza.cpp index 470e751..b069075 100644 --- a/scripts/northrend/nexus/nexus/boss_keristrasza.cpp +++ b/scripts/northrend/nexus/nexus/boss_keristrasza.cpp @@ -85,11 +85,7 @@ struct MANGOS_DLL_DECL boss_keristraszaAI : public ScriptedAI { if (m_pInstance->GetData(TYPE_KERISTRASZA) != SPECIAL) m_creature->CastSpell(m_creature, SPELL_FROZEN_PRISON, true); - else - m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_OOC_NOT_ATTACKABLE); } - - } void Aggro(Unit* pWho) @@ -142,7 +138,32 @@ struct MANGOS_DLL_DECL boss_keristraszaAI : public ScriptedAI uiCrystalChainTimer = 30000; } } - + else + { + if (Unit* pSource = m_creature->getVictim()) + { + uiCrystalChainTimer = 15000; + + Player* pPlayer = pSource->GetCharmerOrOwnerPlayerOrPlayerItself(); + + if (!pPlayer) + return; + + if (Group* pGroup = pPlayer->GetGroup()) + { + for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next()) + { + if (Player* pMember = pRef->getSource()) + { + if (pMember->isAlive() && pMember->IsWithinDistInMap(m_creature, 50.0f)) + m_creature->CastSpell(pMember, SPELL_CRYSTAL_CHAINS, true); + } + } + } + else + m_creature->CastSpell(pPlayer, SPELL_CRYSTAL_CHAINS, false); + } + } } } else @@ -154,7 +175,7 @@ struct MANGOS_DLL_DECL boss_keristraszaAI : public ScriptedAI uiTailSweepTimer = urand(2500, 7500); } else - uiTailSweepTimer -= uiDiff; + uiCrystalChainTimer -= uiDiff; if (uiCrystalfireBreathTimer < uiDiff) { diff --git a/scripts/northrend/nexus/nexus/instance_nexus.cpp b/scripts/northrend/nexus/nexus/instance_nexus.cpp index ba56300..db978c8 100644 --- a/scripts/northrend/nexus/nexus/instance_nexus.cpp +++ b/scripts/northrend/nexus/nexus/instance_nexus.cpp @@ -42,198 +42,136 @@ bool GOUse_go_containment_sphere(Player* pPlayer, GameObject* pGo) return false; } -struct MANGOS_DLL_DECL instance_nexus : public ScriptedInstance +instance_nexus::instance_nexus(Map* pMap) : ScriptedInstance(pMap) { - instance_nexus(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiAnomalusGUID; - uint64 m_uiKeristrazaGUID; + Initialize(); +} - uint64 m_uiTelestrasContainmentSphereGUID; - uint64 m_uiAnomalusContainmentSphereGUID; - uint64 m_uiOrmoroksContainmentSphereGUID; +void instance_nexus::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void Initialize() +void instance_nexus::OnObjectCreate(GameObject* pGo) +{ + switch (pGo->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiAnomalusGUID = 0; - m_uiKeristrazaGUID = 0; - - m_uiTelestrasContainmentSphereGUID = 0; - m_uiAnomalusContainmentSphereGUID = 0; - m_uiOrmoroksContainmentSphereGUID = 0; + case GO_CONTAINMENT_SPHERE_TELESTRA: + if (m_auiEncounter[TYPE_TELESTRA] == DONE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + break; + case GO_CONTAINMENT_SPHERE_ANOMALUS: + if (m_auiEncounter[TYPE_ANOMALUS] == DONE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + break; + case GO_CONTAINMENT_SPHERE_ORMOROK: + if (m_auiEncounter[TYPE_ORMOROK] == DONE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); +} - bool IsEncounterInProgress() const - { - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - } +void instance_nexus::OnCreatureCreate(Creature* pCreature) +{ + if (pCreature->GetEntry() == NPC_KERISTRASZA) + m_mNpcEntryGuidStore[NPC_KERISTRASZA] = pCreature->GetObjectGuid(); +} - return false; - } +uint32 instance_nexus::GetData(uint32 uiType) +{ + if (uiType < MAX_ENCOUNTER) + return m_auiEncounter[uiType]; + + return 0; +} - void OnObjectCreate(GameObject* pGo) +void instance_nexus::SetData(uint32 uiType, uint32 uiData) +{ + switch (uiType) { - switch(pGo->GetEntry()) - { - case GO_CONTAINMENT_SPHERE_TELESTRA: - m_uiTelestrasContainmentSphereGUID = pGo->GetGUID(); - if (m_auiEncounter[0] == DONE) + case TYPE_TELESTRA: + m_auiEncounter[uiType] = uiData; + if (uiData == DONE) + { + if (GameObject* pGo = GetSingleGameObjectFromStorage(GO_CONTAINMENT_SPHERE_TELESTRA)) pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - break; - case GO_CONTAINMENT_SPHERE_ANOMALUS: - m_uiAnomalusContainmentSphereGUID = pGo->GetGUID(); - if (m_auiEncounter[1] == DONE) + } + break; + case TYPE_ANOMALUS: + m_auiEncounter[uiType] = uiData; + if (uiData == DONE) + { + if (GameObject* pGo = GetSingleGameObjectFromStorage(GO_CONTAINMENT_SPHERE_ANOMALUS)) pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - break; - case GO_CONTAINMENT_SPHERE_ORMOROK: - m_uiOrmoroksContainmentSphereGUID = pGo->GetGUID(); - if (m_auiEncounter[2] == DONE) + } + break; + case TYPE_ORMOROK: + m_auiEncounter[uiType] = uiData; + if (uiData == DONE) + { + if (GameObject* pGo = GetSingleGameObjectFromStorage(GO_CONTAINMENT_SPHERE_ORMOROK)) pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - break; - } - } - - void OnCreatureCreate(Creature* pCreature) - { - switch(pCreature->GetEntry()) - { - case NPC_ANOMALUS: - m_uiAnomalusGUID = pCreature->GetGUID(); - break; - case NPC_KERISTRASZA: - m_uiKeristrazaGUID = pCreature->GetGUID(); - break; - } + } + break; + case TYPE_KERISTRASZA: + m_auiEncounter[uiType] = uiData; + break; + default: + error_log("SD2: Instance Nexus: ERROR SetData = %u for type %u does not exist/not implemented.", uiType, uiData); + return; } - uint64 GetData64(uint32 uiType) + if (m_auiEncounter[TYPE_TELESTRA] == SPECIAL && m_auiEncounter[TYPE_ANOMALUS] == SPECIAL && m_auiEncounter[TYPE_ORMOROK] == SPECIAL) { - switch(uiType) - { - case NPC_ANOMALUS: - return m_uiAnomalusGUID; - } + // release Keristrasza from her prison here + m_auiEncounter[TYPE_KERISTRASZA] = SPECIAL; - return 0; - } - - uint32 GetData(uint32 uiType) - { - switch(uiType) + if (Creature* pCreature = GetSingleCreatureFromStorage(NPC_KERISTRASZA)) { - case TYPE_TELESTRA: - return m_auiEncounter[0]; - case TYPE_ANOMALUS: - return m_auiEncounter[1]; - case TYPE_ORMOROK: - return m_auiEncounter[2]; - case TYPE_KERISTRASZA: - return m_auiEncounter[3]; + if (pCreature->isAlive()) + pCreature->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); } - - return 0; } - void SetData(uint32 uiType, uint32 uiData) + if (uiData == DONE) { - debug_log("SD2: Instance Nexus: SetData received for type %u with data %u", uiType, uiData); + OUT_SAVE_INST_DATA; - switch(uiType) - { - case TYPE_TELESTRA: - m_auiEncounter[0] = uiData; - if (uiData == DONE) - { - if (GameObject* pGo = instance->GetGameObject(m_uiTelestrasContainmentSphereGUID)) - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - } - break; - case TYPE_ANOMALUS: - m_auiEncounter[1] = uiData; - if (uiData == DONE) - { - if (GameObject* pGo = instance->GetGameObject(m_uiAnomalusContainmentSphereGUID)) - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - } - break; - case TYPE_ORMOROK: - m_auiEncounter[2] = uiData; - if (uiData == DONE) - { - if (GameObject* pGo = instance->GetGameObject(m_uiOrmoroksContainmentSphereGUID)) - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - } - break; - case TYPE_KERISTRASZA: - m_auiEncounter[3] = uiData; - break; - default: - error_log("SD2: Instance Nexus: ERROR SetData = %u for type %u does not exist/not implemented.", uiType, uiData); - break; - } - - if (m_auiEncounter[0] == SPECIAL && m_auiEncounter[1] == SPECIAL && m_auiEncounter[2] == SPECIAL) - { - // release Keristrasza from her prison here - m_auiEncounter[3] = SPECIAL; - - if (Creature* pCreature = instance->GetCreature(m_uiKeristrazaGUID)) - { - if (pCreature->isAlive()) - pCreature->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); - pCreature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_OOC_NOT_ATTACKABLE); - } - } + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - if (uiData == DONE) - { - OUT_SAVE_INST_DATA; + m_strInstData = saveStream.str(); - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - - strInstData = saveStream.str(); - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - const char* Save() +void instance_nexus::Load(const char* chrIn) +{ + if (!chrIn) { - return strInstData.c_str(); + OUT_LOAD_INST_DATA_FAIL; + return; } - void Load(const char* chrIn) - { - if (!chrIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(chrIn); + OUT_LOAD_INST_DATA(chrIn); - std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; - - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; - OUT_LOAD_INST_DATA_COMPLETE; + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; } -}; + + OUT_LOAD_INST_DATA_COMPLETE; +} InstanceData* GetInstanceData_instance_nexus(Map* pMap) { @@ -242,15 +180,15 @@ InstanceData* GetInstanceData_instance_nexus(Map* pMap) void AddSC_instance_nexus() { - Script* newscript; + Script* pNewScript; - newscript = new Script; - newscript->Name = "instance_nexus"; - newscript->GetInstanceData = &GetInstanceData_instance_nexus; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "instance_nexus"; + pNewScript->GetInstanceData = &GetInstanceData_instance_nexus; + pNewScript->RegisterSelf(); - newscript = new Script; - newscript->Name = "go_containment_sphere"; - newscript->pGOUse = &GOUse_go_containment_sphere; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "go_containment_sphere"; + pNewScript->pGOUse = &GOUse_go_containment_sphere; + pNewScript->RegisterSelf(); } diff --git a/scripts/northrend/nexus/nexus/nexus.h b/scripts/northrend/nexus/nexus/nexus.h index f69854a..6d06569 100644 --- a/scripts/northrend/nexus/nexus/nexus.h +++ b/scripts/northrend/nexus/nexus/nexus.h @@ -23,6 +23,29 @@ enum GO_CONTAINMENT_SPHERE_ANOMALUS = 188527, GO_CONTAINMENT_SPHERE_ORMOROK = 188528, - SPELL_FROZEN_PRISON = 47854 // may not be correct spell + SPELL_FROZEN_PRISON = 47854, // may not be correct spell }; + +class MANGOS_DLL_DECL instance_nexus : public ScriptedInstance +{ + public: + instance_nexus(Map* pMap); + + void Initialize(); + + void OnObjectCreate(GameObject* pGo); + void OnCreatureCreate(Creature* pCreature); + + uint32 GetData(uint32 uiType); + void SetData(uint32 uiType, uint32 uiData); + + const char* Save() { return m_strInstData.c_str(); } + + void Load(const char* chrIn); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + std::string m_strInstData; +}; + #endif diff --git a/scripts/northrend/nexus/oculus/boss_varos.cpp b/scripts/northrend/nexus/oculus/boss_varos.cpp index 8a589d8..39572ea 100644 --- a/scripts/northrend/nexus/oculus/boss_varos.cpp +++ b/scripts/northrend/nexus/oculus/boss_varos.cpp @@ -100,7 +100,7 @@ struct MANGOS_DLL_DECL boss_varosAI : public ScriptedAI uint32 m_uiDragonMoveTimer; uint32 m_uiCheckTimer; - uint64 m_uiAzureDrakeGUID; + ObjectGuid m_uiAzureDrakeGUID; bool m_bIsCastChain; @@ -137,7 +137,7 @@ struct MANGOS_DLL_DECL boss_varosAI : public ScriptedAI if(Creature* Dragon = m_pInstance->instance->GetCreature(m_uiAzureDrakeGUID)) Dragon->DealDamage(Dragon, Dragon->GetMaxHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } - m_uiAzureDrakeGUID = 0; + m_uiAzureDrakeGUID.Clear(); } void CheckVehicle() @@ -169,7 +169,7 @@ struct MANGOS_DLL_DECL boss_varosAI : public ScriptedAI { Dragon->AddSplineFlag(SPLINEFLAG_FLYING); Dragon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_uiAzureDrakeGUID = Dragon->GetGUID(); + m_uiAzureDrakeGUID = Dragon->GetObjectGuid(); } } diff --git a/scripts/northrend/nexus/oculus/instance_oculus.cpp b/scripts/northrend/nexus/oculus/instance_oculus.cpp index 95219b7..58d3f62 100644 --- a/scripts/northrend/nexus/oculus/instance_oculus.cpp +++ b/scripts/northrend/nexus/oculus/instance_oculus.cpp @@ -44,14 +44,9 @@ struct MANGOS_DLL_DECL instance_oculus : public ScriptedInstance Initialize(); }; - uint64 uiDrakos; - uint64 m_uiVarosGUID; - uint64 m_uiUromGUID; - uint64 m_uiEregosGUID; - uint64 uiProect; - uint64 uiCacheEregosGUID; - uint64 uiCacheEregosHGUID; - uint64 m_uiSpotLightGUID; + ObjectGuid uiCacheEregosGUID; + ObjectGuid uiCacheEregosHGUID; + ObjectGuid m_uiSpotLightGUID; uint32 m_auiEncounter[MAX_ENCOUNTERS+1]; @@ -63,12 +58,6 @@ struct MANGOS_DLL_DECL instance_oculus : public ScriptedInstance for (uint8 i = 0; i < MAX_ENCOUNTERS+1; ++i) m_auiEncounter[i] = NOT_STARTED; - uiCacheEregosGUID = 0; - m_uiSpotLightGUID = 0; - uiProect = 0; - m_uiVarosGUID = 0; - m_uiUromGUID = 0; - m_uiEregosGUID = 0; m_auiEncounter[TYPE_ROBOTS] = 10; m_auiEncounter[TYPE_UROM_PHASE] = 0; } @@ -78,13 +67,13 @@ struct MANGOS_DLL_DECL instance_oculus : public ScriptedInstance switch(pGO->GetEntry()) { case GO_EREGOS_CACHE: - uiCacheEregosGUID = pGO->GetGUID(); + uiCacheEregosGUID = pGO->GetObjectGuid(); break; case GO_EREGOS_CACHE_H: - uiCacheEregosHGUID = pGO->GetGUID(); + uiCacheEregosHGUID = pGO->GetObjectGuid(); break; case GO_SPOTLIGHT: - m_uiSpotLightGUID = pGO->GetGUID(); + m_uiSpotLightGUID = pGO->GetObjectGuid(); break; } } @@ -94,19 +83,11 @@ struct MANGOS_DLL_DECL instance_oculus : public ScriptedInstance switch(pCreature->GetEntry()) { case NPC_DRAKOS: - uiDrakos = pCreature->GetGUID(); - break; case NPC_VAROS: - m_uiVarosGUID = pCreature->GetGUID(); - break; case NPC_UROM: - m_uiUromGUID = pCreature->GetGUID(); - break; case NPC_EREGOS: - m_uiEregosGUID = pCreature->GetGUID(); - break; case NPC_BALGAR_IMAGE: - uiProect = pCreature->GetGUID(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); break; } } @@ -132,7 +113,7 @@ struct MANGOS_DLL_DECL instance_oculus : public ScriptedInstance m_auiEncounter[type] = m_auiEncounter[type] - data; if(m_auiEncounter[type] == 0) { - if(Creature* pVaros = instance->GetCreature(m_uiVarosGUID)) + if(Creature* pVaros = GetSingleCreatureFromStorage(NPC_VAROS)) { DoScriptText(SAY_VAROS_SPAWN, pVaros); pVaros->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -181,18 +162,6 @@ struct MANGOS_DLL_DECL instance_oculus : public ScriptedInstance return 0; } - uint64 GetData64(uint32 identifier) - { - switch(identifier) - { - case DATA_DRAKOS: return uiDrakos; - case NPC_VAROS: return m_uiVarosGUID; - case NPC_UROM: return m_uiUromGUID; - case NPC_EREGOS: return m_uiEregosGUID; - } - return 0; - } - const char* Save() { return strSaveData.c_str(); diff --git a/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp b/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp index a6bc4a2..fe668f2 100644 --- a/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp +++ b/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp @@ -174,9 +174,9 @@ float m_afTsunamiStartLoc[5][4]= {3287.5f, 511.10f, 58.6f, 3.19f}, }; -uint64 m_uiAcolyteShadronGUID; -uint64 m_uiAcolyteVesperonGUID; -std::list m_lEggsGUIDList; +ObjectGuid m_uiAcolyteShadronGUID; +ObjectGuid m_uiAcolyteVesperonGUID; +std::list m_lEggsGUIDList; /*###### ## Boss Sartharion @@ -259,9 +259,9 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI if (m_pInstance) { - Creature* pTene = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_TENEBRON)); - Creature* pShad = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADRON)); - Creature* pVesp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VESPERON)); + Creature* pTene = m_pInstance->GetSingleCreatureFromStorage(NPC_TENEBRON); + Creature* pShad = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADRON); + Creature* pVesp = m_pInstance->GetSingleCreatureFromStorage(NPC_VESPERON); if (m_bTenebronHelpedInFight && pTene) { @@ -353,9 +353,9 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI void FetchDragons() { - Creature* pTene = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_TENEBRON)); - Creature* pShad = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADRON)); - Creature* pVesp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VESPERON)); + Creature* pTene = m_pInstance->GetSingleCreatureFromStorage(NPC_TENEBRON); + Creature* pShad = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADRON); + Creature* pVesp = m_pInstance->GetSingleCreatureFromStorage(NPC_VESPERON); //if at least one of the dragons are alive and are being called uint8 uiCountFetchableDragons = 0; @@ -406,7 +406,7 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI { if (m_pInstance) { - Creature* pTemp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(uiEntry)); + Creature* pTemp = m_pInstance->GetSingleCreatureFromStorage(uiEntry); if (pTemp && pTemp->isAlive() && !pTemp->getVictim()) { @@ -419,13 +419,13 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI int32 iTextId = 0; Creature* pAdd = NULL; - pAdd = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_TENEBRON)); + pAdd = m_pInstance->GetSingleCreatureFromStorage(NPC_TENEBRON); if (pAdd) m_uiTeneHealth = pAdd->GetHealth(); - pAdd = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_SHADRON)); + pAdd = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADRON); if (pAdd) m_uiShadHealth = pAdd->GetHealth(); - pAdd = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_VESPERON)); + pAdd = m_pInstance->GetSingleCreatureFromStorage(NPC_VESPERON); if (pAdd) m_uiVespHealth = pAdd->GetHealth(); @@ -497,13 +497,13 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI { m_creature->SetHealth(m_uiSarthHealth); Creature* pTemp = NULL; - pTemp = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_TENEBRON)); + pTemp = m_pInstance->GetSingleCreatureFromStorage(NPC_TENEBRON); if (pTemp && pTemp->isAlive()) pTemp->SetHealth(m_uiTeneHealth); - pTemp = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_SHADRON)); + pTemp = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADRON); if (pTemp && pTemp->isAlive()) pTemp->SetHealth(m_uiShadHealth); - pTemp = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(NPC_VESPERON)); + pTemp = m_pInstance->GetSingleCreatureFromStorage(NPC_VESPERON); if (pTemp && pTemp->isAlive()) pTemp->SetHealth(m_uiVespHealth); } @@ -517,13 +517,13 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI DoScriptText(SAY_SARTHARION_BERSERK, m_creature); //DoCast(m_creature, SPELL_BERSERK); Creature* pTemp = NULL; - pTemp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_TENEBRON)); + pTemp = m_pInstance->GetSingleCreatureFromStorage(NPC_TENEBRON); if (pTemp && pTemp->isAlive()) pTemp->CastSpell(pTemp, 27680, true); - pTemp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADRON)); + pTemp = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADRON); if (pTemp && pTemp->isAlive()) pTemp->CastSpell(pTemp, 27680, true); - pTemp = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_VESPERON)); + pTemp = m_pInstance->GetSingleCreatureFromStorage(NPC_VESPERON); if (pTemp && pTemp->isAlive()) pTemp->CastSpell(pTemp, 27680, true); @@ -673,7 +673,7 @@ struct MANGOS_DLL_DECL boss_sartharionAI : public ScriptedAI } if (!m_lEggsGUIDList.empty()) { - for (std::list::iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) + for (std::list::iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr)) { @@ -1052,7 +1052,7 @@ struct MANGOS_DLL_DECL dummy_dragonAI : public ScriptedAI if (pAcolyte->isAlive()) bNoAliveTwilightRealm = false; if (!m_lEggsGUIDList.empty()) - for (std::list::iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) + for (GUIDList::iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) if (Creature* pTemp = m_creature->GetMap()->GetCreature( *itr)) if (pTemp->isAlive()) { @@ -1076,7 +1076,7 @@ struct MANGOS_DLL_DECL dummy_dragonAI : public ScriptedAI iTextId = SAY_TENEBRON_DEATH; if (!m_lEggsGUIDList.empty()) - for (std::list::iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) + for (GUIDList::iterator itr = m_lEggsGUIDList.begin(); itr != m_lEggsGUIDList.end(); ++itr) if (Creature* pEgg = m_creature->GetMap()->GetCreature( *itr)) pEgg->ForcedDespawn(); break; diff --git a/scripts/northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp b/scripts/northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp index d114854..de8714c 100644 --- a/scripts/northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp +++ b/scripts/northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp @@ -29,11 +29,7 @@ EndScriptData */ */ instance_obsidian_sanctum::instance_obsidian_sanctum(Map* pMap) : ScriptedInstance(pMap), - m_uiAliveDragons(0), - m_uiSartharionGUID(0), - m_uiTenebronGUID(0), - m_uiShadronGUID(0), - m_uiVesperonGUID(0) + m_uiAliveDragons(0) { Initialize(); } @@ -47,22 +43,14 @@ void instance_obsidian_sanctum::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_SARTHARION: - m_uiSartharionGUID = pCreature->GetGUID(); - break; // The three dragons below set to active state once created. // We must expect bigger raid to encounter main boss, and then three dragons must be active due to grid differences case NPC_TENEBRON: - m_uiTenebronGUID = pCreature->GetGUID(); - pCreature->SetActiveObjectState(true); - break; case NPC_SHADRON: - m_uiShadronGUID = pCreature->GetGUID(); - pCreature->SetActiveObjectState(true); - break; case NPC_VESPERON: - m_uiVesperonGUID = pCreature->GetGUID(); pCreature->SetActiveObjectState(true); + case NPC_SARTHARION: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); break; } } @@ -85,19 +73,6 @@ uint32 instance_obsidian_sanctum::GetData(uint32 uiType) return 0; } -uint64 instance_obsidian_sanctum::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_SARTHARION: return m_uiSartharionGUID; - case NPC_TENEBRON: return m_uiTenebronGUID; - case NPC_SHADRON: return m_uiShadronGUID; - case NPC_VESPERON: return m_uiVesperonGUID; - default: - return 0; - } -} - bool instance_obsidian_sanctum::CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/) { switch (uiCriteriaId) diff --git a/scripts/northrend/obsidian_sanctum/obsidian_sanctum.h b/scripts/northrend/obsidian_sanctum/obsidian_sanctum.h index 5b81600..56c25b1 100644 --- a/scripts/northrend/obsidian_sanctum/obsidian_sanctum.h +++ b/scripts/northrend/obsidian_sanctum/obsidian_sanctum.h @@ -42,16 +42,11 @@ class MANGOS_DLL_DECL instance_obsidian_sanctum : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); bool CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player const* pSource, Unit const* pTarget, uint32 uiMiscValue1 /* = 0*/); private: uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint64 m_uiSartharionGUID; - uint64 m_uiTenebronGUID; - uint64 m_uiShadronGUID; - uint64 m_uiVesperonGUID; uint8 m_uiAliveDragons; }; diff --git a/scripts/northrend/ruby_sanctum/boss_baltharus.cpp b/scripts/northrend/ruby_sanctum/boss_baltharus.cpp index 44d3452..898e6ba 100644 --- a/scripts/northrend/ruby_sanctum/boss_baltharus.cpp +++ b/scripts/northrend/ruby_sanctum/boss_baltharus.cpp @@ -18,7 +18,7 @@ SDName: boss_baltharus SD%Complete: 90% SDComment: by notagain and /dev/rsa -SDCategory: ruby_sanctum +SDCategory: Ruby Sanctum EndScriptData */ // Not fully offlike clone work, but Blizz idea is intact. // Need correct timers @@ -80,7 +80,7 @@ struct MANGOS_DLL_DECL boss_baltharusAI : public BSWScriptedAI pClone = NULL; inCombat = false; intro = false; - if (pDummyTarget = m_creature->GetMap()->GetCreature( pInstance->GetData64(NPC_BALTHARUS_TARGET))) + if (pDummyTarget = pInstance->GetSingleCreatureFromStorage(NPC_BALTHARUS_TARGET)) { if (!pDummyTarget->isAlive()) pDummyTarget->Respawn(); @@ -93,8 +93,8 @@ struct MANGOS_DLL_DECL boss_baltharusAI : public BSWScriptedAI pDummyTarget->GetMotionMaster()->MoveIdle(); } - if(Creature* pTarget = m_creature->GetMap()->GetCreature( pInstance->GetData64(NPC_XERESTRASZA))) - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, pTarget->GetGUID()); + if (Creature* pTarget = pInstance->GetSingleCreatureFromStorage(NPC_XERESTRASZA)) + m_creature->SetGuidValue(UNIT_FIELD_TARGET, pTarget->GetObjectGuid()); } void JustReachedHome() @@ -338,6 +338,28 @@ CreatureAI* GetAI_mob_baltharus_clone(Creature* pCreature) } +enum +{ + // Xerestrasza intro and outro texts + SAY_HELP = -1724000, + SAY_THANKS = -1724002, + SAY_OUTRO_1 = -1724003, + SAY_OUTRO_2 = -1724004, + SAY_OUTRO_3 = -1724005, + SAY_OUTRO_4 = -1724006, + SAY_OUTRO_5 = -1724007, + SAY_OUTRO_6 = -1724008, + SAY_OUTRO_7 = -1724009, + + // Baltharus texts + SAY_INTRO = -1724001, + SAY_AGGRO = -1724010, + SAY_SLAY_1 = -1724011, + SAY_SLAY_2 = -1724012, + SAY_DEATH = -1724013, + SAY_SPLIT = -1724014, +}; + void AddSC_boss_baltharus() { Script *newscript; diff --git a/scripts/northrend/ruby_sanctum/boss_halion.cpp b/scripts/northrend/ruby_sanctum/boss_halion.cpp index 5890860..12e4aa5 100644 --- a/scripts/northrend/ruby_sanctum/boss_halion.cpp +++ b/scripts/northrend/ruby_sanctum/boss_halion.cpp @@ -18,7 +18,7 @@ SDName: boss_halion SD%Complete: 80% SDComment: by notagain, corrected by /dev/rsa -SDCategory: ruby_sanctum +SDCategory: Ruby Sanctum EndScriptData */ // TODO: correct timers, Add twilight interorbs connection, sql spells, TESTING @@ -139,11 +139,11 @@ struct MANGOS_DLL_DECL boss_halion_realAI : public BSWScriptedAI SetCombatMovement(true); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (GameObject* pGoPortal = pInstance->instance->GetGameObject(pInstance->GetData64(GO_HALION_PORTAL_1))) + if (GameObject* pGoPortal = pInstance->GetSingleGameObjectFromStorage(GO_HALION_PORTAL_1)) pGoPortal->Delete(); - if (GameObject* pGoPortal = pInstance->instance->GetGameObject(pInstance->GetData64(GO_HALION_PORTAL_2))) + if (GameObject* pGoPortal = pInstance->GetSingleGameObjectFromStorage(GO_HALION_PORTAL_2)) pGoPortal->Delete(); - if (GameObject* pGoPortal = pInstance->instance->GetGameObject(pInstance->GetData64(GO_HALION_PORTAL_3))) + if (GameObject* pGoPortal = pInstance->GetSingleGameObjectFromStorage(GO_HALION_PORTAL_3)) pGoPortal->Delete(); } @@ -202,7 +202,7 @@ struct MANGOS_DLL_DECL boss_halion_realAI : public BSWScriptedAI DoScriptText(-1666104,m_creature); - if (Creature* pclone = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_TWILIGHT))) + if (Creature* pclone = pInstance->GetSingleCreatureFromStorage(NPC_HALION_TWILIGHT)) { if (!pclone->isAlive()) { @@ -291,7 +291,7 @@ struct MANGOS_DLL_DECL boss_halion_realAI : public BSWScriptedAI SetCombatMovement(false); StartMovement(0); { - Creature* pControl = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_CONTROL)); + Creature* pControl = pInstance->GetSingleCreatureFromStorage(NPC_HALION_CONTROL); if (!pControl) pControl = m_creature->SummonCreature(NPC_HALION_CONTROL, SpawnLoc[0].x, SpawnLoc[0].y, SpawnLoc[0].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 1000); else if (!pControl->isAlive()) @@ -308,9 +308,9 @@ struct MANGOS_DLL_DECL boss_halion_realAI : public BSWScriptedAI if (MovementStarted) return; doCast(SPELL_SUMMON_TWILIGHT_PORTAL); setStage(3); - if (GameObject* pGoPortal = pInstance->instance->GetGameObject(pInstance->GetData64(GO_HALION_PORTAL_1))) + if (GameObject* pGoPortal = pInstance->GetSingleGameObjectFromStorage(GO_HALION_PORTAL_1)) pGoPortal->SetPhaseMask(31,true); - if (GameObject* pGoRing = pInstance->instance->GetGameObject(pInstance->GetData64(GO_FLAME_RING))) + if (GameObject* pGoRing = pInstance->GetSingleGameObjectFromStorage(GO_FLAME_RING)) pGoRing->SetPhaseMask(65535,true); break; @@ -324,12 +324,12 @@ struct MANGOS_DLL_DECL boss_halion_realAI : public BSWScriptedAI case 4: if (!m_creature->IsNonMeleeSpellCasted(false)) { - if (Creature* pControl = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_CONTROL))) + if (Creature* pControl = pInstance->GetSingleCreatureFromStorage(NPC_HALION_CONTROL)) { m_creature->SetInCombatWith(pControl); pControl->SetInCombatWith(m_creature); } - Creature* pTwilight = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_TWILIGHT)); + Creature* pTwilight = pInstance->GetSingleCreatureFromStorage(NPC_HALION_TWILIGHT); if (!pTwilight) pTwilight = m_creature->SummonCreature(NPC_HALION_TWILIGHT, SpawnLoc[0].x, SpawnLoc[0].y, SpawnLoc[0].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 1000); else if (!pTwilight->isAlive()) @@ -345,7 +345,7 @@ struct MANGOS_DLL_DECL boss_halion_realAI : public BSWScriptedAI { // pInstance->SetData(TYPE_HALION_EVENT, SPECIAL); doRemove(SPELL_START_PHASE2); - if (Creature* pControl = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_CONTROL))) + if (Creature* pControl = pInstance->GetSingleCreatureFromStorage(NPC_HALION_CONTROL)) { m_creature->SetInCombatWith(pControl); pControl->SetInCombatWith(m_creature); @@ -419,18 +419,18 @@ struct MANGOS_DLL_DECL boss_halion_twilightAI : public BSWScriptedAI intro = false; resetTimers(); m_creature->SetInCombatWithZone(); - if (Creature* pControl = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_CONTROL))) + if (Creature* pControl = pInstance->GetSingleCreatureFromStorage(NPC_HALION_CONTROL)) { m_creature->SetInCombatWith(pControl); pControl->SetInCombatWith(m_creature); } - Creature* pFocus = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_ORB_ROTATION_FOCUS)); + Creature* pFocus = pInstance->GetSingleCreatureFromStorage(NPC_ORB_ROTATION_FOCUS); if (!pFocus ) pFocus = m_creature->SummonCreature(NPC_ORB_ROTATION_FOCUS, SpawnLoc[0].x, SpawnLoc[0].y, SpawnLoc[0].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 1000); else if (!pFocus->isAlive()) pFocus->Respawn(); - if (Creature* pReal = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_REAL))) + if (Creature* pReal = pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL)) if (pReal->isAlive()) m_creature->SetHealth(pReal->GetHealth()); if (!hasAura(SPELL_TWILIGHT_ENTER)) @@ -473,7 +473,7 @@ struct MANGOS_DLL_DECL boss_halion_twilightAI : public BSWScriptedAI AttackStart(pWho); setStage(1); doCast(SPELL_TWILIGHT_PRECISION); - if (Creature* pReal = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_REAL))) + if (Creature* pReal = pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL)) if (pReal->isAlive()) m_creature->SetHealth(pReal->GetHealth()); @@ -489,7 +489,7 @@ struct MANGOS_DLL_DECL boss_halion_twilightAI : public BSWScriptedAI return; DoScriptText(-1666104,m_creature); doRemoveFromAll(SPELL_TWILIGHT_ENTER); - if (Creature* pReal = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_REAL))) + if (Creature* pReal = pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL)) if (!pReal->isAlive()) { pInstance->SetData(TYPE_HALION, DONE); @@ -545,7 +545,7 @@ struct MANGOS_DLL_DECL boss_halion_twilightAI : public BSWScriptedAI pInstance->SetData(TYPE_HALION_EVENT, IN_PROGRESS); DoScriptText(-1666109,m_creature); m_creature->SummonGameobject(GO_HALION_PORTAL_3, SpawnLoc[0].x, SpawnLoc[0].y, SpawnLoc[0].z, 0, 0); - if (GameObject* pGoPortal = pInstance->instance->GetGameObject(pInstance->GetData64(GO_HALION_PORTAL_3))) + if (GameObject* pGoPortal = pInstance->GetSingleGameObjectFromStorage(GO_HALION_PORTAL_3)) pGoPortal->SetPhaseMask(32,true); doCast(SPELL_TWILIGHT_DIVISION); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -774,8 +774,8 @@ struct MANGOS_DLL_DECL mob_halion_controlAI : public BSWScriptedAI if (pInstance->GetData(TYPE_HALION_EVENT) != SPECIAL) return; - pHalionReal = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_REAL)); - pHalionTwilight = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_TWILIGHT)); + pHalionReal = pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL); + pHalionTwilight = pInstance->GetSingleCreatureFromStorage(NPC_HALION_TWILIGHT); //pHalionReal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pHalionTwilight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -867,7 +867,7 @@ struct MANGOS_DLL_DECL mob_orb_rotation_focusAI : public ScriptedAI m_timer = 30000; m_warning = false; - Creature* pPulsar1 = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SHADOW_PULSAR_N)); + Creature* pPulsar1 = pInstance->GetSingleCreatureFromStorage(NPC_SHADOW_PULSAR_N); if (!pPulsar1 ) { float x,y; @@ -876,7 +876,7 @@ struct MANGOS_DLL_DECL mob_orb_rotation_focusAI : public ScriptedAI } else if (!pPulsar1->isAlive()) pPulsar1->Respawn(); - Creature* pPulsar2 = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_SHADOW_PULSAR_S)); + Creature* pPulsar2 = pInstance->GetSingleCreatureFromStorage(NPC_SHADOW_PULSAR_S); if (!pPulsar2) { float x,y; @@ -998,7 +998,7 @@ struct MANGOS_DLL_DECL mob_halion_orbAI : public BSWScriptedAI MovementStarted = true; m_direction = ((float)pInstance->GetData(DATA_ORB_DIRECTION)/1000 + m_delta); if (m_direction > 2.0f*M_PI_F) m_direction = m_direction - 2.0f*M_PI_F; - if (focus = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_ORB_ROTATION_FOCUS))) + if (focus = pInstance->GetSingleCreatureFromStorage(NPC_ORB_ROTATION_FOCUS)) focus->GetNearPoint2D(x, y, FR_RADIUS, m_direction); else m_creature->ForcedDespawn(); // debug_log("EventMGR: creature %u go to move point %u ",m_creature->GetEntry(),id); @@ -1083,7 +1083,7 @@ struct MANGOS_DLL_DECL mob_orb_carrierAI : public BSWScriptedAI float x,y; float m_direction = ((float)pInstance->GetData(DATA_ORB_DIRECTION)/1000.0f + M_PI_F - M_PI_F/32.0f); if (m_direction > 2.0f*M_PI_F) m_direction = m_direction - 2.0f*M_PI_F; - if (Creature* focus = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_ORB_ROTATION_FOCUS))) + if (Creature* focus = pInstance->GetSingleCreatureFromStorage(NPC_ORB_ROTATION_FOCUS)) focus->GetNearPoint2D(x, y, FR_RADIUS, m_direction); else m_creature->ForcedDespawn(); m_creature->GetMotionMaster()->Clear(); @@ -1219,6 +1219,26 @@ bool GOHello_go_halion_portal_real(Player *player, GameObject* pGo) return true; } +enum +{ + SAY_SPAWN = -1724024, + SAY_AGGRO = -1724025, + SAY_SLAY = -1724026, // There is an additonal sound entry related to SLAY: 17502 + SAY_DEATH = -1724027, + SAY_BERSERK = -1724028, + SAY_FIREBALL = -1724029, + SAY_SPHERES = -1724030, + SAY_PHASE_2 = -1724031, + SAY_PHASE_3 = -1724032, + + EMOTE_SPHERES = -1724033, + EMOTE_OUT_OF_TWILLIGHT = -1724034, + EMOTE_OUT_OF_PHYSICAL = -1724035, + EMOTE_INTO_TWILLIGHT = -1724036, + EMOTE_INTO_PHYSICAL = -1724037, + EMOTE_REGENERATE = -1724038, +}; + void AddSC_boss_halion() { Script *newscript; diff --git a/scripts/northrend/ruby_sanctum/boss_saviana.cpp b/scripts/northrend/ruby_sanctum/boss_saviana.cpp index 03580fe..620b946 100644 --- a/scripts/northrend/ruby_sanctum/boss_saviana.cpp +++ b/scripts/northrend/ruby_sanctum/boss_saviana.cpp @@ -18,12 +18,21 @@ SDName: boss_ragefire SD%Complete: 90% SDComment: by notagain && /dev/rsa -SDCategory: ruby_sanctum +SDCategory: Ruby Sanctum EndScriptData */ #include "precompiled.h" #include "ruby_sanctum.h" +enum +{ + SAY_AGGRO = -1724015, + SAY_SLAY_1 = -1724016, + SAY_SLAY_2 = -1724017, + SAY_SPECIAL = -1724018, + SOUND_DEATH = 17531, // On death it has only a screaming sound +}; + enum BossSpells { SPELL_ENRAGE = 78722, //soft enrage + fire nova diff --git a/scripts/northrend/ruby_sanctum/boss_zarithrian.cpp b/scripts/northrend/ruby_sanctum/boss_zarithrian.cpp index 880bc7b..0208c3c 100644 --- a/scripts/northrend/ruby_sanctum/boss_zarithrian.cpp +++ b/scripts/northrend/ruby_sanctum/boss_zarithrian.cpp @@ -14,10 +14,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* ScriptData -SDName: boss_zarithian +SDName: boss_zarithrian SD%Complete: 90% SDComment: by /dev/rsa && notagain -SDCategory: ruby_sanctum +SDCategory: Ruby Sanctum EndScriptData */ // Need correct timers @@ -46,14 +46,23 @@ enum Equipment static Locations SpawnLoc[]= { - {3008.552734f, 530.471680f, 89.195290f}, // 0 - Zarithian start point, o = 6,16 + {3008.552734f, 530.471680f, 89.195290f}, // 0 - Zarithrian start point, o = 6,16 {3014.313477f, 486.453735f, 89.255096f}, // 1 - Mob spawn 1 {3025.324951f, 580.588501f, 88.593185f}, // 2 - Mob spawn 2 }; -struct MANGOS_DLL_DECL boss_zarithianAI : public BSWScriptedAI +enum { - boss_zarithianAI(Creature* pCreature) : BSWScriptedAI(pCreature) + SAY_AGGRO = -1724019, + SAY_SLAY_1 = -1724020, + SAY_SLAY_2 = -1724021, + SAY_DEATH = -1724022, + SAY_SUMMON = -1724023, +}; + +struct MANGOS_DLL_DECL boss_zarithrianAI : public BSWScriptedAI +{ + boss_zarithrianAI(Creature* pCreature) : BSWScriptedAI(pCreature) { pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); Reset(); @@ -68,7 +77,7 @@ struct MANGOS_DLL_DECL boss_zarithianAI : public BSWScriptedAI if (m_creature->isAlive()) { - pInstance->SetData(TYPE_ZARITHIAN, NOT_STARTED); + pInstance->SetData(TYPE_ZARITHRIAN, NOT_STARTED); resetTimers(); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); setStage(0); @@ -105,7 +114,7 @@ struct MANGOS_DLL_DECL boss_zarithianAI : public BSWScriptedAI void JustReachedHome() { if (!pInstance) return; - pInstance->SetData(TYPE_ZARITHIAN, FAIL); + pInstance->SetData(TYPE_ZARITHRIAN, FAIL); } void JustSummoned(Creature* summoned) @@ -126,7 +135,7 @@ struct MANGOS_DLL_DECL boss_zarithianAI : public BSWScriptedAI if(!pInstance) return; SetEquipmentSlots(false, EQUIP_MAIN, EQUIP_OFFHAND, EQUIP_RANGED); - pInstance->SetData(TYPE_ZARITHIAN, IN_PROGRESS); + pInstance->SetData(TYPE_ZARITHRIAN, IN_PROGRESS); DoScriptText(-1666200,m_creature); } @@ -134,7 +143,7 @@ struct MANGOS_DLL_DECL boss_zarithianAI : public BSWScriptedAI { if(!pInstance) return; - pInstance->SetData(TYPE_ZARITHIAN, DONE); + pInstance->SetData(TYPE_ZARITHRIAN, DONE); DoScriptText(-1666203,m_creature); } @@ -162,9 +171,9 @@ struct MANGOS_DLL_DECL boss_zarithianAI : public BSWScriptedAI } }; -CreatureAI* GetAI_boss_zarithian(Creature* pCreature) +CreatureAI* GetAI_boss_zarithrian(Creature* pCreature) { - return new boss_zarithianAI(pCreature); + return new boss_zarithrianAI(pCreature); }; struct MANGOS_DLL_DECL mob_flamecaller_rubyAI : public BSWScriptedAI @@ -187,7 +196,7 @@ struct MANGOS_DLL_DECL mob_flamecaller_rubyAI : public BSWScriptedAI void UpdateAI(const uint32 diff) { - if (pInstance && pInstance->GetData(TYPE_ZARITHIAN) != IN_PROGRESS) + if (pInstance && pInstance->GetData(TYPE_ZARITHRIAN) != IN_PROGRESS) m_creature->ForcedDespawn(); if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) @@ -208,8 +217,8 @@ void AddSC_boss_zarithrian() { Script *newscript; newscript = new Script; - newscript->Name = "boss_zarithian"; - newscript->GetAI = &GetAI_boss_zarithian; + newscript->Name = "boss_zarithrian"; + newscript->GetAI = &GetAI_boss_zarithrian; newscript->RegisterSelf(); newscript = new Script; diff --git a/scripts/northrend/ruby_sanctum/instance_ruby_sanctum.cpp b/scripts/northrend/ruby_sanctum/instance_ruby_sanctum.cpp index c747912..bdb8690 100644 --- a/scripts/northrend/ruby_sanctum/instance_ruby_sanctum.cpp +++ b/scripts/northrend/ruby_sanctum/instance_ruby_sanctum.cpp @@ -26,9 +26,9 @@ EndScriptData */ #include "precompiled.h" #include "ruby_sanctum.h" -struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance +struct MANGOS_DLL_DECL instance_ruby_sanctum : public BSWScriptedInstance { - instance_ruby_sanctum(Map* pMap) : ScriptedInstance(pMap) + instance_ruby_sanctum(Map* pMap) : BSWScriptedInstance(pMap) { Initialize(); } @@ -50,7 +50,7 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance uint64 m_uiHalion_tGUID; uint64 m_uiHalionControlGUID; uint64 m_uiRagefireGUID; - uint64 m_uiZarithianGUID; + uint64 m_uiZarithrianGUID; uint64 m_uiBaltharusGUID; uint64 m_uiCloneGUID; uint64 m_uiXerestraszaGUID; @@ -73,26 +73,6 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance uint64 m_uiFlameWallsGUID; uint64 m_uiFlameRingGUID; - void OpenDoor(uint64 guid) - { - if(!guid) - return; - - GameObject* pGo = instance->GetGameObject(guid); - if(pGo) - pGo->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - } - - void CloseDoor(uint64 guid) - { - if(!guid) - return; - - GameObject* pGo = instance->GetGameObject(guid); - if(pGo) - pGo->SetGoState(GO_STATE_READY); - } - void Initialize() { for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) @@ -103,7 +83,7 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance m_uiHalion_pGUID = 0; m_uiHalion_tGUID = 0; m_uiRagefireGUID = 0; - m_uiZarithianGUID = 0; + m_uiZarithrianGUID = 0; m_uiBaltharusGUID = 0; m_uiCloneGUID = 0; m_uiHalionPortal1GUID = 0; @@ -135,7 +115,7 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance void UpdateWorldState(bool command, uint32 value) { Map::PlayerList const &players = instance->GetPlayers(); - + if (command) { for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) @@ -178,27 +158,30 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance if (m_auiEncounter[TYPE_RAGEFIRE] == DONE && m_auiEncounter[TYPE_BALTHARUS] == DONE && m_auiEncounter[TYPE_XERESTRASZA] == DONE) - OpenDoor(m_uiFlameWallsGUID); - else CloseDoor(m_uiFlameWallsGUID); + DoOpenDoor(GO_FLAME_WALLS); + else + DoCloseDoor(GO_FLAME_WALLS); } void OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_HALION_REAL: m_uiHalion_pGUID = pCreature->GetGUID(); break; - case NPC_HALION_TWILIGHT: m_uiHalion_tGUID = pCreature->GetGUID(); break; - case NPC_HALION_CONTROL: m_uiHalionControlGUID = pCreature->GetGUID(); break; - case NPC_RAGEFIRE: m_uiRagefireGUID = pCreature->GetGUID(); break; - case NPC_ZARITHIAN: m_uiZarithianGUID = pCreature->GetGUID(); break; - case NPC_BALTHARUS: m_uiBaltharusGUID = pCreature->GetGUID(); break; - case NPC_BALTHARUS_TARGET: m_uiBaltharusTargetGUID = pCreature->GetGUID(); break; - case NPC_CLONE: m_uiCloneGUID = pCreature->GetGUID(); break; - case NPC_XERESTRASZA: m_uiXerestraszaGUID = pCreature->GetGUID(); break; - case NPC_SHADOW_PULSAR_N: m_uiOrbNGUID = pCreature->GetGUID(); break; - case NPC_SHADOW_PULSAR_S: m_uiOrbSGUID = pCreature->GetGUID(); break; - case NPC_ORB_ROTATION_FOCUS: m_uiOrbFocusGUID = pCreature->GetGUID(); break; - case NPC_ORB_CARRIER: m_uiOrbCarrierGUID = pCreature->GetGUID(); break; + case NPC_HALION_REAL: + case NPC_HALION_TWILIGHT: + case NPC_HALION_CONTROL: + case NPC_RAGEFIRE: + case NPC_ZARITHRIAN: + case NPC_BALTHARUS: + case NPC_BALTHARUS_TARGET: + case NPC_CLONE: + case NPC_XERESTRASZA: + case NPC_SHADOW_PULSAR_N: + case NPC_SHADOW_PULSAR_S: + case NPC_ORB_ROTATION_FOCUS: + case NPC_ORB_CARRIER: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -206,12 +189,14 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance { switch(pGo->GetEntry()) { - case GO_HALION_PORTAL_1: m_uiHalionPortal1GUID = pGo->GetGUID(); break; - case GO_HALION_PORTAL_2: m_uiHalionPortal2GUID = pGo->GetGUID(); break; - case GO_HALION_PORTAL_3: m_uiHalionPortal3GUID = pGo->GetGUID(); break; - case GO_FLAME_WALLS: m_uiFlameWallsGUID = pGo->GetGUID(); break; - case GO_FLAME_RING: m_uiFlameRingGUID = pGo->GetGUID(); break; - case GO_FIRE_FIELD: m_uiFireFieldGUID = pGo->GetGUID(); break; + case GO_HALION_PORTAL_1: + case GO_HALION_PORTAL_2: + case GO_HALION_PORTAL_3: + case GO_FLAME_WALLS: + case GO_FLAME_RING: + case GO_FIRE_FIELD: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; } OpenAllDoors(); } @@ -222,50 +207,46 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance { case TYPE_EVENT: m_auiEncounter[uiType] = uiData; uiData = NOT_STARTED; break; case TYPE_RAGEFIRE: m_auiEncounter[uiType] = uiData; - OpenAllDoors(); + OpenAllDoors(); break; case TYPE_BALTHARUS: m_auiEncounter[uiType] = uiData; - OpenAllDoors(); + OpenAllDoors(); break; case TYPE_XERESTRASZA: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) - OpenDoor(m_uiFireFieldGUID); + DoOpenDoor(GO_FIRE_FIELD); else if (uiData == NOT_STARTED) { - CloseDoor(m_uiFireFieldGUID); - OpenAllDoors(); + DoCloseDoor(GO_FIRE_FIELD); + OpenAllDoors(); } else if (uiData == DONE) { - OpenAllDoors(); - if (m_auiEncounter[TYPE_ZARITHIAN] == DONE) - { - m_auiEncounter[TYPE_EVENT] = 200; - m_auiEventTimer = 30000; - }; + OpenAllDoors(); + if (m_auiEncounter[TYPE_ZARITHRIAN] == DONE) + { + m_auiEncounter[TYPE_EVENT] = 200; + m_auiEventTimer = 30000; + }; } break; - case TYPE_ZARITHIAN: m_auiEncounter[uiType] = uiData; + case TYPE_ZARITHRIAN: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { - OpenDoor(m_uiFlameWallsGUID); - m_auiEncounter[TYPE_EVENT] = 200; - m_auiEventTimer = 30000; + DoOpenDoor(GO_FLAME_WALLS); + m_auiEncounter[TYPE_EVENT] = 200; + m_auiEventTimer = 30000; } else if (uiData == IN_PROGRESS) - CloseDoor(m_uiFlameWallsGUID); + DoCloseDoor(GO_FLAME_WALLS); else if (uiData == FAIL) - OpenDoor(m_uiFlameWallsGUID); + DoOpenDoor(GO_FLAME_WALLS); break; case TYPE_HALION: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) - { - CloseDoor(m_uiFlameRingGUID); - } + DoCloseDoor(GO_FLAME_RING); else - { - OpenDoor(m_uiFlameRingGUID); - } + DoOpenDoor(GO_FLAME_RING); break; case TYPE_HALION_EVENT: m_auiHalionEvent = uiData; uiData = NOT_STARTED; break; case TYPE_EVENT_TIMER: m_auiEventTimer = uiData; uiData = NOT_STARTED; break; @@ -314,7 +295,7 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance case TYPE_RAGEFIRE: return m_auiEncounter[uiType]; case TYPE_BALTHARUS: return m_auiEncounter[uiType]; case TYPE_XERESTRASZA: return m_auiEncounter[uiType]; - case TYPE_ZARITHIAN: return m_auiEncounter[uiType]; + case TYPE_ZARITHRIAN: return m_auiEncounter[uiType]; case TYPE_HALION: return m_auiEncounter[uiType]; case TYPE_EVENT: return m_auiEncounter[uiType]; @@ -352,36 +333,6 @@ struct MANGOS_DLL_DECL instance_ruby_sanctum : public ScriptedInstance return 0; } - uint64 GetData64(uint32 uiData) - { - switch(uiData) - { - case NPC_BALTHARUS: return m_uiBaltharusGUID; - case NPC_CLONE: return m_uiCloneGUID; - case NPC_ZARITHIAN: return m_uiZarithianGUID; - case NPC_RAGEFIRE: return m_uiRagefireGUID; - case NPC_HALION_REAL: return m_uiHalion_pGUID; - case NPC_HALION_TWILIGHT: return m_uiHalion_tGUID; - case NPC_HALION_CONTROL: return m_uiHalionControlGUID; - case NPC_XERESTRASZA: return m_uiXerestraszaGUID; - case NPC_BALTHARUS_TARGET: return m_uiBaltharusTargetGUID; - - case GO_FLAME_WALLS: return m_uiFlameWallsGUID; - case GO_FLAME_RING: return m_uiFlameRingGUID; - case GO_FIRE_FIELD: return m_uiFireFieldGUID; - - case GO_HALION_PORTAL_1: return m_uiHalionPortal1GUID; - case GO_HALION_PORTAL_2: return m_uiHalionPortal2GUID; - case GO_HALION_PORTAL_3: return m_uiHalionPortal3GUID; - - case NPC_SHADOW_PULSAR_N: return m_uiOrbNGUID; - case NPC_SHADOW_PULSAR_S: return m_uiOrbSGUID; - case NPC_ORB_ROTATION_FOCUS: return m_uiOrbFocusGUID; - case NPC_ORB_CARRIER: return m_uiOrbCarrierGUID; - } - return 0; - } - void Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/northrend/ruby_sanctum/ruby_sanctum.cpp b/scripts/northrend/ruby_sanctum/ruby_sanctum.cpp index 0e314d9..0f4e36f 100644 --- a/scripts/northrend/ruby_sanctum/ruby_sanctum.cpp +++ b/scripts/northrend/ruby_sanctum/ruby_sanctum.cpp @@ -174,13 +174,13 @@ struct MANGOS_DLL_DECL mob_xerestraszaAI : public ScriptedAI break; // Halion spawn case 200: - m_creature->SetActiveObjectState(true); + m_creature->SetActiveObjectState(true); { - Creature* pHalion = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_HALION_REAL)); + Creature* pHalion = pInstance->GetSingleCreatureFromStorage(NPC_HALION_REAL); if (pInstance->GetData(TYPE_BALTHARUS) == DONE && pInstance->GetData(TYPE_RAGEFIRE) == DONE && pInstance->GetData(TYPE_XERESTRASZA) == DONE && - pInstance->GetData(TYPE_ZARITHIAN) == DONE && + pInstance->GetData(TYPE_ZARITHRIAN) == DONE && pInstance->GetData(TYPE_HALION) != DONE) { if (!pHalion) diff --git a/scripts/northrend/ruby_sanctum/ruby_sanctum.h b/scripts/northrend/ruby_sanctum/ruby_sanctum.h index c702504..7d90c52 100644 --- a/scripts/northrend/ruby_sanctum/ruby_sanctum.h +++ b/scripts/northrend/ruby_sanctum/ruby_sanctum.h @@ -5,6 +5,7 @@ #ifndef DEF_RUBY_SANCTUM_H #define DEF_RUBY_SANCTUM_H #include "BSW_ai.h" +#include "BSW_instance.h" enum { @@ -14,7 +15,7 @@ enum TYPE_RAGEFIRE = 1, TYPE_BALTHARUS = 2, TYPE_XERESTRASZA = 3, - TYPE_ZARITHIAN = 4, + TYPE_ZARITHRIAN = 4, TYPE_HALION = 5, TYPE_COUNTER = 6, // for WorldUpdateState @@ -31,13 +32,13 @@ enum NPC_BALTHARUS = 39751, NPC_CLONE = 39899, - NPC_ZARITHIAN = 39746, + NPC_ZARITHRIAN = 39746, NPC_RAGEFIRE = 39747, NPC_XERESTRASZA = 40429, NPC_BALTHARUS_TARGET = 39900, - NPC_ZARITHIAN_SPAWN_STALKER = 39794, + NPC_ZARITHRIAN_SPAWN_STALKER = 39794, // Orb rotation NPC_SHADOW_PULSAR_N = 40083, //spinning orb N spawn diff --git a/scripts/northrend/ulduar/halls_of_lightning/boss_bjarngrim.cpp b/scripts/northrend/ulduar/halls_of_lightning/boss_bjarngrim.cpp index af1eeb4..1e4e5a3 100644 --- a/scripts/northrend/ulduar/halls_of_lightning/boss_bjarngrim.cpp +++ b/scripts/northrend/ulduar/halls_of_lightning/boss_bjarngrim.cpp @@ -79,7 +79,6 @@ struct MANGOS_DLL_DECL boss_bjarngrimAI : public ScriptedAI m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); m_uiStance = STANCE_DEFENSIVE; - memset(&m_auiStormforgedLieutenantGUID, 0, sizeof(m_auiStormforgedLieutenantGUID)); Reset(); } @@ -106,7 +105,7 @@ struct MANGOS_DLL_DECL boss_bjarngrimAI : public ScriptedAI uint32 m_uiMortalStrike_Timer; uint32 m_uiSlam_Timer; - uint64 m_auiStormforgedLieutenantGUID[2]; + ObjectGuid m_aStormforgedLieutenantGuid[2]; // TODO - not filled yet. void Reset() { @@ -131,7 +130,7 @@ struct MANGOS_DLL_DECL boss_bjarngrimAI : public ScriptedAI for(uint8 i = 0; i < 2; ++i) { - if (Creature* pStormforgedLieutenant = m_creature->GetMap()->GetCreature(m_auiStormforgedLieutenantGUID[i])) + if (Creature* pStormforgedLieutenant = m_creature->GetMap()->GetCreature(m_aStormforgedLieutenantGuid[i])) { if (!pStormforgedLieutenant->isAlive()) pStormforgedLieutenant->Respawn(); @@ -344,7 +343,7 @@ struct MANGOS_DLL_DECL mob_stormforged_lieutenantAI : public ScriptedAI { if (m_pInstance) { - if (Creature* pBjarngrim = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_BJARNGRIM))) + if (Creature* pBjarngrim = m_pInstance->GetSingleCreatureFromStorage(NPC_BJARNGRIM)) { if (pBjarngrim->isAlive() && !pBjarngrim->getVictim()) pBjarngrim->AI()->AttackStart(pWho); @@ -370,7 +369,7 @@ struct MANGOS_DLL_DECL mob_stormforged_lieutenantAI : public ScriptedAI { if (m_pInstance) { - if (Creature* pBjarngrim = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_BJARNGRIM))) + if (Creature* pBjarngrim = m_pInstance->GetSingleCreatureFromStorage(NPC_BJARNGRIM)) { if (pBjarngrim->isAlive()) DoCastSpellIfCan(pBjarngrim, m_bIsRegularMode ? SPELL_RENEW_STEEL_N : SPELL_RENEW_STEEL_H); diff --git a/scripts/northrend/ulduar/halls_of_lightning/boss_ionar.cpp b/scripts/northrend/ulduar/halls_of_lightning/boss_ionar.cpp index 329eb4f..685b506 100644 --- a/scripts/northrend/ulduar/halls_of_lightning/boss_ionar.cpp +++ b/scripts/northrend/ulduar/halls_of_lightning/boss_ionar.cpp @@ -212,7 +212,7 @@ struct MANGOS_DLL_DECL boss_ionarAI : public ScriptedAI if (m_creature->getVictim()) pSummoned->AI()->AttackStart(pTarget ? pTarget : m_creature->getVictim()); - m_lSparkGUIDList.push_back(pSummoned->GetGUID()); + m_lSparkGUIDList.push_back(pSummoned->GetObjectGuid()); } } @@ -352,7 +352,7 @@ struct MANGOS_DLL_DECL mob_spark_of_ionarAI : public ScriptedAI if (uiPointId == POINT_CALLBACK) { - if (Creature* pIonar = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_IONAR))) + if (Creature* pIonar = m_pInstance->GetSingleCreatureFromStorage(NPC_IONAR)) { if (!pIonar->isAlive()) { diff --git a/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp b/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp index 192c6bb..11b832b 100644 --- a/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp +++ b/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp @@ -144,7 +144,7 @@ struct MANGOS_DLL_DECL boss_lokenAI : public ScriptedAI if (m_fDist <= 1.0f) // Less than 1 yard dmg = (m_bIsRegularMode ? 800 : 850); // need to correct damage else // Further from 1 yard - dmg = uint32((m_bIsRegularMode ? 200 : 250) * m_fDist) + (m_bIsRegularMode ? 800 : 850); // need to correct damage + dmg = int32((m_bIsRegularMode ? 200.0f : 250.0f) * m_fDist + (m_bIsRegularMode ? 800.0f : 850.0f)); // need to correct damage m_creature->CastCustomSpell(i->getSource(), (m_bIsRegularMode ? 52942 : 59837), &dmg, 0, 0, false); } diff --git a/scripts/northrend/ulduar/halls_of_lightning/boss_volkhan.cpp b/scripts/northrend/ulduar/halls_of_lightning/boss_volkhan.cpp index c4ea4d1..2554640 100644 --- a/scripts/northrend/ulduar/halls_of_lightning/boss_volkhan.cpp +++ b/scripts/northrend/ulduar/halls_of_lightning/boss_volkhan.cpp @@ -347,7 +347,7 @@ struct MANGOS_DLL_DECL mob_molten_golemAI : public ScriptedAI m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); m_creature->SetHealth(1); - Creature* pCreature = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(DATA_VOLKHAN)); + Creature* pCreature = m_pInstance->GetSingleCreatureFromStorage(NPC_VOLKHAN); m_creature->SetInCombatWith(pCreature); diff --git a/scripts/northrend/ulduar/halls_of_lightning/halls_of_lightning.h b/scripts/northrend/ulduar/halls_of_lightning/halls_of_lightning.h index ced4afe..983acc6 100644 --- a/scripts/northrend/ulduar/halls_of_lightning/halls_of_lightning.h +++ b/scripts/northrend/ulduar/halls_of_lightning/halls_of_lightning.h @@ -9,15 +9,10 @@ enum { MAX_ENCOUNTER = 4, - DATA_BJARNGRIM = 1, - DATA_IONAR = 2, - DATA_LOKEN = 3, - DATA_VOLKHAN = 4, - - TYPE_BJARNGRIM = 10, - TYPE_IONAR = 11, - TYPE_LOKEN = 12, - TYPE_VOLKHAN = 13, + TYPE_BJARNGRIM = 0, + TYPE_VOLKHAN = 1, + TYPE_IONAR = 2, + TYPE_LOKEN = 3, NPC_BJARNGRIM = 28586, NPC_VOLKHAN = 28587, @@ -27,7 +22,30 @@ enum GO_VOLKHAN_DOOR = 191325, //_doors07 GO_IONAR_DOOR = 191326, //_doors05 GO_LOKEN_DOOR = 191324, //_doors02 - GO_LOKEN_THRONE = 192654 + GO_LOKEN_THRONE = 192654, + + ACHIEV_START_LOKEN_ID = 20384, +}; + +class MANGOS_DLL_DECL instance_halls_of_lightning : public ScriptedInstance +{ + public: + instance_halls_of_lightning(Map* pMap); + + void Initialize(); + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + const char* Save() { return m_strInstData.c_str(); } + void Load(const char* chrIn); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + std::string m_strInstData; }; #endif diff --git a/scripts/northrend/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp b/scripts/northrend/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp index bc3da73..3f028c8 100644 --- a/scripts/northrend/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp +++ b/scripts/northrend/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp @@ -31,185 +31,127 @@ EndScriptData */ 3 - Loken */ -struct MANGOS_DLL_DECL instance_halls_of_lightning : public ScriptedInstance +instance_halls_of_lightning::instance_halls_of_lightning(Map* pMap) : ScriptedInstance(pMap) { - instance_halls_of_lightning(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiGeneralBjarngrimGUID; - uint64 m_uiIonarGUID; - uint64 m_uiLokenGUID; - uint64 m_uiVolkhanGUID; + Initialize(); +} - uint64 m_uiVolkhanDoorGUID; - uint64 m_uiIonarDoorGUID; - uint64 m_uiLokenDoorGUID; - uint64 m_uiLokenGlobeGUID; +void instance_halls_of_lightning::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void Initialize() +void instance_halls_of_lightning::OnCreatureCreate(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiGeneralBjarngrimGUID = 0; - m_uiVolkhanGUID = 0; - m_uiIonarGUID = 0; - m_uiLokenGUID = 0; - - m_uiVolkhanDoorGUID = 0; - m_uiIonarDoorGUID = 0; - m_uiLokenDoorGUID = 0; - m_uiLokenGlobeGUID = 0; + case NPC_BJARNGRIM: + case NPC_IONAR: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } +} - void OnCreatureCreate(Creature* pCreature) +void instance_halls_of_lightning::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - switch(pCreature->GetEntry()) - { - case NPC_BJARNGRIM: - m_uiGeneralBjarngrimGUID = pCreature->GetGUID(); - break; - case NPC_VOLKHAN: - m_uiVolkhanGUID = pCreature->GetGUID(); - break; - case NPC_IONAR: - m_uiIonarGUID = pCreature->GetGUID(); - break; - case NPC_LOKEN: - m_uiLokenGUID = pCreature->GetGUID(); - break; - } + case GO_VOLKHAN_DOOR: + if (m_auiEncounter[TYPE_VOLKHAN] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_IONAR_DOOR: + if (m_auiEncounter[TYPE_IONAR] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_LOKEN_DOOR: + if (m_auiEncounter[TYPE_LOKEN] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_LOKEN_THRONE: + break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); +} - void OnObjectCreate(GameObject* pGo) +void instance_halls_of_lightning::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(pGo->GetEntry()) - { - case GO_VOLKHAN_DOOR: - m_uiVolkhanDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[1] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case GO_IONAR_DOOR: - m_uiIonarDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[2] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case GO_LOKEN_DOOR: - m_uiLokenDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[3] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case GO_LOKEN_THRONE: - m_uiLokenGlobeGUID = pGo->GetGUID(); - break; - } + case TYPE_BJARNGRIM: + m_auiEncounter[uiType] = uiData; + break; + case TYPE_VOLKHAN: + if (uiData == DONE) + DoUseDoorOrButton(GO_VOLKHAN_DOOR); + m_auiEncounter[uiType] = uiData; + break; + case TYPE_IONAR: + if (uiData == DONE) + DoUseDoorOrButton(GO_IONAR_DOOR); + m_auiEncounter[uiType] = uiData; + break; + case TYPE_LOKEN: + if (uiData == IN_PROGRESS) + DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_LOKEN_ID); + if (uiData == DONE) + { + DoUseDoorOrButton(GO_LOKEN_DOOR); + + //Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder + if (GameObject* pGlobe = GetSingleGameObjectFromStorage(GO_LOKEN_THRONE)) + pGlobe->SetGoState(GO_STATE_ACTIVE); + } + m_auiEncounter[uiType] = uiData; + break; } - void SetData(uint32 uiType, uint32 uiData) + if (uiData == DONE) { - switch(uiType) - { - case TYPE_BJARNGRIM: - m_auiEncounter[0] = uiData; - break; - case TYPE_VOLKHAN: - if (uiData == DONE) - DoUseDoorOrButton(m_uiVolkhanDoorGUID); - m_auiEncounter[1] = uiData; - break; - case TYPE_IONAR: - if (uiData == DONE) - DoUseDoorOrButton(m_uiIonarDoorGUID); - m_auiEncounter[2] = uiData; - break; - case TYPE_LOKEN: - if (uiData == DONE) - { - DoUseDoorOrButton(m_uiLokenDoorGUID); - - //Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder - if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID)) - pGlobe->SetGoState(GO_STATE_ACTIVE); - } - m_auiEncounter[3] = uiData; - break; - } - - if (uiData == DONE) - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - - strInstData = saveStream.str(); - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } - } + OUT_SAVE_INST_DATA; - const char* Save() - { - return strInstData.c_str(); - } + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - uint32 GetData(uint32 uiType) - { - switch(uiType) - { - case TYPE_BJARNGRIM: - return m_auiEncounter[0]; - case TYPE_VOLKHAN: - return m_auiEncounter[1]; - case TYPE_IONAR: - return m_auiEncounter[2]; - case TYPE_LOKEN: - return m_auiEncounter[3]; - } - return 0; - } + m_strInstData = saveStream.str(); - uint64 GetData64(uint32 uiData) - { - switch(uiData) - { - case DATA_BJARNGRIM: - return m_uiGeneralBjarngrimGUID; - case DATA_VOLKHAN: - return m_uiVolkhanGUID; - case DATA_IONAR: - return m_uiIonarGUID; - case DATA_LOKEN: - return m_uiLokenGUID; - } - return 0; + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - void Load(const char* in) - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } +uint32 instance_halls_of_lightning::GetData(uint32 uiType) +{ + if (uiType < MAX_ENCOUNTER) + return m_auiEncounter[uiType]; + + return 0; +} - OUT_LOAD_INST_DATA(in); +void instance_halls_of_lightning::Load(const char* chrIn) +{ + if (!chrIn) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - std::istringstream loadStream(in); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; + OUT_LOAD_INST_DATA(chrIn); - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; - OUT_LOAD_INST_DATA_COMPLETE; + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; } -}; + + OUT_LOAD_INST_DATA_COMPLETE; +} InstanceData* GetInstanceData_instance_halls_of_lightning(Map* pMap) { @@ -218,9 +160,10 @@ InstanceData* GetInstanceData_instance_halls_of_lightning(Map* pMap) void AddSC_instance_halls_of_lightning() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_halls_of_lightning"; - newscript->GetInstanceData = &GetInstanceData_instance_halls_of_lightning; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_halls_of_lightning"; + pNewScript->GetInstanceData = &GetInstanceData_instance_halls_of_lightning; + pNewScript->RegisterSelf(); } diff --git a/scripts/northrend/ulduar/ulduar/boss_hodir.cpp b/scripts/northrend/ulduar/ulduar/boss_hodir.cpp index 334c1b1..5484fa5 100644 --- a/scripts/northrend/ulduar/ulduar/boss_hodir.cpp +++ b/scripts/northrend/ulduar/ulduar/boss_hodir.cpp @@ -243,7 +243,7 @@ struct MANGOS_DLL_DECL boss_hodirAI : public ScriptedAI { //respawn all npc's if (m_pInstance) - for (std::list::iterator i = m_pInstance->m_lHodirMobsGUIDs.begin(); i != m_pInstance->m_lHodirMobsGUIDs.end(); i++) + for (GUIDList::iterator i = m_pInstance->m_lHodirMobsGUIDs.begin(); i != m_pInstance->m_lHodirMobsGUIDs.end(); i++) if (Creature *pTmp = m_pInstance->instance->GetCreature(*i)) if (!pTmp->isAlive()) pTmp->Respawn(); diff --git a/scripts/northrend/ulduar/ulduar/boss_ignis.cpp b/scripts/northrend/ulduar/ulduar/boss_ignis.cpp index 11e6dd4..a1fff16 100644 --- a/scripts/northrend/ulduar/ulduar/boss_ignis.cpp +++ b/scripts/northrend/ulduar/ulduar/boss_ignis.cpp @@ -247,7 +247,7 @@ struct MANGOS_DLL_DECL boss_ignisAI : public ScriptedAI m_bIsSlagPot = false; if (m_pInstance) - for (std::list::iterator i = m_pInstance->m_lIronConstructsGUIDs.begin(); i != m_pInstance->m_lIronConstructsGUIDs.end(); i++) + for (GUIDList::iterator i = m_pInstance->m_lIronConstructsGUIDs.begin(); i != m_pInstance->m_lIronConstructsGUIDs.end(); i++) if (Creature *pTmp = m_pInstance->instance->GetCreature(*i)) if (!pTmp->isAlive()) pTmp->Respawn(); @@ -283,7 +283,7 @@ struct MANGOS_DLL_DECL boss_ignisAI : public ScriptedAI { m_pInstance->SetData(TYPE_IGNIS, DONE); // destroy constructs - for (std::list::iterator i = m_pInstance->m_lIronConstructsGUIDs.begin(); i != m_pInstance->m_lIronConstructsGUIDs.end(); i++) + for (GUIDList::iterator i = m_pInstance->m_lIronConstructsGUIDs.begin(); i != m_pInstance->m_lIronConstructsGUIDs.end(); i++) if (Creature *pTmp = m_pInstance->instance->GetCreature(*i)) if (pTmp->isAlive()) pTmp->DealDamage(pTmp, pTmp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); diff --git a/scripts/northrend/ulduar/ulduar/boss_xt_002.cpp b/scripts/northrend/ulduar/ulduar/boss_xt_002.cpp index 5b94e5e..4dd6da5 100644 --- a/scripts/northrend/ulduar/ulduar/boss_xt_002.cpp +++ b/scripts/northrend/ulduar/ulduar/boss_xt_002.cpp @@ -755,7 +755,7 @@ CreatureAI* GetAI_boss_xt_002(Creature* pCreature) return new boss_xt_002AI(pCreature); } -void AddSC_boss_xt_002() +void AddSC_boss_xt002() { Script* NewScript; diff --git a/scripts/northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp b/scripts/northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp index 3ef6d27..e49d81d 100644 --- a/scripts/northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp +++ b/scripts/northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp @@ -158,7 +158,7 @@ struct MANGOS_DLL_DECL mob_vrykul_skeletonAI : public ScriptedAI if (urand(0, 3)) DoCastSpellIfCan(m_creature->getVictim(), SPELL_DECREPIFY_H); else if (m_pInstance && m_pInstance->GetData(TYPE_KELESETH) == IN_PROGRESS) - if (Creature* pKeleseth = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KELESETH))) + if (Creature* pKeleseth = m_pInstance->GetSingleCreatureFromStorage(NPC_KELESETH)) DoCastSpellIfCan(pKeleseth, SPELL_BONE_ARMOR); } diff --git a/scripts/northrend/utgarde_keep/utgarde_keep/boss_skarvald_and_dalronn.cpp b/scripts/northrend/utgarde_keep/utgarde_keep/boss_skarvald_and_dalronn.cpp index 6d20fd6..54ef768 100644 --- a/scripts/northrend/utgarde_keep/utgarde_keep/boss_skarvald_and_dalronn.cpp +++ b/scripts/northrend/utgarde_keep/utgarde_keep/boss_skarvald_and_dalronn.cpp @@ -80,20 +80,19 @@ struct MANGOS_DLL_DECL boss_s_and_d_dummyAI : public ScriptedAI { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - m_uiGhostGUID = 0; Reset(); } ScriptedInstance* m_pInstance; bool m_bIsRegularMode; - uint64 m_uiGhostGUID; + ObjectGuid m_ghostGuid; Creature* GetBuddy() { if (!m_pInstance) return NULL; - return m_pInstance->instance->GetCreature(m_pInstance->GetData64(m_creature->GetEntry() == NPC_DALRONN ? NPC_SKARVALD : NPC_DALRONN)); + return m_pInstance->GetSingleCreatureFromStorage(m_creature->GetEntry() == NPC_DALRONN ? NPC_SKARVALD : NPC_DALRONN); } void Reset() { } @@ -106,7 +105,7 @@ struct MANGOS_DLL_DECL boss_s_and_d_dummyAI : public ScriptedAI pBuddy->Respawn(); } - if (Creature* pGhost = m_creature->GetMap()->GetCreature(m_uiGhostGUID)) + if (Creature* pGhost = m_creature->GetMap()->GetCreature(m_ghostGuid)) { if (pGhost->isAlive()) pGhost->ForcedDespawn(); @@ -131,7 +130,7 @@ struct MANGOS_DLL_DECL boss_s_and_d_dummyAI : public ScriptedAI { // EventAI can probably handle ghosts if (pSummoned->GetEntry() == NPC_DAL_GHOST || pSummoned->GetEntry() == NPC_SKA_GHOST) - m_uiGhostGUID = pSummoned->GetGUID(); + m_ghostGuid = pSummoned->GetObjectGuid(); Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_TOPAGGRO,1); @@ -154,7 +153,7 @@ struct MANGOS_DLL_DECL boss_s_and_d_dummyAI : public ScriptedAI } else { - if (Creature* pGhost = m_creature->GetMap()->GetCreature(m_uiGhostGUID)) + if (Creature* pGhost = m_creature->GetMap()->GetCreature(m_ghostGuid)) pGhost->ForcedDespawn(); pBuddy->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); diff --git a/scripts/northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp b/scripts/northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp index 3cccba5..acc125f 100644 --- a/scripts/northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp +++ b/scripts/northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp @@ -25,17 +25,6 @@ EndScriptData */ #include "utgarde_keep.h" instance_utgarde_keep::instance_utgarde_keep(Map* pMap) : ScriptedInstance(pMap), - m_uiKelesethGUID(0), - m_uiSkarvaldGUID(0), - m_uiDalronnGUID(0), - m_uiIngvarGUID(0), - - m_uiBellow1GUID(0), - m_uiBellow2GUID(0), - m_uiBellow3GUID(0), - m_uiForgeFire1GUID(0), - m_uiForgeFire2GUID(0), - m_uiForgeFire3GUID(0), m_bKelesethAchievFailed(false) { Initialize(); @@ -50,48 +39,47 @@ void instance_utgarde_keep::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_KELESETH: m_uiKelesethGUID = pCreature->GetGUID(); break; - case NPC_SKARVALD: m_uiSkarvaldGUID = pCreature->GetGUID(); break; - case NPC_DALRONN: m_uiDalronnGUID = pCreature->GetGUID(); break; - case NPC_INGVAR: m_uiIngvarGUID = pCreature->GetGUID(); break; + case NPC_KELESETH: + case NPC_SKARVALD: + case NPC_DALRONN: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } void instance_utgarde_keep::OnObjectCreate(GameObject* pGo) { - switch(pGo->GetEntry()) + switch (pGo->GetEntry()) { case GO_BELLOW_1: - m_uiBellow1GUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BELLOW_1] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_BELLOW_2: - m_uiBellow2GUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BELLOW_2] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_BELLOW_3: - m_uiBellow3GUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BELLOW_3] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_FORGEFIRE_1: - m_uiForgeFire1GUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BELLOW_1] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_FORGEFIRE_2: - m_uiForgeFire2GUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BELLOW_2] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_FORGEFIRE_3: - m_uiForgeFire3GUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_BELLOW_3] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_utgarde_keep::OnCreatureDeath(Creature* pCreature) @@ -147,25 +135,6 @@ uint32 instance_utgarde_keep::GetData(uint32 uiType) return 0; } -uint64 instance_utgarde_keep::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_KELESETH: return m_uiKelesethGUID; - case NPC_SKARVALD: return m_uiSkarvaldGUID; - case NPC_DALRONN: return m_uiDalronnGUID; - case NPC_INGVAR: return m_uiIngvarGUID; - case GO_BELLOW_1: return m_uiBellow1GUID; - case GO_BELLOW_2: return m_uiBellow2GUID; - case GO_BELLOW_3: return m_uiBellow3GUID; - case GO_FORGEFIRE_1: return m_uiForgeFire1GUID; - case GO_FORGEFIRE_2: return m_uiForgeFire2GUID; - case GO_FORGEFIRE_3: return m_uiForgeFire3GUID; - default: - return 0; - } -} - void instance_utgarde_keep::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp b/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp index 77c8c85..70f2239 100644 --- a/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp +++ b/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp @@ -68,7 +68,7 @@ struct MANGOS_DLL_DECL mob_dragonflayer_forge_masterAI : public ScriptedAI uint32 uiGOBellow = 0; uint32 uiGOFire = 0; - for(uint8 i = 0; i < MAX_FORGE; ++i) + for (uint8 i = 0; i < MAX_FORGE; ++i) { switch(i) { @@ -77,7 +77,7 @@ struct MANGOS_DLL_DECL mob_dragonflayer_forge_masterAI : public ScriptedAI case 2: uiGOBellow = GO_BELLOW_3; break; } - if (GameObject* pGOTemp = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(uiGOBellow))) + if (GameObject* pGOTemp = m_pInstance->GetSingleGameObjectFromStorage(uiGOBellow)) lGOList.push_back(pGOTemp); } @@ -100,7 +100,7 @@ struct MANGOS_DLL_DECL mob_dragonflayer_forge_masterAI : public ScriptedAI case GO_BELLOW_3: uiGOFire = GO_FORGEFIRE_3; m_uiForgeEncounterId = TYPE_BELLOW_3; break; } - if (GameObject* pGOTemp = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(uiGOFire))) + if (GameObject* pGOTemp = m_pInstance->GetSingleGameObjectFromStorage(uiGOFire)) { if (pGOTemp->getLootState() == GO_READY) pGOTemp->UseDoorOrButton(DAY); diff --git a/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.h b/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.h index 6ebce4e..aa130a2 100644 --- a/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.h +++ b/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.h @@ -48,7 +48,6 @@ class MANGOS_DLL_DECL instance_utgarde_keep : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -59,18 +58,6 @@ class MANGOS_DLL_DECL instance_utgarde_keep : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiKelesethGUID; - uint64 m_uiSkarvaldGUID; - uint64 m_uiDalronnGUID; - uint64 m_uiIngvarGUID; - - uint64 m_uiBellow1GUID; - uint64 m_uiBellow2GUID; - uint64 m_uiBellow3GUID; - uint64 m_uiForgeFire1GUID; - uint64 m_uiForgeFire2GUID; - uint64 m_uiForgeFire3GUID; - bool m_bKelesethAchievFailed; }; diff --git a/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp b/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp index e33e146..fa7ce61 100644 --- a/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp +++ b/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_utgarde_pinnacle.cpp @@ -24,121 +24,96 @@ EndScriptData */ #include "precompiled.h" #include "utgarde_pinnacle.h" -struct MANGOS_DLL_DECL instance_pinnacle : public ScriptedInstance +instance_pinnacle::instance_pinnacle(Map* pMap) : ScriptedInstance(pMap) { - instance_pinnacle(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; + Initialize(); +} - uint64 m_uiSkadiDoorGUID; +void instance_pinnacle::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void Initialize() +void instance_pinnacle::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + case GO_DOOR_SKADI: + if (m_auiEncounter[TYPE_SKADI] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + m_mGoEntryGuidStore[GO_DOOR_SKADI] = pGo->GetObjectGuid(); + break; + } +} - m_uiSkadiDoorGUID = 0; +void instance_pinnacle::SetData(uint32 uiType, uint32 uiData) +{ + switch (uiType) + { + case TYPE_SVALA: + m_auiEncounter[uiType] = uiData; + break; + case TYPE_GORTOK: + m_auiEncounter[uiType] = uiData; + break; + case TYPE_SKADI: + if (uiData == DONE) + DoUseDoorOrButton(GO_DOOR_SKADI); + + m_auiEncounter[uiType] = uiData; + break; + case TYPE_YMIRON: + m_auiEncounter[uiType] = uiData; + break; + default: + error_log("SD2: Instance Pinnacle: SetData = %u for type %u does not exist/not implemented.", uiType, uiData); + return; } - void OnObjectCreate(GameObject* pGo) + // Saving also SPECIAL for this instance + if (uiData == DONE || uiData == SPECIAL) { - switch(pGo->GetEntry()) - { - case GO_DOOR_SKADI: - m_uiSkadiDoorGUID = pGo->GetGUID(); + OUT_SAVE_INST_DATA; - if (m_auiEncounter[2] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - break; - } - } + m_strInstData = saveStream.str(); - void SetData(uint32 uiType, uint32 uiData) - { - debug_log("SD2: Instance Pinnacle: SetData received for type %u with data %u", uiType, uiData); - - switch(uiType) - { - case TYPE_SVALA: - m_auiEncounter[0] = uiData; - break; - case TYPE_GORTOK: - m_auiEncounter[1] = uiData; - break; - case TYPE_SKADI: - if (uiData == DONE) - DoUseDoorOrButton(m_uiSkadiDoorGUID); - - m_auiEncounter[2] = uiData; - break; - case TYPE_YMIRON: - m_auiEncounter[3] = uiData; - break; - default: - error_log("SD2: Instance Pinnacle: SetData = %u for type %u does not exist/not implemented.", uiType, uiData); - break; - } - - //saving also SPECIAL for this instance - if (uiData == DONE || uiData == SPECIAL) - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; - - strInstData = saveStream.str(); - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - uint32 GetData(uint32 uiType) - { - switch(uiType) - { - case TYPE_SVALA: - return m_auiEncounter[0]; - case TYPE_GORTOK: - return m_auiEncounter[1]; - case TYPE_SKADI: - return m_auiEncounter[2]; - case TYPE_YMIRON: - return m_auiEncounter[3]; - } - - return 0; - } +uint32 instance_pinnacle::GetData(uint32 uiType) +{ + if (uiType < MAX_ENCOUNTER) + return m_auiEncounter[uiType]; - const char* Save() - { - return strInstData.c_str(); - } + return 0; +} - void Load(const char* chrIn) +void instance_pinnacle::Load(const char* chrIn) +{ + if (!chrIn) { - if (!chrIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(chrIn); + OUT_LOAD_INST_DATA_FAIL; + return; + } - std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; + OUT_LOAD_INST_DATA(chrIn); - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; - OUT_LOAD_INST_DATA_COMPLETE; + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; } -}; + + OUT_LOAD_INST_DATA_COMPLETE; +} InstanceData* GetInstanceData_instance_pinnacle(Map* pMap) { @@ -147,10 +122,10 @@ InstanceData* GetInstanceData_instance_pinnacle(Map* pMap) void AddSC_instance_pinnacle() { - Script* newscript; + Script* pNewScript; - newscript = new Script; - newscript->Name = "instance_pinnacle"; - newscript->GetInstanceData = &GetInstanceData_instance_pinnacle; - newscript->RegisterSelf(); + pNewScript = new Script; + pNewScript->Name = "instance_pinnacle"; + pNewScript->GetInstanceData = &GetInstanceData_instance_pinnacle; + pNewScript->RegisterSelf(); } diff --git a/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h b/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h index 1babe3d..5e0c25e 100644 --- a/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h +++ b/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h @@ -23,4 +23,24 @@ enum NPC_RHINO = 26686 }; +class MANGOS_DLL_DECL instance_pinnacle : public ScriptedInstance +{ + public: + instance_pinnacle(Map* pMap); + + void Initialize(); + + void OnObjectCreate(GameObject* pGo); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + const char* Save() { return m_strInstData.c_str(); } + void Load(const char* chrIn); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + std::string m_strInstData; +}; + #endif diff --git a/scripts/northrend/vault_of_archavon/boss_emalon.cpp b/scripts/northrend/vault_of_archavon/boss_emalon.cpp index 1f57998..be7fa6c 100644 --- a/scripts/northrend/vault_of_archavon/boss_emalon.cpp +++ b/scripts/northrend/vault_of_archavon/boss_emalon.cpp @@ -133,7 +133,7 @@ struct MANGOS_DLL_DECL npc_tempest_minionAI : public ScriptedAI if (m_uiEvadeCheckCooldown < uiDiff) { - Creature* pEmalon = m_creature->GetMap()->GetCreature( m_pInstance->GetData64(DATA_EMALON)); + Creature* pEmalon = m_pInstance->GetSingleCreatureFromStorage(NPC_EMALON); if ((pEmalon && pEmalon->IsInEvadeMode()) || (m_creature->GetDistance2d(-219.119f, -289.037f) > 80.0f)) { EnterEvadeMode(); @@ -212,7 +212,7 @@ struct MANGOS_DLL_DECL boss_emalonAI : public ScriptedAI bool m_bIsRegularMode; uint32 m_uiEvadeCheckCooldown; - uint64 m_auiTempestMinionGUID[4]; + Creature* m_auiTempestMinion[4]; uint32 m_uiChainLightningTimer; uint32 m_uiChainLightningCount; uint32 m_uiLightningNovaTimer; @@ -222,7 +222,6 @@ struct MANGOS_DLL_DECL boss_emalonAI : public ScriptedAI void Reset() { m_uiEvadeCheckCooldown = 2000; - memset(&m_auiTempestMinionGUID, 0, sizeof(m_auiTempestMinionGUID)); m_uiChainLightningTimer = 15000; m_uiChainLightningCount = 0; m_uiLightningNovaTimer = 20000; @@ -231,15 +230,15 @@ struct MANGOS_DLL_DECL boss_emalonAI : public ScriptedAI if (m_pInstance) { - m_auiTempestMinionGUID[0] = m_pInstance->GetData64(DATA_TEMPEST_MINION_1); - m_auiTempestMinionGUID[1] = m_pInstance->GetData64(DATA_TEMPEST_MINION_2); - m_auiTempestMinionGUID[2] = m_pInstance->GetData64(DATA_TEMPEST_MINION_3); - m_auiTempestMinionGUID[3] = m_pInstance->GetData64(DATA_TEMPEST_MINION_4); + m_auiTempestMinion[0] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_1); + m_auiTempestMinion[1] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_2); + m_auiTempestMinion[2] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_3); + m_auiTempestMinion[3] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_4); } for (uint8 i=0; i<4; ++i) { - Creature* pMinion = m_creature->GetMap()->GetCreature( m_auiTempestMinionGUID[i]); + Creature* pMinion = m_auiTempestMinion[i]; if (pMinion && pMinion->isDead()) pMinion->Respawn(); } @@ -252,10 +251,10 @@ struct MANGOS_DLL_DECL boss_emalonAI : public ScriptedAI { if (m_pInstance) { - m_auiTempestMinionGUID[0] = m_pInstance->GetData64(DATA_TEMPEST_MINION_1); - m_auiTempestMinionGUID[1] = m_pInstance->GetData64(DATA_TEMPEST_MINION_2); - m_auiTempestMinionGUID[2] = m_pInstance->GetData64(DATA_TEMPEST_MINION_3); - m_auiTempestMinionGUID[3] = m_pInstance->GetData64(DATA_TEMPEST_MINION_4); + m_auiTempestMinion[0] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_1); + m_auiTempestMinion[1] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_2); + m_auiTempestMinion[2] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_3); + m_auiTempestMinion[3] = m_pInstance->GetSingleCreatureFromStorage(DATA_TEMPEST_MINION_4); } m_creature->CallForHelp(80.0f); @@ -270,7 +269,7 @@ struct MANGOS_DLL_DECL boss_emalonAI : public ScriptedAI m_pInstance->SetData(TYPE_EMALON, DONE); for (uint8 i=0; i<4; ++i) { - Creature *pMinion = m_creature->GetMap()->GetCreature( m_auiTempestMinionGUID[i]); + Creature* pMinion = m_auiTempestMinion[i]; if (pMinion) pMinion->DealDamage(pMinion, pMinion->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -293,7 +292,7 @@ struct MANGOS_DLL_DECL boss_emalonAI : public ScriptedAI if (m_uiOverchargeTimer < uiDiff) { - Creature* pMinion = m_creature->GetMap()->GetCreature( m_auiTempestMinionGUID[rand()%4]); + Creature* pMinion = m_auiTempestMinion[rand()%4]; if(pMinion && pMinion->isAlive()) { m_creature->MonsterTextEmote("%s overcharges Tempest Minion!",NULL, true); diff --git a/scripts/northrend/vault_of_archavon/instance_vault_of_archavon.cpp b/scripts/northrend/vault_of_archavon/instance_vault_of_archavon.cpp index 1aee00f..b6fecbe 100644 --- a/scripts/northrend/vault_of_archavon/instance_vault_of_archavon.cpp +++ b/scripts/northrend/vault_of_archavon/instance_vault_of_archavon.cpp @@ -31,25 +31,11 @@ struct MANGOS_DLL_DECL instance_vault_of_archavon : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string strInstData; - uint64 m_uiArchavonGUID; - uint64 m_uiEmalonGUID; - uint64 m_uiKoralonGUID; - uint64 m_uiTempestMinion1GUID; - uint64 m_uiTempestMinion2GUID; - uint64 m_uiTempestMinion3GUID; - uint64 m_uiTempestMinion4GUID; uint8 m_uiMinion; void Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - m_uiArchavonGUID = 0; - m_uiEmalonGUID = 0; - m_uiKoralonGUID = 0; - m_uiTempestMinion1GUID = 0; - m_uiTempestMinion2GUID = 0; - m_uiTempestMinion3GUID = 0; - m_uiTempestMinion4GUID = 0; m_uiMinion = 0; } @@ -57,32 +43,24 @@ struct MANGOS_DLL_DECL instance_vault_of_archavon : public ScriptedInstance { switch (pCreature->GetEntry()) { + case NPC_TORAVON: case NPC_ARCHAVON: - m_uiArchavonGUID = pCreature->GetGUID(); - break; case NPC_EMALON: - m_uiEmalonGUID = pCreature->GetGUID(); - break; case NPC_KORALON: - m_uiKoralonGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); break; case NPC_TEMPEST_MINION: - ++m_uiMinion; switch (m_uiMinion) { + case 0: case 1: - m_uiTempestMinion1GUID = pCreature->GetGUID(); - break; case 2: - m_uiTempestMinion2GUID = pCreature->GetGUID(); - break; case 3: - m_uiTempestMinion3GUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[m_uiMinion + DATA_TEMPEST_MINION_1] = pCreature->GetObjectGuid(); + ++m_uiMinion; break; case 4: - m_uiTempestMinion4GUID = pCreature->GetGUID(); - break; - case 5: + default: m_uiMinion = 0; break; } @@ -138,27 +116,7 @@ struct MANGOS_DLL_DECL instance_vault_of_archavon : public ScriptedInstance return 0; } - uint64 GetData64(uint32 uiData) - { - switch (uiData) - { - case DATA_ARCHAVON: - return m_uiArchavonGUID; - case DATA_EMALON: - return m_uiEmalonGUID; - case DATA_KORALON: - return m_uiKoralonGUID; - case DATA_TEMPEST_MINION_1: - return m_uiTempestMinion1GUID; - case DATA_TEMPEST_MINION_2: - return m_uiTempestMinion2GUID; - case DATA_TEMPEST_MINION_3: - return m_uiTempestMinion3GUID; - case DATA_TEMPEST_MINION_4: - return m_uiTempestMinion4GUID; - } - return 0; - } + const char* Save() { return strInstData.c_str(); diff --git a/scripts/northrend/vault_of_archavon/vault_of_archavon.h b/scripts/northrend/vault_of_archavon/vault_of_archavon.h index 507cde4..2f74300 100644 --- a/scripts/northrend/vault_of_archavon/vault_of_archavon.h +++ b/scripts/northrend/vault_of_archavon/vault_of_archavon.h @@ -9,23 +9,22 @@ enum { MAX_ENCOUNTER = 4, - DATA_ARCHAVON = 1, - DATA_EMALON = 2, - DATA_KORALON = 3, - DATA_TEMPEST_MINION_1 = 4, - DATA_TEMPEST_MINION_2 = 5, - DATA_TEMPEST_MINION_3 = 6, - DATA_TEMPEST_MINION_4 = 7, + TYPE_ARCHAVON = 0, + TYPE_EMALON = 1, + TYPE_KORALON = 2, + TYPE_TORAVON = 3, - TYPE_ARCHAVON = 8, - TYPE_EMALON = 9, - TYPE_KORALON = 10, - TYPE_TORAVON = 11, + DATA_TEMPEST_MINION_1 = 101, + DATA_TEMPEST_MINION_2 = 102, + DATA_TEMPEST_MINION_3 = 103, + DATA_TEMPEST_MINION_4 = 104, + + NPC_TORAVON = 38433, NPC_ARCHAVON = 31125, NPC_EMALON = 33993, NPC_KORALON = 35013, - NPC_TEMPEST_MINION = 33998 + NPC_TEMPEST_MINION = 33998, }; #endif diff --git a/scripts/northrend/violet_hold/boss_cyanigosa.cpp b/scripts/northrend/violet_hold/boss_cyanigosa.cpp index dcb0dd8..eb2df41 100644 --- a/scripts/northrend/violet_hold/boss_cyanigosa.cpp +++ b/scripts/northrend/violet_hold/boss_cyanigosa.cpp @@ -27,16 +27,16 @@ EndScriptData */ enum { - SAY_AGGRO = -1608008, - SAY_SLAY_1 = -1608009, - SAY_SLAY_2 = -1608010, - SAY_SLAY_3 = -1608011, - SAY_DEATH = -1608012, - SAY_SPAWN = -1608013, - SAY_DISRUPTION = -1608014, - SAY_BREATH_ATTACK = -1608015, - SAY_SPECIAL_ATTACK_1 = -1608016, - SAY_SPECIAL_ATTACK_2 = -1608017, + SAY_AGGRO = -1608046, + SAY_SLAY_1 = -1608051, + SAY_SLAY_2 = -1608052, + SAY_SLAY_3 = -1608053, + SAY_DEATH = -1608054, + SAY_SPAWN = -1608045, + SAY_DISRUPTION = -1608050, + SAY_BREATH_ATTACK = -1608047, + SAY_SPECIAL_ATTACK_1 = -1608048, + SAY_SPECIAL_ATTACK_2 = -1608049, SPELL_ARCANE_VACUM = 58694, SPELL_BLIZZARD = 58693, @@ -79,10 +79,21 @@ struct MANGOS_DLL_DECL boss_cyanigosaAI : public ScriptedAI m_creature->SetInCombatWithZone(); } + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_CYANIGOSA, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + } + } + void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); DoCast(m_creature, SPELL_CYANIGOSA_TRANSFORM); + m_pInstance->SetData(TYPE_CYANIGOSA, IN_PROGRESS); } void UpdateAI(const uint32 uiDiff) @@ -93,7 +104,7 @@ struct MANGOS_DLL_DECL boss_cyanigosaAI : public ScriptedAI if (m_uiUncontrollableEnergy_Timer < uiDiff) { - DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_UNCONTROLLABLE_ENERGY_H : SPELL_UNCONTROLLABLE_ENERGY); + DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_UNCONTROLLABLE_ENERGY : SPELL_UNCONTROLLABLE_ENERGY_H); m_uiUncontrollableEnergy_Timer = urand(15000, 16000); } else @@ -111,7 +122,7 @@ struct MANGOS_DLL_DECL boss_cyanigosaAI : public ScriptedAI if (m_uiBlizzard_Timer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - DoCast(pTarget, m_bIsRegularMode ? SPELL_BLIZZARD_H : SPELL_BLIZZARD); + DoCast(pTarget, m_bIsRegularMode ? SPELL_BLIZZARD: SPELL_BLIZZARD_H ); m_uiBlizzard_Timer = urand(20000, 25000); } else @@ -120,6 +131,15 @@ struct MANGOS_DLL_DECL boss_cyanigosaAI : public ScriptedAI if (m_uiArcaneVacuum_Timer < uiDiff) { DoCast(m_creature, SPELL_ARCANE_VACUM); + Map* pMap = m_creature->GetMap(); + if (pMap && pMap->IsDungeon()) + { + Map::PlayerList const &PlayerList = pMap->GetPlayers(); + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (i->getSource()->isAlive()) + DoTeleportPlayer(i->getSource(), m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), i->getSource()->GetOrientation()); + } DoResetThreat(); m_uiArcaneVacuum_Timer = urand(28000, 33000); } @@ -128,7 +148,7 @@ struct MANGOS_DLL_DECL boss_cyanigosaAI : public ScriptedAI if (m_uiTailSweep_Timer < uiDiff) { - DoCast(m_creature, m_bIsRegularMode ? SPELL_TAIL_SWEEP_H : SPELL_TAIL_SWEEP); + DoCast(m_creature, m_bIsRegularMode ? SPELL_TAIL_SWEEP : SPELL_TAIL_SWEEP_H); m_uiTailSweep_Timer = urand(10000, 11000); } else @@ -142,7 +162,11 @@ struct MANGOS_DLL_DECL boss_cyanigosaAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); if (m_pInstance) - m_pInstance->SetData(TYPE_CYANIGOSA,DONE); + { + m_pInstance->SetData(TYPE_RIFT, DONE); + m_pInstance->SetData(TYPE_EVENT, DONE); + m_pInstance->SetData(TYPE_CYANIGOSA, DONE); + } } void KilledUnit(Unit* pVictim) diff --git a/scripts/northrend/violet_hold/boss_erekem.cpp b/scripts/northrend/violet_hold/boss_erekem.cpp index 315cf13..1a73ddc 100644 --- a/scripts/northrend/violet_hold/boss_erekem.cpp +++ b/scripts/northrend/violet_hold/boss_erekem.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,7 +17,7 @@ /* ScriptData SDName: boss_erekem SDAuthor: ckegg -SD%Complete: 0 +SD%Complete: 50% SDComment: SDCategory: The Violet Hold EndScriptData */ @@ -27,14 +27,14 @@ EndScriptData */ enum { - SAY_AGGRO = -1608018, - SAY_SLAY_1 = -1608019, - SAY_SLAY_2 = -1608020, - SAY_SLAY_3 = -1608021, - SAY_DEATH = -1608022, - SAY_SPAWN = -1608023, - SAY_ADD_KILED = -1608024, - SAY_BOTH_ADDS_KILED = -1608025, + SAY_AGGRO = -1608010, + SAY_SLAY_1 = -1608011, + SAY_SLAY_2 = -1608012, + SAY_SLAY_3 = -1608013, + SAY_DEATH = -1608014, + SAY_SPAWN = -1608015, + SAY_ADD_KILED = -1608016, + SAY_BOTH_ADDS_KILED = -1608017, SPELL_BLOODLUST = 54516, SPELL_BREAK_BONDS = 59463, @@ -80,7 +80,7 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI m_bIsAddDead = false; MovementStarted = false; m_uiLightningBolt_Timer = 2000; - m_uiEarthShield_Timer = urand(15000, 20000); + m_uiEarthShield_Timer = urand(10000, 15000); m_uiEarthShock_Timer = urand(12000, 17000); m_uiChainHeal_Timer = urand(5000, 25000); m_uiBreakBonds_Timer = urand(25000, 30000); @@ -95,14 +95,22 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI if ((*iter)->isDead()) (*iter)->Respawn(); - m_pInstance->SetData(TYPE_EREKEM, NOT_STARTED); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_EREKEM, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, NOT_STARTED);} + else {m_pInstance->SetData(TYPE_PORTAL12, NOT_STARTED);} + } + } void Aggro(Unit* pWho) { if (!m_pInstance) return; @@ -138,7 +146,7 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI if ((*iter)->isAlive()) { (*iter)->AddThreat(pWho, 0.0f); - (*iter)->AI()->AttackStart(pWho); + /* (*iter)->AI()->AttackStart(pWho);*/ } } } @@ -147,9 +155,7 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetInCombatWithZone(); MovementStarted = true; @@ -179,8 +185,8 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI if (m_uiEarthShield_Timer < uiDiff) { m_creature->InterruptNonMeleeSpells(false); - DoCast(m_creature, m_bIsRegularMode ? SPELL_EARTH_SHIELD_H : SPELL_EARTH_SHIELD); - m_uiEarthShield_Timer = urand(15000, 20000); + DoCast(m_creature, m_bIsRegularMode ? SPELL_EARTH_SHIELD : SPELL_EARTH_SHIELD_H); + m_uiEarthShield_Timer = urand(25000, 30000); } else m_uiEarthShield_Timer -= uiDiff; @@ -196,7 +202,7 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI if (m_uiChainHeal_Timer < uiDiff) { //m_creature->InterruptNonMeleeSpells(false); - DoCast(m_creature, m_bIsRegularMode ? SPELL_CHAIN_HEAL_H : SPELL_CHAIN_HEAL); + DoCast(m_creature, m_bIsRegularMode ? SPELL_CHAIN_HEAL : SPELL_CHAIN_HEAL_H); m_uiChainHeal_Timer = urand(5000, 25000); } else m_uiChainHeal_Timer -= uiDiff; @@ -232,22 +238,16 @@ struct MANGOS_DLL_DECL boss_erekemAI : public ScriptedAI } } - void JustReachedHome() - { - if(m_pInstance) - { - m_pInstance->SetData(TYPE_MAIN,FAIL); - m_pInstance->SetData(TYPE_EREKEM,FAIL); - m_creature->ForcedDespawn(); - } - } - void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); - if (m_pInstance) + if (m_pInstance) { m_pInstance->SetData(TYPE_EREKEM, DONE); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, DONE);} + else {m_pInstance->SetData(TYPE_PORTAL12, DONE);} + + } } void KilledUnit(Unit* pVictim) @@ -273,24 +273,31 @@ struct MANGOS_DLL_DECL mob_erekem_guardAI : public ScriptedAI uint32 m_uiGushingWound_Timer; uint32 m_uiHowlingScreech_Timer; uint32 m_uiStrike_Timer; + uint32 m_uiBloodlust_Timer; bool MovementStarted; void Reset() { m_uiGushingWound_Timer = urand(5000, 10000); + m_uiBloodlust_Timer = urand(25000, 30000); m_uiHowlingScreech_Timer = urand(12000, 15000); m_uiStrike_Timer = urand(10000, 11000); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = false; + } void Aggro(Unit* pWho) { if (!m_pInstance) return; + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->GetMotionMaster()->MovementExpired(); SetCombatMovement(true); } - void AttackStart(Unit* pWho) + /* void AttackStart(Unit* pWho) { if (!m_pInstance) return; @@ -308,13 +315,17 @@ struct MANGOS_DLL_DECL mob_erekem_guardAI : public ScriptedAI m_creature->SetInCombatWith(pWho); pWho->SetInCombatWith(m_creature); DoStartMovement(pWho); + m_creature->GetMotionMaster()->MovementExpired(); + SetCombatMovement(true); } - } + }*/ void StartMovement(uint32 id) { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = true; m_creature->SetInCombatWithZone(); } @@ -324,7 +335,6 @@ struct MANGOS_DLL_DECL mob_erekem_guardAI : public ScriptedAI if (type != POINT_MOTION_TYPE || !MovementStarted) return; if (id == 0) { - MovementStarted = false; m_creature->GetMotionMaster()->MovementExpired(); SetCombatMovement(true); m_creature->SetInCombatWithZone(); @@ -333,10 +343,10 @@ struct MANGOS_DLL_DECL mob_erekem_guardAI : public ScriptedAI void UpdateAI(const uint32 uiDiff) { - if (m_pInstance->GetData(TYPE_EREKEM) == SPECIAL && !MovementStarted) - { + if (!m_pInstance) return; + + if (m_pInstance->GetData(TYPE_EREKEM) == IN_PROGRESS && !MovementStarted && !m_creature->getVictim()) StartMovement(0); - } //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) @@ -349,6 +359,19 @@ struct MANGOS_DLL_DECL mob_erekem_guardAI : public ScriptedAI } else m_uiGushingWound_Timer -= uiDiff; + if (m_uiBloodlust_Timer < uiDiff) + { + if (m_pInstance) + if (Creature* pErekem = m_pInstance->GetSingleCreatureFromStorage(DATA_EREKEM)) + if (pErekem->isAlive()) + { + pErekem->InterruptNonMeleeSpells(false); + pErekem->CastSpell(pErekem, SPELL_BLOODLUST, false); + m_uiBloodlust_Timer = urand(25000, 30000); + } + } + else m_uiBloodlust_Timer -= uiDiff; + if (m_uiHowlingScreech_Timer < uiDiff) { DoCast(m_creature, SPELL_HOWLING_SCREECH); @@ -369,12 +392,12 @@ struct MANGOS_DLL_DECL mob_erekem_guardAI : public ScriptedAI void JustDied(Unit* pKiller) { if (m_pInstance) - if (Creature* pErekem = ((Creature*)m_creature->GetMap()->GetUnit( m_pInstance->GetData64(DATA_EREKEM)))) + if (Creature* pErekem = m_pInstance->GetSingleCreatureFromStorage(DATA_EREKEM)) if (pErekem->isAlive()) { DoScriptText(SAY_ADD_KILED, pErekem); - pErekem->InterruptNonMeleeSpells(false); - pErekem->CastSpell(pErekem, SPELL_BLOODLUST, false); + // pErekem->InterruptNonMeleeSpells(false); + // pErekem->CastSpell(pErekem, SPELL_BLOODLUST, false); ((boss_erekemAI*)pErekem->AI())->m_bIsAddDead = true; } } diff --git a/scripts/northrend/violet_hold/boss_ichoron.cpp b/scripts/northrend/violet_hold/boss_ichoron.cpp index d4e2c0b..5f674b1 100644 --- a/scripts/northrend/violet_hold/boss_ichoron.cpp +++ b/scripts/northrend/violet_hold/boss_ichoron.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,7 +17,7 @@ /* ScriptData SDName: boss_ichoron SDAuthor: ckegg -SD%Complete: 0 +SD%Complete: 30% SDComment: SDCategory: The Violet Hold EndScriptData */ @@ -28,15 +28,16 @@ EndScriptData */ enum { - SAY_AGGRO = -1608026, - SAY_SLAY_1 = -1608027, - SAY_SLAY_2 = -1608028, - SAY_SLAY_3 = -1608029, - SAY_DEATH = -1608030, - SAY_SPAWN = -1608031, - SAY_ENRAGE = -1608032, - SAY_SHATTER = -1608033, - SAY_BUBBLE = -1608034, + SAY_AGGRO = -1608018, + SAY_SLAY_1 = -1608019, + SAY_SLAY_2 = -1608020, + SAY_SLAY_3 = -1608021, + SAY_DEATH = -1608022, + SAY_SPAWN = -1608023, + SAY_ENRAGE = -1608024, + SAY_SHATTER = -1608025, + SAY_BUBBLE = -1608026, + EMOTE_ICHORON_PROTECTIVE_BUBBLE = -1608008, SPELL_DRAINED = 59820, SPELL_FRENZY = 54312, @@ -49,6 +50,10 @@ enum NPC_ICHOR_GLOBULE = 29321, SPELL_SPLASH = 59516, + SPELL_WATER_GLOBULE = 54268, + SPELL_WATER_GLOBULE_2 = 54260, + GLOBULE_HEAL_H = 9000, + GLOBULE_HEAL = 5000 }; struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI @@ -60,7 +65,7 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI Reset(); } ScriptedInstance *m_pInstance; - std::list m_lWaterElementsGUIDList; + std::list m_lWaterElementsGUIDList; bool m_bIsRegularMode; bool m_bIsExploded; @@ -70,30 +75,42 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI uint32 m_uiBuubleChecker_Timer; uint32 m_uiWaterBoltVolley_Timer; uint32 m_uiShowup_Counter; + uint32 m_uiVisible_Timer; + uint32 m_uiHealth; void Reset() { if (!m_pInstance) return; + DoCastSpellIfCan(m_creature, SPELL_PROTECTIVE_BUBBLE); m_bIsExploded = false; m_bIsFrenzy = false; MovementStarted = false; m_uiBuubleChecker_Timer = 1000; - m_uiWaterBoltVolley_Timer = urand(10000, 15000); - m_uiShowup_Counter = 0; + // m_uiDrained_Timer = 1000; + m_uiVisible_Timer = 0; + m_uiWaterBoltVolley_Timer = urand(5000, 10000); + // m_uiShowup_Counter = 0; m_creature->SetVisibility(VISIBILITY_ON); - DespawnWaterElements(); - - m_pInstance->SetData(TYPE_ICHORON, NOT_STARTED); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DespawnWaterElements(); } + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_ICHORON, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, NOT_STARTED);} + else {m_pInstance->SetData(TYPE_PORTAL12, NOT_STARTED);} + } + } void Aggro(Unit* pWho) { - if (m_pInstance) return; + if (!m_pInstance) return; DoScriptText(SAY_AGGRO, m_creature); m_pInstance->SetData(TYPE_ICHORON, IN_PROGRESS); @@ -115,7 +132,6 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI if (m_creature->Attack(pWho, true)) { -// DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE); m_creature->AddThreat(pWho); m_creature->SetInCombatWith(pWho); pWho->SetInCombatWith(m_creature); @@ -125,31 +141,39 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI void WaterElementHit() { - m_creature->SetHealth(m_creature->GetHealth() + m_creature->GetMaxHealth() * 0.01); - if (m_bIsExploded) - { - DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE); - m_bIsExploded = false; - m_creature->SetVisibility(VISIBILITY_ON); - m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - } + if (Creature* pIchoron = m_pInstance->GetSingleCreatureFromStorage(DATA_ICHORON)) + { + if(pIchoron->isAlive()) + { + pIchoron->ModifyHealth( m_bIsRegularMode ? GLOBULE_HEAL : GLOBULE_HEAL_H); + if (m_bIsExploded) + { + if(m_creature->HasAura(SPELL_DRAINED)) + { + m_creature->RemoveAurasByCasterSpell(SPELL_DRAINED,m_creature->GetObjectGuid()); + } + m_creature->SetVisibility(VISIBILITY_ON); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + } + } + } } void JustSummoned(Creature* pSummoned) { pSummoned->SetSpeedRate(MOVE_RUN, 0.2f); pSummoned->GetMotionMaster()->MoveFollow(m_creature, 0, 0); - m_lWaterElementsGUIDList.push_back(pSummoned->GetGUID()); + pSummoned->CastSpell(pSummoned, SPELL_WATER_GLOBULE, false); + m_lWaterElementsGUIDList.push_back(pSummoned->GetObjectGuid()); } - - void DespawnWaterElements() + void DespawnWaterElements() { if (m_lWaterElementsGUIDList.empty()) return; - for(std::list::iterator itr = m_lWaterElementsGUIDList.begin(); itr != m_lWaterElementsGUIDList.end(); ++itr) + for(std::list::iterator itr = m_lWaterElementsGUIDList.begin(); itr != m_lWaterElementsGUIDList.end(); ++itr) { - if (Creature* pTemp = (Creature*)m_creature->GetMap()->GetUnit( *itr)) + if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr)) { if (pTemp->isAlive()) //pTemp->ForcedDespawn(); @@ -164,9 +188,7 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = true; m_creature->SetInCombatWithZone(); @@ -174,7 +196,7 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE || !MovementStarted) return; + if (type != POINT_MOTION_TYPE || !MovementStarted || m_creature->GetVisibility() == VISIBILITY_OFF ) return; if (id == 0) { MovementStarted = false; @@ -197,63 +219,67 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI { if (m_uiBuubleChecker_Timer < uiDiff) { - if (!m_bIsExploded) + if(!m_creature->HasAura(SPELL_PROTECTIVE_BUBBLE) && m_creature->GetVisibility() == VISIBILITY_ON && m_bIsExploded) { - if (!m_creature->HasAura(SPELL_PROTECTIVE_BUBBLE, EFFECT_INDEX_0)) - { - DoCast(m_creature, m_bIsRegularMode ? SPELL_WATER_BLAST_H : SPELL_WATER_BLAST); - //DoCast(m_creature, SPELL_DRAINED); - m_bIsExploded = true; - m_uiShowup_Counter = 0; - DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE); - m_creature->AttackStop(); - for(uint8 i = 0; i < 10; i++) + DoCastSpellIfCan(m_creature, SPELL_PROTECTIVE_BUBBLE); + DoScriptText(SAY_BUBBLE, m_creature); + m_bIsExploded = false; + m_uiBuubleChecker_Timer = 3000; + } + if(!m_creature->HasAura(SPELL_PROTECTIVE_BUBBLE) && m_creature->GetVisibility() == VISIBILITY_ON && !m_bIsExploded) + { + DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_WATER_BLAST : SPELL_WATER_BLAST_H); + + for(uint8 i = 0; i < 10; i++) { int tmp = urand(0, 5); m_creature->SummonCreature(NPC_ICHOR_GLOBULE, PortalLoc[tmp].x, PortalLoc[tmp].y, PortalLoc[tmp].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); } - } - m_uiBuubleChecker_Timer = 3000; - } - else - { - bool bIsWaterElementsAlive = false; - ++m_uiShowup_Counter; - if (!m_lWaterElementsGUIDList.empty()) - { - for(std::list::iterator itr = m_lWaterElementsGUIDList.begin(); itr != m_lWaterElementsGUIDList.end(); ++itr) - if (Creature* pTemp = (Creature*)m_creature->GetMap()->GetUnit( *itr)) - if (pTemp->isAlive()) - bIsWaterElementsAlive = true; - } - if (!bIsWaterElementsAlive || m_uiShowup_Counter > 20) - { - m_bIsExploded = false; - m_uiShowup_Counter = 0; - m_creature->SetInCombatWithZone(); - m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - } - m_uiBuubleChecker_Timer = 1000; + DoScriptText(EMOTE_ICHORON_PROTECTIVE_BUBBLE, m_creature); + //DoScriptText(SAY_SHATTER, m_creature); + m_creature->DealDamage(m_creature, m_creature->GetMaxHealth()*0.25, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + m_creature->SetVisibility(VISIBILITY_OFF); + m_bIsExploded = true; + m_uiVisible_Timer = 15000; } + } else m_uiBuubleChecker_Timer -= uiDiff; + + if(m_creature->GetVisibility() == VISIBILITY_OFF && m_uiVisible_Timer < uiDiff) + { + m_creature->SetVisibility(VISIBILITY_ON); + m_uiVisible_Timer = 3000; + } + else m_uiVisible_Timer -= uiDiff; + + } + if (m_creature->GetVisibility() == VISIBILITY_OFF && !m_creature->HasAura(SPELL_DRAINED) ) + { + DoCastSpellIfCan(m_creature, SPELL_DRAINED); } - if (!m_bIsExploded) + if (m_creature->GetVisibility() == VISIBILITY_ON ) { if (m_uiWaterBoltVolley_Timer < uiDiff) { - DoCast(m_creature, m_bIsRegularMode ? SPELL_WATER_BOLT_VOLLEY_H : SPELL_WATER_BOLT_VOLLEY); - m_uiWaterBoltVolley_Timer = urand(10000, 15000); + DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_WATER_BOLT_VOLLEY : SPELL_WATER_BOLT_VOLLEY_H); + m_uiWaterBoltVolley_Timer = urand(15000, 20000); } else m_uiWaterBoltVolley_Timer -= uiDiff; - if (!m_bIsFrenzy && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) + } + if (!m_bIsFrenzy && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) { - DoCast(m_creature, m_bIsRegularMode ? SPELL_FRENZY_H : SPELL_FRENZY); + DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_FRENZY : SPELL_FRENZY_H); + DoScriptText(SAY_ENRAGE, m_creature); + if(m_creature->HasAura(SPELL_DRAINED)) + { + m_creature->RemoveAurasByCasterSpell(SPELL_DRAINED,m_creature->GetObjectGuid()); + } + if(m_creature->GetVisibility() == VISIBILITY_OFF){m_creature->SetVisibility(VISIBILITY_ON);} m_bIsFrenzy = true; } - } DoMeleeAttackIfReady(); } @@ -262,18 +288,14 @@ struct MANGOS_DLL_DECL boss_ichoronAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); DespawnWaterElements(); - if (m_pInstance) + if (m_pInstance){ m_pInstance->SetData(TYPE_ICHORON, DONE); - } - - void JustReachedHome() - { - if(m_pInstance) - { - m_pInstance->SetData(TYPE_MAIN,FAIL); - m_pInstance->SetData(TYPE_ICHORON,FAIL); - m_creature->ForcedDespawn(); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, DONE);} + else {m_pInstance->SetData(TYPE_PORTAL12, DONE);} } + + if(m_creature->GetVisibility() == VISIBILITY_OFF) + m_creature->SetVisibility(VISIBILITY_ON); } void KilledUnit(Unit* pVictim) @@ -315,12 +337,13 @@ struct MANGOS_DLL_DECL mob_ichor_globuleAI : public ScriptedAI { if (m_pInstance) { - if (Creature* pIchoron = ((Creature*)m_creature->GetMap()->GetUnit( m_pInstance->GetData64(DATA_ICHORON)))) + if (Creature* pIchoron = m_pInstance->GetSingleCreatureFromStorage(DATA_ICHORON)) { float fDistance = m_creature->GetDistance2d(pIchoron); if (fDistance <= 2) { ((boss_ichoronAI*)pIchoron->AI())->WaterElementHit(); + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } } @@ -333,6 +356,8 @@ struct MANGOS_DLL_DECL mob_ichor_globuleAI : public ScriptedAI void JustDied(Unit* pKiller) { DoCast(m_creature, SPELL_SPLASH); + DoCast(m_creature, SPELL_WATER_GLOBULE_2); + } }; diff --git a/scripts/northrend/violet_hold/boss_lavanthor.cpp b/scripts/northrend/violet_hold/boss_lavanthor.cpp index 9deac7d..7ae55d8 100644 --- a/scripts/northrend/violet_hold/boss_lavanthor.cpp +++ b/scripts/northrend/violet_hold/boss_lavanthor.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -60,13 +60,20 @@ struct MANGOS_DLL_DECL boss_lavanthorAI : public ScriptedAI m_uiFlameBreath_Timer = urand(15000, 16000); m_uiFirebolt_Timer = urand(10000, 11000); MovementStarted = false; - - m_pInstance->SetData(TYPE_LAVANTHOR, NOT_STARTED); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_LAVANTHOR, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, NOT_STARTED);} + else {m_pInstance->SetData(TYPE_PORTAL12, NOT_STARTED);} + } + } void Aggro(Unit* pWho) { @@ -100,9 +107,7 @@ struct MANGOS_DLL_DECL boss_lavanthorAI : public ScriptedAI { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = true; m_creature->SetInCombatWithZone(); @@ -138,7 +143,7 @@ struct MANGOS_DLL_DECL boss_lavanthorAI : public ScriptedAI if (m_uiFirebolt_Timer < uiDiff) { - DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_FIREBOLT_H : SPELL_FIREBOLT); + DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_FIREBOLT: SPELL_FIREBOLT_H ); m_uiFirebolt_Timer = urand(10000, 11000); } else m_uiFirebolt_Timer -= uiDiff; @@ -148,10 +153,11 @@ struct MANGOS_DLL_DECL boss_lavanthorAI : public ScriptedAI switch (urand(0, 1)) { case 0: - DoCast(m_creature, m_bIsRegularMode ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH); + DoCast(m_creature, m_bIsRegularMode ? SPELL_FLAME_BREATH : SPELL_FLAME_BREATH_H); break; case 1: - DoCast(m_creature, m_bIsRegularMode ? SPELL_LAVA_BURN_H : SPELL_LAVA_BURN); + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + DoCast(pTarget, m_bIsRegularMode ? SPELL_LAVA_BURN : SPELL_LAVA_BURN_H); break; } m_uiFlameBreath_Timer = urand(15000, 16000); @@ -161,20 +167,13 @@ struct MANGOS_DLL_DECL boss_lavanthorAI : public ScriptedAI DoMeleeAttackIfReady(); } - void JustReachedHome() - { - if(m_pInstance) - { - m_pInstance->SetData(TYPE_MAIN,FAIL); - m_pInstance->SetData(TYPE_LAVANTHOR,FAIL); - m_creature->ForcedDespawn(); - } - } - void JustDied(Unit* pKiller) { - if (m_pInstance) + if (m_pInstance){ m_pInstance->SetData(TYPE_LAVANTHOR, DONE); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, DONE);} + else {m_pInstance->SetData(TYPE_PORTAL12, DONE);} + } } }; diff --git a/scripts/northrend/violet_hold/boss_moragg.cpp b/scripts/northrend/violet_hold/boss_moragg.cpp index f127009..6cf1d00 100644 --- a/scripts/northrend/violet_hold/boss_moragg.cpp +++ b/scripts/northrend/violet_hold/boss_moragg.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,8 +17,8 @@ /* ScriptData SDName: boss_moragg SDAuthor: ckegg -SD%Complete: 0 -SDComment: +SD%Complete: 50% +SDComment: SDCategory: The Violet Hold EndScriptData */ @@ -56,15 +56,21 @@ struct MANGOS_DLL_DECL boss_moraggAI : public ScriptedAI m_uiCorrosiveSaliva_Timer = urand(10000, 11000); m_uiOpticLink_Timer = urand(25000, 30000); m_uiRay_Timer = urand(2000, 7000); - - if (m_pInstance) - m_pInstance->SetData(TYPE_MORAGG, NOT_STARTED); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_MORAGG, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, NOT_STARTED);} + else {m_pInstance->SetData(TYPE_PORTAL12, NOT_STARTED);} + } + } void Aggro(Unit* pWho) { @@ -98,9 +104,7 @@ struct MANGOS_DLL_DECL boss_moraggAI : public ScriptedAI { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = true; m_creature->SetInCombatWithZone(); @@ -152,21 +156,14 @@ struct MANGOS_DLL_DECL boss_moraggAI : public ScriptedAI DoMeleeAttackIfReady(); } - - void JustReachedHome() - { - if(m_pInstance) - { - m_pInstance->SetData(TYPE_MAIN,FAIL); - m_pInstance->SetData(TYPE_MORAGG,FAIL); - m_creature->ForcedDespawn(); - } - } void JustDied(Unit* pKiller) { - if (m_pInstance) + if (m_pInstance){ m_pInstance->SetData(TYPE_MORAGG, DONE); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, DONE);} + else {m_pInstance->SetData(TYPE_PORTAL12, DONE);} + } } }; diff --git a/scripts/northrend/violet_hold/boss_xevozz.cpp b/scripts/northrend/violet_hold/boss_xevozz.cpp index b87a3bc..713b341 100644 --- a/scripts/northrend/violet_hold/boss_xevozz.cpp +++ b/scripts/northrend/violet_hold/boss_xevozz.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,7 +17,7 @@ /* ScriptData SDName: boss_xevozz SDAuthor: ckegg -SD%Complete: 0 +SD%Complete: 60% SDComment: SDCategory: The Violet Hold EndScriptData */ @@ -27,16 +27,16 @@ EndScriptData */ enum { - SAY_AGGRO = -1608035, - SAY_SLAY_1 = -1608036, - SAY_SLAY_2 = -1608037, - SAY_SLAY_3 = -1608038, - SAY_DEATH = -1608039, - SAY_SPAWN = -1608040, - SAY_CHARGED = -1608041, - SAY_REPEAT_SUMMON_1 = -1608042, - SAY_REPEAT_SUMMON_2 = -1608043, - SAY_SUMMON_ENERGY = -1608044, + SAY_AGGRO = -1608027, + SAY_SLAY_1 = -1608028, + SAY_SLAY_2 = -1608029, + SAY_SLAY_3 = -1608030, + SAY_DEATH = -1608031, + SAY_SPAWN = -1608032, + SAY_CHARGED = -1608033, + SAY_REPEAT_SUMMON_1 = -1608034, + SAY_REPEAT_SUMMON_2 = -1608035, + SAY_SUMMON_ENERGY = -1608036, SPELL_ARCANE_BARRAGE_VOLLEY = 54202, SPELL_ARCANE_BARRAGE_VOLLEY_H = 59483, @@ -51,6 +51,9 @@ enum SPELL_ARCANE_POWER = 54160, SPELL_ARCANE_POWER_H = 59474, SPELL_SUMMON_PLAYERS = 54164, + SPELL_ARCANE_TEMPEST = 35845, + SPELL_ARCANE_TEMPEST_H = 49366, + SPELL_ETHEREAL_BEACON_VISUAL = 32368 }; struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI @@ -69,21 +72,19 @@ struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI uint32 m_uiSummonEtherealSphere_Timer; uint32 m_uiArcaneBarrageVolley_Timer; uint32 m_uiArcaneBuffet_Timer; + uint32 m_uiDespawn_Timer; void Reset() { - m_uiSummonEtherealSphere_Timer = urand(10000, 12000); + m_uiSummonEtherealSphere_Timer = 10000; + m_uiDespawn_Timer = 35000; m_uiArcaneBarrageVolley_Timer = urand(20000, 22000); m_uiArcaneBuffet_Timer = m_uiSummonEtherealSphere_Timer + urand(5000, 6000); DespawnSphere(); MovementStarted = false; - - if (m_pInstance) - m_pInstance->SetData(TYPE_XEVOZZ, NOT_STARTED); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } void Aggro(Unit* pWho) @@ -96,6 +97,18 @@ struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI SetCombatMovement(true); } + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_XEVOZZ, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, NOT_STARTED);} + else {m_pInstance->SetData(TYPE_PORTAL12, NOT_STARTED);} + } + } + void AttackStart(Unit* pWho) { if (!m_pInstance) @@ -131,20 +144,15 @@ struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI void JustSummoned(Creature* pSummoned) { pSummoned->SetSpeedRate(MOVE_RUN, 0.5f); - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - { - pSummoned->AddThreat(pTarget); - pSummoned->AI()->AttackStart(pTarget); - } + pSummoned->StopMoving(); + pSummoned->CastSpell(pSummoned, SPELL_ETHEREAL_BEACON_VISUAL, false); } void StartMovement(uint32 id) { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = true; m_creature->SetInCombatWithZone(); @@ -173,7 +181,7 @@ struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI if (m_uiArcaneBarrageVolley_Timer < uiDiff) { - DoCast(m_creature, m_bIsRegularMode ? SPELL_ARCANE_BARRAGE_VOLLEY_H : SPELL_ARCANE_BARRAGE_VOLLEY); + DoCast(m_creature, m_bIsRegularMode ? SPELL_ARCANE_BARRAGE_VOLLEY : SPELL_ARCANE_BARRAGE_VOLLEY_H); m_uiArcaneBarrageVolley_Timer = urand(20000, 22000); } else m_uiArcaneBarrageVolley_Timer -= uiDiff; @@ -181,24 +189,29 @@ struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI if (m_uiArcaneBuffet_Timer) if (m_uiArcaneBuffet_Timer < uiDiff) { - DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_ARCANE_BUFFET_H : SPELL_ARCANE_BUFFET); + DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_ARCANE_BUFFET : SPELL_ARCANE_BUFFET_H); m_uiArcaneBuffet_Timer = 0; } else m_uiArcaneBuffet_Timer -= uiDiff; - if(m_uiSummonEtherealSphere_Timer) - if (m_uiSummonEtherealSphere_Timer < uiDiff) - { - DoScriptText(SAY_SPAWN, m_creature); - DoCast(m_creature, SPELL_SUMMON_ETHEREAL_SPHERE_1); - if (!m_bIsRegularMode) // extra one for heroic - m_creature->SummonCreature(NPC_ETHEREAL_SPHERE, m_creature->GetPositionX()-5+rand()%10, m_creature->GetPositionY()-5+rand()%10, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 40000); - - //m_uiSummonEtherealSphere_Timer = urand(45000, 47000); - m_uiSummonEtherealSphere_Timer = 0; - m_uiArcaneBuffet_Timer = urand(5000, 6000); - } - else m_uiSummonEtherealSphere_Timer -= uiDiff; + if (m_uiSummonEtherealSphere_Timer < uiDiff) + { + DoScriptText(SAY_SPAWN, m_creature); + DoCast(m_creature, SPELL_SUMMON_ETHEREAL_SPHERE_1); + if (!m_bIsRegularMode) // extra one for heroic + m_creature->SummonCreature(NPC_ETHEREAL_SPHERE, m_creature->GetPositionX()-5+rand()%10, m_creature->GetPositionY()-5+rand()%10, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 40000); + + m_uiSummonEtherealSphere_Timer = 30000; + m_uiArcaneBuffet_Timer = urand(5000, 6000); + m_uiDespawn_Timer= 30000; + } + else m_uiSummonEtherealSphere_Timer -= uiDiff; + + if (m_uiDespawn_Timer < uiDiff) + { + DespawnSphere(); + } + else m_uiDespawn_Timer -= uiDiff; DoMeleeAttackIfReady(); } @@ -208,17 +221,10 @@ struct MANGOS_DLL_DECL boss_xevozzAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); DespawnSphere(); - if (m_pInstance) + if (m_pInstance){ m_pInstance->SetData(TYPE_XEVOZZ, DONE); - } - - void JustReachedHome() - { - if(m_pInstance) - { - m_pInstance->SetData(TYPE_MAIN,FAIL); - m_pInstance->SetData(TYPE_XEVOZZ,FAIL); - m_creature->ForcedDespawn(); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, DONE);} + else {m_pInstance->SetData(TYPE_PORTAL12, DONE);} } } @@ -246,54 +252,83 @@ struct MANGOS_DLL_DECL mob_ethereal_sphereAI : public ScriptedAI uint32 m_uiSummonPlayers_Timer; uint32 m_uiRangeCheck_Timer; + uint32 m_uiPhaseCheck_Timer; + bool bNormalPhase; + void Reset() { - m_uiSummonPlayers_Timer = urand(33000, 35000); + m_uiSummonPlayers_Timer = 5000; m_uiRangeCheck_Timer = 1000; + m_uiPhaseCheck_Timer = 10000; + bNormalPhase = false; } void UpdateAI(const uint32 uiDiff) { //Return since we have no target - if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) - return; - - if (m_uiRangeCheck_Timer < uiDiff) + /* if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return;*/ + if(!bNormalPhase) { - if (m_pInstance) + if (m_uiPhaseCheck_Timer < uiDiff ) { - if (Creature* pXevozz = ((Creature*)m_creature->GetMap()->GetUnit( m_pInstance->GetData64(DATA_XEVOZZ)))) - { - float fDistance = m_creature->GetDistance2d(pXevozz); - if (fDistance <= 3) - DoCast(pXevozz, m_bIsRegularMode ? SPELL_ARCANE_POWER_H : SPELL_ARCANE_POWER); - else - DoCast(m_creature, 35845); - } + bNormalPhase = true; + m_uiPhaseCheck_Timer=3000000; + Creature* pXevozz = m_pInstance->GetSingleCreatureFromStorage(DATA_XEVOZZ); + m_creature->GetMotionMaster()->MoveFollow(pXevozz, 0, 0); } - m_uiRangeCheck_Timer = 1000; + else m_uiPhaseCheck_Timer -= uiDiff; } - else m_uiRangeCheck_Timer -= uiDiff; - - if (m_uiSummonPlayers_Timer < uiDiff) + if(bNormalPhase) { - DoCast(m_creature, SPELL_SUMMON_PLAYERS); // not working right - Map* pMap = m_creature->GetMap(); - if (pMap && pMap->IsDungeon()) + if (m_uiRangeCheck_Timer < uiDiff) { - Map::PlayerList const &PlayerList = pMap->GetPlayers(); - - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->getSource()->isAlive()) - DoTeleportPlayer(i->getSource(), m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), i->getSource()->GetOrientation()); + DoCast(m_creature, m_bIsRegularMode ? SPELL_ARCANE_TEMPEST: SPELL_ARCANE_TEMPEST_H); + if (m_pInstance) + { + if (Creature* pXevozz = m_pInstance->GetSingleCreatureFromStorage(DATA_XEVOZZ)) + { + float fDistance = m_creature->GetDistance2d(pXevozz); + if (fDistance <= 3) + { + m_creature->CastSpell(pXevozz, SPELL_ARCANE_POWER_H, false); + // DoCast(pXevozz,SPELL_ARCANE_POWER_H); + } + } + } + m_uiRangeCheck_Timer = 1000; } + else m_uiRangeCheck_Timer -= uiDiff; - m_uiSummonPlayers_Timer = urand(33000, 35000); + if (m_uiSummonPlayers_Timer < uiDiff) + { + if (Creature* pXevozz = (m_pInstance->GetSingleCreatureFromStorage(DATA_XEVOZZ))) + { + float fDistance = m_creature->GetDistance2d(pXevozz); + + if(fDistance<=20 && fDistance >6) + { + DoCast(m_creature, SPELL_SUMMON_PLAYERS); // not working right + + Map* pMap = m_creature->GetMap(); + if (pMap && pMap->IsDungeon()) + { + Map::PlayerList const &PlayerList = pMap->GetPlayers(); + + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (i->getSource()->isAlive()) + DoTeleportPlayer(i->getSource(), m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), i->getSource()->GetOrientation()); + } + + m_uiSummonPlayers_Timer = 15000; + } + } + } + else m_uiSummonPlayers_Timer -= uiDiff; } - else m_uiSummonPlayers_Timer -= uiDiff; } }; diff --git a/scripts/northrend/violet_hold/boss_zuramat.cpp b/scripts/northrend/violet_hold/boss_zuramat.cpp index 6b3bd53..548a5b8 100644 --- a/scripts/northrend/violet_hold/boss_zuramat.cpp +++ b/scripts/northrend/violet_hold/boss_zuramat.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2009 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,7 +17,7 @@ /* ScriptData SDName: boss_zuramat SDAuthor: ckegg -SD%Complete: 0 +SD%Complete: 60% SDComment: SDCategory: The Violet Hold EndScriptData */ @@ -27,14 +27,14 @@ EndScriptData */ enum { - SAY_AGGRO = -1608045, - SAY_SLAY_1 = -1608046, - SAY_SLAY_2 = -1608047, - SAY_SLAY_3 = -1608048, - SAY_DEATH = -1608049, - SAY_SPAWN = -1608050, - SAY_SHIELD = -1608051, - SAY_WHISPER = -1608052, + SAY_AGGRO = -1608037, + SAY_SLAY_1 = -1608038, + SAY_SLAY_2 = -1608039, + SAY_SLAY_3 = -1608040, + SAY_DEATH = -1608041, + SAY_SPAWN = -1608042, + SAY_SHIELD = -1608043, + SAY_WHISPER = -1608044, SPELL_SHROUD_OF_DARKNESS = 54524, SPELL_SHROUD_OF_DARKNESS_H = 59745, @@ -47,6 +47,7 @@ enum SPELL_VOID_SENTRY_AURA_H = 54351, SPELL_SHADOW_BOLT_VOLLEY = 54358, // 54342? 54358? SPELL_SHADOW_BOLT_VOLLEY_H = 59747, + SPELL_VOID_SHIFTED = 54343 }; struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI @@ -61,7 +62,7 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI bool m_bIsRegularMode; bool MovementStarted; - std::list m_lSentryGUIDList; + std::list m_lSentryGUIDList; uint32 m_uiShroudDarkness_Timer; uint32 m_uiVoidShift_Timer; @@ -70,24 +71,34 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI void Reset() { m_uiShroudDarkness_Timer = urand(8000, 9000); - m_uiSummonVoidSentry_Timer = urand(5000, 10000); + m_uiSummonVoidSentry_Timer = 10000; m_uiVoidShift_Timer = 10000; MovementStarted = false; + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (m_pInstance) - m_pInstance->SetData(TYPE_ZURAMAT, NOT_STARTED); + } - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + void JustReachedHome() + { + if (m_pInstance) + { + m_pInstance->SetData(TYPE_ZURAMAT, FAIL); + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) + m_pInstance->SetData(TYPE_PORTAL6, NOT_STARTED); + else + m_pInstance->SetData(TYPE_PORTAL12, NOT_STARTED); + } } void Aggro(Unit* pWho) { + if (!m_pInstance) return; DoScriptText(SAY_AGGRO, m_creature); - if (m_pInstance) - m_pInstance->SetData(TYPE_ZURAMAT, IN_PROGRESS); + m_pInstance->SetData(TYPE_ZURAMAT, IN_PROGRESS); m_creature->GetMotionMaster()->MovementExpired(); SetCombatMovement(true); } @@ -114,7 +125,7 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI void JustSummoned(Creature* pSummoned) { - m_lSentryGUIDList.push_back(pSummoned->GetGUID()); + m_lSentryGUIDList.push_back(pSummoned->GetObjectGuid()); //pSummoned->AddThreat(m_creature); //pSummoned->AI()->AttackStart(m_creature); } @@ -124,9 +135,9 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI if (m_lSentryGUIDList.empty()) return; - for(std::list::iterator itr = m_lSentryGUIDList.begin(); itr != m_lSentryGUIDList.end(); ++itr) + for(std::list::iterator itr = m_lSentryGUIDList.begin(); itr != m_lSentryGUIDList.end(); ++itr) { - if (Creature* pTemp = (Creature*)m_creature->GetMap()->GetUnit( *itr)) + if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr)) { if (pTemp->isAlive()) //pTemp->ForcedDespawn(); @@ -141,9 +152,7 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI { m_creature->GetMotionMaster()->MovePoint(id, PortalLoc[id].x, PortalLoc[id].y, PortalLoc[id].z); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); - //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MovementStarted = true; m_creature->SetInCombatWithZone(); @@ -151,9 +160,7 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE || !MovementStarted) - return; - + if (type != POINT_MOTION_TYPE || !MovementStarted) return; if (id == 0) { MovementStarted = false; @@ -174,7 +181,7 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI if (m_uiShroudDarkness_Timer < uiDiff) { - DoCast(m_creature, m_bIsRegularMode ? SPELL_SHROUD_OF_DARKNESS_H : SPELL_SHROUD_OF_DARKNESS); + DoCast(m_creature, m_bIsRegularMode ? SPELL_SHROUD_OF_DARKNESS : SPELL_SHROUD_OF_DARKNESS_H); m_uiShroudDarkness_Timer = urand(7000, 8000); } else m_uiShroudDarkness_Timer -= uiDiff; @@ -182,7 +189,10 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI if (m_uiVoidShift_Timer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - DoCast(pTarget, m_bIsRegularMode ? SPELL_VOID_SHIFT_H : SPELL_VOID_SHIFT); + { + DoCast(pTarget, m_bIsRegularMode ? SPELL_VOID_SHIFT : SPELL_VOID_SHIFT_H); + pTarget->CastSpell(pTarget, SPELL_VOID_SHIFTED, true); + } m_uiVoidShift_Timer = urand(10000, 11000); } else m_uiVoidShift_Timer -= uiDiff; @@ -190,7 +200,7 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI if (m_uiSummonVoidSentry_Timer < uiDiff) { m_creature->SummonCreature(NPC_VOID_SENTRY, m_creature->GetPositionX()-10+rand()%20, m_creature->GetPositionY()-10+rand()%20, m_creature->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - m_uiSummonVoidSentry_Timer = urand(10000, 11000); + m_uiSummonVoidSentry_Timer = urand(10000, 10000); } else m_uiSummonVoidSentry_Timer -= uiDiff; @@ -202,17 +212,10 @@ struct MANGOS_DLL_DECL boss_zuramatAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); DespawnSentry(); - if (m_pInstance) + if (m_pInstance){ m_pInstance->SetData(TYPE_ZURAMAT, DONE); - } - - void JustReachedHome() - { - if(m_pInstance) - { - m_pInstance->SetData(TYPE_MAIN,FAIL); - m_pInstance->SetData(TYPE_EREKEM,FAIL); - m_creature->ForcedDespawn(); + if(m_pInstance->GetData(TYPE_PORTAL6) == IN_PROGRESS) {m_pInstance->SetData(TYPE_PORTAL6, DONE);} + else {m_pInstance->SetData(TYPE_PORTAL12, DONE);} } } @@ -238,13 +241,32 @@ struct MANGOS_DLL_DECL mob_zuramat_sentryAI : public ScriptedAI } ScriptedInstance *m_pInstance; bool m_bIsRegularMode; + uint32 m_uiShadowBoltVolley_Timer; void Reset() { - //DoCast(m_creature, m_bIsRegularMode ? SPELL_VOID_SENTRY_AURA_H : SPELL_VOID_SENTRY_AURA); ?? - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - DoCast(m_creature, m_bIsRegularMode ? SPELL_SHADOW_BOLT_VOLLEY_H : SPELL_SHADOW_BOLT_VOLLEY); + m_uiShadowBoltVolley_Timer = 3000; +// DoCast(m_creature, m_bIsRegularMode ? SPELL_VOID_SENTRY_AURA_H : SPELL_VOID_SENTRY_AURA); +// m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);*/ + DoCast(m_creature, m_bIsRegularMode ? SPELL_SHADOW_BOLT_VOLLEY : SPELL_SHADOW_BOLT_VOLLEY_H); + } + + void DamageTaken(Unit *killer, uint32 &damage) + { + if(!killer->HasAura(SPELL_VOID_SHIFTED)) + damage=0; + } + + void UpdateAI(const uint32 uiDiff) + { + if (m_uiShadowBoltVolley_Timer < uiDiff) + { + DoCast(m_creature, m_bIsRegularMode ? SPELL_SHADOW_BOLT_VOLLEY : SPELL_SHADOW_BOLT_VOLLEY_H); + m_uiShadowBoltVolley_Timer = 3000; + } + else m_uiShadowBoltVolley_Timer -= uiDiff; } + }; CreatureAI* GetAI_boss_zuramat(Creature* pCreature) diff --git a/scripts/northrend/violet_hold/instance_violet_hold.cpp b/scripts/northrend/violet_hold/instance_violet_hold.cpp index 19fe60d..7084822 100644 --- a/scripts/northrend/violet_hold/instance_violet_hold.cpp +++ b/scripts/northrend/violet_hold/instance_violet_hold.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2010 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -15,290 +15,187 @@ */ /* ScriptData -SDName: Instance_Violet_Hold -SD%Complete: 50 -SDComment: "experimental" use of header/source object -SDCategory: Violet Hold +SDName: Instance The Violet Hold +SD%Complete: 60% +SDComment: +SDCategory: The Violet Hold EndScriptData */ #include "precompiled.h" #include "violet_hold.h" /* The Violet Hold encounters: -1 Main Event +0 Whole Event +1 Rift 2 Erekem 3 Moragg 4 Ichoron 5 Xevozz 6 Lavanthor 7 Zuramat -8 Cyanigosa */ +//inline uint32 RandRiftBoss() { return ((rand()%2) ? NPC_GUARDIAN : NPC_KEEPER); } -instance_violet_hold::instance_violet_hold(Map* pMap) : ScriptedInstance(pMap), - m_uiSinclariGUID(0), - m_uiSinclariAltGUID(0), - m_uiErekemGUID(0), - m_uiMoraggGUID(0), - m_uiIchoronGUID(0), - m_uiXevozzGUID(0), - m_uiLavanthorGUID(0), - m_uiZuramatGUID(0), - - m_uiSealDoorGUID(0), - m_uiErekemDoorGUID(0), - m_uiErekemDoorLeftGUID(0), - m_uiErekemDoorRightGUID(0), - m_uiMoraggDoorGUID(0), - m_uiIchoronDoorGUID(0), - m_uiXevozzDoorGUID(0), - m_uiLavanthorDoorGUID(0), - m_uiZuramatDoorGUID(0), - - m_uiCellErekemGuard_LGUID(0), - m_uiCellErekemGuard_RGUID(0), - m_uiIntroCrystalGUID(0), - - m_uiWorldState(0), - m_uiWorldStateSealCount(100), - m_uiWorldStatePortalCount(0), - - m_uiPortalId(0), - m_uiPortalTimer(0), - m_uiMaxCountPortalLoc(0), - m_uiSealDmgSay(0), - m_uiChosenBoss(0) +struct MANGOS_DLL_DECL instance_violet_hold : public ScriptedInstance { - Initialize(); -} + instance_violet_hold(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; -GameObject* pSealDoor; -std::string m_strInstData; + uint32 m_auiEncounter[MAX_ENCOUNTER+1]; + std::string m_strInstData; -void instance_violet_hold::Initialize() -{ - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - m_uiMaxCountPortalLoc = (sizeof(afPortalLocation)/sizeof(sPortalData)) - 1; -} -void instance_violet_hold::OnPlayerEnter(Player* pPlayer) -{ - if(m_auiEncounter[0] != NOT_STARTED) - pPlayer->SendUpdateWorldState(WORLD_STATE_ID,1); -} -void instance_violet_hold::ResetVariables() -{ - m_uiWorldStateSealCount = 100; - m_uiWorldStatePortalCount = 0; - m_uiSealDmgSay = 0; - m_uiChosenBoss = 0; -} + bool bIsInBoss; -void instance_violet_hold::ResetAll() -{ - ResetVariables(); - UpdateWorldState(false); - CallGuards(true); - SetIntroPortals(false); -} + uint8 m_uiLastBossID; + uint8 m_uiLastBossIDConst; + uint8 m_uiRiftPortalCount; + uint32 m_uiShieldPercent; + uint32 m_uiDisruptions; + int8 m_uiPortalTime; -void instance_violet_hold::OnCreatureCreate(Creature* pCreature) -{ - switch(pCreature->GetEntry()) + void Initialize() { - case NPC_SINCLARI: m_uiSinclariGUID = pCreature->GetGUID(); break; - case NPC_SINCLARI_ALT: m_uiSinclariAltGUID = pCreature->GetGUID(); break; - case NPC_DOOR_SEAL: m_uiSealDoorGUID = pCreature->GetGUID(); break; + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + m_auiEncounter[i] = NOT_STARTED; - case NPC_EREKEM: - m_uiErekemGUID = pCreature->GetGUID(); - break; - case NPC_MORAGG: - m_uiMoraggGUID = pCreature->GetGUID(); - break; - case NPC_ICHORON: - m_uiIchoronGUID = pCreature->GetGUID(); - break; - case NPC_XEVOZZ: - m_uiXevozzGUID = pCreature->GetGUID(); - break; - case NPC_LAVANTHOR: - m_uiLavanthorGUID = pCreature->GetGUID(); - break; - case NPC_ZURAMAT: - m_uiZuramatGUID = pCreature->GetGUID(); - break; + Clear(); + } - case NPC_PORTAL_INTRO: - m_lIntroPortalList.push_back(pCreature->GetGUID()); - break; - case NPC_HOLD_GUARD: - m_lGuardsList.push_back(pCreature->GetGUID()); - pCreature->setFaction(35); - break; + void Clear(){ + bIsInBoss = false; + + m_uiLastBossID = 0; + m_uiRiftPortalCount = 0; + m_uiPortalTime = 0; + m_uiShieldPercent = 100; } -} -void instance_violet_hold::OnObjectCreate(GameObject* pGo) -{ - switch(pGo->GetEntry()) + void InitWorldState(bool Enable = true) { - case GO_DOOR_SEAL: - m_uiSealDoorGUID = pGo->GetGUID(); - pSealDoor = pGo; - DoUseDoorOrButton(pGo->GetGUID()); - break; - case GO_DOOR_EREKEM: - m_uiErekemDoorGUID = pGo->GetGUID(); - break; - case GO_DOOR_EREKEM_LEFT: - m_uiErekemDoorLeftGUID = pGo->GetGUID(); - break; - case GO_DOOR_EREKEM_RIGHT: - m_uiErekemDoorRightGUID = pGo->GetGUID(); - break; - case GO_DOOR_MORAGG: - m_uiMoraggDoorGUID = pGo->GetGUID(); - break; - case GO_DOOR_ICHORON: - m_uiIchoronDoorGUID = pGo->GetGUID(); - break; - case GO_DOOR_XEVOZZ: - m_uiXevozzDoorGUID = pGo->GetGUID(); - break; - case GO_DOOR_LAVANTHOR: - m_uiLavanthorDoorGUID = pGo->GetGUID(); - break; - case GO_DOOR_ZURAMAT: - m_uiZuramatDoorGUID = pGo->GetGUID(); - break; + DoUpdateWorldState(WORLD_STATE_VH,Enable ? 1 : 0); + DoUpdateWorldState(WORLD_STATE_VH_PRISON,100); + DoUpdateWorldState(WORLD_STATE_VH_PORTALS,0); + } - case GO_INTRO_CRYSTAL: - m_uiIntroCrystalGUID = pGo->GetGUID(); - break; + void OnPlayerEnter(Player* pPlayer) + { + if(m_auiEncounter[0] != NOT_STARTED) + pPlayer->SendUpdateWorldState(WORLD_STATE_VH,1); } -} -void instance_violet_hold::UpdateWorldState(bool bEnable) -{ - if (bEnable) - m_uiWorldState = 1; - else - m_uiWorldState = 0; - - DoUpdateWorldState(WORLD_STATE_ID, m_uiWorldState); - DoUpdateWorldState(WORLD_STATE_SEAL, m_uiWorldStateSealCount); - DoUpdateWorldState(WORLD_STATE_PORTALS, m_uiWorldStatePortalCount); -} + bool IsEncounterInProgress() const + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) + return true; -void instance_violet_hold::SetData(uint32 uiType, uint32 uiData) -{ - debug_log("SD2: instance_violet_hold: SetData got type % u, data %u.", uiType, uiData); + return false; + } - switch(uiType) + void OnCreatureCreate(Creature* pCreature) { - case TYPE_MAIN: + switch(pCreature->GetEntry()) { - if (uiData == m_auiEncounter[0]) - return; - - switch(uiData) - { - case NOT_STARTED: - ResetAll(); - break; - case IN_PROGRESS: - - //DoUseDoorOrButton(m_uiSealDoorGUID); // is not working for unknown reason - if(pSealDoor) - pSealDoor->UseDoorOrButton(); - UpdateWorldState(); - m_uiPortalId = urand(0, 2); - m_uiPortalTimer = 15000; - break; - case FAIL: - /*if (Creature* pSinclari = instance->GetCreature(m_uiSinclariGUID)) - pSinclari->Respawn(); - ResetAll();*/ - case DONE: - UpdateWorldState(false); - //DoUseDoorOrButton(m_uiSealDoorGUID); - if(pSealDoor) - pSealDoor->ResetDoorOrButton(); - if(Creature* pDoorSeal = instance->GetCreature(m_uiSealDoorGUID)) - pDoorSeal->ForcedDespawn(); - break; - case SPECIAL: - break; - } - m_auiEncounter[0] = uiData; - break; + case NPC_SINCLARI: + case NPC_DOOR_SEAL: + case NPC_EREKEM: + case NPC_MORAGG: + case NPC_ICHORON: + case NPC_XEVOZZ: + case NPC_LAVANTHOR: + case NPC_ZURAMAT: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } - case TYPE_SEAL: - m_auiEncounter[1] = uiData; - if(uiData == SPECIAL && m_auiEncounter[TYPE_MAIN] == IN_PROGRESS) - { - --m_uiWorldStateSealCount; - if(Creature* pSinclari = instance->GetCreature(m_uiSinclariGUID)) + } + + void OnObjectCreate(GameObject* pGo) + { + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + } + + void SetData(uint32 uiType, uint32 uiData) + { + switch(uiType) + { + case TYPE_EVENT: + if (uiData == IN_PROGRESS) { - if(m_uiSealDmgSay==0 && m_uiWorldStateSealCount<=75) - { - ++m_uiSealDmgSay; - DoScriptText(SAY_SEAL_75,pSinclari); - } - else if(m_uiSealDmgSay==1 && m_uiWorldStateSealCount<=50) - { - ++m_uiSealDmgSay; - DoScriptText(SAY_SEAL_50,pSinclari); - } - else if(m_uiSealDmgSay==2 && m_uiWorldStateSealCount<=5) - { - ++m_uiSealDmgSay; - DoScriptText(SAY_SEAL_5,pSinclari); - } - UpdateWorldState(); - if(m_uiWorldStateSealCount <= 0) - SetData(TYPE_MAIN,FAIL); + Clear(); + InitWorldState(); } - } - break; - case TYPE_PORTAL: - { - if(m_auiEncounter[TYPE_MAIN] == IN_PROGRESS) - switch(uiData) + else if (uiData == FAIL || uiData == DONE) { - case SPECIAL: // timer to next - m_uiPortalTimer = 90000; - break; - case DONE: // portal done, set timer to 5 secs - m_uiPortalTimer = 5000; - break; + DoUpdateWorldState(WORLD_STATE_VH, 0); + DoUseDoorOrButton(GO_DOOR_SEAL); + if (Creature* pSinclari = GetSingleCreatureFromStorage(NPC_SINCLARI)) + pSinclari->ForcedDespawn(1000); } - m_auiEncounter[2] = uiData; - break; - } - case TYPE_EREKEM: - case TYPE_MORAGG: - case TYPE_ICHORON: - case TYPE_XEVOZZ: - case TYPE_LAVANTHOR: - case TYPE_ZURAMAT: - m_auiEncounter[uiType] = uiData; - if(uiData == DONE) - m_uiPortalTimer = 20000; + m_auiEncounter[0] = uiData; + break; + case TYPE_EREKEM: + m_auiEncounter[2] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_MORAGG: + m_auiEncounter[3] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_ICHORON: + m_auiEncounter[4] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_XEVOZZ: + m_auiEncounter[5] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_LAVANTHOR: + m_auiEncounter[6] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_ZURAMAT: + m_auiEncounter[7] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_CYANIGOSA: + m_auiEncounter[8] = uiData; + if (uiData == IN_PROGRESS) bIsInBoss = true; + break; + case TYPE_PORTAL6: + m_auiEncounter[9] = uiData; + break; + case TYPE_PORTAL12: + m_auiEncounter[10] = uiData; + break; + case TYPE_RIFT: + if (uiData == FAIL) + DoUseDoorOrButton(GO_DOOR_SEAL); + m_auiEncounter[1] = uiData; + break; + case TYPE_DOOR: + if (uiData == SPECIAL) + { + m_uiShieldPercent = m_uiShieldPercent - 5; + if(m_uiShieldPercent > 0) + DoUpdateWorldState(WORLD_STATE_VH_PRISON, m_uiShieldPercent); + else + { DoUpdateWorldState(WORLD_STATE_VH, 0); + DoUseDoorOrButton(GO_DOOR_SEAL); + m_auiEncounter[0] = FAIL; + } + } + break; + case TYPE_DISRUPTIONS: + m_uiDisruptions = uiData; +// DoUpdateWorldState(WORLD_STATE_VH_PRISON, 100-m_uiDisruptions*5); break; - case TYPE_CYANIGOSA: - m_auiEncounter[uiType] = uiData; - if(uiData == DONE) - SetData(TYPE_MAIN,DONE); + case TYPE_LASTBOSS_ID: + m_uiLastBossIDConst = uiData; break; - } - if (uiData == DONE) - { - //check if boss was completed - for(int i = TYPE_EREKEM;i::iterator i = m_lIntroPortalList.begin(); i != m_lIntroPortalList.end(); ++i) - { - if (Creature* pPortal = instance->GetCreature(*i)) - { - if (bDeactivate) - pPortal->ForcedDespawn(); - else - pPortal->Respawn(); } + } -} -void instance_violet_hold::SpawnPortal() -{ - if (const sPortalData* pData = GetPortalData()) + uint32 GetData(uint32 uiType) { - if (Creature* pController = instance->GetCreature(m_uiSinclariAltGUID)) + switch(uiType) { - uint32 uiPortalEntry; - - switch(pData->pPortalType) + case TYPE_EVENT: + return m_auiEncounter[0]; + case TYPE_EREKEM: + return m_auiEncounter[2]; + case TYPE_MORAGG: + return m_auiEncounter[3]; + case TYPE_ICHORON: + return m_auiEncounter[4]; + case TYPE_XEVOZZ: + return m_auiEncounter[5]; + case TYPE_LAVANTHOR: + return m_auiEncounter[6]; + case TYPE_ZURAMAT: + return m_auiEncounter[7]; + case TYPE_CYANIGOSA: + return m_auiEncounter[8]; + case TYPE_PORTAL6: + return m_auiEncounter[9]; + case TYPE_PORTAL12: + return m_auiEncounter[10]; + case TYPE_RIFT: + return m_uiRiftPortalCount; + case TYPE_LASTBOSS_ID: + return m_uiLastBossIDConst; + case TYPE_LASTBOSS: { - case PORTAL_TYPE_NORM: uiPortalEntry = NPC_PORTAL; break; - case PORTAL_TYPE_SQUAD: - case PORTAL_TYPE_BOSS: uiPortalEntry = NPC_PORTAL_ELITE; break; + if (m_uiLastBossID == 0) + m_uiLastBossID = urand(2, 7); + else + { + m_uiLastBossID = urand(2, 7); + if ( m_auiEncounter[2] == DONE && + m_auiEncounter[3] == DONE && + m_auiEncounter[4] == DONE && + m_auiEncounter[5] == DONE && + m_auiEncounter[6] == DONE && + m_auiEncounter[7] == DONE) return 0; + while ( m_auiEncounter[m_uiLastBossID] == DONE + || m_auiEncounter[m_uiLastBossID] == IN_PROGRESS + || m_auiEncounter[m_uiLastBossID] == SPECIAL ) + { + m_uiLastBossID = urand(2, 7); + } + } + return m_uiLastBossID; } - - pController->SummonCreature(uiPortalEntry, pData->fX, pData->fY, pData->fZ, pData->fOrient, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 1800*IN_MILLISECONDS); + case DATA_BOSSTIME: + return bIsInBoss; + case TYPE_DISRUPTIONS: + return m_uiDisruptions; } + return 0; } -} - -void instance_violet_hold::SetPortalId() -{ - if (IsCurrentPortalForTrash()) - { - int iTemp = rand()%(m_uiMaxCountPortalLoc - 1); - - if (iTemp >= m_uiPortalId) - ++iTemp; - debug_log("SD2: instance_violet_hold: SetPortalId %i, old was id %u.", iTemp, m_uiPortalId); - - m_uiPortalId = iTemp; - } - else +const char* Save() { - debug_log("SD2: instance_violet_hold: SetPortalId %u (is boss), old was id %u.", m_uiMaxCountPortalLoc, m_uiPortalId); - m_uiPortalId = m_uiMaxCountPortalLoc; + return m_strInstData.c_str(); } -} -void instance_violet_hold::CallGuards(bool bRespawn) -{ - for(std::list::iterator i = m_lGuardsList.begin(); i != m_lGuardsList.end(); ++i) +void Load(const char* strIn) { - if (Creature* pGuard = instance->GetCreature(*i)) + if (!strIn) { - if (bRespawn) - { - pGuard->Respawn(); - } - else if (pGuard->isAlive()) - { - pGuard->AI()->EnterEvadeMode(); - - if (Creature* pSinclari = instance->GetCreature(m_uiSinclariGUID)) - pGuard->GetMotionMaster()->MoveFollow(pSinclari, 0.0f, 0.0f); - - pGuard->ForcedDespawn(20000); - } + OUT_LOAD_INST_DATA_FAIL; + return; } - } -} - -void instance_violet_hold::ProcessActivationCrystal(Unit* pUser, bool bIsIntro) -{ - if (Creature* pSummon = pUser->SummonCreature(NPC_DEFENSE_SYSTEM, fDefenseSystemLoc[0], fDefenseSystemLoc[1], fDefenseSystemLoc[2], fDefenseSystemLoc[3], TEMPSUMMON_TIMED_DESPAWN, 10000)) - { - pSummon->CastSpell(pSummon, SPELL_DEFENSE_SYSTEM_VISUAL, true); - - // TODO: figure out how the rest work - // NPC's NPC_DEFENSE_DUMMY_TARGET are probably channeling some spell to the defense system - } - - if (bIsIntro) - DoUseDoorOrButton(m_uiIntroCrystalGUID); - - // else, kill (and despawn?) certain trash mobs. Also boss affected, but not killed. -} - -uint32 instance_violet_hold::GetRandomPortalEliteEntry() -{ - return (urand(0, 1) ? NPC_PORTAL_GUARDIAN : NPC_PORTAL_KEEPER); -} - -uint32 instance_violet_hold::GetRandomMobForNormalPortal() -{ - switch(urand(1, 4)) - { - case 1: return NPC_AZURE_INVADER; - case 2: return NPC_MAGE_HUNTER; - case 3: return NPC_AZURE_SPELLBREAKER; - case 4: return NPC_AZURE_BINDER; - } - - return 0; -} -uint64 instance_violet_hold::GetData64(uint32 uiData) -{ - switch(uiData) - { - case DATA_EREKEM: - return m_uiErekemGUID; - case DATA_MORAGG: - return m_uiMoraggGUID; - case DATA_ICHORON: - return m_uiIchoronGUID; - case DATA_XEVOZZ: - return m_uiXevozzGUID; - case DATA_LAVANTHOR: - return m_uiLavanthorGUID; - case DATA_ZURAMAT: - return m_uiZuramatGUID; - case DATA_SINCLARI: - return m_uiSinclariGUID; - case DATA_NPC_SEAL_DOOR: - return m_uiSealDoorGUID; - case DATA_SEAL_DOOR: - return m_uiSealDoorGUID; - case DATA_EREKEM_DOOR: - return m_uiErekemDoorGUID; - case DATA_EREKEM_DOOR_L: - return m_uiErekemDoorLeftGUID; - case DATA_EREKEM_DOOR_R: - return m_uiErekemDoorRightGUID; - case DATA_MORAGG_DOOR: - return m_uiMoraggDoorGUID; - case DATA_ICHORON_DOOR: - return m_uiIchoronDoorGUID; - case DATA_XEVOZZ_DOOR: - return m_uiXevozzDoorGUID; - case DATA_LAVANTHOR_DOOR: - return m_uiLavanthorDoorGUID; - case DATA_ZURAMAT_DOOR: - return m_uiZuramatDoorGUID; - } - return 0; -} + OUT_LOAD_INST_DATA(strIn); -void instance_violet_hold::Update(uint32 uiDiff) -{ - if (!(m_auiEncounter[0] == IN_PROGRESS || m_auiEncounter[0] == SPECIAL)) - return; + std::istringstream loadStream(strIn); - if (m_uiPortalTimer) - { - if (m_uiPortalTimer <= uiDiff) + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) { - DoUpdateWorldState(WORLD_STATE_PORTALS, ++m_uiWorldStatePortalCount); - - SetPortalId(); - SpawnPortal(); + loadStream >> m_auiEncounter[i]; - m_uiPortalTimer = 0; + if (m_auiEncounter[i] == IN_PROGRESS && i != 1) + m_auiEncounter[i] = NOT_STARTED; } - else - m_uiPortalTimer -= uiDiff; + + OUT_LOAD_INST_DATA_COMPLETE; } -} +}; InstanceData* GetInstanceData_instance_violet_hold(Map* pMap) { @@ -528,6 +308,6 @@ void AddSC_instance_violet_hold() Script *newscript; newscript = new Script; newscript->Name = "instance_violet_hold"; - newscript->GetInstanceData = GetInstanceData_instance_violet_hold; + newscript->GetInstanceData = &GetInstanceData_instance_violet_hold; newscript->RegisterSelf(); } diff --git a/scripts/northrend/violet_hold/violet_hold.cpp b/scripts/northrend/violet_hold/violet_hold.cpp index dea8a2b..7c7fb82 100644 --- a/scripts/northrend/violet_hold/violet_hold.cpp +++ b/scripts/northrend/violet_hold/violet_hold.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 - 2011 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -15,354 +15,920 @@ */ /* ScriptData -SDName: Violet_Hold -SD%Complete: 40 -SDComment: -SDCategory: Violet Hold +SDName: violet_hold +SDAuthor: ckegg, modified by rsa +SD%Complete: 60 +SDComment: +SDCategory: The Violet Hold EndScriptData */ -/* ContentData -go_activation_crystal -npc_door_seal -npc_sinclari -npc_teleportation_portal -EndContentData */ - #include "precompiled.h" #include "violet_hold.h" #include "escort_ai.h" - -/*###### -## go_activation_crystal -######*/ - -bool GOUse_go_activation_crystal(Player* pPlayer, GameObject* pGo) -{ - if (instance_violet_hold* pInstance = (instance_violet_hold*)pGo->GetInstanceData()) - pInstance->ProcessActivationCrystal(pPlayer); - - return false; -} - -/*###### -## npc_door_seal -######*/ - -bool pEffectDummyNPC_npc_door_seal(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Creature* pCreatureTarget) -{ - //always check spellid and effectindex - if (uiSpellId == SPELL_DESTROY_DOOR_SEAL && uiEffIndex == EFFECT_INDEX_0) - { - if (instance_violet_hold* pInstance = (instance_violet_hold*)pCreatureTarget->GetInstanceData()) - pInstance->SetData(TYPE_SEAL, SPECIAL); - - //always return true when we are handling this spell and effect - return true; - } - - return false; -} - -/*###### -## npc_sinclari -######*/ - enum { - SAY_BEGIN = -1608000, - SAY_LOCK_DOOR = -1608001, - - GOSSIP_ITEM_INTRO = -3608000, - GOSSIP_ITEM_START = -3608001, + SPELL_TELEPORT_INSIDE = 62139, + SPELL_SHIELD_DISRUPTION = 58291, + + //DRAGONS SPELLS + //Azure Captain + SPELL_MORTAL_STRIKE = 32736, + SPELL_WHIRLWIND = 41057, + + //Azure Raider + SPELL_CONCUSSION_BLOW = 52719, + SPELL_MAGIC_REFLECTION = 60158, + + //Azure Sorceror + SPELL_ARCANE_STREAM = 60181, + SPELL_ARCANE_STREAM_H = 60204, + SPELL_MANA_DETONATION = 60182, + SPELL_MANA_DETONATION_H = 60205, + + //Azure stalker + SPELL_BACKSTAB = 58471, + SPELL_TACTICAL_BLINK = 58470, + + AZURE_SAY_AGGRO_1 = -1608055, + AZURE_SAY_AGGRO_2 = -1608056, + AZURE_SAY_AGGRO_3 = -1608057, + AZURE_SAY_AGGRO_4 = -1608058, + PORTAL_KEEPER_GUARDIAN_AGGRO_1 = -1608059, + PORTAL_KEEPER_GUARDIAN_AGGRO_2 = -1608060, + PORTAL_KEEPER_GUARDIAN_AGGRO_3 = -1608061, + PORTAL_KEEPER_GUARDIAN_DEATH_1 = -1608062, + PORTAL_KEEPER_GUARDIAN_DEATH_2 = -1608063, + PORTAL_KEEPER_GUARDIAN_DEATH_3 = -1608064, + AZURE_CAPTAIN_AGGRO_1 = -1608065 - GOSSIP_TEXT_ID_INTRO = 13853, - GOSSIP_TEXT_ID_START = 13854, }; -struct MANGOS_DLL_DECL npc_sinclariAI : public npc_escortAI +uint32 m_uiNextPortal_Timer; +/*###### +## mob_vh_dragons +## This script is for ALL mobs which are spawned from portals, +## they have to be scripted in SD2 because in EventAI you cant +## check for distance from door seal :/ +## (Intro not implented yet) +######*/ +struct MANGOS_DLL_DECL mob_vh_dragonsAI : public ScriptedAI { - npc_sinclariAI(Creature* pCreature) : npc_escortAI(pCreature) + mob_vh_dragonsAI(Creature* pCreature) : ScriptedAI(pCreature) { - m_pInstance = (instance_violet_hold*)pCreature->GetInstanceData(); + m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + m_bIsRegular = pCreature->GetMap()->IsRegularDifficulty(); + WayPointList.clear(); Reset(); } - uint8 m_uiSealWeakenCount; - - instance_violet_hold* m_pInstance; + ScriptedInstance* m_pInstance; + bool m_bIsRegular; + uint32 creatureEntry; + uint32 motherPortalID; + uint32 WalkTimer; + int8 portalLoc; + bool IsWalking; + bool IsInCombat; + bool MovementStarted; + Creature* pDoorSeal; + + std::list WayPointList; + std::list::iterator WayPoint; + + //Azure Captain + uint32 m_uiMortalStrike_Timer; + uint32 m_uiWhirlwind_Timer; + + //Azure Raider + uint32 m_uiConcussionBlow_Timer; + uint32 m_uiMagicReflection_Timer; + + //Azure Sorceror + uint32 m_uiArcaneStream_Timer; + uint32 m_uiManaDetonation_Timer; + + //Azure Stalker + uint32 m_uiBackstab_Timer; + uint32 m_uiBlink_Timer; + + void Reset(){ + creatureEntry = m_creature->GetEntry(); + motherPortalID = 0; + WalkTimer = 200; + portalLoc = -1; + IsWalking = false; + IsInCombat = false; + MovementStarted = false; + pDoorSeal = GetClosestCreatureWithEntry(m_creature, NPC_DOOR_SEAL, 150.0f); + + //Azure Captain + m_uiMortalStrike_Timer = 3000; + m_uiWhirlwind_Timer = 5000; + + //Azure Raider + m_uiConcussionBlow_Timer = 3000; + m_uiMagicReflection_Timer = 10000; + + //Azure Sorceror + m_uiArcaneStream_Timer = 5000; + m_uiManaDetonation_Timer = 3000; + + //Azure Stalker + m_uiBackstab_Timer = 7100; + m_uiBlink_Timer = 7000; + + if (creatureEntry == NPC_KEEPER + || creatureEntry == NPC_GUARDIAN) + { + SetCombatMovement(false); + m_creature->GetMotionMaster()->MoveRandom(); + }; - void Reset() - { } - void WaypointReached(uint32 uiPointId) + void StartMovement() { - if (!m_pInstance) + if(!WayPointList.empty() || MovementStarted) return; - switch(uiPointId) + uint8 start = 0; + uint8 end = 0; + switch(portalLoc) { + case -1: + return; + //center & ichoron case 0: - m_pInstance->ProcessActivationCrystal(m_creature, true); + case 5: + start = 0; + end = 2; break; + //From lavanthor case 1: - DoScriptText(SAY_BEGIN, m_creature); - m_pInstance->SetIntroPortals(true); - m_pInstance->CallGuards(false); + start = 3; + end = 5; break; + // From Zuramat case 2: - DoScriptText(SAY_LOCK_DOOR, m_creature); - m_pInstance->SetData(TYPE_MAIN, IN_PROGRESS); + start = 6; + end = 11; + break; + //From Moragg + case 3: + start = 12; + end = 16; + break; + //From Erekem + case 4: + start = 17; + end = 21; + break; + //From highest platform + case 6: + start = 22; + end = 26; + break; + } + uint8 wpId = 0; + for(uint8 i = start; i <= end; ++i){ + debug_log("AddWP: %u", i); + AddWaypoint(wpId, DragonsWP[i].x, DragonsWP[i].y, DragonsWP[i].z); + wpId++; } - } - void JustRespawned() + WayPoint = WayPointList.begin(); + m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); + IsWalking = true; + MovementStarted = true; + } + void JustReachedHome() { if (m_pInstance) - m_pInstance->SetData(TYPE_MAIN, NOT_STARTED); + { + m_pInstance->SetData(TYPE_EVENT, FAIL); + m_pInstance->SetData(TYPE_RIFT, FAIL); + } } -}; - -CreatureAI* GetAI_npc_sinclari(Creature* pCreature) -{ - return new npc_sinclariAI(pCreature); -} + void AddWaypoint(uint32 id, float x, float y, float z) + { + WayPoints DWP(id, x, y, z); + WayPointList.push_back(DWP); + } + void MovementInform(uint32 uiType, uint32 uiPointId) + { + if(uiType != POINT_MOTION_TYPE || creatureEntry == NPC_GUARDIAN || creatureEntry == NPC_KEEPER) + return; -bool GossipHello_npc_sinclari(Player* pPlayer, Creature* pCreature) -{ - pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INTRO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXT_ID_INTRO, pCreature->GetGUID()); - return true; -} + if(WayPoint->id != uiPointId) + return; -bool GossipSelect_npc_sinclari(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) -{ - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + ++WayPoint; + WalkTimer = 200; + } + void JustDied(Unit* pKiller) { - if (instance_violet_hold* pInstance = (instance_violet_hold*)pCreature->GetInstanceData()) + switch(creatureEntry) { - if (pInstance->GetData(TYPE_MAIN) == NOT_STARTED) - { - pPlayer->PlayerTalkClass->ClearMenus(); - pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXT_ID_START, pCreature->GetGUID()); - } + case NPC_GUARDIAN: + case NPC_KEEPER: + switch(urand(0,2)) + { + case 0: DoScriptText(PORTAL_KEEPER_GUARDIAN_DEATH_1, m_creature); break; + case 1: DoScriptText(PORTAL_KEEPER_GUARDIAN_DEATH_2, m_creature); break; + case 2: DoScriptText(PORTAL_KEEPER_GUARDIAN_DEATH_3, m_creature); break; + } + break; } - else - pPlayer->CLOSE_GOSSIP_MENU(); } - else - if (uiAction == GOSSIP_ACTION_INFO_DEF+2) + void Aggro(Unit* pWho) { - if (instance_violet_hold* pInstance = (instance_violet_hold*)pCreature->GetInstanceData()) + switch(creatureEntry) { - pPlayer->CLOSE_GOSSIP_MENU(); + case NPC_AZURE_CAPTAIN: + DoScriptText(AZURE_CAPTAIN_AGGRO_1, m_creature); + break; + case NPC_AZURE_RAIDER: + case NPC_AZURE_SORCEROR: + case NPC_AZURE_STALKER: + case NPC_AZURE_BINDER: + case NPC_AZURE_INVADER: + case NPC_AZURE_MAGE_SLAYER: + case NPC_AZURE_SPELLBREAKER: + switch(urand(0,3)) + { + case 0: DoScriptText(AZURE_SAY_AGGRO_1, m_creature); break; + case 1: DoScriptText(AZURE_SAY_AGGRO_2, m_creature); break; + case 2: DoScriptText(AZURE_SAY_AGGRO_3, m_creature); break; + case 3: DoScriptText(AZURE_SAY_AGGRO_4, m_creature); break; + } + break; + case NPC_GUARDIAN: + case NPC_KEEPER: + switch(urand(0,2)) + { + case 0: DoScriptText(PORTAL_KEEPER_GUARDIAN_AGGRO_1, m_creature); break; + case 1: DoScriptText(PORTAL_KEEPER_GUARDIAN_AGGRO_2, m_creature); break; + case 2: DoScriptText(PORTAL_KEEPER_GUARDIAN_AGGRO_3, m_creature); break; + } + break; + default: + debug_log("SD2: The Violet Hold: Unhandled dragon entry %u!", m_creature->GetEntry()); + break; + } + } + void UpdateAI(const uint32 uiDiff){ + if(portalLoc != -1) + StartMovement(); - if (pInstance->GetData(TYPE_MAIN) == NOT_STARTED) + if (IsWalking && WalkTimer) + { + if (WalkTimer <= uiDiff) { - pInstance->SetData(TYPE_MAIN, SPECIAL); + if (WayPoint != WayPointList.end()) + { + m_creature->GetMotionMaster()->MovePoint(WayPoint->id, WayPoint->x, WayPoint->y,WayPoint->z); + WalkTimer = 0; + } + }else WalkTimer -= uiDiff; + } + + //Corrupt Seal - if (npc_sinclariAI* pEscortAI = dynamic_cast(pCreature->AI())) - pEscortAI->Start(); + if(Creature *pDoorSeal2 = GetClosestCreatureWithEntry(m_creature, NPC_DOOR_SEAL, 150.0f)){ + if(m_creature->IsWithinDist(pDoorSeal2, 27.0f, false) && !IsInCombat) + { + IsWalking = false; + WayPointList.clear(); + m_creature->GetMotionMaster()->Clear(false); + m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); + DoCast(pDoorSeal2, SPELL_CORRUPT); + m_pInstance->SetData(TYPE_DOOR,SPECIAL); } } - else - pPlayer->CLOSE_GOSSIP_MENU(); + if(!IsWalking && !IsInCombat) { + if (Unit* m_uEmbraceTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) + m_creature->GetMotionMaster()->MoveChase(m_uEmbraceTarget); + m_creature->SetInCombatWithZone(); + IsInCombat = true; + } + + + //Return since we have no target + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; + + if(m_creature->getVictim()) + if(m_creature->getVictim()->GetEntry() == NPC_DOOR_SEAL) + return; + switch(creatureEntry) + { + case NPC_AZURE_CAPTAIN: + AzureCaptain_UpdateAI(uiDiff); + break; + case NPC_AZURE_RAIDER: + AzureRaider_UpdateAI(uiDiff); + break; + case NPC_AZURE_SORCEROR: + AzureSorceror_UpdateAI(uiDiff); + break; + case NPC_AZURE_STALKER: + AzureStalker_UpdateAI(uiDiff); + break; + case NPC_GUARDIAN: + case NPC_KEEPER: + case NPC_AZURE_BINDER: + case NPC_AZURE_INVADER: + case NPC_AZURE_MAGE_SLAYER: + case NPC_AZURE_SPELLBREAKER: + break; + default: + debug_log("SD2: The Violet Hold: Unhandled dragon entry %u!", m_creature->GetEntry()); + break; + } + DoMeleeAttackIfReady(); } + //Azure Captain + void AzureCaptain_UpdateAI(const uint32 uiDiff) + { + //Mortal Strike + if (m_uiMortalStrike_Timer <= uiDiff) + { + DoCast(m_creature->getVictim(), SPELL_MORTAL_STRIKE); + m_uiMortalStrike_Timer = 6000; + }else m_uiMortalStrike_Timer -= uiDiff; - return true; -} + //Whirlwind + if (m_uiWhirlwind_Timer <= uiDiff) + { + DoCast(m_creature->getVictim(), SPELL_WHIRLWIND); + m_uiWhirlwind_Timer = 15000; + }else m_uiWhirlwind_Timer -= uiDiff; + } + //Azure Raider + void AzureRaider_UpdateAI(const uint32 uiDiff) + { + //Concusion Blow + if (m_uiConcussionBlow_Timer <= uiDiff) + { + DoCast(m_creature->getVictim(), SPELL_CONCUSSION_BLOW); + m_uiMortalStrike_Timer = 7000; + }else m_uiConcussionBlow_Timer -= uiDiff; + + //Magic reflection + if (m_uiMagicReflection_Timer <= uiDiff) + { + DoCast(m_creature, SPELL_MAGIC_REFLECTION); + m_uiMagicReflection_Timer = 30000; + }else m_uiMagicReflection_Timer -= uiDiff; + } + //Azure Sorceror + void AzureSorceror_UpdateAI(const uint32 uiDiff) + { + //Arcane Stream + if (m_uiArcaneStream_Timer <= uiDiff) + { + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) + DoCast(pTarget, m_bIsRegular ? SPELL_ARCANE_STREAM : SPELL_ARCANE_STREAM_H); + m_uiArcaneStream_Timer = 7000; + }else m_uiArcaneStream_Timer -= uiDiff; + + //Mana Detonation + if (m_uiManaDetonation_Timer <= uiDiff) + { + DoCast(m_creature, m_bIsRegular ? SPELL_MANA_DETONATION : SPELL_MANA_DETONATION_H); + m_uiManaDetonation_Timer = 18000; + }else m_uiManaDetonation_Timer -= uiDiff; + } + //Azure Stalker + void AzureStalker_UpdateAI(const uint32 uiDiff) + { + //Backstab + if (m_uiBackstab_Timer <= uiDiff) + { + DoCast(m_creature->getVictim(), SPELL_BACKSTAB); + m_uiBackstab_Timer = 15100; + }else m_uiBackstab_Timer -= uiDiff; + + //Tactical blink + if (m_uiBlink_Timer <= uiDiff) + { + DoCast(m_creature->getVictim(), SPELL_TACTICAL_BLINK); + m_uiBlink_Timer = 15000; + }else m_uiBlink_Timer -= uiDiff; + } +}; /*###### -## npc_teleportation_portal +## npc_violet_portal ######*/ - -struct MANGOS_DLL_DECL npc_teleportation_portalAI : public ScriptedAI +struct MANGOS_DLL_DECL npc_violet_portalAI : public ScriptedAI { - npc_teleportation_portalAI(Creature* pCreature) : ScriptedAI(pCreature) + npc_violet_portalAI(Creature* pCreature) : ScriptedAI(pCreature) { - m_pInstance = (instance_violet_hold*)pCreature->GetInstanceData(); - m_uiMyPortalNumber = 0; + m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); Reset(); } - instance_violet_hold* m_pInstance; - - std::set m_lMobSet; + ScriptedInstance* m_pInstance; + bool m_bIsRegularMode; + bool m_uiGroupSpawned; + uint8 portalType; // 0 = nothing, 1 = Guard & spawns, 2 = Group of elites + uint32 portalID; // To identify portal... + int8 portalLoc; - bool m_bNeedInvisible; - bool m_bIntro; - uint32 m_uiIntroTimer; - uint32 m_uiMyPortalNumber; + uint32 TimeRiftWave_Timer; + uint32 Check_Timer; void Reset() { - m_bNeedInvisible = false; - m_bIntro = false; - m_uiIntroTimer = 6000; - - if (m_pInstance) - m_uiMyPortalNumber = m_pInstance->GetCurrentPortalNumber(); + m_uiGroupSpawned = false; + portalType = 0; + portalID = 0; + portalLoc = -1; + TimeRiftWave_Timer = 15000; + Check_Timer = 5000; + + m_creature->SetRespawnDelay(DAY); } - void DoSummon() + void JustSummoned(Creature* pSummoned) { - if (m_creature->GetEntry() == NPC_PORTAL_INTRO) + switch(pSummoned->GetEntry()) { - //not made yet - return; + case NPC_GUARDIAN: + DoScriptText(EMOTE_GUARDIAN_PORTAL, pSummoned); + break; + case NPC_KEEPER: + DoScriptText(EMOTE_KEEPER_PORTAL, pSummoned); + break; + case NPC_AZURE_CAPTAIN: + DoScriptText(EMOTE_DRAGONFLIGHT_PORTAL, pSummoned); + break; + default: + return; } - else if (m_creature->GetEntry() == NPC_PORTAL) + + } + + uint32 SelectRandSummon() + { + uint32 entry = 0; + if(portalType == 1) { - m_creature->SummonCreature(m_pInstance->GetRandomPortalEliteEntry(), 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600*IN_MILLISECONDS); - m_creature->CastSpell(m_creature, SPELL_PORTAL_PERIODIC, true); + switch (urand(0, 3)) + { + case 0: entry = NPC_AZURE_BINDER; break; + case 1: entry = NPC_AZURE_INVADER; break; + case 2: entry = NPC_AZURE_MAGE_SLAYER; break; + case 3: entry = NPC_AZURE_SPELLBREAKER; break; + } + }else{ + switch (urand(0, 3)) + { + case 0: entry = NPC_AZURE_CAPTAIN; break; + case 1: entry = NPC_AZURE_RAIDER; break; + case 2: entry = NPC_AZURE_SORCEROR; break; + case 3: entry = NPC_AZURE_STALKER; break; + } } - else if (m_pInstance->IsCurrentPortalForTrash()) + return entry; + } + void SpawnGroup() + { + if(portalType == 0) + return; + + uint8 uiSpawnCount = (m_pInstance->GetData(TYPE_RIFT) < 12) ? 3 : 4; + for(uint8 i = 0; i < uiSpawnCount; i++) { - for(uint8 i = 0; i < 4; ++i) + uint32 uiSpawnEntry = SelectRandSummon(); + if(Creature* pSummoned = m_creature->SummonCreature(uiSpawnEntry, m_creature->GetPositionX()-5+rand()%10, m_creature->GetPositionY()-5+rand()%10, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) { - uint32 uiSummonId; - - switch(i) - { - case 0: uiSummonId = NPC_AZURE_CAPTAIN; break; - case 1: uiSummonId = NPC_AZURE_RAIDER; break; - case 2: uiSummonId = NPC_AZURE_SORCEROR; break; - case 3: uiSummonId = NPC_AZURE_STALKER; break; - } - - m_creature->SummonCreature(uiSummonId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600*IN_MILLISECONDS); + debug_log("Spawn NPC %u, motherPortalID %u, portalLoc %u", uiSpawnEntry, portalID, portalLoc); + ((mob_vh_dragonsAI*)pSummoned->AI())->motherPortalID = portalID; + ((mob_vh_dragonsAI*)pSummoned->AI())->portalLoc = portalLoc; } - - m_bNeedInvisible = true; } - else + } + bool IsThereNearElite(float range) + { + //Azure captain + if(Creature* pTemp = GetClosestCreatureWithEntry(m_creature, NPC_AZURE_CAPTAIN, range)) { - if(m_uiMyPortalNumber < 18) - m_creature->SummonCreature(NPC_AZURE_SABOTEUR, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600*IN_MILLISECONDS); - else - m_creature->SummonCreature(NPC_CYANIGOSA, PortalLoc[0].x, PortalLoc[0].y, PortalLoc[0].z, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); - m_bNeedInvisible = true; + if(((mob_vh_dragonsAI*)pTemp->AI())->motherPortalID == portalID) + return true; + } + //Azure raider + else if(Creature* pTemp = GetClosestCreatureWithEntry(m_creature, NPC_AZURE_RAIDER, range)) + { + if(((mob_vh_dragonsAI*)pTemp->AI())->motherPortalID == portalID) + return true; } + //Azure sorceror + else if(Creature* pTemp = GetClosestCreatureWithEntry(m_creature, NPC_AZURE_SORCEROR, range)) + { + if(((mob_vh_dragonsAI*)pTemp->AI())->motherPortalID == portalID) + return true; + } + //Azure Stalker + else if(Creature* pTemp = GetClosestCreatureWithEntry(m_creature, NPC_AZURE_STALKER, range)) + { + if(((mob_vh_dragonsAI*)pTemp->AI())->motherPortalID == portalID) + return true; + } + return false; } - void JustSummoned(Creature* pSummoned) + void UpdateAI(const uint32 diff) { - switch(pSummoned->GetEntry()) + if (!m_pInstance) + return; + + if(m_pInstance->GetData(TYPE_EVENT) != IN_PROGRESS) + return; + + switch(portalType) { - case NPC_PORTAL_GUARDIAN: - DoScriptText(EMOTE_GUARDIAN_PORTAL, pSummoned); - m_creature->CastSpell(pSummoned, SPELL_PORTAL_CHANNEL, false); - break; - case NPC_PORTAL_KEEPER: - DoScriptText(EMOTE_KEEPER_PORTAL, pSummoned); - m_creature->CastSpell(pSummoned, SPELL_PORTAL_CHANNEL, false); + case 0: + return; + case 1: + if (TimeRiftWave_Timer < diff) + { + debug_log("SpawnGroup()"); + SpawnGroup(); + TimeRiftWave_Timer = 15000; + }else TimeRiftWave_Timer -= diff; + + if (!m_creature->IsNonMeleeSpellCasted(false)) + { + m_uiNextPortal_Timer = 5000; + debug_log("SD2: npc_time_rift: not casting anylonger, i need to die."); + m_creature->ForcedDespawn(); + } break; - case NPC_AZURE_CAPTAIN: - DoScriptText(EMOTE_DRAGONFLIGHT_PORTAL, pSummoned); - m_lMobSet.insert(pSummoned->GetGUID()); + case 2: + if(!m_uiGroupSpawned) + { + SpawnGroup(); + m_uiGroupSpawned = true; + } + if (Check_Timer < diff) + { + if(!IsThereNearElite(150.0f)) + { + m_uiNextPortal_Timer = 5000; + debug_log("SD2: npc_time_rift: No elite, i need to die."); + m_creature->ForcedDespawn(); + } + Check_Timer = 1000; + }else Check_Timer -= diff; break; - case NPC_AZURE_RAIDER: - case NPC_AZURE_SORCEROR: - case NPC_AZURE_STALKER: - m_lMobSet.insert(pSummoned->GetGUID()); - return; - default: - return; } + } +}; +/*###### +## npc_sinclari +######*/ +enum +{ + SAY_BEGIN = -1608000, + SAY_LOCK_DOOR = -1608001, - if (m_pInstance) - m_pInstance->SetData(TYPE_PORTAL, SPECIAL); + GOSSIP_ITEM_INTRO = -3608000, + GOSSIP_ITEM_START = -3608001, + + GOSSIP_TEXT_ID_INTRO = 13853, + GOSSIP_TEXT_ID_START = 13854, + SAY_END = -1608009, +}; + +struct MANGOS_DLL_DECL npc_sinclariAI : public ScriptedAI +{ + npc_sinclariAI(Creature *pCreature) : ScriptedAI(pCreature) + { + m_pInstance = ((ScriptedInstance*)pCreature->GetInstanceData()); + Reset(); } + ScriptedInstance *m_pInstance; + + uint8 m_uiRiftPortalCount; + uint8 m_bIsRegular; + uint32 m_uiBossCheck_Timer; + uint32 m_uiPortalCheck_Timer; + std::list m_lGuardsList; + uint32 m_uiWaypoint; + bool start; + uint32 m_uiWalkTimer; - void SummonedCreatureJustDied(Creature* pSummoned) + void Reset() { - switch(pSummoned->GetEntry()) + m_uiRiftPortalCount = 0; + m_uiWalkTimer = 0; + m_uiNextPortal_Timer = 0; + m_uiBossCheck_Timer = 0; + m_uiPortalCheck_Timer = 1000; + m_bIsRegular = m_creature->GetMap()->IsRegularDifficulty(); + m_uiWaypoint = 0; + start = false; + } + + void CallGuards(bool bRespawn) + { + GetCreatureListWithEntryInGrid(m_lGuardsList, m_creature, NPC_GUARD, 50.0f); + for(std::list::iterator i = m_lGuardsList.begin(); i != m_lGuardsList.end(); ++i) + { + if (Creature* pGuard = *i) { - case NPC_PORTAL_GUARDIAN: - case NPC_PORTAL_KEEPER: - break; - case NPC_AZURE_CAPTAIN: - case NPC_AZURE_RAIDER: - case NPC_AZURE_SORCEROR: - case NPC_AZURE_STALKER: + if (bRespawn) + { + pGuard->Respawn(); + } + else if (pGuard->isAlive()) { - m_lMobSet.erase(pSummoned->GetGUID()); + pGuard->AI()->EnterEvadeMode(); - if (!m_lMobSet.empty()) - return; + if (Creature* pSinclari = GetClosestCreatureWithEntry(pGuard,NPC_SINCLARI,50.0f)) + pGuard->GetMotionMaster()->MoveFollow(pSinclari, 0.0f, 0.0f); - break; + pGuard->ForcedDespawn(20000); } - default: - return; } + } +} - if (m_pInstance) - { - // no need if a new portal was made while this was in progress - if (m_uiMyPortalNumber == m_pInstance->GetCurrentPortalNumber()) - m_pInstance->SetData(TYPE_PORTAL, DONE); + + void SetEvent() + { + + m_uiNextPortal_Timer = 5000; + + if (m_pInstance){ + m_pInstance->SetData(TYPE_EVENT, IN_PROGRESS); + m_pInstance->DoUseDoorOrButton(GO_DOOR_SEAL); } + } + void EventEscort() + { + start=true; + m_uiWalkTimer = 1000; + - m_creature->ForcedDespawn(); } - void UpdateAI(const uint32 uiDiff) + void DoSpawnPortal() { - if (m_uiIntroTimer) + int tmp = urand(1, 6); + if (Creature* pTemp = m_creature->SummonCreature(NPC_PORTAL, PortalLoc[tmp].x, PortalLoc[tmp].y, PortalLoc[tmp].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) { - if (m_uiIntroTimer <= uiDiff) + pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + //set portal type + uint8 portalType = rand()%2+1; + uint32 portalID = rand()%50000; + ((npc_violet_portalAI*)pTemp->AI())->portalType = portalType; + ((npc_violet_portalAI*)pTemp->AI())->portalID = portalID; + ((npc_violet_portalAI*)pTemp->AI())->portalLoc = tmp; + + if(portalType == 1) { - if (!m_pInstance) + uint32 entry = urand(0, 1) ? NPC_GUARDIAN : NPC_KEEPER; + if (Creature* pSummoned = pTemp->SummonCreature(entry, PortalLoc[tmp].x, PortalLoc[tmp].y, PortalLoc[tmp].z, pTemp->GetOrientation(), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) { - m_creature->ForcedDespawn(); - return; + pSummoned->AddThreat(pTemp); + pTemp->CastSpell(pSummoned, SPELL_PORTAL_CHANNEL,false); + ((mob_vh_dragonsAI*)pSummoned->AI())->motherPortalID = portalID; } - - m_uiIntroTimer = 0; } - else + } + } + + void UpdateAI(const uint32 uiDiff) + { + if(start) + { + if (m_uiWalkTimer <= uiDiff) { - m_uiIntroTimer -= uiDiff; - return; + switch(m_uiWaypoint) + { + case 0: m_creature->GetMotionMaster()->MovePoint(m_uiWaypoint, SinclariWP[m_uiWaypoint].x, SinclariWP[m_uiWaypoint].y, SinclariWP[m_uiWaypoint].z); + m_uiWalkTimer = 1000; + m_uiWaypoint++; + break; + case 1: m_creature->GetMotionMaster()->MovePoint(m_uiWaypoint, SinclariWP[m_uiWaypoint].x, SinclariWP[m_uiWaypoint].y, SinclariWP[m_uiWaypoint].z); + DoScriptText(SAY_BEGIN, m_creature); + CallGuards(false); + m_uiWalkTimer = 2000; + m_uiWaypoint++; + break; + case 2: + m_creature->GetMotionMaster()->MovePoint(m_uiWaypoint, SinclariWP[m_uiWaypoint].x, SinclariWP[m_uiWaypoint].y, SinclariWP[m_uiWaypoint].z); + m_uiWalkTimer = 3000; + m_uiWaypoint++; + break; + case 3: m_creature->GetMotionMaster()->MovePoint(m_uiWaypoint, SinclariWP[m_uiWaypoint].x, SinclariWP[m_uiWaypoint].y, SinclariWP[m_uiWaypoint].z); + DoScriptText(SAY_LOCK_DOOR, m_creature); + m_uiWalkTimer = 3000; + m_uiWaypoint++; + break; + case 4: + m_creature->GetMotionMaster()->MovePoint(4, 1815.571f, 800.112f, 44.364f); + SetEvent(); + m_uiWalkTimer = 3000; + m_uiWaypoint++; + break; + case 5: + m_creature->GetMotionMaster()->Clear(); + start = false; + m_uiWalkTimer = 0; + break; + + } } + else m_uiWalkTimer -= uiDiff; } - if (!m_bIntro) + if(m_pInstance->GetData(TYPE_EVENT) != IN_PROGRESS || m_pInstance->GetData(TYPE_CYANIGOSA) == IN_PROGRESS) + return; + + if (m_uiNextPortal_Timer && m_pInstance->GetData(TYPE_RIFT) != DONE ) { - DoSummon(); - m_bIntro = true; + if (m_uiNextPortal_Timer <= uiDiff) + { + ++m_uiRiftPortalCount; + if (m_pInstance && m_uiRiftPortalCount < 19) + { + m_pInstance->DoUpdateWorldState(WORLD_STATE_VH_PORTALS, m_uiRiftPortalCount); + m_pInstance->SetData(TYPE_RIFT, SPECIAL); + } + + if ( m_uiRiftPortalCount != 6 + && m_uiRiftPortalCount != 12 + && m_uiRiftPortalCount != 18 + && m_uiRiftPortalCount < 18 + ) + { + DoSpawnPortal(); + if (m_uiRiftPortalCount < 12) + m_uiNextPortal_Timer = 120000; + else + m_uiNextPortal_Timer = 90000; + } + else if ( m_uiRiftPortalCount == 6 + || m_uiRiftPortalCount == 12) + { + if(m_uiRiftPortalCount == 6 && m_pInstance->GetData(TYPE_PORTAL6) != DONE || m_uiRiftPortalCount == 12 && m_pInstance->GetData(TYPE_PORTAL12) != DONE) + { + if (Creature* pTemp = m_creature->SummonCreature(NPC_PORTAL, PortalLoc[0].x, PortalLoc[0].y, PortalLoc[0].z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000)) + { + pTemp->SetRespawnDelay(7*DAY*IN_MILLISECONDS); + Creature* pSummoned = m_creature->SummonCreature(NPC_AZURE_SABOTEUR, PortalLoc[0].x, PortalLoc[0].y, PortalLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); +// pSummoned->AddThreat(pTemp); + pTemp->CastSpell(pSummoned, SPELL_PORTAL_CHANNEL, false); + if(m_uiRiftPortalCount == 6) {m_pInstance->SetData(TYPE_PORTAL6, IN_PROGRESS);} + else m_pInstance->SetData(TYPE_PORTAL12, IN_PROGRESS); + } + m_uiNextPortal_Timer = m_bIsRegular ? 180000 : 120000; + } + else m_uiNextPortal_Timer = 4000; + m_pInstance->SetData(TYPE_RIFT, IN_PROGRESS); + m_uiBossCheck_Timer = 1000; + } + else if (m_uiRiftPortalCount == 18 && m_pInstance->GetData(TYPE_RIFT) != DONE) + { + Creature* pCyanigossa = GetClosestCreatureWithEntry(m_creature, NPC_CYANIGOSA, 300.0f); + + if (!pCyanigossa) + { + m_creature->SummonCreature(NPC_CYANIGOSA, 1922.420f, 803.240f, 52.40f, 3.022f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN , 99999999);} + m_pInstance->SetData(TYPE_RIFT, DONE); + m_pInstance->SetData(TYPE_DISRUPTIONS, 20); + m_uiNextPortal_Timer = 1*DAY; + } + } + else + m_uiNextPortal_Timer -= uiDiff; + + return; } - if (m_bNeedInvisible) + if (m_uiBossCheck_Timer) { - // hack; find a better way - m_creature->SetVisibility(VISIBILITY_OFF); - m_bNeedInvisible = false; + if (m_uiBossCheck_Timer <= uiDiff) + { + if (!m_pInstance->GetData(DATA_BOSSTIME)) + m_uiNextPortal_Timer = 10000; + m_uiBossCheck_Timer = 1000; + } + else + m_uiBossCheck_Timer -= uiDiff; + + return; } } }; -CreatureAI* GetAI_npc_teleportation_portal(Creature* pCreature) +bool GossipHello_npc_sinclari(Player* pPlayer, Creature* pCreature) { - return new npc_teleportation_portalAI(pCreature); + if (ScriptedInstance* m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData()) + { + if (m_pInstance->GetData(TYPE_EVENT) == NOT_STARTED || m_pInstance->GetData(TYPE_EVENT) == FAIL) + { + pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INTRO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXT_ID_INTRO, pCreature->GetObjectGuid()); + } + } + return true; } -bool pEffectDummyNPC_npc_teleportation_portal(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Creature* pCreatureTarget) +bool GossipSelect_npc_sinclari(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { - //always check spellid and effectindex - if (uiSpellId == SPELL_PORTAL_PERIODIC && uiEffIndex == EFFECT_INDEX_0) + if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + { + if (ScriptedInstance* m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData()) + { + if (m_pInstance->GetData(TYPE_EVENT) == NOT_STARTED || m_pInstance->GetData(TYPE_EVENT) == FAIL) + { + pPlayer->PlayerTalkClass->ClearMenus(); + pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXT_ID_START, pCreature->GetObjectGuid()); + } + } + else + pPlayer->CLOSE_GOSSIP_MENU(); + } + + if (uiAction == GOSSIP_ACTION_INFO_DEF+2) { - if (instance_violet_hold* pInstance = (instance_violet_hold*)pCreatureTarget->GetInstanceData()) - pCreatureTarget->SummonCreature(pInstance->GetRandomMobForNormalPortal(), 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600*IN_MILLISECONDS); + if (ScriptedInstance* m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData()) + { + pPlayer->CLOSE_GOSSIP_MENU(); + + if (m_pInstance->GetData(TYPE_EVENT) == NOT_STARTED || m_pInstance->GetData(TYPE_EVENT) == FAIL) + { - //always return true when we are handling this spell and effect - return true; + if (Creature* pSinclari = (m_pInstance->GetSingleCreatureFromStorage(NPC_SINCLARI))) + + ((npc_sinclariAI*)pSinclari->AI())->EventEscort(); + } + } + else + pPlayer->CLOSE_GOSSIP_MENU(); } - return false; + return true; } +/*###### +## npc_door_seal_vh +######*/ +struct MANGOS_DLL_DECL npc_door_sealAI : public ScriptedAI +{ + npc_door_sealAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Reset(); + } + + ScriptedInstance* m_pInstance; + + uint32 CheckTimer; + uint32 SpellCorrupt_Timer; + uint8 lastPortal; + + void Reset() + { + CheckTimer = 0; + SpellCorrupt_Timer = 0; + lastPortal = 0; +} + void SpellHit(Unit* caster, const SpellEntry* spell) + { + if (SpellCorrupt_Timer) + return; + + if (spell->Id == SPELL_CORRUPT) { + SpellCorrupt_Timer = 1000; + } + } + void JustDied(Unit* pKiller) + { + m_creature->Respawn(); + } + + void UpdateAI(const uint32 diff){ + if (SpellCorrupt_Timer) + { + if (SpellCorrupt_Timer <= diff) + { + if (m_creature->HasAura(SPELL_CORRUPT,EFFECT_INDEX_0)) + SpellCorrupt_Timer = 1500; + else + SpellCorrupt_Timer = 0; + }else SpellCorrupt_Timer -= diff; + } + } +}; /*###### ## npc_azure_saboteur @@ -384,8 +950,8 @@ struct MANGOS_DLL_DECL npc_azure_saboteurAI : public ScriptedAI uint8 m_uiBossID; uint8 m_bIsRegular; - uint64 m_uiBossGUID; - uint64 m_uiDoorGUID; + uint32 m_uiBossType; + uint32 m_uiDoorGUID; void AttackStart(Unit* pWho) { @@ -401,15 +967,45 @@ struct MANGOS_DLL_DECL npc_azure_saboteurAI : public ScriptedAI m_uiDisruptionCounter = 0; m_uiDisruptionsCount = 0; m_uiDisruption_Timer = 1000; +// m_bIsRegular = m_creature->GetMap()->IsRegularDifficulty(); if (m_pInstance) { - m_uiBossID = m_pInstance->GetData(TYPE_RAND_BOSS_ID); - - m_uiBossGUID = m_pInstance->GetData64(m_uiBossID); - m_uiDoorGUID = m_pInstance->GetData64(m_uiBossID+30); - m_creature->GetMotionMaster()->MovePoint(0, BossLoc[m_uiBossID].x, BossLoc[m_uiBossID].y, BossLoc[m_uiBossID].z); - //else m_creature->GetMotionMaster()->MovePoint(0, 1827.960, 804.208, 44.364); + m_uiBossID = m_pInstance->GetData(TYPE_LASTBOSS); + m_uiDisruptionsCount = m_pInstance->GetData(TYPE_DISRUPTIONS); + switch (m_uiBossID) + { + case 6: // Lavanthor + m_uiBossType = TYPE_LAVANTHOR; + m_uiDoorGUID = GO_DOOR_LAVANTHOR; + break; + case 7: // Zuramat + m_uiBossType = TYPE_ZURAMAT; + m_uiDoorGUID = GO_DOOR_ZURAMAT; + break; + case 3: // Moragg + m_uiBossType = TYPE_MORAGG; + m_uiDoorGUID = GO_DOOR_MORAGG; + break; + case 2: // Erekem + m_uiBossType = TYPE_EREKEM; + m_uiDoorGUID = GO_DOOR_EREKEM; + break; + case 4: // Ichoron + m_uiBossType = TYPE_ICHORON; + m_uiDoorGUID = GO_DOOR_ICHORON; + break; + case 5: // Xevozz + m_uiBossType = TYPE_XEVOZZ; + m_uiDoorGUID = GO_DOOR_XEVOZZ; + break; + case 0: // No boss + m_uiBossType = 0; + break; + } + m_pInstance->SetData(TYPE_LASTBOSS_ID, m_uiBossType); + if (m_uiBossType != 0) m_creature->GetMotionMaster()->MovePoint(0, BossLoc[m_uiBossID].x, BossLoc[m_uiBossID].y, BossLoc[m_uiBossID].z); + else m_creature->GetMotionMaster()->MovePoint(0, 1827.960f, 804.208f, 44.364f); } } @@ -429,68 +1025,91 @@ struct MANGOS_DLL_DECL npc_azure_saboteurAI : public ScriptedAI void UpdateAI(const uint32 uiDiff) { if (m_bIsActiving) - { - if(!m_pInstance) - return; if (m_uiDisruption_Timer < uiDiff) { - DoCast(m_creature, SPELL_SHIELD_DISRUPTION); - if(Creature* pBoss = (Creature*) m_creature->GetMap()->GetUnit(m_uiBossGUID)) + if (m_uiDisruptionCounter < 3) { - pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); + DoCast(m_creature, SPELL_SHIELD_DISRUPTION); + ++m_uiDisruptionsCount; + m_pInstance->SetData(TYPE_DISRUPTIONS, m_uiDisruptionsCount); } - - m_pInstance->DoUseDoorOrButton(m_uiDoorGUID); - m_pInstance->SetData(m_uiBossID,SPECIAL); - - if (m_uiBossID == TYPE_EREKEM) + else if (m_uiDisruptionCounter == 3) + { + m_pInstance->DoUseDoorOrButton(m_uiDoorGUID); + if (m_uiBossType == TYPE_EREKEM) + { + m_pInstance->DoUseDoorOrButton(GO_DOOR_EREKEM_RIGHT); + m_pInstance->DoUseDoorOrButton(GO_DOOR_EREKEM_LEFT); + } + } + else { - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(DATA_EREKEM_DOOR_L)); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(DATA_EREKEM_DOOR_R)); + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + if (m_pInstance->GetData(TYPE_LASTBOSS_ID) != 0) + m_pInstance->SetData(m_pInstance->GetData(TYPE_LASTBOSS_ID), SPECIAL); + m_bIsActiving = false; } - m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - m_bIsActiving = false; + + ++m_uiDisruptionCounter; + m_uiDisruption_Timer = 1000; } else m_uiDisruption_Timer -= uiDiff; - } } }; + + CreatureAI* GetAI_npc_azure_saboteur(Creature* pCreature) { return new npc_azure_saboteurAI (pCreature); } +CreatureAI* GetAI_mob_vh_dragons(Creature* pCreature) +{ + return new mob_vh_dragonsAI(pCreature); +} +CreatureAI* GetAI_npc_sinclari(Creature* pCreature) +{ + return new npc_sinclariAI (pCreature); +} +CreatureAI* GetAI_npc_violet_portal(Creature* pCreature) +{ + return new npc_violet_portalAI (pCreature); +} +CreatureAI* GetAI_npc_door_seal(Creature* pCreature) +{ + return new npc_door_sealAI(pCreature); +} + void AddSC_violet_hold() { Script *newscript; newscript = new Script; - newscript->Name = "go_activation_crystal"; - newscript->pGOUse = &GOUse_go_activation_crystal; + newscript->Name = "npc_sinclari"; + newscript->GetAI = &GetAI_npc_sinclari; + newscript->pGossipHello = &GossipHello_npc_sinclari; + newscript->pGossipSelect = &GossipSelect_npc_sinclari; newscript->RegisterSelf(); newscript = new Script; - newscript->Name = "npc_door_seal"; - newscript->pEffectDummyNPC = &pEffectDummyNPC_npc_door_seal; + newscript->Name = "npc_violet_portal"; + newscript->GetAI = &GetAI_npc_violet_portal; newscript->RegisterSelf(); newscript = new Script; - newscript->Name = "npc_sinclari"; - newscript->GetAI = &GetAI_npc_sinclari; - newscript->pGossipHello = &GossipHello_npc_sinclari; - newscript->pGossipSelect = &GossipSelect_npc_sinclari; + newscript->Name = "npc_door_seal_vh"; + newscript->GetAI = &GetAI_npc_door_seal; newscript->RegisterSelf(); newscript = new Script; - newscript->Name = "npc_teleportation_portal"; - newscript->GetAI = &GetAI_npc_teleportation_portal; - newscript->pEffectDummyNPC = &pEffectDummyNPC_npc_teleportation_portal; + newscript->Name = "npc_azure_saboteur"; + newscript->GetAI = &GetAI_npc_azure_saboteur; newscript->RegisterSelf(); newscript = new Script; - newscript->Name = "npc_azure_saboteur"; - newscript->GetAI = &GetAI_npc_azure_saboteur; + newscript->Name = "mob_vh_dragons"; + newscript->GetAI = &GetAI_mob_vh_dragons; newscript->RegisterSelf(); + } diff --git a/scripts/northrend/violet_hold/violet_hold.h b/scripts/northrend/violet_hold/violet_hold.h index c5f84c9..f2e851e 100644 --- a/scripts/northrend/violet_hold/violet_hold.h +++ b/scripts/northrend/violet_hold/violet_hold.h @@ -1,281 +1,136 @@ -/* Copyright (C) 2006 - 2011 ScriptDev2 +/* Copyright (C) 2006 - 2011 ScriptDev2 * This program is free software licensed under GPL version 2 * Please see the included DOCS/LICENSE.TXT for more information */ -#ifndef DEF_VIOLET_H -#define DEF_VIOLET_H +#ifndef DEF_VIOLET_HOLD_H +#define DEF_VIOLET_HOLD_H enum { - MAX_ENCOUNTER = 10, - - TYPE_MAIN = 0, - TYPE_PORTAL = 1, - TYPE_SEAL = 2, - - TYPE_EREKEM = 3, - TYPE_MORAGG = 4, - TYPE_ICHORON = 5, - TYPE_XEVOZZ = 6, - TYPE_LAVANTHOR = 7, - TYPE_ZURAMAT = 8, - TYPE_CYANIGOSA = 9, - - TYPE_LASTBOSS = 11, - TYPE_DOOR = 12, - TYPE_SEAL_DMG_SAY = 13, - - TYPE_RAND_BOSS_ID = 14, - - DATA_EREKEM = 23, - DATA_MORAGG = 24, - DATA_ICHORON = 25, - DATA_XEVOZZ = 26, - DATA_LAVANTHOR = 27, - DATA_ZURAMAT = 28, - DATA_SINCLARI = 29, - DATA_NPC_SEAL_DOOR = 31, - - DATA_SEAL_DOOR = 32, - DATA_EREKEM_DOOR = 33, - DATA_MORAGG_DOOR = 34, - DATA_ICHORON_DOOR = 35, - DATA_XEVOZZ_DOOR = 36, - DATA_LAVANTHOR_DOOR = 37, - DATA_ZURAMAT_DOOR = 38, - DATA_EREKEM_DOOR_L = 39, - DATA_EREKEM_DOOR_R = 40, - - WORLD_STATE_ID = 3816, - WORLD_STATE_SEAL = 3815, - WORLD_STATE_PORTALS = 3810, - - GO_INTRO_CRYSTAL = 193615, - - GO_DOOR_SEAL = 191723, - GO_DOOR_EREKEM = 191564, - GO_DOOR_EREKEM_RIGHT = 191563, - GO_DOOR_EREKEM_LEFT = 191562, - GO_DOOR_MORAGG = 191606, - GO_DOOR_ICHORON = 191722, - GO_DOOR_XEVOZZ = 191556, - GO_DOOR_LAVANTHOR = 191566, - GO_DOOR_ZURAMAT = 191565, - - NPC_EVENT_CONTROLLER = 30883, - NPC_PORTAL_INTRO = 31011, - NPC_PORTAL = 30679, - NPC_PORTAL_ELITE = 32174, - NPC_DOOR_SEAL = 30896, - - NPC_SINCLARI = 30658, - NPC_SINCLARI_ALT = 32204, // yeller for seal weakening and summoner for portals - NPC_HOLD_GUARD = 30659, - - NPC_EREKEM = 29315, - NPC_EREKEM_GUARD = 29395, - NPC_MORAGG = 29316, - NPC_ICHORON = 29313, - NPC_XEVOZZ = 29266, - NPC_LAVANTHOR = 29312, - NPC_ZURAMAT = 29314, - NPC_CYANIGOSA = 31134, - - NPC_PORTAL_GUARDIAN = 30660, - NPC_PORTAL_KEEPER = 30695, - - NPC_AZURE_INVADER = 30661, - NPC_AZURE_SPELLBREAKER = 30662, - NPC_AZURE_BINDER = 30663, - NPC_AZURE_MAGE_SLAYER = 30664, - NPC_MAGE_HUNTER = 30665, - NPC_AZURE_CAPTAIN = 30666, - NPC_AZURE_SORCEROR = 30667, - NPC_AZURE_RAIDER = 30668, - NPC_AZURE_STALKER = 32191, - - // used for intro - NPC_AZURE_BINDER_INTRO = 31007, - NPC_AZURE_INVADER_INTRO = 31008, - NPC_AZURE_SPELLBREAKER_INTRO= 31009, - NPC_AZURE_MAGE_SLAYER_INTRO = 31010, - - NPC_AZURE_SABOTEUR = 31079, - - NPC_DEFENSE_SYSTEM = 30837, - NPC_DEFENSE_DUMMY_TARGET = 30857, - - NPC_ARAKKOA = 32226, - NPC_VOID_LORD = 32230, - NPC_ETHERAL = 32231, - NPC_SWIRLING = 32234, - NPC_WATCHER = 32235, - NPC_LAVA_HOUND = 32237, - - SPELL_DEFENSE_SYSTEM_VISUAL = 57887, - SPELL_DEFENSE_SYSTEM_SPAWN = 57886, - - SPELL_DESTROY_DOOR_SEAL = 58040, // spell periodic cast by misc - SPELL_TELEPORTATION_PORTAL = 57687, // visual aura, but possibly not used? creature_template model for portals are same - - SPELL_SHIELD_DISRUPTION = 58291, // dummy when opening a cell - - SPELL_PORTAL_PERIODIC = 58008, // most likely the tick for each summon (tick each 15 seconds) - SPELL_PORTAL_CHANNEL = 58012, // the blue "stream" between portal and guardian/keeper - SPELL_PORTAL_BEAM = 56046, // large beam, unsure if really used here (or possible for something different) - - SPELL_PORTAL_VISUAL_1 = 57872, // no idea, but is possibly related based on it's visual appearence - SPELL_PORTAL_VISUAL_2 = 57630, - - SAY_SEAL_75 = -1608002, - SAY_SEAL_50 = -1608003, - SAY_SEAL_5 = -1608004, + MAX_ENCOUNTER = 11, + + TYPE_EVENT = 0, + TYPE_RIFT = 1, + TYPE_EREKEM = 2, + TYPE_MORAGG = 3, + TYPE_ICHORON = 4, + TYPE_XEVOZZ = 5, + TYPE_LAVANTHOR = 6, + TYPE_ZURAMAT = 7, + TYPE_CYANIGOSA = 8, + TYPE_PORTAL6 = 9, + TYPE_PORTAL12 = 10, + + + WORLD_STATE_VH = 3816, + WORLD_STATE_VH_PRISON = 3815, + WORLD_STATE_VH_PORTALS = 3810, + + TYPE_LASTBOSS = 19, + TYPE_DOOR = 21, + TYPE_PORTAL_TIME = 22, + + TYPE_DISRUPTIONS = 101, + TYPE_LASTBOSS_ID = 102, + + DATA_EREKEM = 23, + DATA_MORAGG = 24, + DATA_ICHORON = 25, + DATA_XEVOZZ = 26, + DATA_LAVANTHOR = 27, + DATA_ZURAMAT = 28, + DATA_SINCLARI = 29, + DATA_BOSSTIME = 30, + + NPC_EREKEM = 29315, + NPC_EREKEM_GUARD = 29395, + NPC_MORAGG = 29316, + NPC_ICHORON = 29313, + NPC_XEVOZZ = 29266, + NPC_LAVANTHOR = 29312, + NPC_ZURAMAT = 29314, + NPC_CYANIGOSA = 31134, + + NPC_AZURE_SABOTEUR = 31079, // Open boss's cell + + NPC_AZURE_CAPTAIN = 30666, //Melee, 40k - 60k hp, 3 for 1-11, 4 for 13-17 + NPC_AZURE_RAIDER = 30668, //Melee, 40k - 60k hp + NPC_AZURE_SORCEROR = 30667, //Caster, 40k - 60k hp + NPC_AZURE_STALKER = 32191, //Melee, 40k - 60k hp + NPC_GUARDIAN = 30660, + NPC_KEEPER = 30695, + NPC_AZURE_BINDER = 30663, //Caster, 7k - 10k hp + NPC_AZURE_INVADER = 30661, //Melee, 8k - 12k hp + NPC_AZURE_MAGE_SLAYER = 30664, //Melee, 10k - 15k hp + NPC_AZURE_SPELLBREAKER = 30662, //Caster, 10k - 15k hp + + NPC_SINCLARI = 30658, + NPC_GUARD = 30659, + NPC_PORTAL = 31011, + NPC_DOOR_SEAL = 30896, + + GO_DOOR_SEAL = 191723, + GO_DOOR_EREKEM = 191564, + GO_DOOR_EREKEM_RIGHT = 191563, + GO_DOOR_EREKEM_LEFT = 191562, + GO_DOOR_MORAGG = 191606, + GO_DOOR_ICHORON = 191722, + GO_DOOR_XEVOZZ = 191556, + GO_DOOR_LAVANTHOR = 191566, + GO_DOOR_ZURAMAT = 191565, + + SPELL_PORTAL_CHANNEL = 58012, + SPELL_CORRUPT = 58040, EMOTE_GUARDIAN_PORTAL = -1608005, EMOTE_DRAGONFLIGHT_PORTAL = -1608006, - EMOTE_KEEPER_PORTAL = -1608007, - - MAX_NORMAL_PORTAL = 8 + EMOTE_KEEPER_PORTAL = -1608007 }; -static float fDefenseSystemLoc[4] = {1888.146f, 803.382f, 58.604f, 3.072f}; - -enum ePortalType -{ - PORTAL_TYPE_NORM = 0, - PORTAL_TYPE_SQUAD, - PORTAL_TYPE_BOSS, -}; - -struct sPortalData +struct Locations { - ePortalType pPortalType; - float fX, fY, fZ, fOrient; + float x, y, z; + uint32 id; }; -static sPortalData afPortalLocation[]= +struct WayPoints { - {PORTAL_TYPE_NORM, 1936.07f, 803.198f, 53.3749f, 3.1241f}, //balcony - {PORTAL_TYPE_NORM, 1877.51f, 850.104f, 44.6599f, 4.7822f}, //erekem - {PORTAL_TYPE_NORM, 1890.64f, 753.471f, 48.7224f, 1.7104f}, //moragg - {PORTAL_TYPE_SQUAD, 1911.06f, 802.103f, 38.6465f, 2.8908f}, //below balcony - {PORTAL_TYPE_SQUAD, 1928.06f, 763.256f, 51.3167f, 2.3905f}, //bridge - {PORTAL_TYPE_SQUAD, 1924.26f, 847.661f, 47.1591f, 4.0202f}, //zuramat - {PORTAL_TYPE_NORM, 1914.16f, 832.527f, 38.6441f, 3.5160f}, //xevozz - {PORTAL_TYPE_NORM, 1857.30f, 764.145f, 38.6543f, 0.8339f}, //lavanthor - {PORTAL_TYPE_BOSS, 1890.73f, 803.309f, 38.4001f, 2.4139f}, //center + WayPoints(uint32 _id, float _x, float _y, float _z) + { + id = _id; + x = _x; + y = _y; + z = _z; + } + uint32 id; + float x, y, z; }; -class MANGOS_DLL_DECL instance_violet_hold : public ScriptedInstance +static Locations SinclariWP[]= { - public: - instance_violet_hold(Map* pMap); - ~instance_violet_hold() {} - - void Initialize(); - void ResetAll(); - void ResetVariables(); - - void OnCreatureCreate(Creature* pCreature); - void OnObjectCreate(GameObject* pGo); - - void UpdateCellForBoss(uint32 uiBossEntry); - void UpdateWorldState(bool bEnable = true); - - void OnPlayerEnter(Player* pPlayer); - - void SetIntroPortals(bool bDeactivate); - void SpawnPortal(); - - void SetPortalId(); + {1830.5f, 799.357f, 44.3418f}, // 0 use activation + {1832.46f, 800.431f, 44.3117f}, // 1 SAY_BEGIN call back guards + {1824.79f, 803.828f, 44.3634f}, // 2 SAY_LOCK_DOOR close door + {1807.25f, 803.904f, 44.3634f}, // 3 + {1808.07f, 804.259f, 44.3641f}, // 4 - void CallGuards(bool bRespawn); - - uint32 GetRandomPortalEliteEntry(); - uint32 GetRandomMobForNormalPortal(); - - uint32 GetCurrentPortalNumber() { return m_uiWorldStatePortalCount; } - - sPortalData const* GetPortalData() { return &afPortalLocation[m_uiPortalId]; } - - bool IsCurrentPortalForTrash() - { - if (m_uiWorldStatePortalCount % 6) - return true; - - return false; - } - - bool IsNextPortalForTrash() - { - if ((m_uiWorldStatePortalCount+1) % 6) - return true; - - return false; - } - - void ProcessActivationCrystal(Unit* pUser, bool bIsIntro = false); - - void SetRandomBosses(); - - void SetData(uint32 uiType, uint32 uiData); - uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); - - void Update(uint32 uiDiff); - - typedef std::multimap BossToCellMap; - - protected: - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiSinclariGUID; - uint64 m_uiSinclariAltGUID; - uint64 m_uiErekemGUID; - uint64 m_uiMoraggGUID; - uint64 m_uiIchoronGUID; - uint64 m_uiXevozzGUID; - uint64 m_uiLavanthorGUID; - uint64 m_uiZuramatGUID; - - uint64 m_uiSealDoorGUID; - uint64 m_uiErekemDoorGUID; - uint64 m_uiErekemDoorLeftGUID; - uint64 m_uiErekemDoorRightGUID; - uint64 m_uiMoraggDoorGUID; - uint64 m_uiIchoronDoorGUID; - uint64 m_uiXevozzDoorGUID; - uint64 m_uiLavanthorDoorGUID; - uint64 m_uiZuramatDoorGUID; - - uint64 m_uiCellErekemGuard_LGUID; - uint64 m_uiCellErekemGuard_RGUID; - uint64 m_uiIntroCrystalGUID; - - uint32 m_uiWorldState; - uint32 m_uiWorldStateSealCount; - uint32 m_uiWorldStatePortalCount; - - uint8 m_uiPortalId; - uint32 m_uiPortalTimer; - uint32 m_uiMaxCountPortalLoc; - uint32 m_uiSealDmgSay; - uint32 m_uiChosenBoss; - - std::list m_lIntroPortalList; - std::list m_lGuardsList; }; -struct Locations +static Locations PortalLoc[]= { - float x, y, z; - uint32 id; + {1888.271f, 810.781f, 38.441f}, // 0 center + {1857.125f, 763.295f, 38.654f}, // 1 Lavanthor + {1925.480f, 849.981f, 47.174f}, // 2 Zuramat + {1892.737f, 744.589f, 47.666f}, // 3 Moragg + {1878.198f, 850.005f, 43.333f}, // 4 Portal in front of Erekem + {1909.381f, 806.796f, 38.645f}, // 5 Portal outside of Ichoron + {1936.101f, 802.950f, 52.417f}, // 6 at the highest platform }; static Locations BossLoc[]= { + {0,0,0}, + {0,0,0}, {1876.100f, 857.079f, 43.333f}, // Erekem {1892.737f, 744.589f, 47.666f}, // Moragg {1908.863f, 785.647f, 37.435f}, // Ichoron @@ -284,15 +139,46 @@ static Locations BossLoc[]= {1925.480f, 849.981f, 47.174f}, // Zuramat }; -static Locations PortalLoc[]= +static Locations DragonsWP[]= { - {1888.271f, 810.781f, 38.441f}, // 0 center - {1857.125f, 763.295f, 38.654f}, // 1 Lavanthor - {1925.480f, 849.981f, 47.174f}, // 2 Zuramat - {1892.737f, 744.589f, 47.666f}, // 3 Moragg - {1878.198f, 850.005f, 43.333f}, // 4 Portal in front of Erekem - {1909.381f, 806.796f, 38.645f}, // 5 Portal outside of Ichoron - {1936.101f, 802.950f, 52.417f}, // 6 at the highest platform + //center, ichoron + {1869.393f, 803.902f, 38.768f}, // 0 + {1859.843f, 804.222f, 44.008f}, // 1 + {1829.64f, 804.194f, 44.355f}, // 2 + + //From left side (lavanthor) + {1861.016f, 789.717f, 38.908f}, // 3 + {1856.217f, 796.705f, 44.008f}, // 4 + {1829.64f, 804.194f, 44.355f}, // 5 + + //From Zuramat + {1931.446f, 826.734f, 47.556f}, // 6 + {1913.049f, 823.930f, 38.792f}, // 7 + {1827.960f, 804.208f, 44.364f}, // 8 + {1869.393f, 803.902f, 38.768f}, // 9 + {1859.843f, 804.222f, 44.008f}, // 10 + {1829.64f, 804.194f, 44.355f}, // 11 + + //From Morag + {1887.500f, 763.096f, 47.666f}, // 12 + {1880.837f, 775.769f, 38.796f}, // 13 + {1861.016f, 789.717f, 38.908f}, // 14 + {1856.217f, 796.705f, 44.008f}, // 15 + {1829.64f, 804.194f, 44.355f}, // 16 + + //From erekem + {1878.280f, 843.267f, 43.333f}, // 17 + {1872.311f, 835.531f, 38.780f}, // 18 + {1861.997f, 818.766f, 38.650f}, // 19 + {1857.348f, 811.230f, 44.008f}, // 20 + {1829.64f, 804.194f, 44.355f}, // 21 + + //From Highest platform + {1937.298f, 824.557f, 52.332f}, // 22 + {1913.049f, 823.930f, 38.792f}, // 23 + {1869.393f, 803.902f, 38.768f}, // 24 + {1859.843f, 804.222f, 44.008f}, // 25 + {1829.64f, 804.194f, 44.355f}, // 26 }; #endif diff --git a/scripts/outdoor_pvp/eastern_kingdoms/outdoor_pvp_eastern_plaguelands.cpp b/scripts/outdoor_pvp/eastern_kingdoms/outdoor_pvp_eastern_plaguelands.cpp index 6abf034..edb05d8 100644 --- a/scripts/outdoor_pvp/eastern_kingdoms/outdoor_pvp_eastern_plaguelands.cpp +++ b/scripts/outdoor_pvp/eastern_kingdoms/outdoor_pvp_eastern_plaguelands.cpp @@ -38,7 +38,7 @@ void outdoor_pvp_eastern_plaguelands::OnPlayerEnterZone(Player* pPlayer, uint32 // pPlayer->CastSpell(pPlayer, SPELL_CENARION_FAVOR, false); // add to the player set - sPlaguelandsPlayers.insert(pPlayer->GetGUID()); + sPlaguelandsPlayers.insert(pPlayer->GetObjectGuid()); // send actual world states SendPlayerWorldState(pPlayer); @@ -47,8 +47,8 @@ void outdoor_pvp_eastern_plaguelands::OnPlayerEnterZone(Player* pPlayer, uint32 void outdoor_pvp_eastern_plaguelands::OnPlayerLeaveZone(Player* pPlayer, uint32 uiZoneId) { // remove from the player set - if (sPlaguelandsPlayers.find(pPlayer->GetGUID()) != sPlaguelandsPlayers.end()) - sPlaguelandsPlayers.erase(pPlayer->GetGUID()); + if (sPlaguelandsPlayers.find(pPlayer->GetObjectGuid()) != sPlaguelandsPlayers.end()) + sPlaguelandsPlayers.erase(pPlayer->GetObjectGuid()); } void outdoor_pvp_eastern_plaguelands::SetData(uint32 uiType, uint32 uiData) diff --git a/scripts/outdoor_pvp/kalimdor/outdoor_pvp_silithus.cpp b/scripts/outdoor_pvp/kalimdor/outdoor_pvp_silithus.cpp index 4298b07..6d700b4 100644 --- a/scripts/outdoor_pvp/kalimdor/outdoor_pvp_silithus.cpp +++ b/scripts/outdoor_pvp/kalimdor/outdoor_pvp_silithus.cpp @@ -37,7 +37,7 @@ void outdoor_pvp_silithus::OnPlayerEnterZone(Player* pPlayer, uint32 uiZoneId) pPlayer->CastSpell(pPlayer, SPELL_CENARION_FAVOR, false); // add to the player set - sSilithusPlayers.insert(pPlayer->GetGUID()); + sSilithusPlayers.insert(pPlayer->GetObjectGuid()); // send actual world states SendPlayerWorldState(pPlayer); @@ -48,8 +48,8 @@ void outdoor_pvp_silithus::OnPlayerEnterZone(Player* pPlayer, uint32 uiZoneId) pPlayer->RemoveAurasDueToSpell(SPELL_CENARION_FAVOR); // remove from the player set - if (sSilithusPlayers.find(pPlayer->GetGUID()) != sSilithusPlayers.end()) - sSilithusPlayers.erase(pPlayer->GetGUID()); + if (sSilithusPlayers.find(pPlayer->GetObjectGuid()) != sSilithusPlayers.end()) + sSilithusPlayers.erase(pPlayer->GetObjectGuid()); } } diff --git a/scripts/outdoor_pvp/outdoor_pvp_zone_selector.h b/scripts/outdoor_pvp/outdoor_pvp_zone_selector.h index f5d8b74..02791a3 100644 --- a/scripts/outdoor_pvp/outdoor_pvp_zone_selector.h +++ b/scripts/outdoor_pvp/outdoor_pvp_zone_selector.h @@ -33,7 +33,7 @@ class OutdoorPvP_ZoneSelector : public OutdoorPvP ~OutdoorPvP_ZoneSelector() { - for (ZoneScriptsSet::iterator itr = m_scriptsSet.begin(); itr != m_scriptsSet.end();) + for (ZoneScriptsSet::iterator itr = m_scriptsSet.begin(); itr != m_scriptsSet.end(); ++itr) delete (*itr); } diff --git a/scripts/outland/auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp b/scripts/outland/auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp index 354d227..f8f9e4c 100644 --- a/scripts/outland/auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp +++ b/scripts/outland/auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp @@ -156,7 +156,7 @@ struct MANGOS_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI Reset(); } - uint64 m_uiTargetGUID; + ObjectGuid m_targetGuid; uint32 m_uiFearTimer; uint32 m_uiRibbonOfSoulsTimer; @@ -167,7 +167,7 @@ struct MANGOS_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI void Reset() { - m_uiTargetGUID = 0; + m_targetGuid.Clear(); m_uiFearTimer = urand(15000, 20000); m_uiRibbonOfSoulsTimer = 5000; @@ -205,7 +205,7 @@ struct MANGOS_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI pSummoned->CastSpell(pSummoned, SPELL_STOLEN_SOUL_VISUAL, false); pSummoned->setFaction(m_creature->getFaction()); - if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_uiTargetGUID)) + if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_targetGuid)) { if (mob_stolen_soulAI* pSoulAI = dynamic_cast(pSummoned->AI())) { @@ -260,7 +260,7 @@ struct MANGOS_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI DoScriptText(urand(0, 1) ? SAY_ROAR : SAY_SOUL_CLEAVE, m_creature); - m_uiTargetGUID = pTarget->GetGUID(); + m_targetGuid = pTarget->GetObjectGuid(); DoCastSpellIfCan(pTarget, SPELL_STOLEN_SOUL); DoSpawnCreature(NPC_STOLEN_SOUL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); diff --git a/scripts/outland/auchindoun/sethekk_halls/boss_darkweaver_syth.cpp b/scripts/outland/auchindoun/sethekk_halls/boss_darkweaver_syth.cpp index fa6109a..f32459e 100644 --- a/scripts/outland/auchindoun/sethekk_halls/boss_darkweaver_syth.cpp +++ b/scripts/outland/auchindoun/sethekk_halls/boss_darkweaver_syth.cpp @@ -215,7 +215,6 @@ struct MANGOS_DLL_DECL mob_syth_fireAI : public ScriptedAI uint32 flameshock_timer; uint32 flamebuffet_timer; - void Reset() { m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true); diff --git a/scripts/outland/auchindoun/sethekk_halls/instance_sethekk_halls.cpp b/scripts/outland/auchindoun/sethekk_halls/instance_sethekk_halls.cpp index f41b1c6..03afc4a 100644 --- a/scripts/outland/auchindoun/sethekk_halls/instance_sethekk_halls.cpp +++ b/scripts/outland/auchindoun/sethekk_halls/instance_sethekk_halls.cpp @@ -24,8 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "sethekk_halls.h" -instance_sethekk_halls::instance_sethekk_halls(Map* pMap) : ScriptedInstance(pMap), - m_uiIkissDoorGUID(0) +instance_sethekk_halls::instance_sethekk_halls(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -38,9 +37,10 @@ void instance_sethekk_halls::OnObjectCreate(GameObject* pGo) { if (pGo->GetEntry() == GO_IKISS_DOOR) { - m_uiIkissDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_IKISS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); + + m_mGoEntryGuidStore[GO_IKISS_DOOR] = pGo->GetObjectGuid(); } } @@ -54,7 +54,7 @@ void instance_sethekk_halls::SetData(uint32 uiType, uint32 uiData) break; case TYPE_IKISS: if (uiData == DONE) - DoUseDoorOrButton(m_uiIkissDoorGUID, DAY*IN_MILLISECONDS); + DoUseDoorOrButton(GO_IKISS_DOOR, DAY); m_auiEncounter[uiType] = uiData; break; default: diff --git a/scripts/outland/auchindoun/sethekk_halls/sethekk_halls.h b/scripts/outland/auchindoun/sethekk_halls/sethekk_halls.h index 52ab8d3..26f42ca 100644 --- a/scripts/outland/auchindoun/sethekk_halls/sethekk_halls.h +++ b/scripts/outland/auchindoun/sethekk_halls/sethekk_halls.h @@ -42,8 +42,6 @@ class MANGOS_DLL_DECL instance_sethekk_halls : public ScriptedInstance private: uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - - uint64 m_uiIkissDoorGUID; }; #endif diff --git a/scripts/outland/auchindoun/shadow_labyrinth/boss_murmur.cpp b/scripts/outland/auchindoun/shadow_labyrinth/boss_murmur.cpp index 10dfcf5..3f42093 100644 --- a/scripts/outland/auchindoun/shadow_labyrinth/boss_murmur.cpp +++ b/scripts/outland/auchindoun/shadow_labyrinth/boss_murmur.cpp @@ -57,7 +57,7 @@ struct MANGOS_DLL_DECL boss_murmurAI : public ScriptedAI uint32 ThunderingStorm_Timer; bool CanSonicBoom; bool CanShockWave; - uint64 m_uiPlayerTargetGUID; + ObjectGuid m_playerTargetGuid; void Reset() { @@ -69,7 +69,7 @@ struct MANGOS_DLL_DECL boss_murmurAI : public ScriptedAI ThunderingStorm_Timer = 12000; //Casting directly after Sonic Boom. CanSonicBoom = false; CanShockWave = false; - m_uiPlayerTargetGUID = 0; + m_playerTargetGuid.Clear(); //database should have `RegenHealth`=0 to prevent regen uint32 hp = (m_creature->GetMaxHealth()*40)/100; @@ -170,7 +170,7 @@ struct MANGOS_DLL_DECL boss_murmurAI : public ScriptedAI if (temp->GetTypeId() == TYPEID_PLAYER) { DoCastSpellIfCan(temp, SPELL_MAGNETIC_PULL); - m_uiPlayerTargetGUID = temp->GetGUID(); + m_playerTargetGuid = temp->GetObjectGuid(); CanShockWave = true; } MagneticPull_Timer = 2500; @@ -178,12 +178,12 @@ struct MANGOS_DLL_DECL boss_murmurAI : public ScriptedAI } else { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiPlayerTargetGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerTargetGuid)) pPlayer->CastSpell(pPlayer, SPELL_SHOCKWAVE, true); MagneticPull_Timer = urand(15000, 30000); CanShockWave = false; - m_uiPlayerTargetGUID = 0; + m_playerTargetGuid.Clear(); } }else MagneticPull_Timer -= diff; diff --git a/scripts/outland/auchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp b/scripts/outland/auchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp index 22b95e7..9a1e070 100644 --- a/scripts/outland/auchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp +++ b/scripts/outland/auchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp @@ -31,172 +31,147 @@ EndScriptData */ 4 - Murmur event */ -struct MANGOS_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance +instance_shadow_labyrinth::instance_shadow_labyrinth(Map* pMap) : ScriptedInstance(pMap), + m_uiFelOverseerCount(0) { - instance_shadow_labyrinth(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strInstData; - - uint64 m_uiRefectoryDoorGUID; - uint64 m_uiScreamingHallDoorGUID; + Initialize(); +} - uint64 m_uiGrandmasterVorpil; - uint32 m_uiFelOverseerCount; +void instance_shadow_labyrinth::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void Initialize() +void instance_shadow_labyrinth::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiRefectoryDoorGUID = 0; - m_uiScreamingHallDoorGUID = 0; - - m_uiGrandmasterVorpil = 0; - m_uiFelOverseerCount = 0; + case GO_REFECTORY_DOOR: + if (m_auiEncounter[2] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + case GO_SCREAMING_HALL_DOOR: + if (m_auiEncounter[3] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); + break; + + default: + return; } - bool IsEncounterInProgress() const - { - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; - - return false; - } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); +} - void OnObjectCreate(GameObject* pGo) +void instance_shadow_labyrinth::OnCreatureCreate(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - switch(pGo->GetEntry()) - { - case GO_REFECTORY_DOOR: - m_uiRefectoryDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[2] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - case GO_SCREAMING_HALL_DOOR: - m_uiScreamingHallDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[3] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - break; - } + case NPC_VORPIL: + m_mNpcEntryGuidStore[NPC_VORPIL] = pCreature->GetObjectGuid(); + break; + case NPC_FEL_OVERSEER: + ++m_uiFelOverseerCount; // TODO should actually only count alive ones + debug_log("SD2: Shadow Labyrinth: counting %u Fel Overseers.", m_uiFelOverseerCount); + break; } +} - void OnCreatureCreate(Creature* pCreature) +void instance_shadow_labyrinth::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(pCreature->GetEntry()) - { - case 18732: - m_uiGrandmasterVorpil = pCreature->GetGUID(); - break; - case 18796: - if (pCreature->isAlive()) - { - ++m_uiFelOverseerCount; - debug_log("SD2: Shadow Labyrinth: counting %u Fel Overseers.", m_uiFelOverseerCount); - } - break; - } - } + case TYPE_HELLMAW: + m_auiEncounter[0] = uiData; + break; + + case TYPE_OVERSEER: + if (uiData != DONE) + { + error_log("SD2: Shadow Labyrinth: TYPE_OVERSEER did not expect other data than DONE"); + return; + } + if (m_uiFelOverseerCount) + { + --m_uiFelOverseerCount; - void SetData(uint32 uiType, uint32 uiData) - { - switch(uiType) - { - case TYPE_HELLMAW: - m_auiEncounter[0] = uiData; - break; - - case TYPE_OVERSEER: - if (uiData != DONE) + if (m_uiFelOverseerCount) { - error_log("SD2: Shadow Labyrinth: TYPE_OVERSEER did not expect other data than DONE"); + debug_log("SD2: Shadow Labyrinth: %u Fel Overseers left to kill.", m_uiFelOverseerCount); + + // Skip save call return; } - if (m_uiFelOverseerCount) + else { - --m_uiFelOverseerCount; - - if (m_uiFelOverseerCount) - debug_log("SD2: Shadow Labyrinth: %u Fel Overseers left to kill.", m_uiFelOverseerCount); - else - { - m_auiEncounter[1] = DONE; - debug_log("SD2: Shadow Labyrinth: TYPE_OVERSEER == DONE"); - } + m_auiEncounter[1] = DONE; + debug_log("SD2: Shadow Labyrinth: TYPE_OVERSEER == DONE"); } - break; - - case TYPE_INCITER: - if (uiData == DONE) - DoUseDoorOrButton(m_uiRefectoryDoorGUID); - m_auiEncounter[2] = uiData; - break; - - case TYPE_VORPIL: - if (uiData == DONE) - DoUseDoorOrButton(m_uiScreamingHallDoorGUID); - m_auiEncounter[3] = uiData; - break; - - case TYPE_MURMUR: - m_auiEncounter[4] = uiData; - break; - } - - if (uiData == DONE) - { - if (uiType == TYPE_OVERSEER && m_uiFelOverseerCount != 0) - return; + } + break; + + case TYPE_INCITER: + if (uiData == DONE) + DoUseDoorOrButton(GO_REFECTORY_DOOR); + m_auiEncounter[2] = uiData; + break; + + case TYPE_VORPIL: + if (uiData == DONE) + DoUseDoorOrButton(GO_SCREAMING_HALL_DOOR); + m_auiEncounter[3] = uiData; + break; + + case TYPE_MURMUR: + m_auiEncounter[4] = uiData; + break; + } - OUT_SAVE_INST_DATA; + if (uiData == DONE) + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " - << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4]; + std::ostringstream saveStream; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " + << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4]; - strInstData = saveStream.str(); + m_strInstData = saveStream.str(); - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + SaveToDB(); + OUT_SAVE_INST_DATA_COMPLETE; } +} - uint32 GetData(uint32 uiType) +uint32 instance_shadow_labyrinth::GetData(uint32 uiType) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_HELLMAW: - return m_auiEncounter[0]; - case TYPE_OVERSEER: - return m_auiEncounter[1]; - } - return false; - } + case TYPE_HELLMAW: return m_auiEncounter[0]; + case TYPE_OVERSEER: return m_auiEncounter[1]; - const char* Save() - { - return strInstData.c_str(); + default: + return 0; } +} - void Load(const char* in) +void instance_shadow_labyrinth::Load(const char* chrIn) +{ + if (!chrIn) { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_LOAD_INST_DATA(in); + OUT_LOAD_INST_DATA(chrIn); - std::istringstream loadStream(in); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> m_auiEncounter[4]; + std::istringstream loadStream(chrIn); + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> m_auiEncounter[4]; - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; - OUT_LOAD_INST_DATA_COMPLETE; - } -}; + OUT_LOAD_INST_DATA_COMPLETE; +} InstanceData* GetInstanceData_instance_shadow_labyrinth(Map* pMap) { @@ -205,9 +180,10 @@ InstanceData* GetInstanceData_instance_shadow_labyrinth(Map* pMap) void AddSC_instance_shadow_labyrinth() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_shadow_labyrinth"; - newscript->GetInstanceData = &GetInstanceData_instance_shadow_labyrinth; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_shadow_labyrinth"; + pNewScript->GetInstanceData = &GetInstanceData_instance_shadow_labyrinth; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/auchindoun/shadow_labyrinth/shadow_labyrinth.h b/scripts/outland/auchindoun/shadow_labyrinth/shadow_labyrinth.h index 4296a6d..79a9f33 100644 --- a/scripts/outland/auchindoun/shadow_labyrinth/shadow_labyrinth.h +++ b/scripts/outland/auchindoun/shadow_labyrinth/shadow_labyrinth.h @@ -15,8 +15,34 @@ enum TYPE_VORPIL = 4, TYPE_MURMUR = 5, + NPC_VORPIL = 18732, + NPC_FEL_OVERSEER = 18796, + GO_REFECTORY_DOOR = 183296, //door opened when blackheart the inciter dies GO_SCREAMING_HALL_DOOR = 183295 //door opened when grandmaster vorpil dies }; +class MANGOS_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance +{ + public: + instance_shadow_labyrinth(Map* pMap); + + void Initialize(); + + void OnObjectCreate(GameObject* pGo); + void OnCreatureCreate(Creature* pCreature); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + const char* Save() { return m_strInstData.c_str(); } + void Load(const char* chrIn); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + std::string m_strInstData; + + uint32 m_uiFelOverseerCount; +}; + #endif diff --git a/scripts/outland/black_temple/black_temple.h b/scripts/outland/black_temple/black_temple.h index 2178fcd..d27629a 100644 --- a/scripts/outland/black_temple/black_temple.h +++ b/scripts/outland/black_temple/black_temple.h @@ -69,28 +69,8 @@ class MANGOS_DLL_DECL instance_black_temple : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiNajentusGUID; - uint64 m_uiAkamaGUID; // This is the Akama that starts the Illidan encounter. - uint64 m_uiAkama_ShadeGUID; // This is the Akama that starts the Shade of Akama encounter. - uint64 m_uiShadeOfAkamaGUID; - uint64 m_uiSupremusGUID; - uint64 m_uiLadyMalandeGUID; - uint64 m_uiGathiosTheShattererGUID; - uint64 m_uiHighNethermancerZerevorGUID; - uint64 m_uiVerasDarkshadowGUID; - uint64 m_uiIllidariCouncilGUID; - uint64 m_uiBloodElfCouncilVoiceGUID; - uint64 m_uiIllidanStormrageGUID; - - uint64 m_uiNajentusGateGUID; - uint64 m_uiMainTempleDoorsGUID; - uint64 m_uiShadeAkamaDoorGUID; - uint64 m_uiIllidanGateGUID; - uint64 m_uiIllidanDoorGUID[2]; - uint64 m_uiShahrazPreDoorGUID; - uint64 m_uiShahrazPostDoorGUID; - uint64 m_uiPreCouncilDoorGUID; - uint64 m_uiCouncilDoorGUID; + ObjectGuid m_akamaGuid; // This is the Akama that starts the Illidan encounter. + ObjectGuid m_illidanStormrageGuid; }; #endif diff --git a/scripts/outland/black_temple/boss_bloodboil.cpp b/scripts/outland/black_temple/boss_bloodboil.cpp index 88ccb7d..e8fa916 100644 --- a/scripts/outland/black_temple/boss_bloodboil.cpp +++ b/scripts/outland/black_temple/boss_bloodboil.cpp @@ -62,7 +62,7 @@ struct MANGOS_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 TargetGUID; + ObjectGuid m_targetGuid; float TargetThreat; @@ -82,7 +82,7 @@ struct MANGOS_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI void Reset() { - TargetGUID = 0; + m_targetGuid.Clear(); TargetThreat = 0; @@ -176,7 +176,7 @@ struct MANGOS_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI }*/ } - void RevertThreatOnTarget(uint64 guid) + void RevertThreatOnTarget(ObjectGuid guid) { if (Player* pPlayer = m_creature->GetMap()->GetPlayer(guid)) { @@ -271,7 +271,7 @@ struct MANGOS_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI Phase1 = false; TargetThreat = m_creature->getThreatManager().getThreat(target); - TargetGUID = target->GetGUID(); + m_targetGuid = target->GetObjectGuid(); target->CastSpell(m_creature, SPELL_TAUNT_GURTOGG, true); if (m_creature->getThreatManager().getThreat(target)) @@ -298,10 +298,10 @@ struct MANGOS_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI } }else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage { - if (TargetGUID) - RevertThreatOnTarget(TargetGUID); + if (m_targetGuid) + RevertThreatOnTarget(m_targetGuid); - TargetGUID = 0; + m_targetGuid.Clear(); Phase1 = true; BloodboilTimer = 10000; BloodboilCount = 0; diff --git a/scripts/outland/black_temple/boss_illidan.cpp b/scripts/outland/black_temple/boss_illidan.cpp index 731762c..9dc44a5 100644 --- a/scripts/outland/black_temple/boss_illidan.cpp +++ b/scripts/outland/black_temple/boss_illidan.cpp @@ -49,31 +49,34 @@ enum CreatureEntry // Gossip for when a player clicks Akama #define GOSSIP_ITEM "We are ready to face Illidan" -#define SAY_CONVO_1 -1564097 -#define SAY_CONVO_2 -1564098 -#define SAY_CONVO_3 -1564099 -#define SAY_CONVO_4 -1564100 -#define SAY_CONVO_5 -1564101 -#define SAY_CONVO_6 -1564102 -#define SAY_CONVO_7 -1564103 -#define SAY_CONVO_8 -1564104 -#define SAY_CONVO_9 -1564105 -#define SAY_CONVO_10 -1564106 -#define SAY_CONVO_11 -1564107 -#define SAY_CONVO_12 -1564108 -#define SAY_CONVO_13 -1564109 -#define SAY_CONVO_14 -1564110 -#define SAY_CONVO_15 -1564111 - -#define SAY_TAUNT_1 -1564112 -#define SAY_TAUNT_2 -1564113 -#define SAY_TAUNT_3 -1564114 -#define SAY_TAUNT_4 -1564115 - -#define SAY_MAIEV_TAUNT_1 -1564116 -#define SAY_MAIEV_TAUNT_2 -1564117 -#define SAY_MAIEV_TAUNT_3 -1564118 -#define SAY_MAIEV_TAUNT_4 -1564119 +enum +{ + SAY_CONVO_1 = -1564097, + SAY_CONVO_2 = -1564098, + SAY_CONVO_3 = -1564099, + SAY_CONVO_4 = -1564100, + SAY_CONVO_5 = -1564101, + SAY_CONVO_6 = -1564102, + SAY_CONVO_7 = -1564103, + SAY_CONVO_8 = -1564104, + SAY_CONVO_9 = -1564105, + SAY_CONVO_10 = -1564106, + SAY_CONVO_11 = -1564107, + SAY_CONVO_12 = -1564108, + SAY_CONVO_13 = -1564109, + SAY_CONVO_14 = -1564110, + SAY_CONVO_15 = -1564111, + + SAY_TAUNT_1 = -1564112, + SAY_TAUNT_2 = -1564113, + SAY_TAUNT_3 = -1564114, + SAY_TAUNT_4 = -1564115, + + SAY_MAIEV_TAUNT_1 = -1564116, + SAY_MAIEV_TAUNT_2 = -1564117, + SAY_MAIEV_TAUNT_3 = -1564118, + SAY_MAIEV_TAUNT_4 = -1564119, +}; //emote only defined if not related to textId (in database) struct Yells @@ -83,7 +86,7 @@ struct Yells bool Talk; }; -static Yells Conversation[]= +static const Yells aConversation[]= { {SAY_CONVO_1, ILLIDAN_STORMRAGE, 8000, 0, true}, {0, ILLIDAN_STORMRAGE, 5000, 396, true}, @@ -109,7 +112,7 @@ static Yells Conversation[]= {0, EMPTY, 1000, 0, false} }; -static Yells RandomTaunts[]= +static const Yells aRandomTaunts[]= { {SAY_TAUNT_1, ILLIDAN_STORMRAGE, 0, 0, false}, {SAY_TAUNT_2, ILLIDAN_STORMRAGE, 0, 0, false}, @@ -117,7 +120,7 @@ static Yells RandomTaunts[]= {SAY_TAUNT_4, ILLIDAN_STORMRAGE, 0, 0, false} }; -static Yells MaievTaunts[]= +static const Yells aMaievTaunts[]= { {SAY_MAIEV_TAUNT_1, MAIEV_SHADOWSONG, 0, 0, false}, {SAY_MAIEV_TAUNT_2, MAIEV_SHADOWSONG, 0, 0, false}, @@ -125,90 +128,93 @@ static Yells MaievTaunts[]= {SAY_MAIEV_TAUNT_4, MAIEV_SHADOWSONG, 0, 0, false} }; -// Yells for/by Akama -#define SAY_AKAMA_BEWARE -1564120 -#define SAY_AKAMA_MINION -1564121 -#define SAY_AKAMA_LEAVE -1564122 - -// Self explanatory -#define SAY_KILL1 -1564123 -#define SAY_KILL2 -1564124 - -// I think I'll fly now and let my subordinates take you on -#define SAY_TAKEOFF -1564125 -#define SAY_SUMMONFLAMES -1564126 - -// When casting Eye Blast. Demon Fire will be appear on places that he casts this -#define SAY_EYE_BLAST -1564127 - -// kk, I go big, dark and demon on you. -#define SAY_MORPH -1564128 - -// I KILL! -#define SAY_ENRAGE -1564129 - -/************** Spells *************/ -// Normal Form -#define SPELL_SHEAR 41032 // Reduces Max. Health by 60% for 7 seconds. Can stack 19 times. 1.5 second cast -#define SPELL_FLAME_CRASH 40832 // Summons an invis/unselect passive mob that has an aura of flame in a circle around him. -#define SPELL_DRAW_SOUL 40904 // 5k Shadow Damage in front of him. Heals Illidan for 100k health (script effect) -#define SPELL_PARASITIC_SHADOWFIEND 41917 // DoT of 3k Shadow every 2 seconds. Lasts 10 seconds. (Script effect: Summon 2 parasites once the debuff has ticked off) -#define SPELL_SUMMON_PARASITICS 41915 // Summons 2 Parasitic Shadowfiends on the target. It's supposed to be cast as soon as the Parasitic Shadowfiend debuff is gone, but the spells aren't linked :( -#define SPELL_AGONIZING_FLAMES 40932 // 4k fire damage initial to target and anyone w/i 5 yards. PHASE 3 ONLY -#define SPELL_ENRAGE 40683 // Increases damage by 50% and attack speed by 30%. 20 seconds, PHASE 5 ONLY -// Flying (Phase 2) -#define SPELL_THROW_GLAIVE 39635 // Throws a glaive on the ground -#define SPELL_THROW_GLAIVE2 39849 // Animation for the above spell -#define SPELL_GLAIVE_RETURNS 39873 // Glaive flies back to Illidan -#define SPELL_FIREBALL 40598 // 2.5k-3.5k damage in 10 yard radius. 2 second cast time. -#define SPELL_DARK_BARRAGE 40585 // 10 second channeled spell, 3k shadow damage per second. -// Demon Form -#define SPELL_DEMON_TRANSFORM_1 40511 // First phase of animations for transforming into Dark Illidan (fall to ground) -#define SPELL_DEMON_TRANSFORM_2 40398 // Second phase of animations (kneel) -#define SPELL_DEMON_TRANSFORM_3 40510 // Final phase of animations (stand up and roar) -#define SPELL_DEMON_FORM 40506 // Transforms into Demon Illidan. Has an Aura of Dread on him. -#define SPELL_SHADOW_BLAST 41078 // 8k - 11k Shadow Damage. Targets highest threat. Has a splash effect, damaging anyone in 20 yards of the target. -#define SPELL_FLAME_BURST 41126 // Hurls fire at entire raid for ~3.5k damage every 10 seconds. Resistable. (Does not work: Script effect) -#define SPELL_FLAME_BURST_EFFECT 41131 // The actual damage. Handled by core (41126 triggers 41131) -// Other Illidan spells -#define SPELL_KNEEL 39656 // Before beginning encounter, this is how he appears (talking to Wilson). -#define SPELL_SHADOW_PRISON 40647 // Illidan casts this spell to immobilize entire raid when he summons Maiev. -#define SPELL_DEATH 41220 // This spell doesn't do anything except stun Illidan and set him on his knees. -#define SPELL_BERSERK 45078 // Damage increased by 500%, attack speed by 150% - -// Non-Illidan spells -#define SPELL_AKAMA_DOOR_CHANNEL 41268 // Akama's channel spell on the door before the Temple Summit -#define SPELL_DEATHSWORN_DOOR_CHANNEL 41269 // Olum and Udalo's channel spell on the door before the Temple Summit -#define SPELL_AKAMA_DOOR_FAIL 41271 // Not sure where this is really used... -#define SPELL_HEALING_POTION 40535 // Akama uses this to heal himself to full. -#define SPELL_AZZINOTH_CHANNEL 39857 // Glaives cast it on Flames. Not sure if this is the right spell. -#define SPELL_SHADOW_DEMON_PASSIVE 41079 // Adds the "shadowform" aura to Shadow Demons. -#define SPELL_CONSUME_SOUL 41080 // Once the Shadow Demons reach their target, they use this to kill them -#define SPELL_PARALYZE 41083 // Shadow Demons cast this on their target -#define SPELL_PURPLE_BEAM 39123 // Purple Beam connecting Shadow Demon to their target -#define SPELL_CAGE_TRAP_DUMMY 40761 // Put this in DB for cage trap GO. -#define SPELL_EYE_BLAST_TRIGGER 40017 // This summons Demon Form every few seconds and deals ~20k damage in its radius -#define SPELL_EYE_BLAST 39908 // This does the blue flamey animation. -#define SPELL_FLAME_CRASH_EFFECT 40836 // Firey blue ring of circle that the other flame crash summons -#define SPELL_BLAZE_EFFECT 40610 // Green flame on the ground, triggers damage (5k) every few seconds -#define SPELL_BLAZE_SUMMON 40637 // Summons the Blaze creature -#define SPELL_DEMON_FIRE 40029 // Blue fire trail left by Eye Blast. Deals 2k per second if players stand on it. -#define SPELL_CAGED 40695 // Caged Trap triggers will cast this on Illidan if he is within 3 yards -#define SPELL_CAGE_TRAP_SUMMON 40694 // Summons a Cage Trap GO (bugged) on the ground along with a Cage Trap Disturb Trigger mob (working) -#define SPELL_CAGE_TRAP_BEAM 40713 // 8 Triggers on the ground in an octagon cast spells like this on Illidan 'caging him' -#define SPELL_FLAME_BLAST 40631 // Flames of Azzinoth use this. Frontal cone AoE 7k-9k damage. -#define SPELL_CHARGE 40602 // Flames of Azzinoth charges whoever is too far from them. They enrage after this. For simplicity, we'll use the same enrage as Illidan. -#define SPELL_TELEPORT_VISUAL 41232 // Teleport visual for Maiev -#define SPELL_SHADOWFIEND_PASSIVE 41913 // Passive aura for shadowfiends +enum +{ + // Yells for/by Akama + SAY_AKAMA_BEWARE = -1564120, + SAY_AKAMA_MINION = -1564121, + SAY_AKAMA_LEAVE = -1564122, + + // Self explanatory + SAY_KILL1 = -1564123, + SAY_KILL2 = -1564124, + + // I think I'll fly now and let my subordinates take you on + SAY_TAKEOFF = -1564125, + SAY_SUMMONFLAMES = -1564126, + + // When casting Eye Blast. Demon Fire will be appear on places that he casts this + SAY_EYE_BLAST = -1564127, + + // kk, I go big, dark and demon on you. + SAY_MORPH = -1564128, + + // I KILL! + SAY_ENRAGE = -1564129, + + /************** Spells *************/ + // Normal Form + SPELL_SHEAR = 41032, // Reduces Max. Health by 60% for 7 seconds. Can stack 19 times. 1.5 second cast + SPELL_FLAME_CRASH = 40832, // Summons an invis/unselect passive mob that has an uiAura of flame in a circle around him. + SPELL_DRAW_SOUL = 40904, // 5k Shadow Damage in front of him. Heals Illidan for 100k health (script effect) + SPELL_PARASITIC_SHADOWFIEND = 41917, // DoT of 3k Shadow every 2 seconds. Lasts 10 seconds. (Script effect: Summon 2 parasites once the debuff has ticked off) + SPELL_SUMMON_PARASITICS = 41915, // Summons 2 Parasitic Shadowfiends on the target. It's supposed to be cast as soon as the Parasitic Shadowfiend debuff is gone, but the spells aren't linked :( + SPELL_AGONIZING_FLAMES = 40932, // 4k fire damage uiInitial to target and anyone w/i 5 yards. PHASE 3 ONLY + SPELL_ENRAGE = 40683, // Increases damage by 50% and attack speed by 30%. 20 seconds, PHASE 5 ONLY + // Flying (Phase 2) + SPELL_THROW_GLAIVE = 39635, // Throws a glaive on the ground + SPELL_THROW_GLAIVE2 = 39849, // Animation for the above spell + SPELL_GLAIVE_RETURNS = 39873, // Glaive flies back to Illidan + SPELL_FIREBALL = 40598, // 2.5k-3.5k damage in 10 yard radius. 2 second cast time. + SPELL_DARK_BARRAGE = 40585, // 10 second channeled spell, 3k shadow damage per second. + // Demon Form + SPELL_DEMON_TRANSFORM_1 = 40511, // First uiPhase of animations for transforming into Dark Illidan (fall to ground) + SPELL_DEMON_TRANSFORM_2 = 40398, // Second uiPhase of animations (kneel) + SPELL_DEMON_TRANSFORM_3 = 40510, // Final uiPhase of animations (stand up and roar) + SPELL_DEMON_FORM = 40506, // Transforms into Demon Illidan. Has an Aura of Dread on him. + SPELL_SHADOW_BLAST = 41078, // 8k - 11k Shadow Damage. Targets highest threat. Has a splash effect, damaging anyone in 20 yards of the target. + SPELL_FLAME_BURST = 41126, // Hurls fire at entire raid for ~3.5k damage every 10 seconds. Resistable. (Does not work: Script effect) + SPELL_FLAME_BURST_EFFECT = 41131, // The actual damage. Handled by core (41126 triggers 41131) + // Other Illidan spells + SPELL_KNEEL = 39656, // Before beginning encounter, this is how he appears (talking to Wilson). + SPELL_SHADOW_PRISON = 40647, // Illidan casts this spell to immobilize entire raid when he summons Maiev. + SPELL_DEATH = 41220, // This spell doesn't do anything except stun Illidan and set him on his knees. + SPELL_BERSERK = 45078, // Damage increased by 500%, attack speed by 150% + + // Non-Illidan spells + SPELL_AKAMA_DOOR_CHANNEL = 41268, // Akama's channel spell on the door before the Temple Summit + SPELL_DEATHSWORN_DOOR_CHANNEL = 41269, // Olum and Udalo's channel spell on the door before the Temple Summit + SPELL_AKAMA_DOOR_FAIL = 41271, // Not sure where this is really used... + SPELL_HEALING_POTION = 40535, // Akama uses this to heal himself to full. + SPELL_AZZINOTH_CHANNEL = 39857, // Glaives cast it on Flames. Not sure if this is the right spell. + SPELL_SHADOW_DEMON_PASSIVE = 41079, // Adds the "shadowform" uiAura to Shadow Demons. + SPELL_CONSUME_SOUL = 41080, // Once the Shadow Demons reach their target, they use this to kill them + SPELL_PARALYZE = 41083, // Shadow Demons cast this on their target + SPELL_PURPLE_BEAM = 39123, // Purple Beam connecting Shadow Demon to their target + SPELL_CAGE_TRAP_DUMMY = 40761, // Put this in DB for cage trap GO. + SPELL_EYE_BLAST_TRIGGER = 40017, // This summons Demon Form every few seconds and deals ~20k damage in its radius + SPELL_EYE_BLAST = 39908, // This does the blue flamey animation. + SPELL_FLAME_CRASH_EFFECT = 40836, // Firey blue ring of circle that the other flame crash summons + SPELL_BLAZE_EFFECT = 40610, // Green flame on the ground, triggers damage (5k) every few seconds + SPELL_BLAZE_SUMMON = 40637, // Summons the Blaze creature + SPELL_DEMON_FIRE = 40029, // Blue fire trail left by Eye Blast. Deals 2k per second if players stand on it. + SPELL_CAGED = 40695, // Caged Trap triggers will cast this on Illidan if he is within 3 yards + SPELL_CAGE_TRAP_SUMMON = 40694, // Summons a Cage Trap GO (bugged) on the ground along with a Cage Trap Disturb Trigger mob (working) + SPELL_CAGE_TRAP_BEAM = 40713, // 8 Triggers on the ground in an octagon cast spells like this on Illidan 'caging him' + SPELL_FLAME_BLAST = 40631, // Flames of Azzinoth use this. Frontal cone AoE 7k-9k damage. + SPELL_CHARGE = 40602, // Flames of Azzinoth charges whoever is too far from them. They enrage after this. For simplicity, we'll use the same enrage as Illidan. + SPELL_TELEPORT_VISUAL = 41232, // Teleport visual for Maiev + SPELL_SHADOWFIEND_PASSIVE = 41913, // Passive uiAura for shadowfiends + + EQUIP_ID_MAIN_HAND = 32837, + EQUIP_ID_OFF_HAND = 32838, +}; // Other defines #define CENTER_X 676.740f #define CENTER_Y 305.297f #define CENTER_Z 353.192f -#define EQUIP_ID_MAIN_HAND 32837 -#define EQUIP_ID_OFF_HAND 32838 - /*** Phase Names ***/ enum Phase { @@ -218,6 +224,7 @@ enum Phase PHASE_DEMON = 4, PHASE_NORMAL_MAIEV = 5, PHASE_DEMON_SEQUENCE = 6, + PHASE_NORMAL_FORM = 7, // Internal marker, for switching back to either NORMAL_2 or NORMAL_MAIEV }; struct Locations @@ -226,7 +233,7 @@ struct Locations uint32 id; }; -static Locations GlaivePosition[]= +static const Locations aGlaivePosition[]= { {695.105f, 305.303f, 354.256f}, {659.338f, 305.303f, 354.256f}, @@ -234,7 +241,7 @@ static Locations GlaivePosition[]= {664.338f, 305.303f, 354.256f} }; -static Locations EyeBlast[]= +static const Locations aEyeBlast[]= { {650.697f, 320.128f, 353.730f}, {652.799f, 275.091f, 353.367f}, @@ -242,7 +249,7 @@ static Locations EyeBlast[]= {709.865f, 325.654f, 353.322f} }; -static Locations AkamaWP[]= +static const Locations aAkamaWP[]= { {770.01f, 304.50f, 312.29f}, // Bottom of the first stairs, at the doors {780.66f, 304.50f, 319.74f}, // Top of the first stairs @@ -256,10 +263,10 @@ static Locations AkamaWP[]= {738.11f, 365.44f, 353.00f}, // in front of the door-thingy (the other one!) {792.18f, 366.62f, 341.42f}, // Down the first flight of stairs {796.84f, 304.89f, 319.76f}, // Down the second flight of stairs - {782.01f, 304.55f, 319.76f} // Final location - back at the initial gates. This is where he will fight the minions! + {782.01f, 304.55f, 319.76f} // Final location - back at the uiInitial gates. This is where he will fight the minions! }; // 755.762, 304.0747, 312.1769 -- This is where Akama should be spawned -static Locations SpiritSpawns[]= +static const Locations aSpiritSpawns[]= { {755.5426f, 309.9156f, 312.2129f, SPIRIT_OF_UDALO}, {755.5426f, 298.7923f, 312.0834f, SPIRIT_OF_OLUM} @@ -280,22 +287,23 @@ struct WayPoints struct Animation // For the demon transformation { - uint32 aura, unaura, timer, size, displayid, phase; - bool equip; + uint32 uiAura, uiUnAura, uiTimer, uiSize, uiDisplayId; + Phase uiPhase; + bool bEquip; }; static Animation DemonTransformation[]= { - {SPELL_DEMON_TRANSFORM_1, 0, 1300, 0, 0, 6, true}, - {SPELL_DEMON_TRANSFORM_2, SPELL_DEMON_TRANSFORM_1, 4000, 0, 0, 6, true}, - {SPELL_DEMON_FORM, 0, 3000, 1073741824, 21322, 6, false}, - {SPELL_DEMON_TRANSFORM_3, SPELL_DEMON_TRANSFORM_2, 3500, 0, 0, 6, false}, - {0, 0, 0, 0, 0, 4, false}, - {SPELL_DEMON_TRANSFORM_1, 0, 1500, 0, 0, 6, false}, - {SPELL_DEMON_TRANSFORM_2, SPELL_DEMON_TRANSFORM_1, 4000, 0, 0, 6, false}, - {0, SPELL_DEMON_FORM, 3000, 1069547520, 21135, 6, false}, - {SPELL_DEMON_TRANSFORM_3, SPELL_DEMON_TRANSFORM_2, 3500, 0, 0, 6, true}, - {0, 0, 0, 0, 0, 8, true} + {SPELL_DEMON_TRANSFORM_1, 0, 1300, 0, 0, PHASE_DEMON_SEQUENCE, true}, + {SPELL_DEMON_TRANSFORM_2, SPELL_DEMON_TRANSFORM_1, 4000, 0, 0, PHASE_DEMON_SEQUENCE, true}, + {SPELL_DEMON_FORM, 0, 3000, 1073741824, 21322, PHASE_DEMON_SEQUENCE, false}, + {SPELL_DEMON_TRANSFORM_3, SPELL_DEMON_TRANSFORM_2, 3500, 0, 0, PHASE_DEMON_SEQUENCE, false}, + {0, 0, 0, 0, 0, PHASE_DEMON, false}, + {SPELL_DEMON_TRANSFORM_1, 0, 1500, 0, 0, PHASE_DEMON_SEQUENCE, false}, + {SPELL_DEMON_TRANSFORM_2, SPELL_DEMON_TRANSFORM_1, 4000, 0, 0, PHASE_DEMON_SEQUENCE, false}, + {0, SPELL_DEMON_FORM, 3000, 1069547520, 21135, PHASE_DEMON_SEQUENCE, false}, + {SPELL_DEMON_TRANSFORM_3, SPELL_DEMON_TRANSFORM_2, 3500, 0, 0, PHASE_DEMON_SEQUENCE, true}, + {0, 0, 0, 0, 0, PHASE_NORMAL_FORM, true} }; /**** Demon Fire will be used for Eye Blast. Illidan needs to have access to it's vars and functions, so we'll set it here ****/ @@ -309,61 +317,64 @@ struct MANGOS_DLL_DECL demonfireAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 IllidanGUID; + ObjectGuid m_illidanGuid; - bool IsTrigger; + bool m_bIsTrigger; - uint32 CheckTimer; - uint32 DemonFireTimer; - uint32 DespawnTimer; + uint32 m_uiCheckTimer; + uint32 m_uiDemonFireTimer; + uint32 m_uiDespawnTimer; void Reset() { - IllidanGUID = 0; + m_illidanGuid.Clear(); - IsTrigger = false; + m_bIsTrigger = false; - CheckTimer = 2000; - DemonFireTimer = 0; - DespawnTimer = 45000; + m_uiCheckTimer = 2000; + m_uiDemonFireTimer = 0; + m_uiDespawnTimer = 45000; } void AttackStart(Unit* who) { } void MoveInLineOfSight(Unit *who){ } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (IsTrigger) + if (m_bIsTrigger) return; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (CheckTimer < diff) + if (m_uiCheckTimer < uiDiff) { - if (!IllidanGUID && m_pInstance) + if (!m_illidanGuid && m_pInstance) { - if (Creature* pIllidan = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_ILLIDAN_STORMRAGE))) + if (Creature* pIllidan = m_pInstance->instance->GetCreature(m_pInstance->GetGuid(NPC_ILLIDAN_STORMRAGE))) { - IllidanGUID = m_pInstance->GetData64(NPC_ILLIDAN_STORMRAGE); + m_illidanGuid = m_pInstance->GetGuid(NPC_ILLIDAN_STORMRAGE); if (!pIllidan->HasSplineFlag(SPLINEFLAG_NO_SPLINE)) m_creature->SetDeathState(JUST_DIED); } } - CheckTimer = 2000; - }else CheckTimer -= diff; + m_uiCheckTimer = 2000; + } + else + m_uiCheckTimer -= uiDiff; - if (DemonFireTimer < diff) + if (m_uiDemonFireTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DEMON_FIRE); - DemonFireTimer = 30000; - }else DemonFireTimer -= diff; + m_uiDemonFireTimer = 30000; + } + else + m_uiDemonFireTimer -= uiDiff; - if (DespawnTimer < diff) + if (m_uiDespawnTimer < uiDiff) m_creature->SetDeathState(JUST_DIED); - else DespawnTimer -= diff; - - DoMeleeAttackIfReady(); + else + m_uiDespawnTimer -= uiDiff; } }; @@ -381,37 +392,37 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI ScriptedInstance* m_pInstance; /* Timers */ - uint32 ChannelTimer; - uint32 TalkTimer; - uint32 WalkTimer; - uint32 SummonMinionTimer; + uint32 m_uiChannelTimer; + uint32 m_uiTalkTimer; + uint32 m_uiWalkTimer; + uint32 m_uiSummonMinionTimer; /* GUIDs */ - uint64 IllidanGUID; - uint64 PlayerGUID; - uint64 SpiritGUID[2]; - uint64 ChannelGUID; - - bool IsTalking; - bool StartChanneling; - bool DoorOpen; - bool FightMinions; - bool IsReturningToIllidan; - bool IsWalking; - uint32 TalkCount; - uint32 ChannelCount; + ObjectGuid m_illidanGuid; + ObjectGuid m_playerGuid; + ObjectGuid m_aSpiritGuids[2]; + ObjectGuid m_channelGuid; + + bool m_bIsTalking; + bool m_bStartChanneling; + bool m_bDoorOpen; + bool m_bFightMinions; + bool m_bIsReturningToIllidan; + bool m_bIsWalking; + uint32 m_uiTalkCount; + uint32 m_uiChannelCount; std::list WayPointList; std::list::iterator WayPoint; - void BeginEvent(uint64 PlayerGUID); + void BeginEvent(ObjectGuid playerGuid); void Reset() { if (m_pInstance) { m_pInstance->SetData(TYPE_ILLIDAN, NOT_STARTED); - GameObject* pGate = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_ILLIDAN_GATE)); + GameObject* pGate = m_pInstance->GetSingleGameObjectFromStorage(GO_ILLIDAN_GATE); // close door if already open (when raid wipes or something) if (pGate && !pGate->GetGoState()) @@ -419,33 +430,34 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI for(uint32 i = GO_ILLIDAN_DOOR_R; i < GO_ILLIDAN_DOOR_L + 1; ++i) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(i))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(i)) pDoor->SetGoState(GO_STATE_ACTIVE); } } - IllidanGUID = 0; - PlayerGUID = 0; - ChannelGUID = 0; - for(uint8 i = 0; i < 2; ++i) SpiritGUID[i] = 0; + m_illidanGuid.Clear(); + m_playerGuid.Clear(); + m_channelGuid.Clear(); + for(uint8 i = 0; i < 2; ++i) + m_aSpiritGuids[i].Clear(); - ChannelTimer = 0; - ChannelCount = 0; - SummonMinionTimer = 2000; + m_uiChannelTimer = 0; + m_uiChannelCount = 0; + m_uiSummonMinionTimer = 2000; - WalkTimer = 0; - IsWalking = false; + m_uiWalkTimer = 0; + m_bIsWalking = false; - TalkTimer = 0; - TalkCount = 0; + m_uiTalkTimer = 0; + m_uiTalkCount = 0; KillAllElites(); - IsReturningToIllidan = false; - FightMinions = false; - IsTalking = false; - StartChanneling = false; - DoorOpen = false; + m_bIsReturningToIllidan = false; + m_bFightMinions = false; + m_bIsTalking = false; + m_bStartChanneling = false; + m_bDoorOpen = false; // Database sometimes has strange values.. m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); @@ -478,12 +490,12 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI void ReturnToIllidan() { KillAllElites(); - FightMinions = false; - IsReturningToIllidan = true; + m_bFightMinions = false; + m_bIsReturningToIllidan = true; WayPoint = WayPointList.begin(); m_creature->SetSpeedRate(MOVE_RUN, 2.0f); m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); - IsWalking = true; + m_bIsWalking = true; } void AddWaypoint(uint32 id, float x, float y, float z) @@ -492,11 +504,11 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI WayPointList.push_back(AWP); } - void DamageTaken(Unit *done_by, uint32 &damage) + void DamageTaken(Unit* pDealer, uint32& uiDamage) { - if (damage > m_creature->GetHealth() && (done_by->GetGUID() != m_creature->GetGUID())) + if (uiDamage > m_creature->GetHealth() && (pDealer != m_creature)) { - damage = 0; + uiDamage = 0; DoCastSpellIfCan(m_creature, SPELL_HEALING_POTION); } } @@ -507,17 +519,17 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI if (!m_pInstance || m_pInstance->GetData(TYPE_COUNCIL) != DONE) return; - debug_log("SD2: Akama - Door event initiated by player %s", pPlayer->GetName()); - PlayerGUID = pPlayer->GetGUID(); + debug_log("SD2: Akama - Door event initiated by player %s", pPlayer->GetObjectGuid().GetString().c_str()); + m_playerGuid = pPlayer->GetObjectGuid(); - if (GameObject* pGate = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_ILLIDAN_GATE))) + if (GameObject* pGate = m_pInstance->GetSingleGameObjectFromStorage(GO_ILLIDAN_GATE)) { float x,y,z; pGate->GetPosition(x, y, z); Creature* Channel = m_creature->SummonCreature(ILLIDAN_DOOR_TRIGGER, x, y, z+5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000); if (Channel) { - ChannelGUID = Channel->GetGUID(); + m_channelGuid = Channel->GetObjectGuid(); // Invisible but spell visuals can still be seen. Channel->SetDisplayId(11686); @@ -527,15 +539,15 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI m_creature->GetPosition(PosX, PosY, PosZ); for(uint8 i = 0; i < 2; ++i) { - Creature* Spirit = m_creature->SummonCreature(SpiritSpawns[i].id, SpiritSpawns[i].x, SpiritSpawns[i].y, SpiritSpawns[i].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000); + Creature* Spirit = m_creature->SummonCreature(aSpiritSpawns[i].id, aSpiritSpawns[i].x, aSpiritSpawns[i].y, aSpiritSpawns[i].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000); if (Spirit) { Spirit->SetVisibility(VISIBILITY_OFF); - SpiritGUID[i] = Spirit->GetGUID(); + m_aSpiritGuids[i] = Spirit->GetObjectGuid(); } } - StartChanneling = true; + m_bStartChanneling = true; m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoCastSpellIfCan(Channel, SPELL_AKAMA_DOOR_FAIL); @@ -545,7 +557,7 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE || !IsWalking) + if (type != POINT_MOTION_TYPE || !m_bIsWalking) return; if (WayPoint->id != id) @@ -554,23 +566,23 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI switch(id) { case 6: - if (!IsReturningToIllidan) + if (!m_bIsReturningToIllidan) { // open the doors that close the summit for(uint32 i = GO_ILLIDAN_DOOR_R; i < GO_ILLIDAN_DOOR_L+1; ++i) { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(i))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(i)) pDoor->SetGoState(GO_STATE_ACTIVE); } } break; case 7: - if (IsReturningToIllidan) + if (m_bIsReturningToIllidan) { - IsWalking = false; - if (IllidanGUID) + m_bIsWalking = false; + if (m_illidanGuid) { - Creature* Illidan = m_creature->GetMap()->GetCreature(IllidanGUID); + Creature* Illidan = m_creature->GetMap()->GetCreature(m_illidanGuid); if (Illidan) { float dx = Illidan->GetPositionX() + rand()%15; @@ -583,173 +595,177 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI break; case 8: m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (!IsReturningToIllidan) + if (!m_bIsReturningToIllidan) { - IsWalking = false; - BeginEvent(PlayerGUID); + m_bIsWalking = false; + BeginEvent(m_playerGuid); } break; case 12: - IsWalking = false; - FightMinions = true; + m_bIsWalking = false; + m_bFightMinions = true; m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; } ++WayPoint; - WalkTimer = 200; + m_uiWalkTimer = 200; } void DeleteFromThreatList() { // If we do not have Illidan's GUID, do not proceed - if (!IllidanGUID) + if (!m_illidanGuid) return; // Create a pointer to Illidan - Creature* Illidan = m_creature->GetMap()->GetCreature(IllidanGUID); + Creature* Illidan = m_creature->GetMap()->GetCreature(m_illidanGuid); // No use to continue if Illidan does not exist if (!Illidan) return; - ThreatList const& tList = m_creature->getThreatManager().getThreatList(); + ThreatList const& tList = Illidan->getThreatManager().getThreatList(); for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr) { - // Loop through threatlist till our GUID is found in it. + // Loop through threatlist till our Guid is found in it. if ((*itr)->getUnitGuid() == m_creature->GetObjectGuid()) { (*itr)->removeReference(); // Delete ourself from his threatlist. - return; // No need to continue anymore. + break; // No need to continue anymore. } } // Now we delete our threatlist to prevent attacking anyone for now m_creature->DeleteThreatList(); + // Also we remove all auras, to prevent delayed damage + m_creature->RemoveAllAuras(); } void UpdateAI(const uint32 diff) { - if (IllidanGUID) + if (m_illidanGuid) { - if (Creature* Illidan = m_creature->GetMap()->GetCreature(IllidanGUID)) + if (Creature* Illidan = m_creature->GetMap()->GetCreature(m_illidanGuid)) { if (Illidan->IsInEvadeMode() && !m_creature->IsInEvadeMode()) EnterEvadeMode(); - if (Illidan->GetHealthPercent() < 85.0f && m_creature->isInCombat() && !FightMinions) + if (Illidan->GetHealthPercent() < 85.0f && m_creature->isInCombat() && !m_bFightMinions) { - if (TalkTimer < diff) + if (m_uiTalkTimer < diff) { - switch(TalkCount) + switch(m_uiTalkCount) { case 0: DoScriptText(SAY_AKAMA_MINION, Illidan); - TalkTimer = 8000; - TalkCount = 1; + m_uiTalkTimer = 8000; + m_uiTalkCount = 1; break; case 1: DoScriptText(SAY_AKAMA_LEAVE, m_creature); - TalkTimer = 3000; - TalkCount = 2; + m_uiTalkTimer = 3000; + m_uiTalkCount = 2; break; case 2: - IsTalking = true; - TalkTimer = 2000; + m_bIsTalking = true; + m_uiTalkTimer = 2000; m_creature->RemoveAllAuras(); m_creature->CombatStop(true); m_creature->AttackStop(); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - TalkCount = 3; + m_uiTalkCount = 3; break; case 3: DeleteFromThreatList(); - IsWalking = true; + m_bIsWalking = true; WayPoint = WayPointList.begin(); std::advance(WayPoint, 9); m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); break; } - }else TalkTimer -= diff; + } + else + m_uiTalkTimer -= diff; } - if (Illidan->GetHealthPercent() < 4.0f && !IsReturningToIllidan) + if (Illidan->GetHealthPercent() < 4.0f && !m_bIsReturningToIllidan) ReturnToIllidan(); } }else { if (m_pInstance) - IllidanGUID = m_pInstance->GetData64(NPC_ILLIDAN_STORMRAGE); + m_illidanGuid = m_pInstance->GetGuid(NPC_ILLIDAN_STORMRAGE); } - if (IsWalking && WalkTimer) + if (m_bIsWalking && m_uiWalkTimer) { - if (WalkTimer <= diff) + if (m_uiWalkTimer <= diff) { if (WayPoint == WayPointList.end()) return; m_creature->GetMotionMaster()->MovePoint(WayPoint->id, WayPoint->x, WayPoint->y,WayPoint->z); - WalkTimer = 0; - }else WalkTimer -= diff; + m_uiWalkTimer = 0; + }else m_uiWalkTimer -= diff; } - if (StartChanneling) + if (m_bStartChanneling) { - if (ChannelTimer < diff) + if (m_uiChannelTimer < diff) { - switch(ChannelCount) + switch(m_uiChannelCount) { case 3: - if (!DoorOpen) + if (!m_bDoorOpen) { m_creature->InterruptNonMeleeSpells(true); for(uint8 i = 0; i < 2; ++i) { - if (SpiritGUID[i]) + if (m_aSpiritGuids[i]) { - Creature* Spirit = m_creature->GetMap()->GetCreature(SpiritGUID[i]); + Creature* Spirit = m_creature->GetMap()->GetCreature(m_aSpiritGuids[i]); if (Spirit) Spirit->InterruptNonMeleeSpells(true); } } - if (GameObject* pGate = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_ILLIDAN_GATE))) + if (GameObject* pGate = m_pInstance->GetSingleGameObjectFromStorage(GO_ILLIDAN_GATE)) pGate->SetGoState(GO_STATE_ACTIVE); - ++ChannelCount; - ChannelTimer = 5000; + ++m_uiChannelCount; + m_uiChannelTimer = 5000; } break; case 4: m_creature->HandleEmote(EMOTE_ONESHOT_SALUTE); - ChannelTimer = 2000; - ++ChannelCount; + m_uiChannelTimer = 2000; + ++m_uiChannelCount; break; case 5: DoScriptText(SAY_AKAMA_BEWARE, m_creature); - if (ChannelGUID) + if (m_channelGuid) { - Creature* ChannelTarget = m_creature->GetMap()->GetCreature(ChannelGUID); + Creature* ChannelTarget = m_creature->GetMap()->GetCreature(m_channelGuid); if (ChannelTarget) ChannelTarget->SetDeathState(JUST_DIED); - ChannelGUID = 0; + m_channelGuid.Clear(); } for(uint8 i = 0; i < 2; ++i) { - if (SpiritGUID[i]) + if (m_aSpiritGuids[i]) { - Creature* Spirit = m_creature->GetMap()->GetCreature(SpiritGUID[i]); + Creature* Spirit = m_creature->GetMap()->GetCreature(m_aSpiritGuids[i]); if (Spirit) Spirit->SetDeathState(JUST_DIED); } } - ChannelTimer = 6000; - ++ChannelCount; + m_uiChannelTimer = 6000; + ++m_uiChannelCount; break; case 6: - StartChanneling = false; + m_bStartChanneling = false; if (WayPointList.empty()) { error_log("SD2: Akama has no waypoints to start with!"); @@ -759,25 +775,25 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI WayPoint = WayPointList.begin(); m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); m_creature->GetMotionMaster()->MovePoint(WayPoint->id, WayPoint->x, WayPoint->y, WayPoint->z); - IsWalking = true; + m_bIsWalking = true; break; default: - if (ChannelGUID) + if (m_channelGuid) { - Creature* Channel = m_creature->GetMap()->GetCreature(ChannelGUID); + Creature* Channel = m_creature->GetMap()->GetCreature(m_channelGuid); if (Channel) { m_creature->InterruptNonMeleeSpells(true); for(uint8 i = 0; i < 2; ++i) { - if (SpiritGUID[i]) + if (m_aSpiritGuids[i]) { - Creature* Spirit = m_creature->GetMap()->GetCreature(SpiritGUID[i]); + Creature* Spirit = m_creature->GetMap()->GetCreature(m_aSpiritGuids[i]); if (Spirit) { Spirit->InterruptNonMeleeSpells(true); - if (ChannelCount%2 == 0) + if (m_uiChannelCount%2 == 0) { Spirit->CastSpell(Channel, SPELL_DEATHSWORN_DOOR_CHANNEL,false); DoCastSpellIfCan(Channel, SPELL_AKAMA_DOOR_CHANNEL); @@ -790,23 +806,25 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI } } } - if (ChannelCount < 3) - ++ChannelCount; - ChannelTimer = 10000; + if (m_uiChannelCount < 3) + ++m_uiChannelCount; + m_uiChannelTimer = 10000; } } break; } - }else ChannelTimer -= diff; + } + else + m_uiChannelTimer -= diff; } - if (FightMinions) + if (m_bFightMinions) { - if (SummonMinionTimer < diff) + if (m_uiSummonMinionTimer < diff) { - if (IllidanGUID) + if (m_illidanGuid) { - Creature* Illidan = m_creature->GetMap()->GetCreature(IllidanGUID); + Creature* Illidan = m_creature->GetMap()->GetCreature(m_illidanGuid); if (!Illidan || Illidan->IsInEvadeMode()) { Reset(); @@ -824,8 +842,10 @@ struct MANGOS_DLL_DECL npc_akama_illidanAI : public ScriptedAI Elite->AddThreat(m_creature, 1000000.0f); AttackStart(Elite); } - SummonMinionTimer = urand(10000, 16000); - }else SummonMinionTimer -= diff; + m_uiSummonMinionTimer = urand(10000, 16000); + } + else + m_uiSummonMinionTimer -= diff; } // If we don't have a target, or is talking, or has run away, return @@ -841,16 +861,6 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI boss_illidan_stormrageAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - - for(uint8 i = 0; i < 2; ++i) - { - FlameGUID[i] = 0; - GlaiveGUID[i] = 0; - } - - AkamaGUID = 0; - MaievGUID = 0; - Reset(); } @@ -858,73 +868,72 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI ScriptedInstance* m_pInstance; /** Generic **/ - bool IsTalking; - bool HasSummoned; - bool RefaceVictim; - bool InformAkama; - uint32 Phase; - uint32 GlobalTimer; - uint32 TalkCount; - uint32 DemonFormSequence; + bool m_bIsTalking; + bool m_bHasSummoned; + bool m_bRefaceVictim; + uint32 m_uiPhase; + uint32 m_uiGlobalTimer; + uint32 m_uiTalkCount; + uint32 m_uiDemonFormSequence; /** GUIDs **/ - uint64 FlameGUID[2]; - uint64 GlaiveGUID[2]; - uint64 AkamaGUID; - uint64 MaievGUID; + ObjectGuid m_flameGuids[2]; + ObjectGuid m_glaiveGuids[2]; + ObjectGuid m_akamaGuid; + ObjectGuid m_maievGuid; /** Timers **/ - uint32 ShearTimer; - uint32 DrawSoulTimer; - uint32 FlameCrashTimer; - uint32 ParasiticShadowFiendTimer; - uint32 FireballTimer; - uint32 EyeBlastTimer; - uint32 DarkBarrageTimer; - uint32 SummonBladesTimer; // Animate summoning the Blades of Azzinoth in Phase 2 - uint32 SummonFlamesTimer; // Summon Flames of Azzinoth in Phase 2 - uint32 CheckFlamesTimer; // This is used to check the status of the Flames to see if we should begin entering Phase 3 or not. - uint32 RetrieveBladesTimer; // Animate retrieving the Blades of Azzinoth in Phase 2 -> 3 transition - uint32 LandTimer; // This is used at the end of phase 2 to signal Illidan landing after Flames are dead - uint32 AgonizingFlamesTimer; - uint32 ShadowBlastTimer; - uint32 FlameBurstTimer; - uint32 ShadowDemonTimer; - uint32 TalkTimer; - uint32 TransformTimer; - uint32 EnrageTimer; - uint32 CageTimer; - uint32 LayTrapTimer; - uint32 AnimationTimer; - uint32 TauntTimer; // This is used for his random yells - uint32 FaceVictimTimer; - uint32 BerserkTimer; + uint32 m_uiShearTimer; + uint32 m_uiDrawSoulTimer; + uint32 m_uiFlameCrashTimer; + uint32 m_uiParasiticShadowFiendTimer; + uint32 m_uiFireballTimer; + uint32 m_uiEyeBlastTimer; + uint32 m_uiDarkBarrageTimer; + uint32 m_uiSummonBladesTimer; // Animate summoning the Blades of Azzinoth in Phase 2 + uint32 m_uiSummonFlamesTimer; // Summon Flames of Azzinoth in Phase 2 + uint32 m_uiCheckFlamesTimer; // This is used to check the status of the Flames to see if we should begin entering Phase 3 or not. + uint32 m_uiRetrieveBladesTimer; // Animate retrieving the Blades of Azzinoth in Phase 2 -> 3 transition + uint32 m_uiLandTimer; // This is used at the end of uiPhase 2 to signal Illidan landing after Flames are dead + uint32 m_uiAgonizingFlamesTimer; + uint32 m_uiShadowBlastTimer; + uint32 m_uiFlameBurstTimer; + uint32 m_uiShadowDemonTimer; + uint32 m_uiTalkTimer; + uint32 m_uiTransformTimer; + uint32 m_uiEnrageTimer; + uint32 m_uiCageTimer; + uint32 m_uiLayTrapTimer; + uint32 m_uiAnimationTimer; + uint32 m_uiTauntTimer; // This is used for his random yells + uint32 m_uiFaceVictimTimer; + uint32 m_uiBerserkTimer; void Reset() { - Phase = PHASE_NORMAL; + m_uiPhase = PHASE_NORMAL; // Check if any flames/glaives are alive/existing. Kill if alive and set GUIDs to 0 for(uint8 i = 0; i < 2; ++i) { - if (Creature* Flame = m_creature->GetMap()->GetCreature(FlameGUID[i])) + if (Creature* pFlame = m_creature->GetMap()->GetCreature(m_flameGuids[i])) { - if (Flame->isAlive()) - Flame->SetDeathState(JUST_DIED); + if (pFlame->isAlive()) + pFlame->SetDeathState(JUST_DIED); - FlameGUID[i] = 0; + m_flameGuids[i].Clear(); } - if (Creature* Glaive = m_creature->GetMap()->GetCreature(GlaiveGUID[i])) + if (Creature* pGlaive = m_creature->GetMap()->GetCreature(m_glaiveGuids[i])) { - if (Glaive->isAlive()) - Glaive->SetDeathState(JUST_DIED); + if (pGlaive->isAlive()) + pGlaive->SetDeathState(JUST_DIED); - GlaiveGUID[i] = 0; + m_glaiveGuids[i].Clear(); } } - if (Creature* pAkama = m_creature->GetMap()->GetCreature(AkamaGUID)) + if (Creature* pAkama = m_creature->GetMap()->GetCreature(m_akamaGuid)) { if (!pAkama->isAlive()) pAkama->Respawn(); @@ -932,43 +941,42 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI pAkama->AI()->EnterEvadeMode(); } - InformAkama = false; - RefaceVictim = false; - HasSummoned = false; + m_bRefaceVictim = false; + m_bHasSummoned = false; - FaceVictimTimer = 1000; - BerserkTimer = 1500000; - GlobalTimer = 0; - DemonFormSequence = 0; + m_uiFaceVictimTimer = 1000; + m_uiBerserkTimer = 1500000; + m_uiGlobalTimer = 0; + m_uiDemonFormSequence = 0; /** Normal Form **/ - ShearTimer = urand(20000, 30000); // 20 to 30 seconds - FlameCrashTimer = 30000; // 30 seconds - ParasiticShadowFiendTimer = 25000; // 25 seconds - DrawSoulTimer = 50000; // 50 seconds + m_uiShearTimer = urand(20000, 30000); // 20 to 30 seconds + m_uiFlameCrashTimer = 30000; // 30 seconds + m_uiParasiticShadowFiendTimer = 25000; // 25 seconds + m_uiDrawSoulTimer = 50000; // 50 seconds /** Phase 2 **/ - SummonBladesTimer = 10000; - SummonFlamesTimer = 20000; // Phase 2 timers may be incorrect - FireballTimer = 5000; - DarkBarrageTimer = 45000; - EyeBlastTimer = 30000; - CheckFlamesTimer = 5000; - RetrieveBladesTimer = 5000; - LandTimer = 0; + m_uiSummonBladesTimer = 10000; + m_uiSummonFlamesTimer = 20000; // Phase 2 timers may be incorrect + m_uiFireballTimer = 5000; + m_uiDarkBarrageTimer = 45000; + m_uiEyeBlastTimer = 30000; + m_uiCheckFlamesTimer = 5000; + m_uiRetrieveBladesTimer = 5000; + m_uiLandTimer = 0; /** Phase 3+ **/ - AgonizingFlamesTimer = 35000; // Phase 3+ timers may be incorrect - ShadowBlastTimer = 3000; - FlameBurstTimer = 10000; - ShadowDemonTimer = 30000; - TransformTimer = 90000; - EnrageTimer = 40000; - CageTimer = 30000; - LayTrapTimer = CageTimer + 2000; - AnimationTimer = 0; - - TauntTimer = 30000; // This timer may be off. + m_uiAgonizingFlamesTimer = 35000; // Phase 3+ timers may be incorrect + m_uiShadowBlastTimer = 3000; + m_uiFlameBurstTimer = 10000; + m_uiShadowDemonTimer = 30000; + m_uiTransformTimer = 90000; + m_uiEnrageTimer = 40000; + m_uiCageTimer = 30000; + m_uiLayTrapTimer = m_uiCageTimer + 2000; + m_uiAnimationTimer = 0; + + m_uiTauntTimer = 30000; // This timer may be off. m_creature->SetDisplayId(21135); m_creature->InterruptNonMeleeSpells(false); @@ -980,57 +988,64 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI m_creature->RemoveSplineFlag(SPLINEFLAG_NO_SPLINE); - IsTalking = false; + m_bIsTalking = false; - TalkCount = 0; - TalkTimer = 0; + m_uiTalkCount = 0; + m_uiTalkTimer = 0; if (m_pInstance) m_pInstance->SetData(TYPE_ILLIDAN, NOT_STARTED); } - void AttackStart(Unit *who) + void GetAIInformation(ChatHandler& reader) { - if (!who || IsTalking || Phase == 2 || Phase == 4 || Phase == 6 || m_creature->HasAura(SPELL_KNEEL, EFFECT_INDEX_0)) + reader.PSendSysMessage("Boss Illidan, current uiPhase = %u, m_uiDemonFormSequence = %u", m_uiPhase, m_uiDemonFormSequence); + reader.PSendSysMessage("Boolean Vars: m_bIsTalking is %s, m_bHasSummoned is %s, m_bRefaceVictim is %s", m_bIsTalking ? "true" : "false", m_bHasSummoned ? "true" : "false", m_bRefaceVictim ? "true" : "false"); + reader.PSendSysMessage("Guids: Akama is %s, Maiev is %s", m_akamaGuid.GetString().c_str(), m_maievGuid.GetString().c_str()); + } + + void AttackStart(Unit* pWho) + { + if (!pWho || m_bIsTalking || m_uiPhase == PHASE_FLIGHT || m_uiPhase == PHASE_DEMON || m_uiPhase == PHASE_DEMON_SEQUENCE || m_creature->HasAura(SPELL_KNEEL, EFFECT_INDEX_0)) return; - if (who == m_creature) + if (pWho == m_creature) return; - if (m_creature->Attack(who, true)) + if (m_creature->Attack(pWho, true)) { - m_creature->AddThreat(who); - m_creature->SetInCombatWith(who); - who->SetInCombatWith(m_creature); + m_creature->AddThreat(pWho); + m_creature->SetInCombatWith(pWho); + pWho->SetInCombatWith(m_creature); - DoStartMovement(who); + DoStartMovement(pWho); } } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* pWho) { - if (!who || m_creature->getVictim() || IsTalking || m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + if (!pWho || m_creature->getVictim() || m_bIsTalking || m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return; - if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who)) + if (pWho->isTargetableForAttack() && pWho->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(pWho)) { - if (!m_creature->CanFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + if (!m_creature->CanFly() && m_creature->GetDistanceZ(pWho) > CREATURE_Z_ATTACK_RANGE) return; - float attackRadius = m_creature->GetAttackDistance(who); - if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who)) + float attackRadius = m_creature->GetAttackDistance(pWho); + if (m_creature->IsWithinDistInMap(pWho, attackRadius) && m_creature->IsWithinLOSInMap(pWho)) { - who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); - AttackStart(who); + pWho->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); + AttackStart(pWho); } } } - void JustDied(Unit *killer) + void JustDied(Unit* pKiller) { - IsTalking = false; - TalkCount = 0; - TalkTimer = 0; + m_bIsTalking = false; + m_uiTalkCount = 0; + m_uiTalkTimer = 0; m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -1043,37 +1058,37 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI for(uint32 i = GO_ILLIDAN_DOOR_R; i < GO_ILLIDAN_DOOR_L + 1; ++i) { // Open Doors - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(i))) + if (GameObject* pDoor = m_pInstance->GetSingleGameObjectFromStorage(i)) pDoor->SetGoState(GO_STATE_ACTIVE); } } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { - if (victim == m_creature) + if (pVictim == m_creature) return; DoScriptText(urand(0, 1) ? SAY_KILL1 : SAY_KILL2, m_creature); } - void DamageTaken(Unit *done_by, uint32 &damage) + void DamageTaken(Unit* pDealer, uint32& uiDamage) { - if (damage > m_creature->GetHealth()) // Don't let ourselves be slain before we do our death speech + if (uiDamage > m_creature->GetHealth()) // Don't let ourselves be slain before we do our death speech { - damage = 0; + uiDamage = 0; m_creature->SetHealth(m_creature->GetMaxHealth()/100); } } - void Cast(Unit* victim, uint32 Spell, bool triggered = false) + void Cast(Unit* pVictim, uint32 uiSpellId, bool bTriggered = false) { - if (!victim) + if (!pVictim) return; - RefaceVictim = true; - m_creature->SetTargetGuid(victim->GetObjectGuid()); - m_creature->CastSpell(victim, Spell, triggered); + m_bRefaceVictim = true; + m_creature->SetTargetGuid(pVictim->GetObjectGuid()); + m_creature->CastSpell(pVictim, uiSpellId, bTriggered); } /** This will handle the cast of eye blast **/ @@ -1081,30 +1096,30 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI { m_creature->InterruptNonMeleeSpells(false); - DarkBarrageTimer += 10000; + m_uiDarkBarrageTimer += 10000; DoScriptText(SAY_EYE_BLAST, m_creature); - uint32 initial = urand(0, 3); - uint32 final = 0; + uint32 uiInitial = urand(0, 3); + uint32 uiFinal = 0; - if (initial < 3) - final = initial+1; + if (uiInitial < 3) + uiFinal = uiInitial+1; - float initial_X = EyeBlast[initial].x; - float initial_Y = EyeBlast[initial].y; - float initial_Z = EyeBlast[initial].z; + float initial_X = aEyeBlast[uiInitial].x; + float initial_Y = aEyeBlast[uiInitial].y; + float initial_Z = aEyeBlast[uiInitial].z; - float final_X = EyeBlast[final].x; - float final_Y = EyeBlast[final].y; - float final_Z = EyeBlast[final].z; + float final_X = aEyeBlast[uiFinal].x; + float final_Y = aEyeBlast[uiFinal].y; + float final_Z = aEyeBlast[uiFinal].z; for(uint8 i = 0; i < 2; ++i) { if (Creature* pTrigger = m_creature->SummonCreature(DEMON_FIRE, initial_X, initial_Y, initial_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 20000)) { if (demonfireAI* pTriggerAI = dynamic_cast(pTrigger->AI())) - pTriggerAI->IsTrigger = true; + pTriggerAI->m_bIsTrigger = true; pTrigger->GetMotionMaster()->MovePoint(0, final_X, final_Y, final_Z); @@ -1138,43 +1153,43 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI int32 text = 0; - if (Conversation[count].textId) - text = Conversation[count].textId; + if (aConversation[count].textId) + text = aConversation[count].textId; - TalkTimer = Conversation[count].timer; - uint32 emote = Conversation[count].emote; - IsTalking = Conversation[count].Talk; + m_uiTalkTimer = aConversation[count].timer; + uint32 emote = aConversation[count].emote; + m_bIsTalking = aConversation[count].Talk; Creature* pCreature = NULL; - uint64 GUID = 0; + ObjectGuid Guid; - if (Conversation[count].creature == ILLIDAN_STORMRAGE) + if (aConversation[count].creature == ILLIDAN_STORMRAGE) pCreature = m_creature; - else if (Conversation[count].creature == AKAMA) + else if (aConversation[count].creature == AKAMA) { - if (!AkamaGUID) + if (!m_akamaGuid) { if (m_pInstance) { - AkamaGUID = m_pInstance->GetData64(NPC_AKAMA); - if (!AkamaGUID) + m_akamaGuid = m_pInstance->GetGuid(NPC_AKAMA); + if (!m_akamaGuid) return; - GUID = AkamaGUID; + Guid = m_akamaGuid; } } - else GUID = AkamaGUID; + else Guid = m_akamaGuid; } - else if (Conversation[count].creature == MAIEV_SHADOWSONG) + else if (aConversation[count].creature == MAIEV_SHADOWSONG) { - if (!MaievGUID) + if (!m_maievGuid) return; - GUID = MaievGUID; + Guid = m_maievGuid; } - else if (Conversation[count].creature == EMPTY) // This is just for special cases without speech/sounds/emotes. + else if (aConversation[count].creature == EMPTY) // This is just for special cases without speech/sounds/emotes. return; - if (GUID) // Now we check if we actually specified a GUID, if so: + if (Guid) // Now we check if we actually specified a GUID, if so: // we grab a pointer to that creature - pCreature = m_creature->GetMap()->GetCreature(GUID); + pCreature = m_creature->GetMap()->GetCreature(Guid); if (pCreature) { @@ -1190,35 +1205,31 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI pCreature->GetMotionMaster()->MovePoint(0, X, Y, Z); } - void HandleDemonTransformAnimation(uint32 count) + void HandleDemonTransformAnimation(uint32 uiSequenceCount) { - uint32 unaura = DemonTransformation[count].unaura; - uint32 aura = DemonTransformation[count].aura; - uint32 displayid = DemonTransformation[count].displayid; - AnimationTimer = DemonTransformation[count].timer; - uint32 size = DemonTransformation[count].size; + m_uiAnimationTimer = DemonTransformation[uiSequenceCount].uiTimer; m_creature->InterruptNonMeleeSpells(false); - if (DemonTransformation[count].phase != 8) + if (DemonTransformation[uiSequenceCount].uiPhase != PHASE_NORMAL_FORM) { m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveIdle(); } - if (unaura) - m_creature->RemoveAurasDueToSpell(unaura); + if (DemonTransformation[uiSequenceCount].uiUnAura) + m_creature->RemoveAurasDueToSpell(DemonTransformation[uiSequenceCount].uiUnAura); - if (aura) - DoCastSpellIfCan(m_creature, aura, CAST_TRIGGERED); + if (DemonTransformation[uiSequenceCount].uiAura) + DoCastSpellIfCan(m_creature, DemonTransformation[uiSequenceCount].uiAura, CAST_TRIGGERED); - if (displayid) + if (DemonTransformation[uiSequenceCount].uiDisplayId) // It's morphin time! - m_creature->SetDisplayId(displayid); - /*if (size) - m_creature->SetUInt32Value(OBJECT_FIELD_SCALE_X, size); // Let us grow! (or shrink)*/ + m_creature->SetDisplayId(DemonTransformation[uiSequenceCount].uiDisplayId); + /*if (DemonTransformation[uiSequenceCount].uiSize) + m_creature->SetUInt32Value(OBJECT_FIELD_SCALE_X, DemonTransformation[uiSequenceCount].uiSize); // Let us grow! (or shrink)*/ - if (DemonTransformation[count].equip) + if (DemonTransformation[uiSequenceCount].bEquip) { // Requip warglaives if needed SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_ID_OFF_HAND, EQUIP_NO_CHANGE); @@ -1229,24 +1240,26 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); } - if (DemonTransformation[count].phase != 8) - Phase = DemonTransformation[count].phase; // Set phase properly + if (DemonTransformation[uiSequenceCount].uiPhase != PHASE_NORMAL_FORM) + m_uiPhase = DemonTransformation[uiSequenceCount].uiPhase; // Set uiPhase properly else { // Refollow and attack our old victim m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - // Depending on whether we summoned Maiev, we switch to either phase 5 or 3 - if (MaievGUID) Phase = PHASE_NORMAL_MAIEV; - else Phase = PHASE_NORMAL_2; + // Depending on whether we summoned Maiev, we switch to either uiPhase 5 or 3 + if (m_maievGuid) + m_uiPhase = PHASE_NORMAL_MAIEV; + else + m_uiPhase = PHASE_NORMAL_2; } - if (count == 7) + if (uiSequenceCount == 7) { DoResetThreat(); m_creature->RemoveAurasDueToSpell(SPELL_DEMON_FORM); } - else if (count == 4) + else if (uiSequenceCount == 4) { DoResetThreat(); if (!m_creature->HasAura(SPELL_DEMON_FORM, EFFECT_INDEX_0)) @@ -1259,11 +1272,11 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI { DoScriptText(SAY_TAKEOFF, m_creature); - SummonBladesTimer = 10000; // Summon Glaives when this decrements - SummonFlamesTimer = 20000; // Summon Flames when this decrements - GlobalTimer += 20000; - LandTimer = 0; - Phase = PHASE_FLIGHT; + m_uiSummonBladesTimer = 10000; // Summon Glaives when this decrements + m_uiSummonFlamesTimer = 20000; // Summon Flames when this decrements + m_uiGlobalTimer += 20000; + m_uiLandTimer = 0; + m_uiPhase = PHASE_FLIGHT; m_creature->RemoveAllAuras(); m_creature->SetTargetGuid(ObjectGuid()); @@ -1276,10 +1289,10 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI m_creature->GetMotionMaster()->MovePoint(0, CENTER_X, CENTER_Y, CENTER_Z); for(uint8 i = 0; i < 2; ++i) { - Creature* Glaive = m_creature->SummonCreature(BLADE_OF_AZZINOTH, GlaivePosition[i].x, GlaivePosition[i].y, GlaivePosition[i].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + Creature* Glaive = m_creature->SummonCreature(BLADE_OF_AZZINOTH, aGlaivePosition[i].x, aGlaivePosition[i].y, aGlaivePosition[i].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (Glaive) { - GlaiveGUID[i] = Glaive->GetGUID(); // We need this to remove them later on + m_glaiveGuids[i] = Glaive->GetObjectGuid(); // We need this to remove them later on Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Glaive->SetVisibility(VISIBILITY_OFF); Glaive->setFaction(m_creature->getFaction()); @@ -1291,8 +1304,8 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI { m_creature->GetMotionMaster()->Clear(false); - LandTimer = 0; - RetrieveBladesTimer = 0; + m_uiLandTimer = 0; + m_uiRetrieveBladesTimer = 0; // Make it look like we're throwing the glaives on the ground DoCastSpellIfCan(m_creature, SPELL_THROW_GLAIVE2); @@ -1304,7 +1317,7 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI for(uint8 i = 0; i < 2; ++i) { Creature* Glaive = NULL; - Glaive = m_creature->GetMap()->GetCreature(GlaiveGUID[i]); + Glaive = m_creature->GetMap()->GetCreature(m_glaiveGuids[i]); if (Glaive) { DoCastSpellIfCan(Glaive, SPELL_THROW_GLAIVE, CAST_TRIGGERED); @@ -1321,10 +1334,10 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI { Creature* Flame = NULL; Creature* Glaive = NULL; - Glaive = m_creature->GetMap()->GetCreature(GlaiveGUID[i]); + Glaive = m_creature->GetMap()->GetCreature(m_glaiveGuids[i]); if (Glaive) { - Flame = m_creature->SummonCreature(FLAME_OF_AZZINOTH, GlaivePosition[i+2].x, GlaivePosition[i+2].y, GlaivePosition[i+2].z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + Flame = m_creature->SummonCreature(FLAME_OF_AZZINOTH, aGlaivePosition[i+2].x, aGlaivePosition[i+2].y, aGlaivePosition[i+2].z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); if (Flame) { // Just in case the database has it as a different faction @@ -1333,8 +1346,8 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI // Attack our target! Flame->AI()->AttackStart(m_creature->getVictim()); - // Record GUID in order to check if they're dead later on to move to the next phase - FlameGUID[i] = Flame->GetGUID(); + // Record GUID in order to check if they're dead later on to move to the next uiPhase + m_flameGuids[i] = Flame->GetObjectGuid(); // Glaives do some random Beam type channel on it. Glaive->CastSpell(Flame, SPELL_AZZINOTH_CHANNEL, true); @@ -1354,13 +1367,13 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI } } DoResetThreat(); // And now reset our threatlist - HasSummoned = true; + m_bHasSummoned = true; } void SummonMaiev() { - TauntTimer += 4000; - GlobalTimer += 4000; + m_uiTauntTimer += 4000; + m_uiGlobalTimer += 4000; m_creature->InterruptNonMeleeSpells(false); // Interrupt any of our spells Creature* Maiev = NULL; // Summon Maiev near Illidan @@ -1372,11 +1385,11 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI // Just in case someone is unaffected by Shadow Prison m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoCastSpellIfCan(m_creature, SPELL_SHADOW_PRISON, CAST_TRIGGERED); - TalkCount = 10; - IsTalking = true; // We are now talking/ + m_uiTalkCount = 10; + m_bIsTalking = true; // We are now talking/ Maiev->SetVisibility(VISIBILITY_OFF); // Leave her invisible until she has to talk Maiev->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - MaievGUID = Maiev->GetGUID(); + m_maievGuid = Maiev->GetObjectGuid(); } else // If Maiev cannot be summoned, reset the encounter and post some errors to the console. { @@ -1395,9 +1408,9 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI m_creature->GetMotionMaster()->Clear(false); // No moving! m_creature->GetMotionMaster()->MoveIdle(); - if (MaievGUID) + if (m_maievGuid) { - if (Creature* Maiev = m_creature->GetMap()->GetCreature(MaievGUID)) + if (Creature* Maiev = m_creature->GetMap()->GetCreature(m_maievGuid)) { Maiev->CombatStop(true); // Maiev shouldn't do anything either. No point in her attacking us =] Maiev->GetMotionMaster()->Clear(false); // Stop her from moving as well @@ -1413,18 +1426,18 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI Maiev->SetTargetGuid(m_creature->GetObjectGuid()); } } - IsTalking = true; - ++TalkCount; + m_bIsTalking = true; + ++m_uiTalkCount; } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { /*** This section will handle the conversations ***/ - if (IsTalking) // Somewhat more efficient using a function rather than a long switch + if (m_bIsTalking) // Somewhat more efficient using a function rather than a long switch { - if (TalkTimer < diff) + if (m_uiTalkTimer < uiDiff) { - switch(TalkCount) // This is only for specialized cases + switch(m_uiTalkCount) // This is only for specialized cases { case 0: // Time to stand up! @@ -1437,16 +1450,16 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI m_creature->setFaction(14); break; case 9: - if (AkamaGUID) + if (m_akamaGuid) { - if (Creature* pAkama = m_creature->GetMap()->GetCreature(AkamaGUID)) + if (Creature* pAkama = m_creature->GetMap()->GetCreature(m_akamaGuid)) { // Start attacking Akama AttackStart(pAkama); // Akama stop talk and start attack illidan if (npc_akama_illidanAI* pAkamaAI = dynamic_cast(pAkama->AI())) - pAkamaAI->IsTalking = false; + pAkamaAI->m_bIsTalking = false; pAkama->AI()->AttackStart(m_creature); pAkama->AddThreat(m_creature, 1000000.0f); @@ -1458,9 +1471,9 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI debug_log("SD2: Black Temple: Illidan intro complete, players can attack Illidan."); break; case 11: - if (MaievGUID) + if (m_maievGuid) { - Creature* Maiev = m_creature->GetMap()->GetCreature(MaievGUID); + Creature* Maiev = m_creature->GetMap()->GetCreature(m_maievGuid); if (Maiev) { // Maiev is now visible @@ -1475,39 +1488,31 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI } break; case 14: - if (MaievGUID) + if (Creature* pMaiev = m_creature->GetMap()->GetCreature(m_maievGuid)) { - Creature* Maiev = m_creature->GetMap()->GetCreature(MaievGUID); - if (Maiev) - { - Maiev->GetMotionMaster()->Clear(false); - Maiev->GetMotionMaster()->MoveChase(m_creature); - // Have Maiev add a lot of threat on us so that players don't pull her off if they damage her via AOE - Maiev->AddThreat(m_creature, 10000000.0f); - // Force Maiev to attack us. - Maiev->AI()->AttackStart(m_creature); - Maiev->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } + pMaiev->GetMotionMaster()->Clear(false); + pMaiev->GetMotionMaster()->MoveChase(m_creature); + // Have Maiev add a lot of threat on us so that players don't pull her off if they damage her via AOE + pMaiev->AddThreat(m_creature, 10000000.0f); + // Force Maiev to attack us. + pMaiev->AI()->AttackStart(m_creature); + pMaiev->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - IsTalking = false; - FaceVictimTimer = 2000; - RefaceVictim = true; + m_bIsTalking = false; + m_uiFaceVictimTimer = 2000; + m_bRefaceVictim = true; break; case 20: // Kill ourself. - if (MaievGUID) + if (Creature* Maiev = m_creature->GetMap()->GetCreature(m_maievGuid)) { - Creature* Maiev = m_creature->GetMap()->GetCreature(MaievGUID); - if (Maiev) - { - // Make Maiev leave - Maiev->CastSpell(Maiev, SPELL_TELEPORT_VISUAL, true); - Maiev->SetDeathState(JUST_DIED); - } + // Make Maiev leave + Maiev->CastSpell(Maiev, SPELL_TELEPORT_VISUAL, true); + Maiev->SetDeathState(JUST_DIED); } - IsTalking = false; + m_bIsTalking = false; if (m_creature->getVictim()) m_creature->getVictim()->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE,SPELL_SCHOOL_MASK_NORMAL, NULL, false); else @@ -1517,203 +1522,239 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI } // This function does most of the talking - Talk(TalkCount); - ++TalkCount; - }else TalkTimer -= diff; + Talk(m_uiTalkCount); + ++m_uiTalkCount; + } + else + m_uiTalkTimer -= uiDiff; } + // No further action while talking + if (m_bIsTalking) + return; + // If we don't have a target, return. - if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() || IsTalking) + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // If we are 'caged', then we shouldn't do anything such as cast spells or transform into Demon Form. if (m_creature->HasAura(SPELL_CAGED, EFFECT_INDEX_0)) { // Just so that he doesn't immediately enrage after he stops being caged. - EnrageTimer = 40000; - CageTimer = 30000; + m_uiEnrageTimer = 40000; + m_uiCageTimer = 30000; return; } // Berserk Timer - flat 25 minutes - if (!m_creature->HasAura(SPELL_BERSERK, EFFECT_INDEX_0) && Phase != PHASE_DEMON_SEQUENCE) + if (m_uiPhase != PHASE_DEMON_SEQUENCE && !m_creature->HasAura(SPELL_BERSERK, EFFECT_INDEX_0)) { - if (BerserkTimer < diff) + if (m_uiBerserkTimer < uiDiff) { DoScriptText(SAY_ENRAGE, m_creature); DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_TRIGGERED); - }else BerserkTimer -= diff; + } + else + m_uiBerserkTimer -= uiDiff; } - if (RefaceVictim) + if (m_bRefaceVictim) { - if (FaceVictimTimer < diff) + if (m_uiFaceVictimTimer < uiDiff) { m_creature->SetTargetGuid(m_creature->getVictim()->GetObjectGuid()); - FaceVictimTimer = 1000; - RefaceVictim = false; - }else FaceVictimTimer -= diff; + m_uiFaceVictimTimer = 1000; + m_bRefaceVictim = false; + } + else + m_uiFaceVictimTimer -= uiDiff; } - /** Signal to change to phase 2 **/ - if (m_creature->GetHealthPercent() < 65.0f && Phase == PHASE_NORMAL) + /** Signal to change to uiPhase 2 **/ + if (m_uiPhase == PHASE_NORMAL && m_creature->GetHealthPercent() < 65.0f) + { EnterPhase2(); + return; + } /** Signal to summon Maiev **/ - if (m_creature->GetHealthPercent() < 30.0f && !MaievGUID && (Phase != PHASE_DEMON || Phase != PHASE_DEMON_SEQUENCE)) + if (m_creature->GetHealthPercent() < 30.0f && !m_maievGuid && (m_uiPhase != PHASE_DEMON || m_uiPhase != PHASE_DEMON_SEQUENCE)) + { SummonMaiev(); + return; + } /** Time for the death speech **/ - if (m_creature->GetHealthPercent() < 1.0f && !IsTalking && (Phase != PHASE_DEMON || Phase != PHASE_DEMON_SEQUENCE)) + if (m_creature->GetHealthPercent() < 1.0f && (m_uiPhase != PHASE_DEMON || m_uiPhase != PHASE_DEMON_SEQUENCE)) + { InitializeDeath(); + return; + } /***** Spells for Phase 1, 3 and 5 (Normal Form) ******/ - if (Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV) + if (m_uiPhase == PHASE_NORMAL || m_uiPhase == PHASE_NORMAL_2 || m_uiPhase == PHASE_NORMAL_MAIEV) { - if (TauntTimer < diff) // His random taunt/yell timer. + if (m_uiTauntTimer < uiDiff) // His random taunt/yell uiTimer. { uint32 random = urand(0, 3); - int32 yell = RandomTaunts[random].textId; + int32 yell = aRandomTaunts[random].textId; if (yell) DoScriptText(yell, m_creature); - TauntTimer = 32000; - }else TauntTimer -= diff; + m_uiTauntTimer = 32000; + } + else + m_uiTauntTimer -= uiDiff; // Global Timer so that spells do not overlap. - if (GlobalTimer < diff) + if (m_uiGlobalTimer < uiDiff) { - if (ShearTimer < diff) + if (m_uiShearTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_SHEAR); - ShearTimer = urand(25000, 40000); - GlobalTimer += 2000; - }else ShearTimer -= diff; + m_uiShearTimer = urand(25000, 40000); + m_uiGlobalTimer += 2000; + } + else + m_uiShearTimer -= uiDiff; - if (FlameCrashTimer < diff) + if (m_uiFlameCrashTimer < uiDiff) { //It spawns multiple flames sometimes. Therefore, we'll do this manually. //DoCastSpellIfCan(m_creature->getVictim(), SPELL_FLAME_CRASH); m_creature->SummonCreature(FLAME_CRASH, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 40000); - FlameCrashTimer = 35000; - GlobalTimer += 2000; - }else FlameCrashTimer -= diff; + m_uiFlameCrashTimer = 35000; + m_uiGlobalTimer += 2000; + } + else + m_uiFlameCrashTimer -= uiDiff; - if (ParasiticShadowFiendTimer < diff) + if (m_uiParasiticShadowFiendTimer < uiDiff) { Unit* target = NULL; target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,1); if (target && target->isAlive() && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND, EFFECT_INDEX_0)) { Cast(target, SPELL_PARASITIC_SHADOWFIEND); - ParasiticShadowFiendTimer = 40000; + m_uiParasiticShadowFiendTimer = 40000; } - }else ParasiticShadowFiendTimer -= diff; + } + else + m_uiParasiticShadowFiendTimer -= uiDiff; - if (DrawSoulTimer < diff) + if (m_uiDrawSoulTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_DRAW_SOUL); - DrawSoulTimer = 55000; - GlobalTimer += 3000; - }else DrawSoulTimer -= diff; - }else GlobalTimer -= diff; + m_uiDrawSoulTimer = 55000; + m_uiGlobalTimer += 3000; + } + else + m_uiDrawSoulTimer -= uiDiff; + } + else + m_uiGlobalTimer -= uiDiff; - if (!IsTalking) - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); } /*** Phase 2 ***/ - if (Phase == PHASE_FLIGHT) + if (m_uiPhase == PHASE_FLIGHT) { // Check if we have summoned or not. - if (!HasSummoned) + if (!m_bHasSummoned) { - if (SummonBladesTimer) - if (SummonBladesTimer <= diff) + if (m_uiSummonBladesTimer) { - SummonBladesOfAzzinoth(); - SummonBladesTimer = 0; - }else SummonBladesTimer -= diff; + if (m_uiSummonBladesTimer <= uiDiff) + { + SummonBladesOfAzzinoth(); + m_uiSummonBladesTimer = 0; + } + else + m_uiSummonBladesTimer -= uiDiff; + } - if (SummonFlamesTimer < diff) + if (m_uiSummonFlamesTimer < uiDiff) { SummonFlamesOfAzzinoth(); - }else SummonFlamesTimer -= diff; + } + else + m_uiSummonFlamesTimer -= uiDiff; } if (!m_creature->GetMotionMaster()->empty() && (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)) m_creature->GetMotionMaster()->Clear(false); - if (HasSummoned) + if (m_bHasSummoned) { - if (CheckFlamesTimer) + if (m_uiCheckFlamesTimer) { - if (CheckFlamesTimer <= diff) + if (m_uiCheckFlamesTimer <= uiDiff) { // Check if flames are dead or non-existant. If so, set GUID to 0. for(uint8 i = 0; i < 2; ++i) { - if (FlameGUID[i]) + if (m_flameGuids[i]) { - Creature* Flame = m_creature->GetMap()->GetCreature(FlameGUID[i]); + Creature* pFlame = m_creature->GetMap()->GetCreature(m_flameGuids[i]); - // If the flame dies, or somehow the pointer becomes invalid, reset GUID to 0. - if (!Flame || !Flame->isAlive()) - FlameGUID[i] = 0; + // If the flame dies, or somehow the pointer becomes invalid, reset Guid. + if (!pFlame || !pFlame->isAlive()) + m_flameGuids[i].Clear(); } } - CheckFlamesTimer = 500; - }else CheckFlamesTimer -= diff; + m_uiCheckFlamesTimer = 500; + } + else + m_uiCheckFlamesTimer -= uiDiff; } - // If both flames are dead/non-existant, kill glaives and change to phase 3. - if (!FlameGUID[0] && !FlameGUID[1] && CheckFlamesTimer) + // If both flames are dead/non-existant, kill glaives and change to uiPhase 3. + if (!m_flameGuids[0] && !m_flameGuids[1] && m_uiCheckFlamesTimer) { - RetrieveBladesTimer = 5000; // Prepare for re-equipin! - CheckFlamesTimer = 0; + m_uiRetrieveBladesTimer = 5000; // Prepare for re-equipin! + m_uiCheckFlamesTimer = 0; } - if (RetrieveBladesTimer) + if (m_uiRetrieveBladesTimer) { - if (RetrieveBladesTimer <= diff) // Time to get back our glaives! + if (m_uiRetrieveBladesTimer <= uiDiff) // Time to get back our glaives! { // Interrupt any spells we might be doing *cough* DArk Barrage *cough* m_creature->InterruptNonMeleeSpells(false); for(uint8 i = 0; i < 2; ++i) { - if (GlaiveGUID[i]) + if (Creature* pGlaive = m_creature->GetMap()->GetCreature(m_glaiveGuids[i])) { - Creature* Glaive = m_creature->GetMap()->GetCreature(GlaiveGUID[i]); - if (Glaive) - { - // Make it look like the Glaive flies back up to us - Glaive->CastSpell(m_creature, SPELL_GLAIVE_RETURNS, true); - // Despawn the Glaive - Glaive->SetDeathState(JUST_DIED); - } - GlaiveGUID[i] = 0; + // Make it look like the Glaive flies back up to us + pGlaive->CastSpell(m_creature, SPELL_GLAIVE_RETURNS, true); + // Despawn the Glaive + pGlaive->SetDeathState(JUST_DIED); + m_glaiveGuids[i].Clear(); } } - // Re-equip our warblades! + // Re-bEquip our warblades! SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_ID_OFF_HAND, EQUIP_NO_CHANGE); // Prepare for landin'! - LandTimer = 5000; - RetrieveBladesTimer = 0; - }else RetrieveBladesTimer -= diff; + m_uiLandTimer = 5000; + m_uiRetrieveBladesTimer = 0; + } + else + m_uiRetrieveBladesTimer -= uiDiff; } - if (LandTimer) + if (m_uiLandTimer) { // Time to land! - if (LandTimer <= diff) + if (m_uiLandTimer <= uiDiff) { DoResetThreat(); // anndddd touchdown! m_creature->HandleEmote(EMOTE_ONESHOT_LAND); m_creature->RemoveSplineFlag(SPLINEFLAG_NO_SPLINE); - Phase = PHASE_NORMAL_2; + m_uiPhase = PHASE_NORMAL_2; // We should let the raid fight us =) m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -1721,86 +1762,105 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI // Chase our victim! m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - }else LandTimer -= diff; - return; // Do not continue past this point if LandTimer is not 0 and we are in phase 2. + } + else + m_uiLandTimer -= uiDiff; + + return; // Do not continue past this point if m_uiLandTimer is not 0 and we are in uiPhase 2. } } - if (GlobalTimer < diff) + if (m_uiGlobalTimer < uiDiff) { - if (FireballTimer < diff) + if (m_uiFireballTimer < uiDiff) { Cast(m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0), SPELL_FIREBALL); - FireballTimer = 5000; - }else FireballTimer -= diff; + m_uiFireballTimer = 5000; + } + else + m_uiFireballTimer -= uiDiff; - if (DarkBarrageTimer < diff) + if (m_uiDarkBarrageTimer < uiDiff) { m_creature->InterruptNonMeleeSpells(false); if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) DoCastSpellIfCan(pTarget, SPELL_DARK_BARRAGE); - DarkBarrageTimer = 35000; - GlobalTimer += 9000; - }else DarkBarrageTimer -= diff; + m_uiDarkBarrageTimer = 35000; + m_uiGlobalTimer += 9000; + } + else + m_uiDarkBarrageTimer -= uiDiff; - if (EyeBlastTimer < diff) + if (m_uiEyeBlastTimer < uiDiff) { CastEyeBlast(); - EyeBlastTimer = 30000; - }else EyeBlastTimer -= diff; - }else GlobalTimer -= diff; + m_uiEyeBlastTimer = 30000; + } + else + m_uiEyeBlastTimer -= uiDiff; + } + else + m_uiGlobalTimer -= uiDiff; } /** Phase 3,5 spells only**/ - if (Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV) + if (m_uiPhase == PHASE_NORMAL_2 || m_uiPhase == PHASE_NORMAL_MAIEV) { - if (GlobalTimer < diff) + if (m_uiGlobalTimer < uiDiff) { - if (AgonizingFlamesTimer < diff) + if (m_uiAgonizingFlamesTimer < uiDiff) { CastAgonizingFlames(); - AgonizingFlamesTimer = 60000; - }else AgonizingFlamesTimer -= diff; - }else GlobalTimer -= diff; + m_uiAgonizingFlamesTimer = 60000; + } + else + m_uiAgonizingFlamesTimer -= uiDiff; + } + else + m_uiGlobalTimer -= uiDiff; - if (TransformTimer < diff) + if (m_uiTransformTimer < uiDiff) { float CurHealth = m_creature->GetHealthPercent(); - // Prevent Illidan from morphing if less than 32% or 5%, as this may cause issues with the phase transition or death speech - if ((CurHealth < 32.0f && !MaievGUID) || CurHealth < 5.0f) + // Prevent Illidan from morphing if less than 32% or 5%, as this may cause issues with the uiPhase transition or death speech + if ((CurHealth < 32.0f && !m_maievGuid) || CurHealth < 5.0f) return; - Phase = PHASE_DEMON_SEQUENCE; // Transform sequence - DemonFormSequence = 0; - AnimationTimer = 0; + m_uiPhase = PHASE_DEMON_SEQUENCE; // Transform sequence + m_uiDemonFormSequence = 0; + m_uiAnimationTimer = 0; DoScriptText(SAY_MORPH, m_creature); - TransformTimer = 60000; - FlameBurstTimer = 10000; - ShadowDemonTimer = 30000; + m_uiTransformTimer = 60000; + m_uiFlameBurstTimer = 10000; + m_uiShadowDemonTimer = 30000; m_creature->GetMotionMaster()->Clear(false);// Stop moving - }else TransformTimer -= diff; + } + else + m_uiTransformTimer -= uiDiff; } /** Phase 4 spells only (Demon Form) **/ - if (Phase == PHASE_DEMON) + if (m_uiPhase == PHASE_DEMON) { // Stop moving if we are by clearing movement generators. if (!m_creature->GetMotionMaster()->empty()) m_creature->GetMotionMaster()->Clear(false); - if (TransformTimer < diff) + if (m_uiTransformTimer < uiDiff) { - Phase = PHASE_DEMON_SEQUENCE; - DemonFormSequence = 5; - AnimationTimer = 100; - TransformTimer = 60000; - }else TransformTimer -= diff; + m_uiPhase = PHASE_DEMON_SEQUENCE; + m_uiDemonFormSequence = 5; + m_uiAnimationTimer = 100; + m_uiTransformTimer = 60000; + } + else + m_uiTransformTimer -= uiDiff; - if (ShadowDemonTimer < diff) + if (m_uiShadowDemonTimer < uiDiff) { m_creature->InterruptNonMeleeSpells(false); Creature* ShadowDemon = NULL; @@ -1821,50 +1881,60 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI } } } - ShadowDemonTimer = 60000; - }else ShadowDemonTimer -= diff; + m_uiShadowDemonTimer = 60000; + } + else + m_uiShadowDemonTimer -= uiDiff; - if (GlobalTimer < diff) + if (m_uiGlobalTimer < uiDiff) { - if (ShadowBlastTimer < diff) + if (m_uiShadowBlastTimer < uiDiff) { Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_TOPAGGRO, 0); if (target && target->isAlive()) { m_creature->SetTargetGuid(target->GetObjectGuid()); DoCastSpellIfCan(target, SPELL_SHADOW_BLAST); - ShadowBlastTimer = 4000; - GlobalTimer += 1500; + m_uiShadowBlastTimer = 4000; + m_uiGlobalTimer += 1500; } if (!m_creature->HasAura(SPELL_DEMON_FORM, EFFECT_INDEX_0)) DoCastSpellIfCan(m_creature, SPELL_DEMON_FORM, CAST_TRIGGERED); - }else ShadowBlastTimer -= diff; + } + else + m_uiShadowBlastTimer -= uiDiff; - if (FlameBurstTimer < diff) + if (m_uiFlameBurstTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_FLAME_BURST); - FlameBurstTimer = 15000; - }else FlameBurstTimer -= diff; - }else GlobalTimer -= diff; + m_uiFlameBurstTimer = 15000; + } + else + m_uiFlameBurstTimer -= uiDiff; + } + else + m_uiGlobalTimer -= uiDiff; } /** Phase 5 timers. Enrage spell **/ - if (Phase == PHASE_NORMAL_MAIEV) + if (m_uiPhase == PHASE_NORMAL_MAIEV) { - if (EnrageTimer < diff) + if (m_uiEnrageTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_ENRAGE); - EnrageTimer = 40000; - CageTimer = 30000; - TransformTimer += 10000; - }else EnrageTimer -= diff; + m_uiEnrageTimer = 40000; + m_uiCageTimer = 30000; + m_uiTransformTimer += 10000; + } + else + m_uiEnrageTimer -= uiDiff; // We'll handle Cage Trap in Illidan's script for simplicity's sake - if (CageTimer < diff) + if (m_uiCageTimer < uiDiff) { - if (MaievGUID) + if (m_maievGuid) { - Creature* Maiev = m_creature->GetMap()->GetCreature(MaievGUID); + Creature* Maiev = m_creature->GetMap()->GetCreature(m_maievGuid); Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); if (!Maiev || !target || (target->GetTypeId() != TYPEID_PLAYER)) @@ -1879,46 +1949,47 @@ struct MANGOS_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI // summon the trap! Maiev->CastSpell(Maiev, SPELL_CAGE_TRAP_SUMMON, false); } - CageTimer = 15000; - }else CageTimer -= diff; + m_uiCageTimer = 15000; + } + else + m_uiCageTimer -= uiDiff; } - if (Phase == PHASE_DEMON_SEQUENCE) // Demonic Transformation + if (m_uiPhase == PHASE_DEMON_SEQUENCE) // Demonic Transformation { - if (AnimationTimer < diff) + if (m_uiAnimationTimer < uiDiff) { - HandleDemonTransformAnimation(DemonFormSequence); - ++DemonFormSequence; - }else AnimationTimer -= diff; + HandleDemonTransformAnimation(m_uiDemonFormSequence); + ++m_uiDemonFormSequence; + } + else + m_uiAnimationTimer -= uiDiff; } } }; /*********************** End of Illidan AI ******************************************/ -void npc_akama_illidanAI::BeginEvent(uint64 PlayerGUID) +void npc_akama_illidanAI::BeginEvent(ObjectGuid playerGuid) { debug_log("SD2: Akama - Illidan Introduction started. Illidan event properly begun."); if (m_pInstance) { - IllidanGUID = m_pInstance->GetData64(NPC_ILLIDAN_STORMRAGE); + m_illidanGuid = m_pInstance->GetGuid(NPC_ILLIDAN_STORMRAGE); m_pInstance->SetData(TYPE_ILLIDAN, IN_PROGRESS); } if (m_pInstance) { - for(uint32 i = GO_ILLIDAN_DOOR_R; i < GO_ILLIDAN_DOOR_L+1; ++i) - { - if (GameObject* pDoor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(i))) - pDoor->SetGoState(GO_STATE_READY); - } + m_pInstance->DoUseDoorOrButton(GO_ILLIDAN_DOOR_R); + m_pInstance->DoUseDoorOrButton(GO_ILLIDAN_DOOR_L); } - if (IllidanGUID) + if (m_illidanGuid) { m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Creature* pIllidan = m_creature->GetMap()->GetCreature(IllidanGUID)) + if (Creature* pIllidan = m_creature->GetMap()->GetCreature(m_illidanGuid)) { boss_illidan_stormrageAI* pIllidanAI = dynamic_cast(pIllidan->AI()); @@ -1930,16 +2001,16 @@ void npc_akama_illidanAI::BeginEvent(uint64 PlayerGUID) // First line of Akama-Illidan convo - pIllidanAI->TalkCount = 0; + pIllidanAI->m_uiTalkCount = 0; // Begin Talking - pIllidanAI->IsTalking = true; - pIllidanAI->AkamaGUID = m_creature->GetGUID(); + pIllidanAI->m_bIsTalking = true; + pIllidanAI->m_akamaGuid = m_creature->GetObjectGuid(); m_creature->SetTargetGuid(pIllidan->GetObjectGuid()); pIllidan->SetTargetGuid(m_creature->GetObjectGuid()); - IsTalking = true; // Prevent Akama from starting to attack him + m_bIsTalking = true; // Prevent Akama from starting to attack him // Prevent players from talking again m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); @@ -1951,9 +2022,9 @@ void npc_akama_illidanAI::BeginEvent(uint64 PlayerGUID) m_creature->GetMotionMaster()->Clear(false); m_creature->GetMotionMaster()->MoveIdle(); - if (PlayerGUID) + if (playerGuid) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(PlayerGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(playerGuid)) pIllidan->AddThreat(pPlayer, 100.0f); } } @@ -1989,33 +2060,33 @@ struct MANGOS_DLL_DECL boss_maievAI : public ScriptedAI Reset(); }; - uint32 TauntTimer; - uint64 IllidanGUID; + uint32 m_uiTauntTimer; + ObjectGuid m_illidanGuid; ScriptedInstance* m_pInstance; void Reset() { - TauntTimer = 12000; - IllidanGUID = 0; + m_uiTauntTimer = 12000; } void UpdateAI(const uint32 diff) { - if (!IllidanGUID) + if (!m_illidanGuid) { if (m_pInstance) - IllidanGUID = m_pInstance->GetData64(NPC_ILLIDAN_STORMRAGE); - }else + m_illidanGuid = m_pInstance->GetGuid(NPC_ILLIDAN_STORMRAGE); + } + else { - Creature* Illidan = m_creature->GetMap()->GetCreature(IllidanGUID); + Creature* pIllidan = m_creature->GetMap()->GetCreature(m_illidanGuid); - if (!Illidan || !Illidan->isAlive() || Illidan->IsInEvadeMode()) + if (!pIllidan || !pIllidan->isAlive() || pIllidan->IsInEvadeMode()) { m_creature->SetVisibility(VISIBILITY_OFF); m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } - else if (Illidan && Illidan->GetHealthPercent() < 2.0f) + else if (pIllidan && pIllidan->GetHealthPercent() < 2.0f) return; } @@ -2023,15 +2094,17 @@ struct MANGOS_DLL_DECL boss_maievAI : public ScriptedAI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (TauntTimer < diff) + if (m_uiTauntTimer < diff) { uint32 random = urand(0, 3); - int32 text = MaievTaunts[random].textId; + int32 text = aMaievTaunts[random].textId; DoScriptText(text, m_creature); - TauntTimer = urand(22000, 42000); - }else TauntTimer -= diff; + m_uiTauntTimer = urand(22000, 42000); + } + else + m_uiTauntTimer -= diff; DoMeleeAttackIfReady(); } @@ -2039,49 +2112,46 @@ struct MANGOS_DLL_DECL boss_maievAI : public ScriptedAI struct MANGOS_DLL_DECL cage_trap_triggerAI : public ScriptedAI { - cage_trap_triggerAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} + cage_trap_triggerAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - uint64 IllidanGUID; - uint64 CageTrapGUID; + ObjectGuid m_illidanGuid; + ObjectGuid m_cageTrapGuid; - uint32 DespawnTimer; + uint32 m_uiDespawnTimer; - bool Active; - bool SummonedBeams; + bool m_bActive; + bool m_bSummonedBeams; void Reset() { - IllidanGUID = 0; - CageTrapGUID = 0; - - Active = false; - SummonedBeams = false; + m_bActive = false; + m_bSummonedBeams = false; - DespawnTimer = 0; + m_uiDespawnTimer = 0; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } void MoveInLineOfSight(Unit *who) { - if (!Active) + if (!m_bActive) return; if (who && (who->GetTypeId() != TYPEID_PLAYER)) { if (who->GetEntry() == ILLIDAN_STORMRAGE) // Check if who is Illidan { - if (!IllidanGUID && m_creature->IsWithinDistInMap(who, 3) && !who->HasAura(SPELL_CAGED, EFFECT_INDEX_0)) + if (!m_illidanGuid && m_creature->IsWithinDistInMap(who, 3) && !who->HasAura(SPELL_CAGED, EFFECT_INDEX_0)) { - IllidanGUID = who->GetGUID(); + m_illidanGuid = who->GetObjectGuid(); who->CastSpell(who, SPELL_CAGED, true); - DespawnTimer = 5000; + m_uiDespawnTimer = 5000; // Dispel his enrage if (who->HasAura(SPELL_ENRAGE, EFFECT_INDEX_0)) who->RemoveAurasDueToSpell(SPELL_ENRAGE); - if (GameObject* pCageTrap = m_creature->GetMap()->GetGameObject(CageTrapGUID)) + if (GameObject* pCageTrap = m_creature->GetMap()->GetGameObject(m_cageTrapGuid)) pCageTrap->SetLootState(GO_JUST_DEACTIVATED); } } @@ -2090,16 +2160,16 @@ struct MANGOS_DLL_DECL cage_trap_triggerAI : public ScriptedAI void UpdateAI(const uint32 diff) { - if (DespawnTimer) + if (m_uiDespawnTimer) { - if (DespawnTimer <= diff) + if (m_uiDespawnTimer <= diff) m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - else DespawnTimer -= diff; + else m_uiDespawnTimer -= diff; } - //if (IllidanGUID && !SummonedBeams) + //if (m_illidanGuid && !m_bSummonedBeams) //{ - // if (Creature* pIllidan = m_creature->GetMap()->GetCreature(IllidanGUID) + // if (Creature* pIllidan = m_creature->GetMap()->GetCreature(m_illidanGuid) // { // //TODO: Find proper spells and properly apply 'caged' Illidan effect // } @@ -2122,7 +2192,7 @@ bool GOUse_go_cage_trap(Player* pPlayer, GameObject* pGo) } if (cage_trap_triggerAI* pTriggerAI = dynamic_cast(pTrigger->AI())) - pTriggerAI->Active = true; + pTriggerAI->m_bActive = true; pGo->SetGoState(GO_STATE_ACTIVE); return true; @@ -2132,15 +2202,15 @@ struct MANGOS_DLL_DECL flame_of_azzinothAI : public ScriptedAI { flame_of_azzinothAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint32 FlameBlastTimer; - uint32 SummonBlazeTimer; - uint32 ChargeTimer; + uint32 m_uiFlameBlastTimer; + uint32 m_uiSummonBlazeTimer; + uint32 m_uiChargeTimer; void Reset() { - FlameBlastTimer = urand(15000, 30000); - SummonBlazeTimer = urand(10000, 30000); - ChargeTimer = 5000; + m_uiFlameBlastTimer = urand(15000, 30000); + m_uiSummonBlazeTimer = urand(10000, 30000); + m_uiChargeTimer = 5000; } void Charge() @@ -2182,23 +2252,29 @@ struct MANGOS_DLL_DECL flame_of_azzinothAI : public ScriptedAI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (FlameBlastTimer < diff) + if (m_uiFlameBlastTimer < diff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_FLAME_BLAST); - FlameBlastTimer = 30000; - }else FlameBlastTimer -= diff; + m_uiFlameBlastTimer = 30000; + } + else + m_uiFlameBlastTimer -= diff; - if (SummonBlazeTimer < diff) + if (m_uiSummonBlazeTimer < diff) { DoCastSpellIfCan(m_creature, SPELL_BLAZE_SUMMON); - SummonBlazeTimer = urand(30000, 50000); - }else SummonBlazeTimer -= diff; + m_uiSummonBlazeTimer = urand(30000, 50000); + } + else + m_uiSummonBlazeTimer -= diff; - if (ChargeTimer < diff) + if (m_uiChargeTimer < diff) { Charge(); - ChargeTimer = 5000; - }else ChargeTimer -= diff; + m_uiChargeTimer = 5000; + } + else + m_uiChargeTimer -= diff; DoMeleeAttackIfReady(); } @@ -2206,31 +2282,33 @@ struct MANGOS_DLL_DECL flame_of_azzinothAI : public ScriptedAI struct MANGOS_DLL_DECL shadow_demonAI : public ScriptedAI { - shadow_demonAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} + shadow_demonAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - uint64 TargetGUID; + ObjectGuid m_targetGuid; - void Reset() { TargetGUID = 0; } + void Reset() {} void JustDied(Unit *killer) { - if (TargetGUID) + if (m_targetGuid) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(TargetGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_targetGuid)) pPlayer->RemoveAurasDueToSpell(SPELL_PARALYZE); } } void UpdateAI(const uint32 diff) { - if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; + if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) + return; // Only cast the below on players. - if (m_creature->getVictim()->GetTypeId() != TYPEID_PLAYER) return; + if (m_creature->getVictim()->GetTypeId() != TYPEID_PLAYER) + return; if (!m_creature->getVictim()->HasAura(SPELL_PARALYZE, EFFECT_INDEX_0)) { - TargetGUID = m_creature->getVictim()->GetGUID(); + m_targetGuid = m_creature->getVictim()->GetObjectGuid(); m_creature->AddThreat(m_creature->getVictim(), 10000000.0f); DoCastSpellIfCan(m_creature, SPELL_SHADOW_DEMON_PASSIVE, CAST_TRIGGERED); DoCastSpellIfCan(m_creature->getVictim(), SPELL_PURPLE_BEAM, CAST_TRIGGERED); @@ -2246,13 +2324,13 @@ struct MANGOS_DLL_DECL flamecrashAI : public ScriptedAI { flamecrashAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint32 FlameCrashTimer; - uint32 DespawnTimer; + uint32 m_uiFlameCrashTimer; + uint32 m_uiDespawnTimer; void Reset() { - FlameCrashTimer = urand(3000, 8000); - DespawnTimer = 60000; + m_uiFlameCrashTimer = urand(3000, 8000); + m_uiDespawnTimer = 60000; } void AttackStart(Unit *who) { } @@ -2261,18 +2339,22 @@ struct MANGOS_DLL_DECL flamecrashAI : public ScriptedAI void UpdateAI(const uint32 diff) { - if (FlameCrashTimer < diff) + if (m_uiFlameCrashTimer < diff) { DoCastSpellIfCan(m_creature, SPELL_FLAME_CRASH_EFFECT); - FlameCrashTimer = 15000; - }else FlameCrashTimer -= diff; + m_uiFlameCrashTimer = 15000; + } + else + m_uiFlameCrashTimer -= diff; - if (DespawnTimer < diff) + if (m_uiDespawnTimer < diff) { // So that players don't see the sparkly effect when we die. m_creature->SetVisibility(VISIBILITY_OFF); m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - }else DespawnTimer -= diff; + } + else + m_uiDespawnTimer -= diff; } }; @@ -2310,15 +2392,15 @@ struct MANGOS_DLL_DECL mob_parasitic_shadowfiendAI : public ScriptedAI struct MANGOS_DLL_DECL blazeAI : public ScriptedAI { - blazeAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} + blazeAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } - uint32 BlazeTimer; - uint32 DespawnTimer; + uint32 m_uiBlazeTimer; + uint32 m_uiDespawnTimer; void Reset() { - BlazeTimer = 2000; - DespawnTimer = 15000; + m_uiBlazeTimer = 2000; + m_uiDespawnTimer = 15000; } void AttackStart(Unit* who) { } @@ -2327,17 +2409,21 @@ struct MANGOS_DLL_DECL blazeAI : public ScriptedAI void UpdateAI(const uint32 diff) { - if (BlazeTimer < diff) + if (m_uiBlazeTimer < diff) { DoCastSpellIfCan(m_creature, SPELL_BLAZE_EFFECT); - BlazeTimer = 15000; - }else BlazeTimer -= diff; + m_uiBlazeTimer = 15000; + } + else + m_uiBlazeTimer -= diff; - if (DespawnTimer < diff) + if (m_uiDespawnTimer < diff) { m_creature->SetVisibility(VISIBILITY_OFF); m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - }else DespawnTimer -= diff; + } + else + m_uiDespawnTimer -= diff; } }; @@ -2363,7 +2449,7 @@ CreatureAI* GetAI_npc_akama_at_illidan(Creature* pCreature) npc_akama_illidanAI* Akama_AI = new npc_akama_illidanAI(pCreature); for(uint8 i = 0; i < 13; ++i) - Akama_AI->AddWaypoint(i, AkamaWP[i].x, AkamaWP[i].y, AkamaWP[i].z); + Akama_AI->AddWaypoint(i, aAkamaWP[i].x, aAkamaWP[i].y, aAkamaWP[i].z); return ((CreatureAI*)Akama_AI); } diff --git a/scripts/outland/black_temple/boss_mother_shahraz.cpp b/scripts/outland/black_temple/boss_mother_shahraz.cpp index 715cad2..da19ef6 100644 --- a/scripts/outland/black_temple/boss_mother_shahraz.cpp +++ b/scripts/outland/black_temple/boss_mother_shahraz.cpp @@ -86,7 +86,7 @@ struct MANGOS_DLL_DECL boss_shahrazAI : public ScriptedAI ScriptedInstance* m_pInstance; - uint64 TargetGUID[3]; + ObjectGuid m_targetGuid[3]; uint32 BeamTimer; uint32 BeamCount; uint32 CurrentBeam; @@ -102,8 +102,8 @@ struct MANGOS_DLL_DECL boss_shahrazAI : public ScriptedAI void Reset() { - for(uint8 i = 0; i<3; ++i) - TargetGUID[i] = 0; + for (uint8 i = 0; i < 3; ++i) + m_targetGuid[i].Clear(); BeamTimer = 60000; // Timers may be incorrect BeamCount = 0; @@ -158,7 +158,7 @@ struct MANGOS_DLL_DECL boss_shahrazAI : public ScriptedAI Unit* pUnit = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1); if (pUnit && pUnit->isAlive() && (pUnit->GetTypeId() == TYPEID_PLAYER)) { - TargetGUID[i] = pUnit->GetGUID(); + m_targetGuid[i] = pUnit->GetObjectGuid(); pUnit->CastSpell(pUnit, SPELL_TELEPORT_VISUAL, true); DoTeleportPlayer(pUnit, X, Y, Z, pUnit->GetOrientation()); } @@ -239,12 +239,12 @@ struct MANGOS_DLL_DECL boss_shahrazAI : public ScriptedAI { for(uint8 i = 0; i < 3; ++i) { - if (TargetGUID[i]) + if (m_targetGuid[i]) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(TargetGUID[i])) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_targetGuid[i])) pPlayer->CastSpell(pPlayer, SPELL_ATTRACTION, true); - TargetGUID[i] = 0; + m_targetGuid[i].Clear(); } } diff --git a/scripts/outland/black_temple/boss_reliquary_of_souls.cpp b/scripts/outland/black_temple/boss_reliquary_of_souls.cpp index e76426c..e067bef 100644 --- a/scripts/outland/black_temple/boss_reliquary_of_souls.cpp +++ b/scripts/outland/black_temple/boss_reliquary_of_souls.cpp @@ -98,11 +98,11 @@ struct MANGOS_DLL_DECL npc_enslaved_soulAI : public ScriptedAI { npc_enslaved_soulAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint64 ReliquaryGUID; + ObjectGuid m_reliquaryGuid; void Reset() { - ReliquaryGUID = 0; + m_reliquaryGuid.Clear(); } void DamageTaken(Unit *done_by, uint32 &damage) @@ -132,18 +132,15 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI { boss_reliquary_of_soulsAI(Creature* pCreature) : ScriptedAI(pCreature) { - SufferingGUID = 0; - DesireGUID = 0; - AngerGUID = 0; m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); Reset(); } ScriptedInstance* m_pInstance; - uint64 SufferingGUID; - uint64 DesireGUID; - uint64 AngerGUID; + ObjectGuid m_sufferingGuid; + ObjectGuid m_desireGuid; + ObjectGuid m_angerGuid; uint32 SoulDeathCount; // 0 = Out of Combat, 1 = Not started, 2 = Suffering, 3 = Souls, 4 = Desire, 5 = Souls, 6 = Anger @@ -188,12 +185,12 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI { Creature* pEssence = NULL; - if (SufferingGUID) - pEssence = m_creature->GetMap()->GetCreature(SufferingGUID); - else if (DesireGUID) - pEssence = m_creature->GetMap()->GetCreature(DesireGUID); - else if (AngerGUID) - pEssence = m_creature->GetMap()->GetCreature(AngerGUID); + if (m_sufferingGuid) + pEssence = m_creature->GetMap()->GetCreature(m_sufferingGuid); + else if (m_desireGuid) + pEssence = m_creature->GetMap()->GetCreature(m_desireGuid); + else if (m_angerGuid) + pEssence = m_creature->GetMap()->GetCreature(m_angerGuid); if (pEssence && pEssence->isAlive()) pEssence->ForcedDespawn(); @@ -242,7 +239,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI if (target && Soul) { if (npc_enslaved_soulAI* pSoulAI = dynamic_cast(Soul->AI())) - pSoulAI->ReliquaryGUID = m_creature->GetGUID(); + pSoulAI->m_reliquaryGuid = m_creature->GetObjectGuid(); Soul->CastSpell(Soul, ENSLAVED_SOUL_PASSIVE, true); Soul->AddThreat(target); @@ -309,7 +306,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI EssenceSuffering->AI()->AttackStart(target); } - SufferingGUID = EssenceSuffering->GetGUID(); + m_sufferingGuid = EssenceSuffering->GetObjectGuid(); } EndingPhase = false; @@ -319,9 +316,9 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI if (Phase == 2) { - if (SufferingGUID) + if (m_sufferingGuid) { - Creature* EssenceSuffering = m_creature->GetMap()->GetCreature(SufferingGUID); + Creature* EssenceSuffering = m_creature->GetMap()->GetCreature(m_sufferingGuid); if (!EssenceSuffering || (!EssenceSuffering->isAlive())) EnterEvadeMode(); @@ -369,7 +366,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI SummonSoulTimer = 1000; EndingPhase = false; Phase = 3; - SufferingGUID = 0; + m_sufferingGuid.Clear(); }else DespawnEssenceTimer -= diff; } } @@ -412,7 +409,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI EssenceDesire->AI()->AttackStart(target); } - DesireGUID = EssenceDesire->GetGUID(); + m_desireGuid = EssenceDesire->GetObjectGuid(); SoulDeathCount = 0; } @@ -423,9 +420,9 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI if (Phase == 4) { - if (DesireGUID) + if (m_desireGuid) { - Creature* EssenceDesire = m_creature->GetMap()->GetCreature(DesireGUID); + Creature* EssenceDesire = m_creature->GetMap()->GetCreature(m_desireGuid); if (!EssenceDesire || !EssenceDesire->isAlive()) EnterEvadeMode(); @@ -475,7 +472,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI SummonSoulTimer = 1000; EndingPhase = false; Phase = 5; - DesireGUID = 0; + m_desireGuid.Clear(); }else DespawnEssenceTimer -= diff; } } @@ -517,7 +514,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI EssenceAnger->AI()->AttackStart(target); } - AngerGUID = EssenceAnger->GetGUID(); + m_angerGuid = EssenceAnger->GetObjectGuid(); DoScriptText(ANGER_SAY_FREED, EssenceAnger); SoulDeathCount = 0; } @@ -529,9 +526,9 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI if (Phase == 6) { - if (AngerGUID) + if (m_angerGuid) { - Creature* EssenceAnger = m_creature->GetMap()->GetCreature(AngerGUID); + Creature* EssenceAnger = m_creature->GetMap()->GetCreature(m_angerGuid); if (!EssenceAnger) EnterEvadeMode(); @@ -540,7 +537,7 @@ struct MANGOS_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI { if (!EssenceAnger->isAlive()) { - AngerGUID = 0; + m_angerGuid.Clear(); m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } } @@ -553,7 +550,7 @@ struct MANGOS_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI { boss_essence_of_sufferingAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint64 StatAuraGUID; + ObjectGuid m_statAuraGuid; // TODO currently unused - bug? uint32 AggroYellTimer; uint32 FixateTimer; @@ -562,7 +559,7 @@ struct MANGOS_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI void Reset() { - StatAuraGUID = 0; + m_statAuraGuid.Clear(); AggroYellTimer = 5000; FixateTimer = 5000; @@ -577,9 +574,9 @@ struct MANGOS_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI damage = 0; // 10% of total health, signalling time to return m_creature->SetHealth(m_creature->GetMaxHealth()/10); - if (StatAuraGUID) + if (m_statAuraGuid) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(StatAuraGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_statAuraGuid)) pPlayer->RemoveAurasDueToSpell(AURA_OF_SUFFERING_ARMOR); } } @@ -641,9 +638,9 @@ struct MANGOS_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI if (m_creature->GetHealthPercent() <= 10.0f) { - if (StatAuraGUID) + if (m_statAuraGuid) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(StatAuraGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_statAuraGuid)) pPlayer->RemoveAurasDueToSpell(AURA_OF_SUFFERING_ARMOR); } } @@ -797,7 +794,7 @@ struct MANGOS_DLL_DECL boss_essence_of_angerAI : public ScriptedAI { boss_essence_of_angerAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} - uint64 AggroTargetGUID; + ObjectGuid m_aggroTargetGuid; uint32 AggroYellTimer; uint32 CheckTankTimer; @@ -808,7 +805,7 @@ struct MANGOS_DLL_DECL boss_essence_of_angerAI : public ScriptedAI void Reset() { - AggroTargetGUID = 0; + m_aggroTargetGuid.Clear(); AggroYellTimer = 5000; CheckTankTimer = 5000; @@ -861,7 +858,7 @@ struct MANGOS_DLL_DECL boss_essence_of_angerAI : public ScriptedAI if (!CheckedAggro) { - AggroTargetGUID = m_creature->getVictim()->GetGUID(); + m_aggroTargetGuid = m_creature->getVictim()->GetObjectGuid(); CheckedAggro = true; } @@ -876,12 +873,12 @@ struct MANGOS_DLL_DECL boss_essence_of_angerAI : public ScriptedAI if (CheckTankTimer < diff) { - if (m_creature->getVictim()->GetGUID() != AggroTargetGUID) + if (m_creature->getVictim()->GetObjectGuid() != m_aggroTargetGuid) { DoScriptText(ANGER_SAY_BEFORE, m_creature); DoCastSpellIfCan(m_creature, SPELL_SELF_SEETHE); DoCastSpellIfCan(m_creature->getVictim(), SPELL_ENEMY_SEETHE, CAST_TRIGGERED); - AggroTargetGUID = m_creature->getVictim()->GetGUID(); + m_aggroTargetGuid = m_creature->getVictim()->GetObjectGuid(); } CheckTankTimer = 2000; }else CheckTankTimer -= diff; @@ -910,9 +907,9 @@ struct MANGOS_DLL_DECL boss_essence_of_angerAI : public ScriptedAI void npc_enslaved_soulAI::JustDied(Unit *killer) { - if (ReliquaryGUID) + if (m_reliquaryGuid) { - if (Creature* pReliquary = m_creature->GetMap()->GetCreature(ReliquaryGUID)) + if (Creature* pReliquary = m_creature->GetMap()->GetCreature(m_reliquaryGuid)) { if (boss_reliquary_of_soulsAI* pReliqAI = dynamic_cast(pReliquary->AI())) pReliqAI->SoulDeathCount++; diff --git a/scripts/outland/black_temple/boss_shade_of_akama.cpp b/scripts/outland/black_temple/boss_shade_of_akama.cpp index 3eeb93f..3065e82 100644 --- a/scripts/outland/black_temple/boss_shade_of_akama.cpp +++ b/scripts/outland/black_temple/boss_shade_of_akama.cpp @@ -119,8 +119,6 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI boss_shade_of_akamaAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - m_lChannelersGUIDList.clear(); - m_lSorcerersGUIDList.clear(); Reset(); } @@ -129,8 +127,6 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI GUIDList m_lChannelersGUIDList; GUIDList m_lSorcerersGUIDList; - uint64 m_uiAkamaGUID; - uint32 m_uiSorcererCount; uint32 m_uiDeathCount; @@ -184,7 +180,8 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI RespawnChannelersIfDeadOrEvade(); } - void IncrementDeathCount(uint64 uiGuid = 0) // If guid is set, will remove it from list of sorcerer + // If guid is set, will remove it from list of sorcerer + void IncrementDeathCount(ObjectGuid uiGuid = ObjectGuid()) { debug_log("SD2: Increasing Death Count for Shade of Akama encounter"); ++m_uiDeathCount; @@ -192,7 +189,7 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI if (uiGuid) { if (m_lSorcerersGUIDList.empty()) - error_log("SD2: boss_shade_of_akamaAI attempt to remove guid " UI64FMTD " from Sorcerers list but list is already empty", uiGuid); + error_log("SD2: boss_shade_of_akamaAI attempt to remove guid %s from Sorcerers list but list is already empty", uiGuid.GetString().c_str()); else m_lSorcerersGUIDList.remove(uiGuid); } @@ -213,7 +210,7 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI pSorcerer->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()); pSorcerer->SetTargetGuid(m_creature->GetObjectGuid()); - m_lSorcerersGUIDList.push_back(pSorcerer->GetGUID()); + m_lSorcerersGUIDList.push_back(pSorcerer->GetObjectGuid()); --m_uiDeathCount; ++m_uiSorcererCount; @@ -282,8 +279,8 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI for(std::list::iterator itr = lChannelerList.begin(); itr != lChannelerList.end(); ++itr) { - m_lChannelersGUIDList.push_back((*itr)->GetGUID()); - debug_log("SD2: boss_shade_of_akamaAI found channeler " UI64FMTD ". Adding to list", (*itr)->GetGUID()); + m_lChannelersGUIDList.push_back((*itr)->GetObjectGuid()); + debug_log("SD2: boss_shade_of_akamaAI found channeler %s. Adding to list", (*itr)->GetObjectGuid().GetString().c_str()); (*itr)->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } @@ -323,7 +320,7 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI m_afSpawnLoc[uiRand].m_fX, m_afSpawnLoc[uiRand].m_fY, m_afSpawnLoc[uiRand].m_fZ, m_afSpawnLoc[uiRand].m_fO, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 25000)) { - if (Creature* pAkama = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_AKAMA_SHADE))) + if (Creature* pAkama = m_pInstance->GetSingleCreatureFromStorage(NPC_AKAMA_SHADE)) pDefender->AI()->AttackStart(pAkama); } @@ -342,7 +339,7 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI if (m_uiDeathCount >= 6) { - if (Creature* pAkama = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_AKAMA_SHADE))) + if (Creature* pAkama = m_pInstance->GetSingleCreatureFromStorage(NPC_AKAMA_SHADE)) { if (pAkama && pAkama->isAlive()) { @@ -364,7 +361,7 @@ struct MANGOS_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI { if (m_uiReduceHealthTimer < uiDiff) { - if (Creature* pAkama = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_AKAMA_SHADE))) + if (Creature* pAkama = m_pInstance->GetSingleCreatureFromStorage(NPC_AKAMA_SHADE)) { if (pAkama->isAlive()) { @@ -455,7 +452,7 @@ struct MANGOS_DLL_DECL npc_akamaAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pShade = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { if (boss_shade_of_akamaAI* pShadeAI = dynamic_cast(pShade->AI())) pShadeAI->PrepareChannelers(); @@ -489,7 +486,7 @@ struct MANGOS_DLL_DECL npc_akamaAI : public ScriptedAI ++m_uiWayPointId; break; case 1: - if (Creature* pShade = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { DoCastSpellIfCan(pShade, SPELL_AKAMA_SOUL_RETRIEVE); m_uiEndingTalkCount = 0; @@ -511,7 +508,7 @@ struct MANGOS_DLL_DECL npc_akamaAI : public ScriptedAI if (!m_bCanStartCombat) { - if (Creature* pShade = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { if (!pShade->isAlive()) { @@ -550,7 +547,7 @@ struct MANGOS_DLL_DECL npc_akamaAI : public ScriptedAI { if (m_uiCheckTimer < uiDiff) { - if (Creature* pShade = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { if (!pShade->isAlive()) { @@ -586,7 +583,7 @@ struct MANGOS_DLL_DECL npc_akamaAI : public ScriptedAI pBroken->GetMotionMaster()->MovePoint(0, wx, wy, wz); pBroken->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_lBrokenGUIDList.push_back(pBroken->GetGUID()); + m_lBrokenGUIDList.push_back(pBroken->GetObjectGuid()); } } @@ -671,7 +668,7 @@ struct MANGOS_DLL_DECL npc_akamaAI : public ScriptedAI if (m_uiDestructivePoisonTimer < uiDiff) { - if (Creature* pShade = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { if (pShade->isAlive()) DoCastSpellIfCan(pShade, SPELL_DESTRUCTIVE_POISON); @@ -749,7 +746,7 @@ struct MANGOS_DLL_DECL mob_ashtongue_channelerAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pShade = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { if (pShade->isAlive()) { @@ -769,7 +766,7 @@ struct MANGOS_DLL_DECL mob_ashtongue_channelerAI : public ScriptedAI //start channel (not nice way to start channeling) if (!m_creature->IsNonMeleeSpellCasted(false) && !m_creature->getVictim() && m_pInstance) { - if (Creature* pShade = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) m_creature->CastSpell(pShade, SPELL_SHADE_SOUL_CHANNEL, false); } } @@ -802,12 +799,12 @@ struct MANGOS_DLL_DECL mob_ashtongue_sorcererAI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pShade = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA))) + if (Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA)) { if (pShade->isAlive()) { if (boss_shade_of_akamaAI* pShadeAI = dynamic_cast(pShade->AI())) - pShadeAI->IncrementDeathCount(m_creature->GetGUID()); + pShadeAI->IncrementDeathCount(m_creature->GetObjectGuid()); else error_log("SD2: mob_ashtongue_sorcererAI dead but unable to increment DeathCount for Shade of Akama."); } @@ -821,7 +818,7 @@ struct MANGOS_DLL_DECL mob_ashtongue_sorcererAI : public ScriptedAI if (m_uiCheckTimer < uiDiff) { - Creature* pShade = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHADE_OF_AKAMA)); + Creature* pShade = m_pInstance->GetSingleCreatureFromStorage(NPC_SHADE_OF_AKAMA); if (pShade && pShade->isAlive() && m_creature->isAlive()) { diff --git a/scripts/outland/black_temple/boss_supremus.cpp b/scripts/outland/black_temple/boss_supremus.cpp index 55da5fc..741a10e 100644 --- a/scripts/outland/black_temple/boss_supremus.cpp +++ b/scripts/outland/black_temple/boss_supremus.cpp @@ -99,7 +99,7 @@ struct MANGOS_DLL_DECL boss_supremusAI : public ScriptedAI uint32 m_uiBerserkTimer; uint32 m_uiMoltenPunchTimer; - uint64 m_uiLastGazeTargetGUID; + ObjectGuid m_lastGazeTargetGuid; bool m_bTankPhase; @@ -113,7 +113,7 @@ struct MANGOS_DLL_DECL boss_supremusAI : public ScriptedAI m_uiMoltenPunchTimer = 8000; m_uiBerserkTimer = 15*MINUTE*IN_MILLISECONDS; - m_uiLastGazeTargetGUID = 0; + m_lastGazeTargetGuid.Clear(); m_bTankPhase = true; } @@ -187,7 +187,7 @@ struct MANGOS_DLL_DECL boss_supremusAI : public ScriptedAI void KilledUnit(Unit* pKilled) { - if (!m_bTankPhase && pKilled->GetGUID() == m_uiLastGazeTargetGUID) + if (!m_bTankPhase && pKilled->GetObjectGuid() == m_lastGazeTargetGuid) m_uiSwitchTargetTimer = 0; } @@ -262,7 +262,7 @@ struct MANGOS_DLL_DECL boss_supremusAI : public ScriptedAI m_creature->AddThreat(pTarget, 5000000.0f); DoScriptText(EMOTE_NEW_TARGET, m_creature); m_uiSwitchTargetTimer = 10000; - m_uiLastGazeTargetGUID = pTarget->GetGUID(); + m_lastGazeTargetGuid = pTarget->GetObjectGuid(); } } else diff --git a/scripts/outland/black_temple/boss_teron_gorefiend.cpp b/scripts/outland/black_temple/boss_teron_gorefiend.cpp index ed9fc37..26ad1f5 100644 --- a/scripts/outland/black_temple/boss_teron_gorefiend.cpp +++ b/scripts/outland/black_temple/boss_teron_gorefiend.cpp @@ -61,13 +61,12 @@ struct MANGOS_DLL_DECL mob_doom_blossomAI : public ScriptedAI uint32 m_uiCheckTeronTimer; uint32 m_uiShadowBoltTimer; - uint64 m_uiTeronGUID; + ObjectGuid m_teronGuid; void Reset() { m_uiCheckTeronTimer = 5000; m_uiShadowBoltTimer = 12000; - m_uiTeronGUID = 0; } void AttackStart(Unit* pWho) { } @@ -77,11 +76,11 @@ struct MANGOS_DLL_DECL mob_doom_blossomAI : public ScriptedAI { if (m_uiCheckTeronTimer < uiDiff) { - if (m_uiTeronGUID) + if (m_teronGuid) { m_creature->SetInCombatWithZone(); - Creature* pTeron = m_creature->GetMap()->GetCreature(m_uiTeronGUID); + Creature* pTeron = m_creature->GetMap()->GetCreature(m_teronGuid); if (pTeron && (!pTeron->isAlive() || pTeron->IsInEvadeMode())) m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -107,7 +106,7 @@ struct MANGOS_DLL_DECL mob_doom_blossomAI : public ScriptedAI m_uiShadowBoltTimer -= uiDiff; } - void SetTeronGUID(uint64 uiGUID){ m_uiTeronGUID = uiGUID; } + void SetTeronGUID(ObjectGuid guid){ m_teronGuid = guid; } }; struct MANGOS_DLL_DECL mob_shadowy_constructAI : public ScriptedAI @@ -117,16 +116,15 @@ struct MANGOS_DLL_DECL mob_shadowy_constructAI : public ScriptedAI Reset(); } - uint64 m_uiGhostGUID; - uint64 m_uiTeronGUID; + ObjectGuid m_ghostGuid; + ObjectGuid m_teronGuid; // TODO unused, possible bug? uint32 m_uiCheckPlayerTimer; uint32 m_uiCheckTeronTimer; void Reset() { - m_uiGhostGUID = 0; - m_uiTeronGUID = 0; + m_ghostGuid.Clear(); m_uiCheckPlayerTimer = 2000; m_uiCheckTeronTimer = 5000; @@ -134,7 +132,7 @@ struct MANGOS_DLL_DECL mob_shadowy_constructAI : public ScriptedAI void MoveInLineOfSight(Unit* pWho) { - if (!pWho || !pWho->isAlive() || pWho->GetGUID() == m_uiGhostGUID) + if (!pWho || !pWho->isAlive() || pWho->GetObjectGuid() == m_ghostGuid) return; ScriptedAI::MoveInLineOfSight(pWho); @@ -143,7 +141,7 @@ struct MANGOS_DLL_DECL mob_shadowy_constructAI : public ScriptedAI /* Comment it out for now. NOTE TO FUTURE DEV: UNCOMMENT THIS OUT ONLY AFTER MIND CONTROL IS IMPLEMENTED void DamageTaken(Unit* done_by, uint32 &damage) { - if (done_by->GetGUID() != m_uiGhostGUID) + if (done_by->GetObjectGuid() != m_ghostGuid) damage = 0; // Only the ghost can deal damage. } */ @@ -185,7 +183,7 @@ struct MANGOS_DLL_DECL mob_shadowy_constructAI : public ScriptedAI if (m_uiCheckTeronTimer < uiDiff) { - Creature* pTeron = m_creature->GetMap()->GetCreature(m_uiTeronGUID); + Creature* pTeron = m_creature->GetMap()->GetCreature(m_teronGuid); if (!pTeron || !pTeron->isAlive() || pTeron->IsInEvadeMode()) m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); @@ -215,8 +213,8 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI uint32 m_uiRandomYellTimer; uint32 m_uiAggroTimer; - uint64 m_uiAggroTargetGUID; - uint64 m_uiGhostGUID; // Player that gets killed by Shadow of Death and gets turned into a ghost + ObjectGuid m_aggroTargetGuid; + ObjectGuid m_ghostGuid; // Player that gets killed by Shadow of Death and gets turned into a ghost bool m_bIntro; @@ -234,7 +232,7 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_uiAggroTimer = 20000; - m_uiAggroTargetGUID = 0; + m_aggroTargetGuid.Clear(); m_bIntro = false; } @@ -259,7 +257,7 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI DoScriptText(SAY_INTRO, m_creature); m_creature->HandleEmote(EMOTE_STATE_TALK); - m_uiAggroTargetGUID = pWho->GetGUID(); + m_aggroTargetGuid = pWho->GetObjectGuid(); m_bIntro = true; } } @@ -313,8 +311,8 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI /************************************************************************/ Player* pGhost = NULL; - if (m_uiGhostGUID) - pGhost = m_creature->GetMap()->GetPlayer(m_uiGhostGUID); + if (m_ghostGuid) + pGhost = m_creature->GetMap()->GetPlayer(m_ghostGuid); if (pGhost && pGhost->isAlive() && pGhost->HasAura(SPELL_SHADOW_OF_DEATH, EFFECT_INDEX_0)) { @@ -338,7 +336,7 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI SetThreatList(pConstruct); // Use same function as Doom Blossom to set Threat List. if (mob_shadowy_constructAI* pConstructAI = dynamic_cast(pConstruct->AI())) - pConstructAI->m_uiGhostGUID = m_uiGhostGUID; + pConstructAI->m_ghostGuid = m_ghostGuid; Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1); pConstruct->GetMotionMaster()->MoveChase(pTarget ? pTarget : m_creature->getVictim()); @@ -360,9 +358,9 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI m_creature->HandleEmote(EMOTE_STATE_NONE); m_bIntro = false; - if (m_uiAggroTargetGUID) + if (m_aggroTargetGuid) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiAggroTargetGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_aggroTargetGuid)) AttackStart(pPlayer); m_creature->SetInCombatWithZone(); @@ -409,7 +407,7 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI pDoomBlossom->AddThreat(pTarget); if (mob_doom_blossomAI* pDoomBlossomAI = dynamic_cast(pDoomBlossom->AI())) - pDoomBlossomAI->SetTeronGUID(m_creature->GetGUID()); + pDoomBlossomAI->SetTeronGUID(m_creature->GetObjectGuid()); SetThreatList(pDoomBlossom); } @@ -453,7 +451,7 @@ struct MANGOS_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI if (pTarget && pTarget->isAlive() && pTarget->GetTypeId() == TYPEID_PLAYER) { DoCastSpellIfCan(pTarget, SPELL_SHADOW_OF_DEATH); - m_uiGhostGUID = pTarget->GetGUID(); + m_ghostGuid = pTarget->GetObjectGuid(); m_uiShadowOfDeathTimer = 30000; m_uiSummonShadowsTimer = 53000; // Make it VERY close but slightly less so that we can check if the aura is still on the pPlayer } diff --git a/scripts/outland/black_temple/boss_warlord_najentus.cpp b/scripts/outland/black_temple/boss_warlord_najentus.cpp index a4e54a8..9236e86 100644 --- a/scripts/outland/black_temple/boss_warlord_najentus.cpp +++ b/scripts/outland/black_temple/boss_warlord_najentus.cpp @@ -198,7 +198,6 @@ struct MANGOS_DLL_DECL boss_najentusAI : public ScriptedAI else m_uiNeedleSpineTimer -= uiDiff; - DoMeleeAttackIfReady(); } }; diff --git a/scripts/outland/black_temple/illidari_council.cpp b/scripts/outland/black_temple/illidari_council.cpp index 65c9edb..6ca01ea 100644 --- a/scripts/outland/black_temple/illidari_council.cpp +++ b/scripts/outland/black_temple/illidari_council.cpp @@ -24,32 +24,33 @@ EndScriptData */ #include "precompiled.h" #include "black_temple.h" -//Speech'n'Sounds -#define SAY_GATH_SLAY -1564085 -#define SAY_GATH_SLAY_COMNT -1564089 -#define SAY_GATH_DEATH -1564093 -#define SAY_GATH_SPECIAL1 -1564077 -#define SAY_GATH_SPECIAL2 -1564081 - -#define SAY_VERA_SLAY -1564086 -#define SAY_VERA_COMNT -1564089 -#define SAY_VERA_DEATH -1564094 -#define SAY_VERA_SPECIAL1 -1564078 -#define SAY_VERA_SPECIAL2 -1564082 - -#define SAY_MALA_SLAY -1564087 -#define SAY_MALA_COMNT -1564090 -#define SAY_MALA_DEATH -1564095 -#define SAY_MALA_SPECIAL1 -1564079 -#define SAY_MALA_SPECIAL2 -1564083 - -#define SAY_ZERE_SLAY -1564088 -#define SAY_ZERE_COMNT -1564091 -#define SAY_ZERE_DEATH -1564096 -#define SAY_ZERE_SPECIAL1 -1564080 -#define SAY_ZERE_SPECIAL2 -1564084 - -#define ERROR_INST_DATA "SD2 ERROR: Instance Data for Black Temple not set properly; Illidari Council event will not function properly." +enum +{ + //Speech'n'Sounds + SAY_GATH_SLAY = -1564085, + SAY_GATH_SLAY_COMNT = -1564089, + SAY_GATH_DEATH = -1564093, + SAY_GATH_SPECIAL1 = -1564077, + SAY_GATH_SPECIAL2 = -1564081, + + SAY_VERA_SLAY = -1564086, + SAY_VERA_COMNT = -1564089, + SAY_VERA_DEATH = -1564094, + SAY_VERA_SPECIAL1 = -1564078, + SAY_VERA_SPECIAL2 = -1564082, + + SAY_MALA_SLAY = -1564087, + SAY_MALA_COMNT = -1564090, + SAY_MALA_DEATH = -1564095, + SAY_MALA_SPECIAL1 = -1564079, + SAY_MALA_SPECIAL2 = -1564083, + + SAY_ZERE_SLAY = -1564088, + SAY_ZERE_COMNT = -1564091, + SAY_ZERE_DEATH = -1564096, + SAY_ZERE_SPECIAL1 = -1564080, + SAY_ZERE_SPECIAL2 = -1564084, +}; struct CouncilYells { @@ -57,7 +58,7 @@ struct CouncilYells uint32 timer; }; -static CouncilYells CouncilAggro[]= +static const CouncilYells CouncilAggro[]= { {-1564069, 5000}, // Gathios {-1564070, 5500}, // Veras @@ -66,7 +67,7 @@ static CouncilYells CouncilAggro[]= }; // Need to get proper timers for this later -static CouncilYells CouncilEnrage[]= +static const CouncilYells CouncilEnrage[]= { {-1564073, 2000}, // Gathios {-1564074, 6000}, // Veras @@ -74,115 +75,118 @@ static CouncilYells CouncilEnrage[]= {-1564076, 0}, // Zerevor }; -// High Nethermancer Zerevor's spells -#define SPELL_FLAMESTRIKE 41481 -#define SPELL_BLIZZARD 41482 -#define SPELL_ARCANE_BOLT 41483 -#define SPELL_ARCANE_EXPLOSION 41524 -#define SPELL_DAMPEN_MAGIC 41478 - -// Lady Malande's spells -#define SPELL_EMPOWERED_SMITE 41471 -#define SPELL_CIRCLE_OF_HEALING 41455 -#define SPELL_REFLECTIVE_SHIELD 41475 -#define SPELL_DIVINE_WRATH 41472 -#define SPELL_HEAL_VISUAL 24171 - -// Gathios the Shatterer's spells -#define SPELL_BLESS_PROTECTION 41450 -#define SPELL_BLESS_SPELLWARD 41451 -#define SPELL_CONSECRATION 41541 -#define SPELL_HAMMER_OF_JUSTICE 41468 -#define SPELL_SEAL_OF_COMMAND 41469 -#define SPELL_SEAL_OF_BLOOD 41459 -#define SPELL_CHROMATIC_AURA 41453 -#define SPELL_DEVOTION_AURA 41452 - -// Veras Darkshadow's spells -#define SPELL_DEADLY_POISON 41485 -#define SPELL_ENVENOM 41487 -#define SPELL_VANISH 41479 - -#define SPELL_BERSERK 45078 +enum +{ + // High Nethermancer Zerevor's spells + SPELL_FLAMESTRIKE = 41481, + SPELL_BLIZZARD = 41482, + SPELL_ARCANE_BOLT = 41483, + SPELL_ARCANE_EXPLOSION = 41524, + SPELL_DAMPEN_MAGIC = 41478, + + // Lady Malande's spells + SPELL_EMPOWERED_SMITE = 41471, + SPELL_CIRCLE_OF_HEALING = 41455, + SPELL_REFLECTIVE_SHIELD = 41475, + SPELL_DIVINE_WRATH = 41472, + SPELL_HEAL_VISUAL = 24171, + + // Gathios the Shatterer's spells + SPELL_BLESS_PROTECTION = 41450, + SPELL_BLESS_SPELLWARD = 41451, + SPELL_CONSECRATION = 41541, + SPELL_HAMMER_OF_JUSTICE = 41468, + SPELL_SEAL_OF_COMMAND = 41469, + SPELL_SEAL_OF_BLOOD = 41459, + SPELL_CHROMATIC_AURA = 41453, + SPELL_DEVOTION_AURA = 41452, + + // Veras Darkshadow's spells + SPELL_DEADLY_POISON = 41485, + SPELL_ENVENOM = 41487, + SPELL_VANISH = 41479, + + SPELL_BERSERK = 45078, +}; + +static const uint32 aCouncilMember[] = {NPC_GATHIOS, NPC_VERAS, NPC_LADY_MALANDE, NPC_ZEREVOR}; struct MANGOS_DLL_DECL mob_blood_elf_council_voice_triggerAI : public ScriptedAI { mob_blood_elf_council_voice_triggerAI(Creature* pCreature) : ScriptedAI(pCreature) { - for(uint8 i = 0; i < 4; ++i) - Council[i] = 0; + m_pInstance = (ScriptedInstance*)(m_creature->GetInstanceData()); Reset(); } + ScriptedInstance* m_pInstance; - uint64 Council[4]; - - uint32 EnrageTimer; - uint32 AggroYellTimer; + uint32 m_uiEnrageTimer; + uint32 m_uiAggroYellTimer; - uint8 YellCounter; // Serves as the counter for both the aggro and enrage yells + uint8 m_uiYellCounter; // Serves as the counter for both the aggro and enrage yells - bool EventStarted; + bool m_bEventStarted; - void Reset() + void StartVoiceEvent() { - EnrageTimer = 900000; // 15 minutes - AggroYellTimer = 500; - YellCounter = 0; + if (!m_pInstance) + return; - EventStarted = false; + m_bEventStarted = true; } - // finds and stores the GUIDs for each Council member using instance data system. - void LoadCouncilGUIDs() + void Reset() { - if (ScriptedInstance* pInstance = (ScriptedInstance*)m_creature->GetInstanceData()) - { - Council[0] = pInstance->GetData64(NPC_GATHIOS); - Council[1] = pInstance->GetData64(NPC_VERAS); - Council[2] = pInstance->GetData64(NPC_LADY_MALANDE); - Council[3] = pInstance->GetData64(NPC_ZEREVOR); - }else error_log(ERROR_INST_DATA); + m_uiEnrageTimer = 15*MINUTE*IN_MILLISECONDS; // 15 minutes + m_uiAggroYellTimer = 500; + m_uiYellCounter = 0; + + m_bEventStarted = false; } - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} + void AttackStart(Unit* pWho) {} + void MoveInLineOfSight(Unit* pWho) {} - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (!EventStarted) + if (!m_bEventStarted) return; - if (YellCounter > 3) + if (m_uiYellCounter > 3) return; - if (AggroYellTimer) + if (m_uiAggroYellTimer) { - if (AggroYellTimer <= diff) + if (m_uiAggroYellTimer <= uiDiff) { - if (Creature* pMember = m_creature->GetMap()->GetCreature(Council[YellCounter])) + if (Creature* pMember = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[m_uiYellCounter])) { - DoScriptText(CouncilAggro[YellCounter].entry, pMember); - AggroYellTimer = CouncilAggro[YellCounter].timer; + DoScriptText(CouncilAggro[m_uiYellCounter].entry, pMember); + m_uiAggroYellTimer = CouncilAggro[m_uiYellCounter].timer; } - ++YellCounter; + ++m_uiYellCounter; - if (YellCounter > 3) - YellCounter = 0; // Reuse for Enrage Yells - }else AggroYellTimer -= diff; + if (m_uiYellCounter > 3) + m_uiYellCounter = 0; // Reuse for Enrage Yells + } + else + m_uiAggroYellTimer -= uiDiff; } - if (EnrageTimer) + if (m_uiEnrageTimer) { - if (EnrageTimer <= diff) + if (m_uiEnrageTimer <= uiDiff) { - if (Creature* pMember = m_creature->GetMap()->GetCreature(Council[YellCounter])) + if (Creature* pMember = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[m_uiYellCounter])) { pMember->CastSpell(pMember, SPELL_BERSERK, true); - DoScriptText(CouncilEnrage[YellCounter].entry, pMember); - EnrageTimer = CouncilEnrage[YellCounter].timer; + DoScriptText(CouncilEnrage[m_uiYellCounter].entry, pMember); + m_uiEnrageTimer = CouncilEnrage[m_uiYellCounter].timer; } - ++YellCounter; - }else EnrageTimer -= diff; + ++m_uiYellCounter; + } + else + m_uiEnrageTimer -= uiDiff; } } }; @@ -192,45 +196,26 @@ struct MANGOS_DLL_DECL mob_illidari_councilAI : public ScriptedAI mob_illidari_councilAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - - for(uint8 i = 0; i < 4; ++i) - Council[i] = 0; - Reset(); } ScriptedInstance* m_pInstance; - uint64 Council[4]; + uint32 m_uiCheckTimer; + uint32 m_uiEndEventTimer; - uint32 CheckTimer; - uint32 EndEventTimer; + uint8 m_uiDeathCount; - uint8 DeathCount; - - bool EventBegun; + bool m_bEventBegun; void Reset() { - CheckTimer = 2000; - EndEventTimer = 0; - - DeathCount = 0; + m_uiCheckTimer = 2000; + m_uiEndEventTimer = 0; - for(uint8 i = 0; i < 4; ++i) - { - if (Creature* pMember = m_creature->GetMap()->GetCreature(Council[i])) - { - if (!pMember->isAlive()) - { - pMember->RemoveCorpse(); - pMember->Respawn(); - } - pMember->AI()->EnterEvadeMode(); - } - } + m_uiDeathCount = 0; - EventBegun = false; + m_bEventBegun = false; m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -238,53 +223,55 @@ struct MANGOS_DLL_DECL mob_illidari_councilAI : public ScriptedAI if (m_pInstance) { - //if already done, not do anything + // If already done, not do anything if (m_pInstance->GetData(TYPE_COUNCIL) == DONE) return; - if (Creature* VoiceTrigger = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_COUNCIL_VOICE))) + if (Creature* VoiceTrigger = m_pInstance->GetSingleCreatureFromStorage(NPC_COUNCIL_VOICE)) VoiceTrigger->AI()->EnterEvadeMode(); m_pInstance->SetData(TYPE_COUNCIL, NOT_STARTED); + + for(uint8 i = 0; i < 4; ++i) + { + if (Creature* pMember = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i])) + { + if (!pMember->isAlive()) + { + pMember->RemoveCorpse(); + pMember->Respawn(); + } + pMember->AI()->EnterEvadeMode(); + } + } } } - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} + void AttackStart(Unit* pWho) {} + void MoveInLineOfSight(Unit* pWho) {} - void StartEvent(Unit *target) + void StartEvent(Unit* pTarget) { if (!m_pInstance) return; - if (target && target->isAlive() && !EventBegun) + if (pTarget && pTarget->isAlive() && !m_bEventBegun) { - // Prevent further handling for next council member aggroing - EventBegun = true; - - Council[0] = m_pInstance->GetData64(NPC_GATHIOS); - Council[1] = m_pInstance->GetData64(NPC_ZEREVOR); - Council[2] = m_pInstance->GetData64(NPC_LADY_MALANDE); - Council[3] = m_pInstance->GetData64(NPC_VERAS); + // Prevent further handling for next council uiMember aggroing + m_bEventBegun = true; // Start the event for the Voice Trigger - if (Creature* pVoiceTrigger = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_COUNCIL_VOICE))) + if (Creature* pVoiceTrigger = m_pInstance->GetSingleCreatureFromStorage(NPC_COUNCIL_VOICE)) { if (mob_blood_elf_council_voice_triggerAI* pVoiceAI = dynamic_cast(pVoiceTrigger->AI())) - { - pVoiceAI->LoadCouncilGUIDs(); - pVoiceAI->EventStarted = true; - } + pVoiceAI->StartVoiceEvent(); } for(uint8 i = 0; i < 4; ++i) { - if (Council[i]) - { - Creature* pMember = m_creature->GetMap()->GetCreature(Council[i]); - if (pMember && pMember->isAlive() && !pMember->isInCombat()) - pMember->AI()->AttackStart(target); - } + Creature* pMember = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i]); + if (pMember && pMember->isAlive() && !pMember->isInCombat()) + pMember->AI()->AttackStart(pTarget); } // All are set into combat now, Set Instance Data @@ -294,68 +281,66 @@ struct MANGOS_DLL_DECL mob_illidari_councilAI : public ScriptedAI void UpdateAI(const uint32 diff) { - if (!EventBegun) + if (!m_bEventBegun) // Can only be true when m_pInstance is valid return; - if (EndEventTimer) + if (m_uiEndEventTimer) { - if (EndEventTimer <= diff) + if (m_uiEndEventTimer <= diff) { - if (DeathCount > 3) + if (m_uiDeathCount > 3) { - if (m_pInstance) - { - if (Creature* VoiceTrigger = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_COUNCIL_VOICE))) - VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + if (Creature* VoiceTrigger = m_pInstance->GetSingleCreatureFromStorage(NPC_COUNCIL_VOICE)) + VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + + m_pInstance->SetData(TYPE_COUNCIL, DONE); - m_pInstance->SetData(TYPE_COUNCIL, DONE); - } m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } - Creature* pMember = m_creature->GetMap()->GetCreature(Council[DeathCount]); + Creature* pMember = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[m_uiDeathCount]); if (pMember && pMember->isAlive()) pMember->DealDamage(pMember, pMember->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - ++DeathCount; - EndEventTimer = 1500; - }else EndEventTimer -= diff; + ++m_uiDeathCount; + m_uiEndEventTimer = 1500; + } + else + m_uiEndEventTimer -= diff; } - if (CheckTimer) + if (m_uiCheckTimer) { - if (CheckTimer <= diff) + if (m_uiCheckTimer <= diff) { uint8 EvadeCheck = 0; for(uint8 i = 0; i < 4; ++i) { - if (Council[i]) + if (Creature* Member = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i])) { - if (Creature* Member = m_creature->GetMap()->GetCreature(Council[i])) + // This is the evade/death check. + if (Member->isAlive() && !Member->SelectHostileTarget()) + ++EvadeCheck; // If all members evade, we reset so that players can properly reset the event + else if (!Member->isAlive()) // If even one uiMember dies, kill the rest, set instance data, and kill self. { - // This is the evade/death check. - if (Member->isAlive() && !Member->SelectHostileTarget()) - ++EvadeCheck; //If all members evade, we reset so that players can properly reset the event - else if (!Member->isAlive()) //If even one member dies, kill the rest, set instance data, and kill self. - { - EndEventTimer = 1000; - CheckTimer = 0; - return; - } + m_uiEndEventTimer = 1000; + m_uiCheckTimer = 0; + return; } } } if (EvadeCheck > 3) { - if (m_pInstance) - m_pInstance->SetData(TYPE_COUNCIL, FAIL); + m_pInstance->SetData(TYPE_COUNCIL, FAIL); Reset(); } - CheckTimer = 2000; - }else CheckTimer -= diff; + m_uiCheckTimer = 2000; + } + else + m_uiCheckTimer -= diff; } } }; @@ -365,41 +350,22 @@ struct MANGOS_DLL_DECL boss_illidari_councilAI : public ScriptedAI boss_illidari_councilAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - - for(uint8 i = 0; i < 4; ++i) - Council[i] = 0; - - LoadedGUIDs = false; } ScriptedInstance* m_pInstance; - uint64 Council[4]; - - bool LoadedGUIDs; - void Aggro(Unit* pWho) { if (m_pInstance) { - if (Creature* pController = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_ILLIDARI_COUNCIL))) + if (Creature* pController = m_pInstance->GetSingleCreatureFromStorage(NPC_ILLIDARI_COUNCIL)) { if (mob_illidari_councilAI* pControlAI = dynamic_cast(pController->AI())) pControlAI->StartEvent(pWho); } } else - { - error_log(ERROR_INST_DATA); EnterEvadeMode(); - } - - // Load GUIDs on first aggro because the creature guids are only set as the creatures are created in world- - // this means that for each creature, it will attempt to LoadGUIDs even though some of the other creatures are - // not in world, and thus have no GUID set in the instance data system. Putting it in aggro ensures that all the creatures - // have been loaded and have their GUIDs set in the instance data system. - if (!LoadedGUIDs) - LoadGUIDs(); } void DamageTaken(Unit* done_by, uint32 &damage) @@ -408,111 +374,112 @@ struct MANGOS_DLL_DECL boss_illidari_councilAI : public ScriptedAI return; damage /= 4; + if (!m_pInstance) + return; + for(uint8 i = 0; i < 4; ++i) { - if (Creature* pCouncil = m_creature->GetMap()->GetCreature(Council[i])) + if (Creature* pCouncil = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i])) { if (pCouncil != m_creature && damage < pCouncil->GetHealth()) pCouncil->SetHealth(pCouncil->GetHealth() - damage); } } } - - void LoadGUIDs() - { - if (!m_pInstance) - { - error_log(ERROR_INST_DATA); - return; - } - - Council[0] = m_pInstance->GetData64(NPC_LADY_MALANDE); - Council[1] = m_pInstance->GetData64(NPC_ZEREVOR); - Council[2] = m_pInstance->GetData64(NPC_GATHIOS); - Council[3] = m_pInstance->GetData64(NPC_VERAS); - - LoadedGUIDs = true; - } }; struct MANGOS_DLL_DECL boss_gathios_the_shattererAI : public boss_illidari_councilAI { boss_gathios_the_shattererAI(Creature* pCreature) : boss_illidari_councilAI(pCreature) { Reset(); } - uint32 ConsecrationTimer; - uint32 HammerOfJusticeTimer; - uint32 SealTimer; - uint32 AuraTimer; - uint32 BlessingTimer; + uint32 m_uiConsecrationTimer; + uint32 m_uiHammerOfJusticeTimer; + uint32 m_uiSealTimer; + uint32 m_uiAuraTimer; + uint32 m_uiBlessingTimer; void Reset() { - ConsecrationTimer = 40000; - HammerOfJusticeTimer = 10000; - SealTimer = 40000; - AuraTimer = 90000; - BlessingTimer = 60000; + m_uiConsecrationTimer = 40000; + m_uiHammerOfJusticeTimer = 10000; + m_uiSealTimer = 40000; + m_uiAuraTimer = 90000; + m_uiBlessingTimer = 60000; } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { DoScriptText(SAY_GATH_SLAY, m_creature); } - void JustDied(Unit *victim) + void JustDied(Unit* pKiller) { DoScriptText(SAY_GATH_DEATH, m_creature); } Unit* SelectCouncilMember() { + if (!m_pInstance) + return m_creature; + Unit* pUnit = m_creature; - uint32 member = 0; // He chooses Lady Malande most often + uint32 uiMember = 2; // He chooses Lady Malande most often if (!urand(0, 9)) // But there is a chance he picks someone else. - member = urand(1, 3); + { + uiMember += urand(1, 3); + uiMember %= 4; + } - if (member != 2) // No need to create another pointer - pUnit = m_creature->GetMap()->GetCreature(Council[member]); + if (uiMember != 0) // No need to create another pointer + pUnit = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[uiMember]); return pUnit; } void CastAuraOnCouncil() { - uint32 spellid = 0; + uint32 uiSpellid = 0; switch(urand(0, 1)) { - case 0: spellid = SPELL_DEVOTION_AURA; break; - case 1: spellid = SPELL_CHROMATIC_AURA; break; + case 0: uiSpellid = SPELL_DEVOTION_AURA; break; + case 1: uiSpellid = SPELL_CHROMATIC_AURA; break; } + + if (!m_pInstance) + return; + for(uint8 i = 0; i < 4; ++i) { - if (Creature* pCouncil = m_creature->GetMap()->GetCreature(Council[i])) - pCouncil->CastSpell(pCouncil, spellid, true, NULL, NULL, m_creature->GetObjectGuid()); + if (Creature* pCouncil = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i])) + pCouncil->CastSpell(pCouncil, uiSpellid, true, NULL, NULL, m_creature->GetObjectGuid()); } } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (BlessingTimer < diff) + if (m_uiBlessingTimer < uiDiff) { if (Unit* pUnit = SelectCouncilMember()) DoCastSpellIfCan(pUnit, urand(0, 1) ? SPELL_BLESS_SPELLWARD : SPELL_BLESS_PROTECTION); - BlessingTimer = 60000; - }else BlessingTimer -= diff; + m_uiBlessingTimer = 60000; + } + else + m_uiBlessingTimer -= uiDiff; - if (ConsecrationTimer < diff) + if (m_uiConsecrationTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_CONSECRATION); - ConsecrationTimer = 40000; - }else ConsecrationTimer -= diff; + m_uiConsecrationTimer = 40000; + } + else + m_uiConsecrationTimer -= uiDiff; - if (HammerOfJusticeTimer < diff) + if (m_uiHammerOfJusticeTimer < uiDiff) { if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { @@ -520,22 +487,28 @@ struct MANGOS_DLL_DECL boss_gathios_the_shattererAI : public boss_illidari_counc if (m_creature->IsInRange(target, 10.0f, 40.0f, false)) { DoCastSpellIfCan(target, SPELL_HAMMER_OF_JUSTICE); - HammerOfJusticeTimer = 20000; + m_uiHammerOfJusticeTimer = 20000; } } - }else HammerOfJusticeTimer -= diff; + } + else + m_uiHammerOfJusticeTimer -= uiDiff; - if (SealTimer < diff) + if (m_uiSealTimer < uiDiff) { DoCastSpellIfCan(m_creature, urand(0, 1) ? SPELL_SEAL_OF_COMMAND : SPELL_SEAL_OF_BLOOD); - SealTimer = 40000; - }else SealTimer -= diff; + m_uiSealTimer = 40000; + } + else + m_uiSealTimer -= uiDiff; - if (AuraTimer < diff) + if (m_uiAuraTimer < uiDiff) { CastAuraOnCouncil(); - AuraTimer = 90000; - }else AuraTimer -= diff; + m_uiAuraTimer = 90000; + } + else + m_uiAuraTimer -= uiDiff; DoMeleeAttackIfReady(); } @@ -545,92 +518,102 @@ struct MANGOS_DLL_DECL boss_high_nethermancer_zerevorAI : public boss_illidari_c { boss_high_nethermancer_zerevorAI(Creature* pCreature) : boss_illidari_councilAI(pCreature) { Reset(); } - uint32 BlizzardTimer; - uint32 FlamestrikeTimer; - uint32 ArcaneBoltTimer; - uint32 DampenMagicTimer; - uint32 Cooldown; - uint32 ArcaneExplosionTimer; + uint32 m_uiBlizzardTimer; + uint32 m_uiFlamestrikeTimer; + uint32 m_uiArcaneBoltTimer; + uint32 m_uiDampenMagicTimer; + uint32 m_uiCooldown; + uint32 m_uiArcaneExplosionTimer; void Reset() { - BlizzardTimer = urand(30000, 90000); - FlamestrikeTimer = urand(30000, 90000); - ArcaneBoltTimer = 10000; - DampenMagicTimer = 2000; - ArcaneExplosionTimer = 14000; - Cooldown = 0; + m_uiBlizzardTimer = urand(30000, 90000); + m_uiFlamestrikeTimer = urand(30000, 90000); + m_uiArcaneBoltTimer = 10000; + m_uiDampenMagicTimer = 2000; + m_uiArcaneExplosionTimer = 14000; + m_uiCooldown = 0; } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { DoScriptText(SAY_ZERE_SLAY, m_creature); } - void JustDied(Unit *victim) + void JustDied(Unit* pKiller) { DoScriptText(SAY_ZERE_DEATH, m_creature); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (Cooldown) + if (m_uiCooldown) { - if (Cooldown < diff) - Cooldown = 0; + if (m_uiCooldown < uiDiff) + m_uiCooldown = 0; else { - Cooldown -= diff; + m_uiCooldown -= uiDiff; return; // Don't cast any other spells if global cooldown is still ticking } } - if (DampenMagicTimer < diff) + if (m_uiDampenMagicTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DAMPEN_MAGIC); - Cooldown = 1000; - DampenMagicTimer = 110000; // almost 2 minutes - ArcaneBoltTimer += 1000; // Give the Mage some time to spellsteal Dampen. - }else DampenMagicTimer -= diff; + m_uiCooldown = 1000; + m_uiDampenMagicTimer = 110000; // Almost 2 minutes + m_uiArcaneBoltTimer += 1000; // Give the Mage some time to spellsteal Dampen. + } + else + m_uiDampenMagicTimer -= uiDiff; - if (ArcaneExplosionTimer < diff) + if (m_uiArcaneExplosionTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_ARCANE_EXPLOSION); - Cooldown = 1000; - ArcaneExplosionTimer = 14000; - }else ArcaneExplosionTimer -= diff; + m_uiCooldown = 1000; + m_uiArcaneExplosionTimer = 14000; + } + else + m_uiArcaneExplosionTimer -= uiDiff; - if (ArcaneBoltTimer < diff) + if (m_uiArcaneBoltTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_ARCANE_BOLT); - ArcaneBoltTimer = 3000; - Cooldown = 2000; - }else ArcaneBoltTimer -= diff; + m_uiArcaneBoltTimer = 3000; + m_uiCooldown = 2000; + } + else + m_uiArcaneBoltTimer -= uiDiff; - if (BlizzardTimer < diff) + if (m_uiBlizzardTimer < uiDiff) { if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { DoCastSpellIfCan(target, SPELL_BLIZZARD); - BlizzardTimer = urand(45000, 90000); - FlamestrikeTimer += 10000; - Cooldown = 1000; + m_uiBlizzardTimer = urand(45000, 90000); + m_uiFlamestrikeTimer += 10000; + m_uiCooldown = 1000; } - }else BlizzardTimer -= diff; + } + else + m_uiBlizzardTimer -= uiDiff; - if (FlamestrikeTimer < diff) + if (m_uiFlamestrikeTimer < uiDiff) { if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { DoCastSpellIfCan(target, SPELL_FLAMESTRIKE); - FlamestrikeTimer = urand(55000, 100000); - BlizzardTimer += 10000; - Cooldown = 2000; + m_uiFlamestrikeTimer = urand(55000, 100000); + m_uiBlizzardTimer += 10000; + m_uiCooldown = 2000; } - }else FlamestrikeTimer -= diff; + } + else + m_uiFlamestrikeTimer -= uiDiff; } }; @@ -638,64 +621,72 @@ struct MANGOS_DLL_DECL boss_lady_malandeAI : public boss_illidari_councilAI { boss_lady_malandeAI(Creature* pCreature) : boss_illidari_councilAI(pCreature) { Reset(); } - uint32 EmpoweredSmiteTimer; - uint32 CircleOfHealingTimer; - uint32 DivineWrathTimer; - uint32 ReflectiveShieldTimer; + uint32 m_uiEmpoweredSmiteTimer; + uint32 m_uiCircleOfHealingTimer; + uint32 m_uiDivineWrathTimer; + uint32 m_uiReflectiveShieldTimer; void Reset() { - EmpoweredSmiteTimer = 38000; - CircleOfHealingTimer = 20000; - DivineWrathTimer = 40000; - ReflectiveShieldTimer = 0; + m_uiEmpoweredSmiteTimer = 38000; + m_uiCircleOfHealingTimer = 20000; + m_uiDivineWrathTimer = 40000; + m_uiReflectiveShieldTimer = 0; } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { DoScriptText(SAY_MALA_SLAY, m_creature); } - void JustDied(Unit *victim) + void JustDied(Unit* pKiller) { DoScriptText(SAY_MALA_DEATH, m_creature); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (EmpoweredSmiteTimer < diff) + if (m_uiEmpoweredSmiteTimer < uiDiff) { - if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { - DoCastSpellIfCan(target, SPELL_EMPOWERED_SMITE); - EmpoweredSmiteTimer = 38000; + DoCastSpellIfCan(pTarget, SPELL_EMPOWERED_SMITE); + m_uiEmpoweredSmiteTimer = 38000; } - }else EmpoweredSmiteTimer -= diff; + } + else + m_uiEmpoweredSmiteTimer -= uiDiff; - if (CircleOfHealingTimer < diff) + if (m_uiCircleOfHealingTimer < uiDiff) { //Currently bugged and puts Malande on the threatlist of the other council members. It also heals players. //DoCastSpellIfCan(m_creature, SPELL_CIRCLE_OF_HEALING); - CircleOfHealingTimer = 60000; - }else CircleOfHealingTimer -= diff; + m_uiCircleOfHealingTimer = 60000; + } + else + m_uiCircleOfHealingTimer -= uiDiff; - if (DivineWrathTimer < diff) + if (m_uiDivineWrathTimer < uiDiff) { if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { DoCastSpellIfCan(target, SPELL_DIVINE_WRATH); - DivineWrathTimer = urand(40000, 80000); + m_uiDivineWrathTimer = urand(40000, 80000); } - }else DivineWrathTimer -= diff; + } + else + m_uiDivineWrathTimer -= uiDiff; - if (ReflectiveShieldTimer < diff) + if (m_uiReflectiveShieldTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_REFLECTIVE_SHIELD); - ReflectiveShieldTimer = 65000; - }else ReflectiveShieldTimer -= diff; + m_uiReflectiveShieldTimer = 65000; + } + else + m_uiReflectiveShieldTimer -= uiDiff; DoMeleeAttackIfReady(); } @@ -705,96 +696,102 @@ struct MANGOS_DLL_DECL boss_veras_darkshadowAI : public boss_illidari_councilAI { boss_veras_darkshadowAI(Creature* pCreature) : boss_illidari_councilAI(pCreature) { Reset(); } - uint64 EnvenomTargetGUID; - - uint32 DeadlyPoisonTimer; - uint32 VanishTimer; - uint32 AppearEnvenomTimer; + uint32 m_uiDeadlyPoisonTimer; + uint32 m_uiVanishTimer; + uint32 m_uiAppearEnvenomTimer; - bool HasVanished; + bool m_bHasVanished; void Reset() { - EnvenomTargetGUID = 0; + m_uiDeadlyPoisonTimer = 20000; + m_uiVanishTimer = urand(60000, 120000); + m_uiAppearEnvenomTimer = 150000; - DeadlyPoisonTimer = 20000; - VanishTimer = urand(60000, 120000); - AppearEnvenomTimer = 150000; - - HasVanished = false; + m_bHasVanished = false; m_creature->SetVisibility(VISIBILITY_ON); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { DoScriptText(SAY_VERA_SLAY, m_creature); } - void JustDied(Unit *victim) + void JustDied(Unit* pKiller) { DoScriptText(SAY_VERA_DEATH, m_creature); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (!HasVanished) + if (!m_bHasVanished) { - if (DeadlyPoisonTimer < diff) + if (m_uiDeadlyPoisonTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_DEADLY_POISON); - DeadlyPoisonTimer = urand(15000, 45000); - }else DeadlyPoisonTimer -= diff; + m_uiDeadlyPoisonTimer = urand(15000, 45000); + } + else + m_uiDeadlyPoisonTimer -= uiDiff; - if (AppearEnvenomTimer < diff) // Cast Envenom. This is cast 4 seconds after Vanish is over + if (m_uiAppearEnvenomTimer < uiDiff) // Cast Envenom. This is cast 4 seconds after Vanish is over { DoCastSpellIfCan(m_creature->getVictim(), SPELL_ENVENOM); - AppearEnvenomTimer = 90000; - }else AppearEnvenomTimer -= diff; + m_uiAppearEnvenomTimer = 90000; + } + else + m_uiAppearEnvenomTimer -= uiDiff; - if (VanishTimer < diff) // Disappear and stop attacking, but follow a random unit + if (m_uiVanishTimer < uiDiff) // Disappear and stop attacking, but follow a random unit { - if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { - VanishTimer = 30000; - AppearEnvenomTimer= 28000; - HasVanished = true; + m_uiVanishTimer = 30000; + m_uiAppearEnvenomTimer= 28000; + m_bHasVanished = true; m_creature->SetVisibility(VISIBILITY_OFF); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoResetThreat(); // Chase a unit. Check before DoMeleeAttackIfReady prevents from attacking - m_creature->AddThreat(target, 500000.0f); - m_creature->GetMotionMaster()->MoveChase(target); + m_creature->AddThreat(pTarget, 500000.0f); + m_creature->GetMotionMaster()->MoveChase(pTarget); } - }else VanishTimer -= diff; + } + else + m_uiVanishTimer -= uiDiff; DoMeleeAttackIfReady(); } else { - if (VanishTimer < diff) // Become attackable and poison current target + if (m_uiVanishTimer < uiDiff) // Become attackable and poison current target { Unit* target = m_creature->getVictim(); DoCastSpellIfCan(target, SPELL_DEADLY_POISON); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoResetThreat(); - m_creature->AddThreat(target, 3000.0f); // Make Veras attack his target for a while, he will cast Envenom 4 seconds after. - DeadlyPoisonTimer += 6000; - VanishTimer = 90000; - AppearEnvenomTimer = 4000; - HasVanished = false; - }else VanishTimer -= diff; - - if (AppearEnvenomTimer < diff) // Appear 2 seconds before becoming attackable (Shifting out of vanish) + m_creature->AddThreat(target, 3000.0f); // Make Veras attack his pTarget for a while, he will cast Envenom 4 seconds after. + m_uiDeadlyPoisonTimer += 6000; + m_uiVanishTimer = 90000; + m_uiAppearEnvenomTimer = 4000; + m_bHasVanished = false; + } + else + m_uiVanishTimer -= uiDiff; + + if (m_uiAppearEnvenomTimer < uiDiff) // Appear 2 seconds before becoming attackable (Shifting out of vanish) { m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_creature->SetVisibility(VISIBILITY_ON); - AppearEnvenomTimer = 6000; - }else AppearEnvenomTimer -= diff; + m_uiAppearEnvenomTimer = 6000; + } + else + m_uiAppearEnvenomTimer -= uiDiff; } } }; @@ -831,35 +828,35 @@ CreatureAI* GetAI_boss_high_nethermancer_zerevor(Creature* pCreature) void AddSC_boss_illidari_council() { - Script *newscript; - - newscript = new Script; - newscript->Name = "mob_illidari_council"; - newscript->GetAI = &GetAI_mob_illidari_council; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_blood_elf_council_voice_trigger"; - newscript->GetAI = &GetAI_mob_blood_elf_council_voice_trigger; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "boss_gathios_the_shatterer"; - newscript->GetAI = &GetAI_boss_gathios_the_shatterer; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "boss_lady_malande"; - newscript->GetAI = &GetAI_boss_lady_malande; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "boss_veras_darkshadow"; - newscript->GetAI = &GetAI_boss_veras_darkshadow; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "boss_high_nethermancer_zerevor"; - newscript->GetAI = &GetAI_boss_high_nethermancer_zerevor; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "mob_illidari_council"; + pNewScript->GetAI = &GetAI_mob_illidari_council; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_blood_elf_council_voice_trigger"; + pNewScript->GetAI = &GetAI_mob_blood_elf_council_voice_trigger; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "boss_gathios_the_shatterer"; + pNewScript->GetAI = &GetAI_boss_gathios_the_shatterer; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "boss_lady_malande"; + pNewScript->GetAI = &GetAI_boss_lady_malande; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "boss_veras_darkshadow"; + pNewScript->GetAI = &GetAI_boss_veras_darkshadow; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "boss_high_nethermancer_zerevor"; + pNewScript->GetAI = &GetAI_boss_high_nethermancer_zerevor; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/black_temple/instance_black_temple.cpp b/scripts/outland/black_temple/instance_black_temple.cpp index 6f28dc9..d5fefc7 100644 --- a/scripts/outland/black_temple/instance_black_temple.cpp +++ b/scripts/outland/black_temple/instance_black_temple.cpp @@ -36,28 +36,7 @@ EndScriptData */ 8 - Illidan Stormrage Event */ -instance_black_temple::instance_black_temple(Map* pMap) : ScriptedInstance(pMap), - m_uiNajentusGUID(0), - m_uiAkamaGUID(0), - m_uiAkama_ShadeGUID(0), - m_uiShadeOfAkamaGUID(0), - m_uiSupremusGUID(0), - m_uiLadyMalandeGUID(0), - m_uiGathiosTheShattererGUID(0), - m_uiHighNethermancerZerevorGUID(0), - m_uiVerasDarkshadowGUID(0), - m_uiIllidariCouncilGUID(0), - m_uiBloodElfCouncilVoiceGUID(0), - m_uiIllidanStormrageGUID(0), - - m_uiNajentusGateGUID(0), - m_uiMainTempleDoorsGUID(0), - m_uiShadeAkamaDoorGUID(0), - m_uiIllidanGateGUID(0), - m_uiShahrazPreDoorGUID(0), - m_uiShahrazPostDoorGUID(0), - m_uiPreCouncilDoorGUID(0), - m_uiCouncilDoorGUID(0) +instance_black_temple::instance_black_temple(Map* pMap) : ScriptedInstance(pMap) { Initialize(); }; @@ -65,9 +44,6 @@ instance_black_temple::instance_black_temple(Map* pMap) : ScriptedInstance(pMap) void instance_black_temple::Initialize() { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiIllidanDoorGUID[0] = 0; - m_uiIllidanDoorGUID[1] = 0; } bool instance_black_temple::IsEncounterInProgress() const @@ -82,18 +58,20 @@ void instance_black_temple::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_WARLORD_NAJENTUS: m_uiNajentusGUID = pCreature->GetGUID(); break; - case NPC_AKAMA: m_uiAkamaGUID = pCreature->GetGUID(); break; - case NPC_AKAMA_SHADE: m_uiAkama_ShadeGUID = pCreature->GetGUID(); break; - case NPC_SHADE_OF_AKAMA: m_uiShadeOfAkamaGUID = pCreature->GetGUID(); break; - case NPC_SUPREMUS: m_uiSupremusGUID = pCreature->GetGUID(); break; - case NPC_ILLIDAN_STORMRAGE: m_uiIllidanStormrageGUID = pCreature->GetGUID(); break; - case NPC_GATHIOS: m_uiGathiosTheShattererGUID = pCreature->GetGUID(); break; - case NPC_ZEREVOR: m_uiHighNethermancerZerevorGUID = pCreature->GetGUID(); break; - case NPC_LADY_MALANDE: m_uiLadyMalandeGUID = pCreature->GetGUID(); break; - case NPC_VERAS: m_uiVerasDarkshadowGUID = pCreature->GetGUID(); break; - case NPC_ILLIDARI_COUNCIL: m_uiIllidariCouncilGUID = pCreature->GetGUID(); break; - case NPC_COUNCIL_VOICE: m_uiBloodElfCouncilVoiceGUID = pCreature->GetGUID(); break; + // SPECIAL - guid is directly used, keep open how to handle + case NPC_AKAMA: m_akamaGuid = pCreature->GetObjectGuid(); break; + case NPC_ILLIDAN_STORMRAGE: m_illidanStormrageGuid = pCreature->GetObjectGuid(); break; + + case NPC_AKAMA_SHADE: + case NPC_SHADE_OF_AKAMA: + case NPC_GATHIOS: + case NPC_ZEREVOR: + case NPC_LADY_MALANDE: + case NPC_VERAS: + case NPC_ILLIDARI_COUNCIL: + case NPC_COUNCIL_VOICE: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -102,45 +80,38 @@ void instance_black_temple::OnObjectCreate(GameObject* pGo) switch(pGo->GetEntry()) { case GO_NAJENTUS_GATE: // Gate past Naj'entus (at the entrance to Supermoose's courtyards) - m_uiNajentusGateGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_NAJENTUS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_SUPREMUS_DOORS: // Main Temple Doors - right past Supermoose (Supremus) - m_uiMainTempleDoorsGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_SUPREMUS] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_SHADE_OF_AKAMA: // Door close during encounter - m_uiShadeAkamaDoorGUID = pGo->GetGUID(); break; case GO_PRE_SHAHRAZ_DOOR: // Door leading to Mother Shahraz - m_uiShahrazPreDoorGUID = pGo->GetGUID(); if (CanPreMotherDoorOpen()) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_POST_SHAHRAZ_DOOR: // Door after shahraz - m_uiShahrazPostDoorGUID = pGo->GetGUID(); if (m_auiEncounter[6] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PRE_COUNCIL_DOOR: // Door leading to the Council (grand promenade) - m_uiPreCouncilDoorGUID = pGo->GetGUID(); break; case GO_COUNCIL_DOOR: // Door leading to the Council (inside) - m_uiCouncilDoorGUID = pGo->GetGUID(); break; case GO_ILLIDAN_GATE: // Gate leading to Temple Summit - m_uiIllidanGateGUID = pGo->GetGUID(); // TODO - dependend on council state break; case GO_ILLIDAN_DOOR_R: // Right door at Temple Summit - m_uiIllidanDoorGUID[0] = pGo->GetGUID(); - break; case GO_ILLIDAN_DOOR_L: // Left door at Temple Summit - m_uiIllidanDoorGUID[1] = pGo->GetGUID(); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } bool instance_black_temple::CanPreMotherDoorOpen() @@ -164,46 +135,34 @@ void instance_black_temple::SetData(uint32 uiType, uint32 uiData) case TYPE_NAJENTUS: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiNajentusGateGUID); + DoUseDoorOrButton(GO_NAJENTUS_GATE); break; case TYPE_SUPREMUS: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiMainTempleDoorsGUID); + DoUseDoorOrButton(GO_SUPREMUS_DOORS); break; case TYPE_SHADE: - m_auiEncounter[uiType] = uiData; - if (uiData == DONE && CanPreMotherDoorOpen()) - DoUseDoorOrButton(m_uiShahrazPreDoorGUID); - break; case TYPE_GOREFIEND: - m_auiEncounter[uiType] = uiData; - if (uiData == DONE && CanPreMotherDoorOpen()) - DoUseDoorOrButton(m_uiShahrazPreDoorGUID); - break; case TYPE_BLOODBOIL: - m_auiEncounter[uiType] = uiData; - if (uiData == DONE && CanPreMotherDoorOpen()) - DoUseDoorOrButton(m_uiShahrazPreDoorGUID); - break; case TYPE_RELIQUIARY: m_auiEncounter[uiType] = uiData; if (uiData == DONE && CanPreMotherDoorOpen()) - DoUseDoorOrButton(m_uiShahrazPreDoorGUID); + DoUseDoorOrButton(GO_PRE_SHAHRAZ_DOOR); break; case TYPE_SHAHRAZ: if (uiData == DONE) - DoUseDoorOrButton(m_uiShahrazPostDoorGUID); + DoUseDoorOrButton(GO_POST_SHAHRAZ_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_COUNCIL: - DoUseDoorOrButton(m_uiCouncilDoorGUID); + DoUseDoorOrButton(GO_COUNCIL_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_ILLIDAN: m_auiEncounter[uiType] = uiData; break; default: error_log("SD2: Instance Black Temple: ERROR SetData = %u for type %u does not exist/not implemented.", uiType, uiData); - break; + return; } if (uiData == DONE) @@ -224,47 +183,18 @@ void instance_black_temple::SetData(uint32 uiType, uint32 uiData) uint32 instance_black_temple::GetData(uint32 uiType) { - switch(uiType) - { - case TYPE_NAJENTUS: return m_auiEncounter[0]; - case TYPE_SUPREMUS: return m_auiEncounter[1]; - case TYPE_SHADE: return m_auiEncounter[2]; - case TYPE_GOREFIEND: return m_auiEncounter[3]; - case TYPE_BLOODBOIL: return m_auiEncounter[4]; - case TYPE_RELIQUIARY: return m_auiEncounter[5]; - case TYPE_SHAHRAZ: return m_auiEncounter[6]; - case TYPE_COUNCIL: return m_auiEncounter[7]; - case TYPE_ILLIDAN: return m_auiEncounter[8]; - default: - return 0; - } + if (uiType < MAX_ENCOUNTER) + return m_auiEncounter[uiType]; + + return 0; } uint64 instance_black_temple::GetData64(uint32 uiData) { switch(uiData) { - case NPC_WARLORD_NAJENTUS: return m_uiNajentusGUID; - case NPC_AKAMA: return m_uiAkamaGUID; - case NPC_AKAMA_SHADE: return m_uiAkama_ShadeGUID; - case NPC_SHADE_OF_AKAMA: return m_uiShadeOfAkamaGUID; - case NPC_SUPREMUS: return m_uiSupremusGUID; - case NPC_ILLIDAN_STORMRAGE: return m_uiIllidanStormrageGUID; - case NPC_GATHIOS: return m_uiGathiosTheShattererGUID; - case NPC_ZEREVOR: return m_uiHighNethermancerZerevorGUID; - case NPC_LADY_MALANDE: return m_uiLadyMalandeGUID; - case NPC_VERAS: return m_uiVerasDarkshadowGUID; - case NPC_ILLIDARI_COUNCIL: return m_uiIllidariCouncilGUID; - case GO_NAJENTUS_GATE: return m_uiNajentusGateGUID; - case GO_ILLIDAN_GATE: return m_uiIllidanGateGUID; - case GO_ILLIDAN_DOOR_R: return m_uiIllidanDoorGUID[0]; - case GO_ILLIDAN_DOOR_L: return m_uiIllidanDoorGUID[1]; - case GO_SUPREMUS_DOORS: return m_uiMainTempleDoorsGUID; - case NPC_COUNCIL_VOICE: return m_uiBloodElfCouncilVoiceGUID; - case GO_PRE_SHAHRAZ_DOOR: return m_uiShahrazPreDoorGUID; - case GO_POST_SHAHRAZ_DOOR: return m_uiShahrazPostDoorGUID; - case GO_PRE_COUNCIL_DOOR: return m_uiPreCouncilDoorGUID; - case GO_COUNCIL_DOOR: return m_uiCouncilDoorGUID; + case NPC_AKAMA: return m_akamaGuid.GetRawValue(); + case NPC_ILLIDAN_STORMRAGE: return m_illidanStormrageGuid.GetRawValue(); default: return 0; } diff --git a/scripts/outland/boss_doomwalker.cpp b/scripts/outland/boss_doomwalker.cpp index 7d1b779..aee9f0c 100644 --- a/scripts/outland/boss_doomwalker.cpp +++ b/scripts/outland/boss_doomwalker.cpp @@ -91,7 +91,6 @@ struct MANGOS_DLL_DECL boss_doomwalkerAI : public ScriptedAI DoScriptText(SAY_AGGRO, m_creature); } - void MoveInLineOfSight(Unit *who) { if (who && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsHostileTo(who)) diff --git a/scripts/outland/coilfang_reservoir/serpent_shrine/boss_fathomlord_karathress.cpp b/scripts/outland/coilfang_reservoir/serpent_shrine/boss_fathomlord_karathress.cpp index 38bd46f..40f8306 100644 --- a/scripts/outland/coilfang_reservoir/serpent_shrine/boss_fathomlord_karathress.cpp +++ b/scripts/outland/coilfang_reservoir/serpent_shrine/boss_fathomlord_karathress.cpp @@ -74,13 +74,14 @@ enum // position for Seer Olum const float afCoords_Olum[] = {446.78f, -542.76f, -7.54773f, 0.401581f}; +static const uint32 aAdvisors[] = {NPC_SHARKKIS, NPC_TIDALVESS, NPC_CARIBDIS}; + //Fathom-Lord Karathress AI struct MANGOS_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI { boss_fathomlord_karathressAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - memset(&m_auiAdvisorsGUID, 0, sizeof(m_auiAdvisorsGUID)); Reset(); } @@ -92,27 +93,11 @@ struct MANGOS_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI bool m_bBlessingOfTides_MobsChecked; - uint64 m_auiAdvisorsGUID[MAX_ADVISORS]; // the GUIDs from the advisors - void Reset() { m_uiCataclysmicBoltTimer = 10000; m_uiEnrageTimer = 600000; m_bBlessingOfTides_MobsChecked = false; - - for(uint8 i = 0; i < MAX_ADVISORS; ++i) - { - if (Creature* pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorsGUID[i])) - { - if (pAdvisor->getVictim()) - pAdvisor->AI()->EnterEvadeMode(); - else if (!pAdvisor->isAlive()) - pAdvisor->Respawn(); - } - } - - if (m_pInstance) - m_pInstance->SetData(TYPE_KARATHRESS_EVENT, NOT_STARTED); } // TODO - unneeded workaround - the spell should be cast by adviser onto karathress; text can also be handled in their AI @@ -148,28 +133,16 @@ struct MANGOS_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI DoCastSpellIfCan(m_creature, uiSpell); } - void GetAdvisors() - { - if (!m_pInstance) - return; - - m_auiAdvisorsGUID[0] = m_pInstance->GetData64(NPC_SHARKKIS); - m_auiAdvisorsGUID[1] = m_pInstance->GetData64(NPC_TIDALVESS); - m_auiAdvisorsGUID[2] = m_pInstance->GetData64(NPC_CARIBDIS); - } - void Aggro(Unit* pWho) { if (!m_pInstance) return; - GetAdvisors(); - DoScriptText(SAY_AGGRO, m_creature); if (Player* pPlayer = pWho->GetCharmerOrOwnerPlayerOrPlayerItself()) { - m_pInstance->SetData64(DATA_KARATHRESS_STARTER, pPlayer->GetGUID()); + m_pInstance->SetGuid(DATA_KARATHRESS_STARTER, pPlayer->GetObjectGuid()); m_pInstance->SetData(TYPE_KARATHRESS_EVENT, IN_PROGRESS); } } @@ -195,25 +168,45 @@ struct MANGOS_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI m_creature->SummonCreature(NPC_SEER_OLUM, afCoords_Olum[0], afCoords_Olum[1], afCoords_Olum[2], afCoords_Olum[3], TEMPSUMMON_TIMED_DESPAWN, 3600000); } + void JustReachedHome() + { + if (!m_pInstance) + return; + + for (uint8 i = 0; i < MAX_ADVISORS; ++i) + { + if (Creature* pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[i])) + { + if (pAdvisor->getVictim()) + pAdvisor->AI()->EnterEvadeMode(); + else if (!pAdvisor->isAlive()) + pAdvisor->Respawn(); + } + } + + if (m_pInstance) + m_pInstance->SetData(TYPE_KARATHRESS_EVENT, FAIL); + } + void UpdateAI(const uint32 uiDiff) { + if (!m_pInstance) + return; + //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { //check if the event is started - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) { - if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_KARATHRESS_STARTER))) - { + if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetGuid(DATA_KARATHRESS_STARTER))) AttackStart(pTarget); - GetAdvisors(); - } } return; } //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == FAIL) { EnterEvadeMode(); return; @@ -240,7 +233,7 @@ struct MANGOS_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI { for(uint8 i = 0; i < MAX_ADVISORS; ++i) { - if (Creature* pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorsGUID[i])) + if (Creature* pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[i])) { //stack max three times (one for each alive) if (pAdvisor->isAlive()) @@ -284,7 +277,7 @@ struct MANGOS_DLL_DECL Advisor_Base_AI : public ScriptedAI void JustReachedHome() { if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) - m_pInstance->SetData(TYPE_KARATHRESS_EVENT, NOT_STARTED); + m_pInstance->SetData(TYPE_KARATHRESS_EVENT, FAIL); } void Aggro(Unit *pWho) @@ -292,11 +285,11 @@ struct MANGOS_DLL_DECL Advisor_Base_AI : public ScriptedAI if (!m_pInstance) return; - if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED || m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == FAIL) m_pInstance->SetData(TYPE_KARATHRESS_EVENT, IN_PROGRESS); if (Player* pPlayer = pWho->GetCharmerOrOwnerPlayerOrPlayerItself()) - m_pInstance->SetData64(DATA_KARATHRESS_STARTER, pPlayer->GetGUID()); + m_pInstance->SetGuid(DATA_KARATHRESS_STARTER, pPlayer->GetObjectGuid()); } void JustDied(Unit* pVictim) @@ -304,7 +297,7 @@ struct MANGOS_DLL_DECL Advisor_Base_AI : public ScriptedAI if (!m_pInstance) return; - if (Creature* pKarathress = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KARATHRESS))) + if (Creature* pKarathress = m_pInstance->GetSingleCreatureFromStorage(NPC_KARATHRESS)) { if (boss_fathomlord_karathressAI* pKaraAI = dynamic_cast(pKarathress->AI())) pKaraAI->EventAdvisorDeath(m_creature->GetEntry()); @@ -368,20 +361,23 @@ struct MANGOS_DLL_DECL boss_fathomguard_sharkkisAI : public Advisor_Base_AI void UpdateAI(const uint32 uiDiff) { + if (!m_pInstance) + return; + //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { //check if the event is started - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) { - if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_KARATHRESS_STARTER))) + if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetGuid(DATA_KARATHRESS_STARTER))) AttackStart(pTarget); } return; } //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == FAIL) { EnterEvadeMode(); return; @@ -450,20 +446,23 @@ struct MANGOS_DLL_DECL boss_fathomguard_tidalvessAI : public Advisor_Base_AI void UpdateAI(const uint32 uiDiff) { + if (!m_pInstance) + return; + //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { //check if the event is started - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) { - if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_KARATHRESS_STARTER))) + if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetGuid(DATA_KARATHRESS_STARTER))) AttackStart(pTarget); } return; } //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == FAIL) { EnterEvadeMode(); return; @@ -501,20 +500,23 @@ struct MANGOS_DLL_DECL boss_fathomguard_caribdisAI : public Advisor_Base_AI void UpdateAI(const uint32 uiDiff) { + if (!m_pInstance) + return; + //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { //check if the event is started - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS) { - if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_KARATHRESS_STARTER))) + if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetGuid(DATA_KARATHRESS_STARTER))) AttackStart(pTarget); } return; } //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED) + if (m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == FAIL) { EnterEvadeMode(); return; @@ -544,15 +546,12 @@ struct MANGOS_DLL_DECL boss_fathomguard_caribdisAI : public Advisor_Base_AI // It can be cast on any of the mobs Unit* pUnit = NULL; - if (m_pInstance) + switch (urand(0, 3)) { - switch(urand(0, 3)) - { - case 0: pUnit = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_KARATHRESS)); break; - case 1: pUnit = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_SHARKKIS)); break; - case 2: pUnit = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_TIDALVESS)); break; - case 3: pUnit = m_creature; break; - } + case 0: pUnit = m_pInstance->GetSingleCreatureFromStorage(NPC_KARATHRESS); break; + case 1: pUnit = m_pInstance->GetSingleCreatureFromStorage(NPC_SHARKKIS); break; + case 2: pUnit = m_pInstance->GetSingleCreatureFromStorage(NPC_TIDALVESS); break; + case 3: pUnit = m_creature; break; } if (!pUnit) diff --git a/scripts/outland/coilfang_reservoir/serpent_shrine/boss_lady_vashj.cpp b/scripts/outland/coilfang_reservoir/serpent_shrine/boss_lady_vashj.cpp index d1dcf94..623ff01 100644 --- a/scripts/outland/coilfang_reservoir/serpent_shrine/boss_lady_vashj.cpp +++ b/scripts/outland/coilfang_reservoir/serpent_shrine/boss_lady_vashj.cpp @@ -119,13 +119,12 @@ struct MANGOS_DLL_DECL boss_lady_vashjAI : public ScriptedAI boss_lady_vashjAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - memset(&m_auiShieldGeneratorChannel, 0, sizeof(m_auiShieldGeneratorChannel)); Reset(); } ScriptedInstance *m_pInstance; // the instance - uint64 m_auiShieldGeneratorChannel[MAX_SHIELD_GEN]; + ObjectGuid m_auiShieldGeneratorChannel[MAX_SHIELD_GEN]; // timers uint32 m_uiShockBlast_Timer; @@ -181,7 +180,7 @@ struct MANGOS_DLL_DECL boss_lady_vashjAI : public ScriptedAI if (pTemp->isAlive()) pTemp->SetDeathState(JUST_DIED); - m_auiShieldGeneratorChannel[i] = 0; + m_auiShieldGeneratorChannel[i].Clear(); } } } @@ -212,7 +211,7 @@ struct MANGOS_DLL_DECL boss_lady_vashjAI : public ScriptedAI for(uint8 i = 0; i < MAX_SHIELD_GEN; ++i) { if (Creature* pCreature = m_creature->SummonCreature(NPC_SHIELD_GENERATOR, afShieldGeneratorChannelPos[i][0], afShieldGeneratorChannelPos[i][1], afShieldGeneratorChannelPos[i][2], afShieldGeneratorChannelPos[i][3], TEMPSUMMON_CORPSE_DESPAWN, 0)) - m_auiShieldGeneratorChannel[i] = pCreature->GetGUID(); + m_auiShieldGeneratorChannel[i] = pCreature->GetObjectGuid(); } } } @@ -507,7 +506,7 @@ struct MANGOS_DLL_DECL mob_enchanted_elementalAI : public ScriptedAI { if (m_pInstance) { - if (Creature* pVashj = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LADYVASHJ))) + if (Creature* pVashj = m_pInstance->GetSingleCreatureFromStorage(NPC_LADYVASHJ)) { if (pVashj->IsWithinDistInMap(m_creature, INTERACTION_DISTANCE)) { @@ -607,7 +606,7 @@ struct MANGOS_DLL_DECL mob_toxic_sporebatAI : public ScriptedAI if (m_pInstance) { //check if vashj is death - Creature* pVashj = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_LADYVASHJ)); + Creature* pVashj = m_pInstance->GetSingleCreatureFromStorage(NPC_LADYVASHJ); if (!pVashj || !pVashj->isAlive()) { //remove @@ -657,7 +656,7 @@ bool ItemUse_item_tainted_core(Player* pPlayer, Item* pItem, SpellCastTargets co return true; } - Creature* pVashj = pPlayer->GetMap()->GetCreature(pInstance->GetData64(NPC_LADYVASHJ)); + Creature* pVashj = pInstance->GetSingleCreatureFromStorage(NPC_LADYVASHJ); if (!pVashj) return true; diff --git a/scripts/outland/coilfang_reservoir/serpent_shrine/boss_leotheras_the_blind.cpp b/scripts/outland/coilfang_reservoir/serpent_shrine/boss_leotheras_the_blind.cpp index 9906985..1916d77 100644 --- a/scripts/outland/coilfang_reservoir/serpent_shrine/boss_leotheras_the_blind.cpp +++ b/scripts/outland/coilfang_reservoir/serpent_shrine/boss_leotheras_the_blind.cpp @@ -68,7 +68,6 @@ struct MANGOS_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI boss_leotheras_the_blindAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - m_uiShadowLeo = 0; Reset(); } @@ -83,7 +82,7 @@ struct MANGOS_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI bool m_bDemonForm; bool m_bIsFinalForm; - uint64 m_uiShadowLeo; + ObjectGuid m_shadowLeoGuid; void Reset() { @@ -127,7 +126,7 @@ struct MANGOS_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI { if (m_creature->getVictim() && pSummoned->GetEntry() == NPC_SHADOW_LEO) { - m_uiShadowLeo = pSummoned->GetGUID(); + m_shadowLeoGuid = pSummoned->GetObjectGuid(); pSummoned->AI()->AttackStart(m_creature->getVictim()); } } @@ -137,9 +136,9 @@ struct MANGOS_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); //despawn copy - if (m_uiShadowLeo) + if (m_shadowLeoGuid) { - if (Creature* pShadowLeo = m_creature->GetMap()->GetCreature(m_uiShadowLeo)) + if (Creature* pShadowLeo = m_creature->GetMap()->GetCreature(m_shadowLeoGuid)) pShadowLeo->ForcedDespawn(); } diff --git a/scripts/outland/coilfang_reservoir/serpent_shrine/instance_serpent_shrine.cpp b/scripts/outland/coilfang_reservoir/serpent_shrine/instance_serpent_shrine.cpp index 83db493..127a35c 100644 --- a/scripts/outland/coilfang_reservoir/serpent_shrine/instance_serpent_shrine.cpp +++ b/scripts/outland/coilfang_reservoir/serpent_shrine/instance_serpent_shrine.cpp @@ -33,13 +33,7 @@ EndScriptData */ 5 - Lady Vashj Event */ -instance_serpentshrine_cavern::instance_serpentshrine_cavern(Map* pMap) : ScriptedInstance(pMap), - m_uiSharkkis(0), - m_uiTidalvess(0), - m_uiCaribdis(0), - m_uiLadyVashj(0), - m_uiKarathress(0), - m_uiKarathressEvent_Starter(0) +instance_serpentshrine_cavern::instance_serpentshrine_cavern(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -65,34 +59,28 @@ void instance_serpentshrine_cavern::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_LADYVASHJ: m_uiLadyVashj = pCreature->GetGUID(); break; - case NPC_KARATHRESS: m_uiKarathress = pCreature->GetGUID(); break; - case NPC_SHARKKIS: m_uiSharkkis = pCreature->GetGUID(); break; - case NPC_TIDALVESS: m_uiTidalvess = pCreature->GetGUID(); break; - case NPC_CARIBDIS: m_uiCaribdis = pCreature->GetGUID(); break; + case NPC_LADYVASHJ: + case NPC_KARATHRESS: + case NPC_SHARKKIS: + case NPC_TIDALVESS: + case NPC_CARIBDIS: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } void instance_serpentshrine_cavern::SetData64(uint32 uiType, uint64 uiData) { if (uiType == DATA_KARATHRESS_STARTER) - m_uiKarathressEvent_Starter = uiData; + m_karathressEventStarterGuid = ObjectGuid(uiData); } uint64 instance_serpentshrine_cavern::GetData64(uint32 uiData) { - switch (uiData) - { - case NPC_SHARKKIS: return m_uiSharkkis; - case NPC_TIDALVESS: return m_uiTidalvess; - case NPC_CARIBDIS: return m_uiCaribdis; - case NPC_LADYVASHJ: return m_uiLadyVashj; - case NPC_KARATHRESS: return m_uiKarathress; - case DATA_KARATHRESS_STARTER: return m_uiKarathressEvent_Starter; + if (uiData == DATA_KARATHRESS_STARTER) + return m_karathressEventStarterGuid.GetRawValue(); - default: - return 0; - } + return 0; } void instance_serpentshrine_cavern::SetData(uint32 uiType, uint32 uiData) diff --git a/scripts/outland/coilfang_reservoir/serpent_shrine/serpent_shrine.h b/scripts/outland/coilfang_reservoir/serpent_shrine/serpent_shrine.h index f15da1d..80bcbc7 100644 --- a/scripts/outland/coilfang_reservoir/serpent_shrine/serpent_shrine.h +++ b/scripts/outland/coilfang_reservoir/serpent_shrine/serpent_shrine.h @@ -55,12 +55,7 @@ class MANGOS_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance uint32 m_auiShieldGenerator[MAX_GENERATOR]; std::string m_strInstData; - uint64 m_uiSharkkis; - uint64 m_uiTidalvess; - uint64 m_uiCaribdis; - uint64 m_uiLadyVashj; - uint64 m_uiKarathress; - uint64 m_uiKarathressEvent_Starter; + ObjectGuid m_karathressEventStarterGuid; }; #endif diff --git a/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp b/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp index 402772b..c00f240 100644 --- a/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp +++ b/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp @@ -226,9 +226,9 @@ struct MANGOS_DLL_DECL mob_steamrigger_mechanicAI : public ScriptedAI { if (Repair_Timer < diff) { - if (m_pInstance && m_pInstance->GetData64(NPC_STEAMRIGGER) && m_pInstance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) + if (m_pInstance && m_pInstance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) { - if (Creature* pMekgineer = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_STEAMRIGGER))) + if (Creature* pMekgineer = m_pInstance->GetSingleCreatureFromStorage(NPC_STEAMRIGGER)) { if (m_creature->IsWithinDistInMap(pMekgineer, MAX_REPAIR_RANGE)) { diff --git a/scripts/outland/coilfang_reservoir/steam_vault/instance_steam_vault.cpp b/scripts/outland/coilfang_reservoir/steam_vault/instance_steam_vault.cpp index 26b9b8d..e7be549 100644 --- a/scripts/outland/coilfang_reservoir/steam_vault/instance_steam_vault.cpp +++ b/scripts/outland/coilfang_reservoir/steam_vault/instance_steam_vault.cpp @@ -24,7 +24,6 @@ EndScriptData */ #include "precompiled.h" #include "steam_vault.h" - /* Steam Vaults encounters: 1 - Hydromancer Thespia Event 2 - Mekgineer Steamrigger Event @@ -47,13 +46,7 @@ bool GOUse_go_main_chambers_access_panel(Player* pPlayer, GameObject* pGo) return true; } -instance_steam_vault::instance_steam_vault(Map* pMap) : ScriptedInstance(pMap), - m_uiThespiaGUID(0), - m_uiMekgineerGUID(0), - m_uiKalithreshGUID(0), - m_uiMainChambersDoor(0), - m_uiAccessPanelHydro(0), - m_uiAccessPanelMek(0) +instance_steam_vault::instance_steam_vault(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -67,9 +60,9 @@ void instance_steam_vault::OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { - case NPC_THESPIA: m_uiThespiaGUID = pCreature->GetGUID(); break; - case NPC_STEAMRIGGER: m_uiMekgineerGUID = pCreature->GetGUID(); break; - case NPC_KALITRESH: m_uiKalithreshGUID = pCreature->GetGUID(); break; + case NPC_STEAMRIGGER: + m_mNpcEntryGuidStore[NPC_STEAMRIGGER] = pCreature->GetObjectGuid(); + break; } } @@ -77,9 +70,11 @@ void instance_steam_vault::OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { - case GO_MAIN_CHAMBERS_DOOR: m_uiMainChambersDoor = pGo->GetGUID(); break; - case GO_ACCESS_PANEL_HYDRO: m_uiAccessPanelHydro = pGo->GetGUID(); break; - case GO_ACCESS_PANEL_MEK: m_uiAccessPanelMek = pGo->GetGUID(); break; + case GO_MAIN_CHAMBERS_DOOR: + case GO_ACCESS_PANEL_HYDRO: + case GO_ACCESS_PANEL_MEK: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; } } @@ -90,10 +85,10 @@ void instance_steam_vault::SetData(uint32 uiType, uint32 uiData) case TYPE_HYDROMANCER_THESPIA: if (uiData == SPECIAL) { - DoUseDoorOrButton(m_uiAccessPanelHydro); + DoUseDoorOrButton(GO_ACCESS_PANEL_HYDRO); if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) - DoUseDoorOrButton(m_uiMainChambersDoor); + DoUseDoorOrButton(GO_MAIN_CHAMBERS_DOOR); debug_log("SD2: Instance Steamvault: Access panel used."); } @@ -102,10 +97,10 @@ void instance_steam_vault::SetData(uint32 uiType, uint32 uiData) case TYPE_MEKGINEER_STEAMRIGGER: if (uiData == SPECIAL) { - DoUseDoorOrButton(m_uiAccessPanelMek); + DoUseDoorOrButton(GO_ACCESS_PANEL_MEK); if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL) - DoUseDoorOrButton(m_uiMainChambersDoor); + DoUseDoorOrButton(GO_MAIN_CHAMBERS_DOOR); debug_log("SD2: Instance Steamvault: Access panel used."); } @@ -134,19 +129,6 @@ uint32 instance_steam_vault::GetData(uint32 uiType) } } -uint64 instance_steam_vault::GetData64(uint32 uiType) -{ - switch (uiType) - { - case NPC_THESPIA: return m_uiThespiaGUID; - case NPC_STEAMRIGGER: return m_uiMekgineerGUID; - case NPC_KALITRESH: return m_uiKalithreshGUID; - - default: - return 0; - } -} - InstanceData* GetInstanceData_instance_steam_vault(Map* pMap) { return new instance_steam_vault(pMap); diff --git a/scripts/outland/coilfang_reservoir/steam_vault/steam_vault.h b/scripts/outland/coilfang_reservoir/steam_vault/steam_vault.h index 1fc33e6..da17c0a 100644 --- a/scripts/outland/coilfang_reservoir/steam_vault/steam_vault.h +++ b/scripts/outland/coilfang_reservoir/steam_vault/steam_vault.h @@ -15,8 +15,8 @@ enum TYPE_DISTILLER = 4, NPC_STEAMRIGGER = 17796, - NPC_KALITRESH = 17798, - NPC_THESPIA = 17797, + //NPC_KALITRESH = 17798, + //NPC_THESPIA = 17797, GO_MAIN_CHAMBERS_DOOR = 183049, GO_ACCESS_PANEL_HYDRO = 184125, @@ -35,18 +35,9 @@ class MANGOS_DLL_DECL instance_steam_vault : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiType); private: uint32 m_auiEncounter[MAX_ENCOUNTER]; - - uint64 m_uiThespiaGUID; - uint64 m_uiMekgineerGUID; - uint64 m_uiKalithreshGUID; - - uint64 m_uiMainChambersDoor; - uint64 m_uiAccessPanelHydro; - uint64 m_uiAccessPanelMek; }; #endif diff --git a/scripts/outland/gruuls_lair/boss_high_king_maulgar.cpp b/scripts/outland/gruuls_lair/boss_high_king_maulgar.cpp index adedc27..eaa39b0 100644 --- a/scripts/outland/gruuls_lair/boss_high_king_maulgar.cpp +++ b/scripts/outland/gruuls_lair/boss_high_king_maulgar.cpp @@ -72,13 +72,14 @@ enum const float DISTANCE_KIGGLER = 20.0f; const float DISTANCE_KROSH = 30.0f; +static const uint32 aCouncilMember[] = {NPC_BLINDEYE, NPC_KIGGLER, NPC_KROSH, NPC_OLM}; + //High King Maulgar AI struct MANGOS_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI { boss_high_king_maulgarAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - memset(&m_auiCouncil, 0, sizeof(m_auiCouncil)); Reset(); } @@ -93,8 +94,6 @@ struct MANGOS_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI bool m_bPhase2; - uint64 m_auiCouncil[MAX_COUNCIL]; // Council GUIDs - void Reset() { m_uiArcingSmash_Timer = urand(8000, 14000); @@ -108,9 +107,12 @@ struct MANGOS_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI void JustReachedHome() { + if (!m_pInstance) + return; + for (uint8 i = 0; i < MAX_COUNCIL; ++i) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_auiCouncil[i])) + if (Creature* pCreature = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i])) { if (!pCreature->isAlive()) pCreature->Respawn(); @@ -119,8 +121,7 @@ struct MANGOS_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI } } - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == IN_PROGRESS) - m_pInstance->SetData(TYPE_MAULGAR_EVENT, NOT_STARTED); + m_pInstance->SetData(TYPE_MAULGAR_EVENT, FAIL); } void KilledUnit() @@ -149,26 +150,20 @@ struct MANGOS_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI if (!m_pInstance) return; - GetCouncil(); - DoScriptText(SAY_AGGRO, m_creature); - m_creature->CallForHelp(50.0f); - - if (m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - m_pInstance->SetData(TYPE_MAULGAR_EVENT, IN_PROGRESS); - } - - void GetCouncil() - { - if (!m_pInstance) - return; + m_pInstance->SetData(TYPE_MAULGAR_EVENT, IN_PROGRESS); - //get council member's guid to respawn them if needed - m_auiCouncil[0] = m_pInstance->GetData64(NPC_KIGGLER); - m_auiCouncil[1] = m_pInstance->GetData64(NPC_BLINDEYE); - m_auiCouncil[2] = m_pInstance->GetData64(NPC_OLM); - m_auiCouncil[3] = m_pInstance->GetData64(NPC_KROSH); + for (uint8 i = 0; i < MAX_COUNCIL; ++i) + { + if (Creature* pCreature = m_pInstance->GetSingleCreatureFromStorage(aCouncilMember[i])) + { + if (!pCreature->isAlive()) + pCreature->Respawn(); + if (!pCreature->getVictim()) + pCreature->AI()->AttackStart(pWho); + } + } } void EventCouncilDeath() @@ -188,13 +183,6 @@ struct MANGOS_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - { - EnterEvadeMode(); - return; - } - //m_uiArcingSmash_Timer if (m_uiArcingSmash_Timer < uiDiff) { @@ -269,16 +257,22 @@ struct MANGOS_DLL_DECL Council_Base_AI : public ScriptedAI void JustReachedHome() { - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == IN_PROGRESS) - m_pInstance->SetData(TYPE_MAULGAR_EVENT, NOT_STARTED); + if (!m_pInstance) + return; + + Creature* pMaulgar = m_pInstance->GetSingleCreatureFromStorage(NPC_MAULGAR); + if (pMaulgar && pMaulgar->isAlive() && pMaulgar->getVictim()) + pMaulgar->AI()->EnterEvadeMode(); } void Aggro(Unit *pWho) { - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - m_pInstance->SetData(TYPE_MAULGAR_EVENT, IN_PROGRESS); + if (!m_pInstance) + return; - m_creature->CallForHelp(50.0f); + Creature* pMaulgar = m_pInstance->GetSingleCreatureFromStorage(NPC_MAULGAR); + if (pMaulgar && pMaulgar->isAlive() && !pMaulgar->getVictim()) + pMaulgar->AI()->AttackStart((pWho)); } void JustDied(Unit* pVictim) @@ -286,9 +280,8 @@ struct MANGOS_DLL_DECL Council_Base_AI : public ScriptedAI if (!m_pInstance) return; - Creature* pMaulgar = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MAULGAR)); - - if (pMaulgar->isAlive()) + Creature* pMaulgar = m_pInstance->GetSingleCreatureFromStorage(NPC_MAULGAR); + if (pMaulgar && pMaulgar->isAlive()) { if (boss_high_king_maulgarAI* pMaulgarAI = dynamic_cast(pMaulgar->AI())) pMaulgarAI->EventCouncilDeath(); @@ -318,13 +311,6 @@ struct MANGOS_DLL_DECL boss_olm_the_summonerAI : public Council_Base_AI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - { - EnterEvadeMode(); - return; - } - //m_uiDarkDecay_Timer if (m_uiDarkDecay_Timer < uiDiff) { @@ -408,13 +394,6 @@ struct MANGOS_DLL_DECL boss_kiggler_the_crazedAI : public Council_Base_AI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - { - EnterEvadeMode(); - return; - } - if (m_uiGreatherPolymorph_Timer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) @@ -477,13 +456,6 @@ struct MANGOS_DLL_DECL boss_blindeye_the_seerAI : public Council_Base_AI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - { - EnterEvadeMode(); - return; - } - //m_uiGreaterPowerWordShield_Timer if (m_uiGreaterPowerWordShield_Timer < uiDiff) { @@ -552,13 +524,6 @@ struct MANGOS_DLL_DECL boss_krosh_firehandAI : public Council_Base_AI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - //someone evaded! - if (m_pInstance && m_pInstance->GetData(TYPE_MAULGAR_EVENT) == NOT_STARTED) - { - EnterEvadeMode(); - return; - } - //m_uiGreaterFireball_Timer if (m_uiGreaterFireball_Timer < uiDiff) { diff --git a/scripts/outland/gruuls_lair/gruuls_lair.h b/scripts/outland/gruuls_lair/gruuls_lair.h index 1d71c12..d2e5a3a 100644 --- a/scripts/outland/gruuls_lair/gruuls_lair.h +++ b/scripts/outland/gruuls_lair/gruuls_lair.h @@ -24,7 +24,7 @@ enum NPC_OLM = 18834, }; -struct MANGOS_DLL_DECL instance_gruuls_lair : public ScriptedInstance +class MANGOS_DLL_DECL instance_gruuls_lair : public ScriptedInstance { public: instance_gruuls_lair(Map *pMap); @@ -37,7 +37,6 @@ struct MANGOS_DLL_DECL instance_gruuls_lair : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strSaveData.c_str(); } void Load(const char* chrIn); @@ -45,14 +44,6 @@ struct MANGOS_DLL_DECL instance_gruuls_lair : public ScriptedInstance private: uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strSaveData; - - uint64 m_uiMaulgarGUID; - uint64 m_uiKigglerGUID; - uint64 m_uiBlindeyeGUID; - uint64 m_uiOlmGUID; - uint64 m_uiKroshGUID; - uint64 m_uiMaulgarDoorGUID; - uint64 m_uiGruulEncounterDoorGUID; }; #endif diff --git a/scripts/outland/gruuls_lair/instance_gruuls_lair.cpp b/scripts/outland/gruuls_lair/instance_gruuls_lair.cpp index 7c818dd..0a729cb 100644 --- a/scripts/outland/gruuls_lair/instance_gruuls_lair.cpp +++ b/scripts/outland/gruuls_lair/instance_gruuls_lair.cpp @@ -29,15 +29,7 @@ EndScriptData */ 2 - Gruul event */ -instance_gruuls_lair::instance_gruuls_lair(Map *pMap) : ScriptedInstance(pMap), - m_uiMaulgarGUID(0), - m_uiKigglerGUID(0), - m_uiBlindeyeGUID(0), - m_uiOlmGUID(0), - m_uiKroshGUID(0), - - m_uiMaulgarDoorGUID(0), - m_uiGruulEncounterDoorGUID(0) +instance_gruuls_lair::instance_gruuls_lair(Map *pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -60,11 +52,13 @@ void instance_gruuls_lair::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_MAULGAR: m_uiMaulgarGUID = pCreature->GetGUID(); break; - case NPC_KROSH: m_uiKroshGUID = pCreature->GetGUID(); break; - case NPC_OLM: m_uiOlmGUID = pCreature->GetGUID(); break; - case NPC_KIGGLER: m_uiKigglerGUID = pCreature->GetGUID(); break; - case NPC_BLINDEYE: m_uiBlindeyeGUID = pCreature->GetGUID(); break; + case NPC_MAULGAR: + case NPC_KROSH: + case NPC_OLM: + case NPC_KIGGLER: + case NPC_BLINDEYE: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -73,14 +67,16 @@ void instance_gruuls_lair::OnObjectCreate(GameObject* pGo) switch (pGo->GetEntry()) { case GO_PORT_GRONN_1: - m_uiMaulgarDoorGUID = pGo->GetGUID(); if (m_auiEncounter[0] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_PORT_GRONN_2: - m_uiGruulEncounterDoorGUID = pGo->GetGUID(); break; + + default: + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_gruuls_lair::SetData(uint32 uiType, uint32 uiData) @@ -89,11 +85,11 @@ void instance_gruuls_lair::SetData(uint32 uiType, uint32 uiData) { case TYPE_MAULGAR_EVENT: if (uiData == DONE) - DoUseDoorOrButton(m_uiMaulgarDoorGUID); + DoUseDoorOrButton(GO_PORT_GRONN_1); m_auiEncounter[0] = uiData; break; case TYPE_GRUUL_EVENT: - DoUseDoorOrButton(m_uiGruulEncounterDoorGUID); + DoUseDoorOrButton(GO_PORT_GRONN_2); m_auiEncounter[1] = uiData; break; } @@ -124,21 +120,6 @@ uint32 instance_gruuls_lair::GetData(uint32 uiType) } } -uint64 instance_gruuls_lair::GetData64(uint32 uiData) -{ - switch (uiData) - { - case NPC_MAULGAR: return m_uiMaulgarGUID; - case NPC_BLINDEYE: return m_uiBlindeyeGUID; - case NPC_KIGGLER: return m_uiKigglerGUID; - case NPC_KROSH: return m_uiKroshGUID; - case NPC_OLM: return m_uiOlmGUID; - - default: - return 0; - } -} - void instance_gruuls_lair::Load(const char* chrIn) { if (!chrIn) diff --git a/scripts/outland/hellfire_citadel/blood_furnace/blood_furnace.h b/scripts/outland/hellfire_citadel/blood_furnace/blood_furnace.h index 458e376..8ad92bb 100644 --- a/scripts/outland/hellfire_citadel/blood_furnace/blood_furnace.h +++ b/scripts/outland/hellfire_citadel/blood_furnace/blood_furnace.h @@ -8,14 +8,16 @@ enum { MAX_ENCOUNTER = 3, + MAX_ORC_WAVES = 4, TYPE_THE_MAKER_EVENT = 0, TYPE_BROGGOK_EVENT = 1, TYPE_KELIDAN_EVENT = 2, - NPC_THE_MAKER = 17381, + // NPC_THE_MAKER = 17381, NPC_BROGGOK = 17380, - NPC_KELIDAN_THE_MAKER = 17377, + // NPC_KELIDAN_THE_BREAKER = 17377, + NPC_NASCENT_FEL_ORC = 17398, // Used in the Broggok event GO_DOOR_FINAL_EXIT = 181766, GO_DOOR_MAKER_FRONT = 181811, @@ -24,14 +26,27 @@ enum GO_DOOR_BROGGOK_REAR = 181819, GO_DOOR_KELIDAN_EXIT = 181823, - GO_PRISON_CELL_MAKER1 = 181813, // The maker cell front right - GO_PRISON_CELL_MAKER2 = 181814, // The maker cell back right - GO_PRISON_CELL_MAKER3 = 181816, // The maker cell front left - GO_PRISON_CELL_MAKER4 = 181815, // The maker cell back left - GO_PRISON_CELL_BROGGOK1 = 181821, // Broggok cell front right - GO_PRISON_CELL_BROGGOK2 = 181818, // Broggok cell back right - GO_PRISON_CELL_BROGGOK3 = 181820, // Broggok cell front left - GO_PRISON_CELL_BROGGOK4 = 181817, // Broggok cell back left + // GO_PRISON_CELL_MAKER1 = 181813, // The maker cell front right + // GO_PRISON_CELL_MAKER2 = 181814, // The maker cell back right + // GO_PRISON_CELL_MAKER3 = 181816, // The maker cell front left + // GO_PRISON_CELL_MAKER4 = 181815, // The maker cell back left + + GO_PRISON_CELL_BROGGOK_1 = 181817, // Broggok cell back left (NE) + GO_PRISON_CELL_BROGGOK_2 = 181818, // Broggok cell back right (SE) + GO_PRISON_CELL_BROGGOK_3 = 181820, // Broggok cell front left (NW) + GO_PRISON_CELL_BROGGOK_4 = 181821, // Broggok cell front right (SW) + + SAY_BROGGOK_INTRO = -1542015, +}; + +struct BroggokEventInfo +{ + BroggokEventInfo() : m_bIsCellOpened(false), m_uiKilledOrcCount(0) {} + + ObjectGuid m_cellGuid; + bool m_bIsCellOpened; + uint8 m_uiKilledOrcCount; + GUIDSet m_sSortedOrcGuids; }; class MANGOS_DLL_DECL instance_blood_furnace : public ScriptedInstance @@ -44,36 +59,32 @@ class MANGOS_DLL_DECL instance_blood_furnace : public ScriptedInstance void OnCreatureCreate(Creature* pCreature); void OnObjectCreate(GameObject* pGo); - uint64 GetData64(uint32 uiData); + void OnCreatureDeath(Creature* pCreature); + void OnCreatureEvade(Creature* pCreature); + void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); + void Update(uint32 uiDiff); + void Load(const char* chrIn); const char* Save() { return m_strInstData.c_str(); } + void GetMovementDistanceForIndex(uint32 uiIndex, float& dx, float& dy); + private: + void DoSortBroggokOrcs(); + void DoNextBroggokEventPhase(); + uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - uint64 m_uiMakerGUID; - uint64 m_uiBroggokGUID; - uint64 m_uiKelidanGUID; - - uint64 m_uiDoorFinalExitGUID; - uint64 m_uiDoorMakerFrontGUID; - uint64 m_uiDoorMakerRearGUID; - uint64 m_uiDoorBroggokFrontGUID; - uint64 m_uiDoorBrokkokRearGUID; - uint64 m_uiDoorKelidanExitGUID; - - uint64 m_uiPrisonCell1GUID; - uint64 m_uiPrisonCell2GUID; - uint64 m_uiPrisonCell3GUID; - uint64 m_uiPrisonCell4GUID; - uint64 m_uiPrisonCell5GUID; - uint64 m_uiPrisonCell6GUID; - uint64 m_uiPrisonCell7GUID; - uint64 m_uiPrisonCell8GUID; + BroggokEventInfo m_aBroggokEvent[MAX_ORC_WAVES]; + + uint32 m_uiBroggokEventTimer; // Timer for opening the event cages; only on heroic mode = 30 secs + uint32 m_uiBroggokEventPhase; + + GUIDList m_luiNascentOrcGUIDs; }; #endif diff --git a/scripts/outland/hellfire_citadel/blood_furnace/boss_broggok.cpp b/scripts/outland/hellfire_citadel/blood_furnace/boss_broggok.cpp index 52c4810..0b37564 100644 --- a/scripts/outland/hellfire_citadel/blood_furnace/boss_broggok.cpp +++ b/scripts/outland/hellfire_citadel/blood_furnace/boss_broggok.cpp @@ -29,87 +29,126 @@ enum SAY_AGGRO = -1542008, SPELL_SLIME_SPRAY = 30913, - H_SPELL_SLIME_SPRAY = 38458, + SPELL_SLIME_SPRAY_H = 38458, SPELL_POISON_CLOUD = 30916, SPELL_POISON_BOLT = 30917, - H_SPELL_POISON_BOLT = 38459, + SPELL_POISON_BOLT_H = 38459, - SPELL_POISON = 30914 + SPELL_POISON = 30914, + + POINT_EVENT_COMBAT = 1, }; struct MANGOS_DLL_DECL boss_broggokAI : public ScriptedAI { boss_broggokAI(Creature* pCreature) : ScriptedAI(pCreature) { - m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + m_pInstance = (instance_blood_furnace*)pCreature->GetInstanceData(); m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); Reset(); } - ScriptedInstance* m_pInstance; + instance_blood_furnace* m_pInstance; bool m_bIsRegularMode; - uint32 AcidSpray_Timer; - uint32 PoisonSpawn_Timer; - uint32 PoisonBolt_Timer; + uint32 m_uiAcidSprayTimer; + uint32 m_uiPoisonSpawnTimer; + uint32 m_uiPoisonBoltTimer; void Reset() { - AcidSpray_Timer = 10000; - PoisonSpawn_Timer = 5000; - PoisonBolt_Timer = 7000; + m_uiAcidSprayTimer = 10000; + m_uiPoisonSpawnTimer = 5000; + m_uiPoisonBoltTimer = 7000; } - void Aggro(Unit *who) + void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); if (m_pInstance) - m_pInstance->SetData(TYPE_BROGGOK_EVENT,IN_PROGRESS); + m_pInstance->SetData(TYPE_BROGGOK_EVENT, IN_PROGRESS); } - void JustReachedHome() + void JustSummoned(Creature* pSummoned) { - if (m_pInstance) - m_pInstance->SetData(TYPE_BROGGOK_EVENT,FAIL); + // ToDo: set correct flags and data in DB!!! + pSummoned->setFaction(16); + pSummoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pSummoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pSummoned->CastSpell(pSummoned, SPELL_POISON, false, NULL, NULL, m_creature->GetObjectGuid()); } - void JustSummoned(Creature *summoned) + void JustDied(Unit* pWho) { - summoned->setFaction(16); - summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - summoned->CastSpell(summoned, SPELL_POISON, false, NULL, NULL, m_creature->GetObjectGuid()); + if (m_pInstance) + m_pInstance->SetData(TYPE_BROGGOK_EVENT, DONE); } - void JustDied(Unit *who) + void EnterEvadeMode() { + m_creature->RemoveAllAuras(); + m_creature->DeleteThreatList(); + m_creature->CombatStop(true); + m_creature->LoadCreatureAddon(); + + m_creature->SetLootRecipient(NULL); + + Reset(); + + if (!m_creature->isAlive()) + return; + if (m_pInstance) - m_pInstance->SetData(TYPE_BROGGOK_EVENT,DONE); + { + float dx, dy; + float fRespX, fRespY, fRespZ; + m_creature->GetRespawnCoord(fRespX, fRespY, fRespZ); + m_pInstance->GetMovementDistanceForIndex(4, dx, dy); + m_creature->GetMotionMaster()->MovePoint(POINT_EVENT_COMBAT, dx, dy, fRespZ); + } + else + m_creature->GetMotionMaster()->MoveTargetedHome(); + } + + // Reset Orientation + void MovementInform(uint32 uiMotionType, uint32 uiPointId) + { + if (uiMotionType != POINT_MOTION_TYPE || uiPointId != POINT_EVENT_COMBAT) + return; + + if (GameObject* pFrontDoor = m_pInstance->GetSingleGameObjectFromStorage(GO_DOOR_BROGGOK_FRONT)) + m_creature->SetFacingToObject(pFrontDoor); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (AcidSpray_Timer < diff) + if (m_uiAcidSprayTimer < uiDiff) { - DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? H_SPELL_SLIME_SPRAY : SPELL_SLIME_SPRAY); - AcidSpray_Timer = urand(4000, 12000); - }else AcidSpray_Timer -=diff; + if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_SLIME_SPRAY : SPELL_SLIME_SPRAY_H) == CAST_OK) + m_uiAcidSprayTimer = urand(4000, 12000); + } + else + m_uiAcidSprayTimer -= uiDiff; - if (PoisonBolt_Timer < diff) + if (m_uiPoisonBoltTimer < uiDiff) { - DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? H_SPELL_POISON_BOLT : SPELL_POISON_BOLT); - PoisonBolt_Timer = urand(4000, 12000); - }else PoisonBolt_Timer -=diff; + if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_POISON_BOLT : SPELL_POISON_BOLT_H) == CAST_OK) + m_uiPoisonBoltTimer = urand(4000, 12000); + } + else + m_uiPoisonBoltTimer -= uiDiff; - if (PoisonSpawn_Timer < diff) + if (m_uiPoisonSpawnTimer < uiDiff) { - DoCastSpellIfCan(m_creature,SPELL_POISON_CLOUD); - PoisonSpawn_Timer = 20000; - }else PoisonSpawn_Timer -=diff; + if (DoCastSpellIfCan(m_creature, SPELL_POISON_CLOUD) == CAST_OK) + m_uiPoisonSpawnTimer = 20000; + } + else + m_uiPoisonSpawnTimer -= uiDiff; DoMeleeAttackIfReady(); } @@ -136,14 +175,15 @@ CreatureAI* GetAI_mob_broggok_poisoncloud(Creature* pCreature) void AddSC_boss_broggok() { - Script *newscript; - newscript = new Script; - newscript->Name = "boss_broggok"; - newscript->GetAI = &GetAI_boss_broggok; - newscript->RegisterSelf(); - - newscript = new Script; - newscript->Name = "mob_broggok_poisoncloud"; - newscript->GetAI = &GetAI_mob_broggok_poisoncloud; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "boss_broggok"; + pNewScript->GetAI = &GetAI_boss_broggok; + pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "mob_broggok_poisoncloud"; + pNewScript->GetAI = &GetAI_mob_broggok_poisoncloud; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp b/scripts/outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp index fbe058d..c31f14a 100644 --- a/scripts/outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp +++ b/scripts/outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp @@ -41,6 +41,7 @@ enum SAY_DIE = -1542007, SPELL_CORRUPTION = 30938, + SPELL_EVOCATION = 30935, // Aura channeled by the boss SPELL_FIRE_NOVA = 33132, H_SPELL_FIRE_NOVA = 37371, @@ -77,6 +78,8 @@ struct MANGOS_DLL_DECL boss_kelidan_the_breakerAI : public ScriptedAI BurningNova_Timer = 15000; Corruption_Timer = 5000; Firenova = false; + + DoCastSpellIfCan(m_creature, SPELL_EVOCATION); } void Aggro(Unit *who) diff --git a/scripts/outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp b/scripts/outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp index 0a65360..e747bad 100644 --- a/scripts/outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp +++ b/scripts/outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp @@ -25,25 +25,8 @@ EndScriptData */ #include "blood_furnace.h" instance_blood_furnace::instance_blood_furnace(Map* pMap) : ScriptedInstance(pMap), - m_uiMakerGUID(0), - m_uiBroggokGUID(0), - m_uiKelidanGUID(0), - - m_uiDoorFinalExitGUID(0), - m_uiDoorMakerFrontGUID(0), - m_uiDoorMakerRearGUID(0), - m_uiDoorBroggokFrontGUID(0), - m_uiDoorBrokkokRearGUID(0), - m_uiDoorKelidanExitGUID(0), - - m_uiPrisonCell1GUID(0), - m_uiPrisonCell2GUID(0), - m_uiPrisonCell3GUID(0), - m_uiPrisonCell4GUID(0), - m_uiPrisonCell5GUID(0), - m_uiPrisonCell6GUID(0), - m_uiPrisonCell7GUID(0), - m_uiPrisonCell8GUID(0) + m_uiBroggokEventTimer(30000), + m_uiBroggokEventPhase(0) { Initialize(); } @@ -57,9 +40,13 @@ void instance_blood_furnace::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_THE_MAKER: m_uiMakerGUID = pCreature->GetGUID(); break; - case NPC_BROGGOK: m_uiBroggokGUID = pCreature->GetGUID(); break; - case NPC_KELIDAN_THE_MAKER: m_uiKelidanGUID = pCreature->GetGUID(); break; + case NPC_BROGGOK: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + + case NPC_NASCENT_FEL_ORC: + m_luiNascentOrcGUIDs.push_back(pCreature->GetObjectGuid()); + break; } } @@ -68,60 +55,35 @@ void instance_blood_furnace::OnObjectCreate(GameObject* pGo) switch (pGo->GetEntry()) { case GO_DOOR_MAKER_FRONT: // the maker front door - m_uiDoorMakerFrontGUID = pGo->GetGUID(); break; case GO_DOOR_MAKER_REAR: // the maker rear door - m_uiDoorMakerRearGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_THE_MAKER_EVENT] == DONE && pGo->GetGoState() == GO_STATE_READY) - DoUseDoorOrButton(m_uiDoorMakerRearGUID); + if (m_auiEncounter[TYPE_THE_MAKER_EVENT] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOOR_BROGGOK_FRONT: // broggok front door - m_uiDoorBroggokFrontGUID = pGo->GetGUID(); break; case GO_DOOR_BROGGOK_REAR: // broggok rear door - m_uiDoorBrokkokRearGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_BROGGOK_EVENT] == DONE && pGo->GetGoState() == GO_STATE_READY) - DoUseDoorOrButton(m_uiDoorBrokkokRearGUID); + if (m_auiEncounter[TYPE_BROGGOK_EVENT] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOOR_KELIDAN_EXIT: // kelidan exit door - m_uiDoorKelidanExitGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_KELIDAN_EVENT] == DONE && pGo->GetGoState() == GO_STATE_READY) - DoUseDoorOrButton(m_uiDoorKelidanExitGUID); + if (m_auiEncounter[TYPE_KELIDAN_EVENT] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_DOOR_FINAL_EXIT: // final exit door - m_uiDoorFinalExitGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_KELIDAN_EVENT] == DONE && pGo->GetGoState() == GO_STATE_READY) - DoUseDoorOrButton(m_uiDoorFinalExitGUID); + if (m_auiEncounter[TYPE_KELIDAN_EVENT] == DONE) + pGo->SetGoState(GO_STATE_ACTIVE); break; - case GO_PRISON_CELL_MAKER1: m_uiPrisonCell1GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_MAKER2: m_uiPrisonCell2GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_MAKER3: m_uiPrisonCell3GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_MAKER4: m_uiPrisonCell4GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_BROGGOK1: m_uiPrisonCell5GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_BROGGOK2: m_uiPrisonCell6GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_BROGGOK3: m_uiPrisonCell7GUID = pGo->GetGUID(); break; - case GO_PRISON_CELL_BROGGOK4: m_uiPrisonCell8GUID = pGo->GetGUID(); break; - } -} -uint64 instance_blood_furnace::GetData64(uint32 uiData) -{ - switch (uiData) - { - case NPC_THE_MAKER: return m_uiMakerGUID; - case NPC_BROGGOK: return m_uiBroggokGUID; - case GO_PRISON_CELL_MAKER1: return m_uiPrisonCell1GUID; - case GO_PRISON_CELL_MAKER2: return m_uiPrisonCell2GUID; - case GO_PRISON_CELL_MAKER3: return m_uiPrisonCell3GUID; - case GO_PRISON_CELL_MAKER4: return m_uiPrisonCell4GUID; - case GO_PRISON_CELL_BROGGOK1: return m_uiPrisonCell5GUID; - case GO_PRISON_CELL_BROGGOK2: return m_uiPrisonCell6GUID; - case GO_PRISON_CELL_BROGGOK3: return m_uiPrisonCell7GUID; - case GO_PRISON_CELL_BROGGOK4: return m_uiPrisonCell8GUID; + case GO_PRISON_CELL_BROGGOK_1: m_aBroggokEvent[0].m_cellGuid = pGo->GetObjectGuid(); return; + case GO_PRISON_CELL_BROGGOK_2: m_aBroggokEvent[1].m_cellGuid = pGo->GetObjectGuid(); return; + case GO_PRISON_CELL_BROGGOK_3: m_aBroggokEvent[2].m_cellGuid = pGo->GetObjectGuid(); return; + case GO_PRISON_CELL_BROGGOK_4: m_aBroggokEvent[3].m_cellGuid = pGo->GetObjectGuid(); return; default: - return 0; + return; } + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_blood_furnace::SetData(uint32 uiType, uint32 uiData) @@ -130,33 +92,66 @@ void instance_blood_furnace::SetData(uint32 uiType, uint32 uiData) { case TYPE_THE_MAKER_EVENT: if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiDoorMakerFrontGUID); + DoUseDoorOrButton(GO_DOOR_MAKER_FRONT); if (uiData == FAIL) - DoUseDoorOrButton(m_uiDoorMakerFrontGUID); + DoUseDoorOrButton(GO_DOOR_MAKER_FRONT); if (uiData == DONE) { - DoUseDoorOrButton(m_uiDoorMakerFrontGUID); - DoUseDoorOrButton(m_uiDoorMakerRearGUID); + DoUseDoorOrButton(GO_DOOR_MAKER_FRONT); + DoUseDoorOrButton(GO_DOOR_MAKER_REAR); } m_auiEncounter[uiType] = uiData; break; case TYPE_BROGGOK_EVENT: + if (m_auiEncounter[uiType] == uiData) + return; + + // Combat door; the exit door is opened in event + DoUseDoorOrButton(GO_DOOR_BROGGOK_FRONT); if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiDoorBroggokFrontGUID); - if (uiData == FAIL) - DoUseDoorOrButton(m_uiDoorBroggokFrontGUID); - if (uiData == DONE) { - DoUseDoorOrButton(m_uiDoorBroggokFrontGUID); - DoUseDoorOrButton(m_uiDoorBrokkokRearGUID); + if (m_uiBroggokEventPhase <= MAX_ORC_WAVES) + { + m_uiBroggokEventPhase = 0; + DoSortBroggokOrcs(); + // open first cage + DoNextBroggokEventPhase(); + } + } + else if (uiData == FAIL) + { + // On wipe we reset only the orcs; if the party wipes at the boss itself then the orcs don't reset + if (m_uiBroggokEventPhase <= MAX_ORC_WAVES) + { + for (uint8 i = 0; i < MAX_ORC_WAVES; ++i) + { + // Reset Orcs + if (!m_aBroggokEvent[i].m_bIsCellOpened) + continue; + + m_aBroggokEvent[i].m_uiKilledOrcCount = 0; + for (GUIDSet::const_iterator itr = m_aBroggokEvent[i].m_sSortedOrcGuids.begin(); itr != m_aBroggokEvent[i].m_sSortedOrcGuids.end(); ++itr) + { + if (Creature* pOrc = instance->GetCreature(*itr)) + { + if (!pOrc->isAlive()) + pOrc->Respawn(); + } + } + + // Close Door + DoUseDoorOrButton(m_aBroggokEvent[i].m_cellGuid); + m_aBroggokEvent[i].m_bIsCellOpened = false; + } + } } m_auiEncounter[uiType] = uiData; break; case TYPE_KELIDAN_EVENT: if (uiData == DONE) { - DoUseDoorOrButton(m_uiDoorKelidanExitGUID); - DoUseDoorOrButton(m_uiDoorFinalExitGUID); + DoUseDoorOrButton(GO_DOOR_KELIDAN_EXIT); + DoUseDoorOrButton(GO_DOOR_FINAL_EXIT); } m_auiEncounter[uiType] = uiData; break; @@ -179,6 +174,111 @@ void instance_blood_furnace::SetData(uint32 uiType, uint32 uiData) } } +void instance_blood_furnace::DoNextBroggokEventPhase() +{ + // Get Movement Position + float dx, dy; + GetMovementDistanceForIndex(m_uiBroggokEventPhase, dx, dy); + + // Open door to the final boss now and move boss to the center of the room + if (m_uiBroggokEventPhase >= MAX_ORC_WAVES) + { + DoUseDoorOrButton(GO_DOOR_BROGGOK_REAR); + + if (Creature* pBroggok = GetSingleCreatureFromStorage(NPC_BROGGOK)) + { + pBroggok->RemoveSplineFlag(SPLINEFLAG_WALKMODE); + pBroggok->GetMotionMaster()->MovePoint(0, dx, dy, pBroggok->GetPositionZ()); + } + } + else + { + // Open cage door + if (!m_aBroggokEvent[m_uiBroggokEventPhase].m_bIsCellOpened) + DoUseDoorOrButton(m_aBroggokEvent[m_uiBroggokEventPhase].m_cellGuid); + + m_aBroggokEvent[m_uiBroggokEventPhase].m_bIsCellOpened = true; + + for(GUIDSet::const_iterator itr = m_aBroggokEvent[m_uiBroggokEventPhase].m_sSortedOrcGuids.begin(); itr != m_aBroggokEvent[m_uiBroggokEventPhase].m_sSortedOrcGuids.end(); ++itr) + { + if (Creature* pOrc = instance->GetCreature(*itr)) + { + // Remove unit flags from npcs + pOrc->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pOrc->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + // Move them out of the cages + pOrc->RemoveSplineFlag(SPLINEFLAG_WALKMODE); + pOrc->GetMotionMaster()->MovePoint(0, pOrc->GetPositionX() + dx, pOrc->GetPositionY() + dy, pOrc->GetPositionZ()); + } + } + } + + // Prepare for further handling + m_uiBroggokEventTimer = 30000; + ++m_uiBroggokEventPhase; +} + +void instance_blood_furnace::OnCreatureEvade(Creature* pCreature) +{ + if (m_auiEncounter[TYPE_BROGGOK_EVENT] == FAIL) + return; + + if (pCreature->GetEntry() == NPC_BROGGOK) + SetData(TYPE_BROGGOK_EVENT, FAIL); + + else if (pCreature->GetEntry() == NPC_NASCENT_FEL_ORC) + { + for (uint8 i = 0; i < std::min(m_uiBroggokEventPhase, MAX_ORC_WAVES); ++i) + { + if (m_aBroggokEvent[i].m_sSortedOrcGuids.find(pCreature->GetObjectGuid()) != m_aBroggokEvent[i].m_sSortedOrcGuids.end()) + SetData(TYPE_BROGGOK_EVENT, FAIL); + } + } +} + +void instance_blood_furnace::OnCreatureDeath(Creature* pCreature) +{ + if (m_auiEncounter[TYPE_BROGGOK_EVENT] != IN_PROGRESS) + return; + + if (pCreature->GetEntry() == NPC_NASCENT_FEL_ORC) + { + uint8 uiClearedCells = 0; + for (uint8 i = 0; i < std::min(m_uiBroggokEventPhase, MAX_ORC_WAVES); ++i) + { + if (m_aBroggokEvent[i].m_sSortedOrcGuids.size() == m_aBroggokEvent[i].m_uiKilledOrcCount) + { + ++uiClearedCells; + continue; + } + + // Increase kill counter, if we found a mob of this cell + if (m_aBroggokEvent[i].m_sSortedOrcGuids.find(pCreature->GetObjectGuid()) != m_aBroggokEvent[i].m_sSortedOrcGuids.end()) + m_aBroggokEvent[i].m_uiKilledOrcCount++; + + if (m_aBroggokEvent[i].m_sSortedOrcGuids.size() == m_aBroggokEvent[i].m_uiKilledOrcCount) + ++uiClearedCells; + } + + // Increase phase when all opened cells are cleared + if (uiClearedCells == m_uiBroggokEventPhase) + DoNextBroggokEventPhase(); + } +} + +void instance_blood_furnace::Update(uint32 uiDiff) +{ + // Broggok Event: For the last wave we don't check the timer; the boss is released only when all mobs die, also the timer is only active on heroic + if (m_auiEncounter[TYPE_BROGGOK_EVENT] == IN_PROGRESS && m_uiBroggokEventPhase < MAX_ORC_WAVES && !instance->IsRegularDifficulty()) + { + if (m_uiBroggokEventTimer < uiDiff) + DoNextBroggokEventPhase(); + else + m_uiBroggokEventTimer -= uiDiff; + } +} + uint32 instance_blood_furnace::GetData(uint32 uiType) { if (uiType < MAX_ENCOUNTER) @@ -207,11 +307,89 @@ void instance_blood_furnace::Load(const char* chrIn) OUT_LOAD_INST_DATA_COMPLETE; } +// Sort all nascent orcs in the instance in order to get only those near broggok doors +void instance_blood_furnace::DoSortBroggokOrcs() +{ + for (GUIDList::const_iterator itr = m_luiNascentOrcGUIDs.begin(); itr != m_luiNascentOrcGUIDs.end(); ++itr) + { + if (Creature* pOrc = instance->GetCreature(*itr)) + { + for (uint8 i = 0; i < MAX_ORC_WAVES; ++i) + { + if (GameObject* pDoor = instance->GetGameObject(m_aBroggokEvent[i].m_cellGuid)) + { + if (pOrc->IsWithinDistInMap(pDoor, 15.0f)) + { + m_aBroggokEvent[i].m_sSortedOrcGuids.insert(pOrc->GetObjectGuid()); + if (!pOrc->isAlive()) + pOrc->Respawn(); + break; + } + } + } + } + } +} + +// Helper function to calculate the position to where the orcs should move +// For case of orc-indexes the difference, for Braggok his position +void instance_blood_furnace::GetMovementDistanceForIndex(uint32 uiIndex, float& dx, float& dy) +{ + GameObject* pDoor[2]; + + if (uiIndex < MAX_ORC_WAVES) + { + // Use doors 0, 1 for index 0 or 1; and use doors 2, 3 for index 2 or 3 + pDoor[0] = instance->GetGameObject(m_aBroggokEvent[(uiIndex / 2) * 2].m_cellGuid); + pDoor[1] = instance->GetGameObject(m_aBroggokEvent[(uiIndex / 2) * 2 + 1].m_cellGuid); + } + else + { + // Use doors 0 and 3 for Braggok case (which means the middle point is the center of the room) + pDoor[0] = instance->GetGameObject(m_aBroggokEvent[0].m_cellGuid); + pDoor[1] = instance->GetGameObject(m_aBroggokEvent[3].m_cellGuid); + } + + if (!pDoor[0] || !pDoor[1]) + return; + + if (uiIndex < MAX_ORC_WAVES) + { + dx = (pDoor[0]->GetPositionX() + pDoor[1]->GetPositionX()) / 2 - pDoor[uiIndex % 2]->GetPositionX(); + dy = (pDoor[0]->GetPositionY() + pDoor[1]->GetPositionY()) / 2 - pDoor[uiIndex % 2]->GetPositionY(); + } + else + { + dx = (pDoor[0]->GetPositionX() + pDoor[1]->GetPositionX()) / 2; + dy = (pDoor[0]->GetPositionY() + pDoor[1]->GetPositionY()) / 2; + } +} + InstanceData* GetInstanceData_instance_blood_furnace(Map* pMap) { return new instance_blood_furnace(pMap); } +bool GOUse_go_prison_cell_lever(Player* pPlayer, GameObject* pGo) +{ + ScriptedInstance* pInstance = (ScriptedInstance*)pGo->GetInstanceData(); + + if (!pInstance) + return false; + + // Set broggok event in progress + if (pInstance->GetData(TYPE_BROGGOK_EVENT) != DONE && pInstance->GetData(TYPE_BROGGOK_EVENT) != IN_PROGRESS) + { + pInstance->SetData(TYPE_BROGGOK_EVENT, IN_PROGRESS); + + // Yell intro + if (Creature* pBroggok = pInstance->GetSingleCreatureFromStorage(NPC_BROGGOK)) + DoScriptText(SAY_BROGGOK_INTRO, pBroggok); + } + + return false; +} + void AddSC_instance_blood_furnace() { Script* pNewScript; @@ -220,4 +398,9 @@ void AddSC_instance_blood_furnace() pNewScript->Name = "instance_blood_furnace"; pNewScript->GetInstanceData = &GetInstanceData_instance_blood_furnace; pNewScript->RegisterSelf(); + + pNewScript = new Script; + pNewScript->Name = "go_prison_cell_lever"; + pNewScript->pGOUse = &GOUse_go_prison_cell_lever; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_nazan_and_vazruden.cpp b/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_nazan_and_vazruden.cpp index 3a2a7ed..0a5bd40 100644 --- a/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_nazan_and_vazruden.cpp +++ b/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_nazan_and_vazruden.cpp @@ -55,9 +55,7 @@ enum POINT_ID_FLYING = 101, POINT_ID_COMBAT = 102, - NPC_VAZRUDEN_HERALD = 17307, NPC_NAZAN = 17536, - NPC_VAZRUDEN = 17537 }; const float afCenterPos[3] = {-1399.401f, 1736.365f, 87.008f}; //moves here to drop off nazan @@ -100,6 +98,12 @@ struct MANGOS_DLL_DECL boss_vazrudenAI : public ScriptedAI m_pInstance->SetData(TYPE_VAZRUDEN, DONE); } + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->SetData(TYPE_VAZRUDEN, FAIL); + } + void KilledUnit(Unit* pVictim) { DoScriptText(urand(0, 1) ? SAY_KILL1 : SAY_KILL2, m_creature); @@ -107,7 +111,7 @@ struct MANGOS_DLL_DECL boss_vazrudenAI : public ScriptedAI void PrepareAndDescendMount() { - if (Creature* pHerald = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_HERALD))) + if (Creature* pHerald = m_pInstance->GetSingleCreatureFromStorage(NPC_VAZRUDEN_HERALD)) { if (pHerald->HasSplineFlag(SPLINEFLAG_WALKMODE)) pHerald->RemoveSplineFlag(SPLINEFLAG_WALKMODE); @@ -160,8 +164,8 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI uint32 m_uiMovementTimer; uint32 m_uiFireballTimer; - uint64 m_uiLastSeenPlayerGUID; - uint64 m_uiVazrudenGUID; + ObjectGuid m_lastSeenPlayerGuid; + ObjectGuid m_vazrudenGuid; void Reset() { @@ -172,8 +176,8 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI m_uiMovementTimer = 0; m_bIsEventInProgress = false; - m_uiLastSeenPlayerGUID = 0; - m_uiVazrudenGUID = 0; + m_lastSeenPlayerGuid.Clear(); + m_vazrudenGuid.Clear(); m_uiFireballTimer = 0; // see boss_onyxia @@ -184,10 +188,10 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI void MoveInLineOfSight(Unit* pWho) { - if (m_bIsEventInProgress && !m_uiLastSeenPlayerGUID && pWho->GetTypeId() == TYPEID_PLAYER && pWho->isAlive() && !((Player*)pWho)->isGameMaster()) + if (m_bIsEventInProgress && !m_lastSeenPlayerGuid && pWho->GetTypeId() == TYPEID_PLAYER && pWho->isAlive() && !((Player*)pWho)->isGameMaster()) { if (m_creature->IsWithinDistInMap(pWho, 40.0f)) - m_uiLastSeenPlayerGUID = pWho->GetGUID(); + m_lastSeenPlayerGuid = pWho->GetObjectGuid(); } if (m_pInstance && m_pInstance->GetData(TYPE_NAZAN) != IN_PROGRESS) @@ -231,14 +235,15 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI m_creature->SetByteValue(UNIT_FIELD_BYTES_1, 3, 0); m_creature->RemoveSplineFlag(SPLINEFLAG_FLYING); - Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiLastSeenPlayerGUID); + Player* pPlayer = m_creature->GetMap()->GetPlayer(m_lastSeenPlayerGuid); if (pPlayer && pPlayer->isAlive()) AttackStart(pPlayer); break; } case POINT_ID_FLYING: - m_uiFireballTimer = 3000; + if (m_bIsEventInProgress) // Additional check for wipe case, while nazan is flying to this point + m_uiFireballTimer = 3000; break; } } @@ -279,10 +284,10 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI if (pSummoned->GetEntry() != NPC_VAZRUDEN) return; - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_uiLastSeenPlayerGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_lastSeenPlayerGuid)) pSummoned->AI()->AttackStart(pPlayer); - m_uiVazrudenGUID = pSummoned->GetGUID(); + m_vazrudenGuid = pSummoned->GetObjectGuid(); if (m_pInstance) m_pInstance->SetData(TYPE_VAZRUDEN, IN_PROGRESS); @@ -294,6 +299,12 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI m_pInstance->SetData(TYPE_NAZAN, DONE); } + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->SetData(TYPE_NAZAN, FAIL); + } + void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) @@ -315,14 +326,14 @@ struct MANGOS_DLL_DECL boss_vazruden_heraldAI : public ScriptedAI m_uiMovementTimer -= uiDiff; } - if (m_uiVazrudenGUID && m_uiFireballTimer) + if (m_vazrudenGuid && m_uiFireballTimer) { if (m_uiFireballTimer <= uiDiff) { - if (Creature* pVazruden = m_creature->GetMap()->GetCreature(m_uiVazrudenGUID)) + if (Creature* pVazruden = m_creature->GetMap()->GetCreature(m_vazrudenGuid)) { if (Unit* pEnemy = pVazruden->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - DoCastSpellIfCan(pEnemy, m_bIsRegularMode ? SPELL_FIREBALL : SPELL_FIREBALL_H, 0, pVazruden->GetGUID()); + DoCastSpellIfCan(pEnemy, m_bIsRegularMode ? SPELL_FIREBALL : SPELL_FIREBALL_H, 0, pVazruden->GetObjectGuid()); } m_uiFireballTimer = urand(4000, 8000); } diff --git a/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp b/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp index 1bba977..b4521e2 100644 --- a/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp +++ b/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp @@ -59,7 +59,7 @@ struct MANGOS_DLL_DECL boss_omor_the_unscarredAI : public ScriptedAI uint32 Shadowbolt_Timer; uint32 Summon_Timer; uint32 SummonedCount; - uint64 playerGUID; + ObjectGuid m_playerGuid; bool CanPullBack; void Reset() @@ -73,7 +73,7 @@ struct MANGOS_DLL_DECL boss_omor_the_unscarredAI : public ScriptedAI Shadowbolt_Timer = 2000; Summon_Timer = 10000; SummonedCount = 0; - playerGUID = 0; + m_playerGuid.Clear(); CanPullBack = false; } @@ -130,7 +130,7 @@ struct MANGOS_DLL_DECL boss_omor_the_unscarredAI : public ScriptedAI { if (ShadowWhip_Timer < diff) { - if (Player* pPlayer = m_creature->GetMap()->GetPlayer(playerGUID)) + if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerGuid)) { //if unit dosen't have this flag, then no pulling back (script will attempt cast, even if orbital strike was resisted) if (pPlayer->HasMovementFlag(MOVEFLAG_FALLING)) @@ -139,7 +139,7 @@ struct MANGOS_DLL_DECL boss_omor_the_unscarredAI : public ScriptedAI DoCastSpellIfCan(pPlayer,SPELL_SHADOW_WHIP); } } - playerGUID = 0; + m_playerGuid.Clear(); ShadowWhip_Timer = 2000; CanPullBack = false; }else ShadowWhip_Timer -= diff; @@ -155,10 +155,9 @@ struct MANGOS_DLL_DECL boss_omor_the_unscarredAI : public ScriptedAI { DoCastSpellIfCan(temp,SPELL_ORBITAL_STRIKE); OrbitalStrike_Timer = urand(14000, 16000); - playerGUID = temp->GetGUID(); + m_playerGuid = temp->GetObjectGuid(); - if (playerGUID) - CanPullBack = true; + CanPullBack = true; } }else OrbitalStrike_Timer -= diff; diff --git a/scripts/outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h b/scripts/outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h index e0832ff..3cc2162 100644 --- a/scripts/outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h +++ b/scripts/outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h @@ -12,7 +12,9 @@ enum TYPE_VAZRUDEN = 1, TYPE_NAZAN = 2, // Do not change, used in ACID (SetData(SPECIAL) on death of 17517 - NPC_HERALD = 17307, + NPC_HELLFIRE_SENTRY = 17517, + NPC_VAZRUDEN_HERALD = 17307, + NPC_VAZRUDEN = 17537, GO_FEL_IRON_CHEST = 185168, GO_FEL_IRON_CHEST_H = 185169, @@ -30,16 +32,16 @@ class MANGOS_DLL_DECL instance_ramparts : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); // No need to save and load this instance (only one encounter needs special handling, no doors used) private: + void DoFailVazruden(); + uint32 m_auiEncounter[MAX_ENCOUNTER]; uint32 m_uiSentryCounter; - uint64 m_uiChestGUID; - uint64 m_uiHeraldGUID; + GUIDList m_lSentryGUIDs; }; #endif diff --git a/scripts/outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp b/scripts/outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp index 52f1b69..ef59fc2 100644 --- a/scripts/outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp +++ b/scripts/outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp @@ -25,9 +25,7 @@ EndScriptData */ #include "hellfire_ramparts.h" instance_ramparts::instance_ramparts(Map* pMap) : ScriptedInstance(pMap), - m_uiSentryCounter(0), - m_uiChestGUID(0), - m_uiHeraldGUID(0) + m_uiSentryCounter(0) { Initialize(); } @@ -39,17 +37,25 @@ void instance_ramparts::Initialize() void instance_ramparts::OnCreatureCreate(Creature* pCreature) { - if (pCreature->GetEntry() == NPC_HERALD) - m_uiHeraldGUID = pCreature->GetGUID(); + switch (pCreature->GetEntry()) + { + case NPC_VAZRUDEN_HERALD: + case NPC_VAZRUDEN: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; + case NPC_HELLFIRE_SENTRY: + m_lSentryGUIDs.push_back(pCreature->GetObjectGuid()); + break; + } } void instance_ramparts::OnObjectCreate(GameObject* pGo) { - switch(pGo->GetEntry()) + switch (pGo->GetEntry()) { case GO_FEL_IRON_CHEST: case GO_FEL_IRON_CHEST_H: - m_uiChestGUID = pGo->GetGUID(); + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); break; } } @@ -58,11 +64,13 @@ void instance_ramparts::SetData(uint32 uiType, uint32 uiData) { debug_log("SD2: Instance Ramparts: SetData received for type %u with data %u",uiType,uiData); - switch(uiType) + switch (uiType) { case TYPE_VAZRUDEN: if (uiData == DONE && m_auiEncounter[1] == DONE) - DoRespawnGameObject(m_uiChestGUID, HOUR*IN_MILLISECONDS); + DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_FEL_IRON_CHEST : GO_FEL_IRON_CHEST_H, HOUR); + if (uiData == FAIL && m_auiEncounter[0] != FAIL) + DoFailVazruden(); m_auiEncounter[0] = uiData; break; case TYPE_NAZAN: @@ -72,14 +80,15 @@ void instance_ramparts::SetData(uint32 uiType, uint32 uiData) if (m_uiSentryCounter == 2) m_auiEncounter[1] = uiData; + + return; } if (uiData == DONE && m_auiEncounter[0] == DONE) - { - DoRespawnGameObject(m_uiChestGUID, HOUR*IN_MILLISECONDS); - m_auiEncounter[1] = uiData; - } - if (uiData == IN_PROGRESS) - m_auiEncounter[1] = uiData; + DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_FEL_IRON_CHEST : GO_FEL_IRON_CHEST_H, HOUR); + if (uiData == FAIL && m_auiEncounter[1] != FAIL) + DoFailVazruden(); + + m_auiEncounter[1] = uiData; break; } } @@ -95,12 +104,35 @@ uint32 instance_ramparts::GetData(uint32 uiType) return 0; } -uint64 instance_ramparts::GetData64(uint32 uiData) +void instance_ramparts::DoFailVazruden() { - if (uiData == NPC_HERALD) - return m_uiHeraldGUID; + // Store FAIL for both types + m_auiEncounter[0] = FAIL; + m_auiEncounter[1] = FAIL; - return 0; + // Restore Sentries (counter and respawn them) + m_uiSentryCounter = 0; + for (GUIDList::const_iterator itr = m_lSentryGUIDs.begin(); itr != m_lSentryGUIDs.end(); ++itr) + { + if (Creature* pSentry = instance->GetCreature(*itr)) + pSentry->Respawn(); + } + + // Respawn or Reset Vazruden the herald + if (Creature* pVazruden = GetSingleCreatureFromStorage(NPC_VAZRUDEN_HERALD)) + { + if (!pVazruden->isAlive()) + pVazruden->Respawn(); + else + { + if (ScriptedAI* pVazrudenAI = dynamic_cast (pVazruden->AI())) + pVazrudenAI->Reset(); + } + } + + // Despawn Vazruden + if (Creature* pVazruden = GetSingleCreatureFromStorage(NPC_VAZRUDEN)) + pVazruden->ForcedDespawn(); } InstanceData* GetInstanceData_instance_ramparts(Map* pMap) diff --git a/scripts/outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp b/scripts/outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp index 04cc188..79391dd 100644 --- a/scripts/outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp +++ b/scripts/outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp @@ -85,7 +85,7 @@ enum MAX_CLICK = 5 }; -typedef std::map CubeMap; +typedef std::map CubeMap; struct MANGOS_DLL_DECL mob_abyssalAI : public ScriptedAI { @@ -197,7 +197,7 @@ struct MANGOS_DLL_DECL boss_magtheridonAI : public ScriptedAI Reset(); } - CubeMap Cube; + CubeMap m_mCube; ScriptedInstance* m_pInstance; @@ -244,13 +244,13 @@ struct MANGOS_DLL_DECL boss_magtheridonAI : public ScriptedAI } } - void SetClicker(uint64 uiCubeGUID, uint64 uiClickerGUID) + void SetClicker(GameObject* pGo, Player* pPlayer) { // to avoid multiclicks from 1 cube - if (uint64 guid = Cube[uiCubeGUID]) + if (ObjectGuid guid = m_mCube[pGo->GetObjectGuid()]) DebuffClicker(m_creature->GetMap()->GetPlayer(guid)); - Cube[uiCubeGUID] = uiClickerGUID; + m_mCube[pGo->GetObjectGuid()] = pPlayer->GetObjectGuid(); m_bNeedCheckCube = true; } @@ -279,14 +279,14 @@ struct MANGOS_DLL_DECL boss_magtheridonAI : public ScriptedAI // now checking if every clicker has debuff from manticron // if not - apply mind exhaustion and delete from clicker's list - for(CubeMap::iterator i = Cube.begin(); i != Cube.end(); ++i) + for(CubeMap::iterator i = m_mCube.begin(); i != m_mCube.end(); ++i) { Player* pClicker = m_creature->GetMap()->GetPlayer(i->second); if (!pClicker || !pClicker->HasAura(SPELL_SHADOW_GRASP, EFFECT_INDEX_1)) { DebuffClicker(pClicker); - i->second = 0; + i->second.Clear(); } else ++ClickerNum; @@ -537,7 +537,7 @@ struct MANGOS_DLL_DECL mob_hellfire_channelerAI : public ScriptedAI m_creature->InterruptNonMeleeSpells(false); - if (Creature* pMagtheridon = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_MAGTHERIDON))) + if (Creature* pMagtheridon = m_pInstance->GetSingleCreatureFromStorage(NPC_MAGTHERIDON)) { if (!pMagtheridon->isAlive()) return; @@ -643,7 +643,7 @@ bool GOUse_go_manticron_cube(Player* pPlayer, GameObject* pGo) if (pInstance->GetData(TYPE_MAGTHERIDON_EVENT) != IN_PROGRESS) return true; - if (Creature* pMagtheridon = pInstance->instance->GetCreature(pInstance->GetData64(DATA_MAGTHERIDON))) + if (Creature* pMagtheridon = pInstance->GetSingleCreatureFromStorage(NPC_MAGTHERIDON)) { if (!pMagtheridon->isAlive()) return true; @@ -657,7 +657,7 @@ bool GOUse_go_manticron_cube(Player* pPlayer, GameObject* pGo) pPlayer->CastSpell(pPlayer, SPELL_SHADOW_GRASP_VISUAL, false); if (boss_magtheridonAI* pMagAI = dynamic_cast(pMagtheridon->AI())) - pMagAI->SetClicker(pGo->GetGUID(), pPlayer->GetGUID()); + pMagAI->SetClicker(pGo, pPlayer); } } diff --git a/scripts/outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp b/scripts/outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp index 2b96b3b..e601979 100644 --- a/scripts/outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp +++ b/scripts/outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp @@ -24,252 +24,229 @@ EndScriptData */ #include "precompiled.h" #include "magtheridons_lair.h" -struct MANGOS_DLL_DECL instance_magtheridons_lair : public ScriptedInstance +instance_magtheridons_lair::instance_magtheridons_lair(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } + +void instance_magtheridons_lair::Initialize() { - instance_magtheridons_lair(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - uint32 m_auiEncounter[MAX_ENCOUNTER]; + m_uiCageTimer = 0; + m_uiRespawnTimer = 0; +} - uint64 m_uiMagtheridonGUID; - GUIDSet ChannelerGUID; - uint64 m_uiDoorGUID; - GUIDSet ColumnGUID; +bool instance_magtheridons_lair::IsEncounterInProgress() const +{ + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) + return true; - uint32 m_uiCageTimer; - uint32 m_uiRespawnTimer; + return false; +} - void Initialize() +void instance_magtheridons_lair::OnCreatureCreate(Creature* pCreature) +{ + switch(pCreature->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - ChannelerGUID.clear(); - ColumnGUID.clear(); - - m_uiMagtheridonGUID = 0; - m_uiDoorGUID = 0; - - m_uiCageTimer = 0; - m_uiRespawnTimer = 0; - } - - bool IsEncounterInProgress() const - { - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; + case NPC_MAGTHERIDON: + m_mNpcEntryGuidStore[NPC_MAGTHERIDON] = pCreature->GetObjectGuid(); + break; + case NPC_CHANNELER: + m_sChannelerGuid.insert(pCreature->GetObjectGuid()); + break; } +} - void OnCreatureCreate(Creature* pCreature) +void instance_magtheridons_lair::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - switch(pCreature->GetEntry()) - { - case NPC_MAGTHERION: m_uiMagtheridonGUID = pCreature->GetGUID(); break; - case NPC_CHANNELER: ChannelerGUID.insert(pCreature->GetGUID()); break; - } + case GO_MANTICRON_CUBE: + pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + break; + case GO_DOODAD_HF_MAG_DOOR01: // event door + m_mGoEntryGuidStore[GO_DOODAD_HF_MAG_DOOR01] = pGo->GetObjectGuid(); + break; + case GO_DOODAD_HF_RAID_FX01: // hall + case GO_MAGTHERIDON_COLUMN_003: // six columns + case GO_MAGTHERIDON_COLUMN_002: + case GO_MAGTHERIDON_COLUMN_004: + case GO_MAGTHERIDON_COLUMN_005: + case GO_MAGTHERIDON_COLUMN_000: + case GO_MAGTHERIDON_COLUMN_001: + m_sColumnGuid.insert(pGo->GetObjectGuid()); + break; } +} - void OnObjectCreate(GameObject* pGo) +void instance_magtheridons_lair::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(pGo->GetEntry()) - { - case 181713: - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - break; - case 183847: //event door - m_uiDoorGUID = pGo->GetGUID(); - break; - case 184653: // hall - case 184634: // six columns - case 184635: - case 184636: - case 184637: - case 184638: - case 184639: - ColumnGUID.insert(pGo->GetGUID()); - break; - } - } + case TYPE_MAGTHERIDON_EVENT: + m_auiEncounter[0] = uiData; + if (uiData == NOT_STARTED) + m_uiRespawnTimer = 10000; + if (uiData != IN_PROGRESS) + { + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_DOODAD_HF_MAG_DOOR01)) + pDoor->SetGoState(GO_STATE_ACTIVE); + } + break; + case TYPE_CHANNELER_EVENT: + switch(uiData) + { + case NOT_STARTED: // Reset all channelers once one is reset. + if (m_auiEncounter[1] != NOT_STARTED) + { + m_auiEncounter[1] = NOT_STARTED; - void SetData(uint32 uiType, uint32 uiData) - { - switch(uiType) - { - case TYPE_MAGTHERIDON_EVENT: - m_auiEncounter[0] = uiData; - if (uiData == NOT_STARTED) - m_uiRespawnTimer = 10000; - if (uiData != IN_PROGRESS) - { - if (GameObject* pDoor = instance->GetGameObject(m_uiDoorGUID)) - pDoor->SetGoState(GO_STATE_ACTIVE); - } - break; - case TYPE_CHANNELER_EVENT: - switch(uiData) - { - case NOT_STARTED: // Reset all channelers once one is reset. - if (m_auiEncounter[1] != NOT_STARTED) + if (m_sChannelerGuid.empty()) { - m_auiEncounter[1] = NOT_STARTED; + debug_log("SD2: Instance Magtheridon: Channeler GUID list are empty."); + break; + } - if (ChannelerGUID.empty()) + for(GUIDSet::const_iterator itr = m_sChannelerGuid.begin(); itr != m_sChannelerGuid.end(); ++itr) + { + if (Creature* pChanneler = instance->GetCreature(*itr)) { - debug_log("SD2: Instance Magtheridon: Channeler GUID list are empty."); - break; + if (pChanneler->isAlive()) + pChanneler->AI()->EnterEvadeMode(); + else + pChanneler->Respawn(); } + } - for(GUIDSet::const_iterator itr = ChannelerGUID.begin(); itr != ChannelerGUID.end(); ++itr) - { - if (Creature* pChanneler = instance->GetCreature(*itr)) - { - if (pChanneler->isAlive()) - pChanneler->AI()->EnterEvadeMode(); - else - pChanneler->Respawn(); - } - } + m_uiCageTimer = 0; - m_uiCageTimer = 0; + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_DOODAD_HF_MAG_DOOR01)) + pDoor->SetGoState(GO_STATE_ACTIVE); + } + break; + case IN_PROGRESS: // Event start. + if (m_auiEncounter[1] != IN_PROGRESS) + { + m_auiEncounter[1] = IN_PROGRESS; - if (GameObject* pDoor = instance->GetGameObject(m_uiDoorGUID)) - pDoor->SetGoState(GO_STATE_ACTIVE); - } - break; - case IN_PROGRESS: // Event start. - if (m_auiEncounter[1] != IN_PROGRESS) + // Let all five channelers aggro. + for(GUIDSet::const_iterator itr = m_sChannelerGuid.begin(); itr != m_sChannelerGuid.end(); ++itr) { - m_auiEncounter[1] = IN_PROGRESS; + Creature* pChanneler = instance->GetCreature(*itr); - // Let all five channelers aggro. - for(GUIDSet::const_iterator itr = ChannelerGUID.begin(); itr != ChannelerGUID.end(); ++itr) - { - Creature* pChanneler = instance->GetCreature(*itr); + if (pChanneler && pChanneler->isAlive()) + AttackNearestTarget(pChanneler); + } - if (pChanneler && pChanneler->isAlive()) - AttackNearestTarget(pChanneler); - } + // Magtheridon breaks free after two minutes. + Creature* pMagtheridon = GetSingleCreatureFromStorage(NPC_MAGTHERIDON); - // Magtheridon breaks free after two minutes. - Creature* pMagtheridon = instance->GetCreature(m_uiMagtheridonGUID); + if (pMagtheridon && pMagtheridon->isAlive()) + m_uiCageTimer = 120000; - if (pMagtheridon && pMagtheridon->isAlive()) - m_uiCageTimer = 120000; + if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_DOODAD_HF_MAG_DOOR01)) + pDoor->SetGoState(GO_STATE_READY); + } + break; + case DONE: // Add buff and check if all channelers are dead. + for(GUIDSet::iterator itr = m_sChannelerGuid.begin(); itr != m_sChannelerGuid.end(); ++itr) + { + Creature* pChanneler = instance->GetCreature(*itr); - if (GameObject* pDoor = instance->GetGameObject(m_uiDoorGUID)) - pDoor->SetGoState(GO_STATE_READY); - } - break; - case DONE: // Add buff and check if all channelers are dead. - for(GUIDSet::iterator itr = ChannelerGUID.begin(); itr != ChannelerGUID.end(); ++itr) + if (pChanneler && pChanneler->isAlive()) { - Creature* pChanneler = instance->GetCreature(*itr); - - if (pChanneler && pChanneler->isAlive()) - { - //Channeler->InterruptNonMeleeSpells(false); - //Channeler->CastSpell(Channeler, SPELL_SOUL_TRANSFER, false); - uiData = IN_PROGRESS; - break; - } + //Channeler->InterruptNonMeleeSpells(false); + //Channeler->CastSpell(Channeler, SPELL_SOUL_TRANSFER, false); + uiData = IN_PROGRESS; + break; } - break; - } - m_auiEncounter[1] = uiData; - break; - case TYPE_HALL_COLLAPSE: - // IN_PROGRESS - collapse / NOT_STARTED - reset - for(GUIDSet::const_iterator itr = ColumnGUID.begin(); itr != ColumnGUID.end(); ++itr) - DoUseDoorOrButton(*itr); - break; - } + } + break; + } + m_auiEncounter[1] = uiData; + break; + case TYPE_HALL_COLLAPSE: + // IN_PROGRESS - collapse / NOT_STARTED - reset + for(GUIDSet::const_iterator itr = m_sColumnGuid.begin(); itr != m_sColumnGuid.end(); ++itr) + DoUseDoorOrButton(*itr); + break; } +} - uint32 GetData(uint32 uiType) - { - if (uiType == TYPE_MAGTHERIDON_EVENT) - return m_auiEncounter[0]; - if (uiType == TYPE_CHANNELER_EVENT) - return m_auiEncounter[1]; - - return 0; - } +uint32 instance_magtheridons_lair::GetData(uint32 uiType) +{ + if (uiType == TYPE_MAGTHERIDON_EVENT) + return m_auiEncounter[0]; + if (uiType == TYPE_CHANNELER_EVENT) + return m_auiEncounter[1]; - uint64 GetData64(uint32 uiData) - { - if (uiData == DATA_MAGTHERIDON) - return m_uiMagtheridonGUID; + return 0; +} - return 0; - } +void instance_magtheridons_lair::AttackNearestTarget(Creature* pCreature) +{ + float minRange = VISIBLE_RANGE; + float range; + Player* target = NULL; - void AttackNearestTarget(Creature* pCreature) + Map::PlayerList const& players = instance->GetPlayers(); + for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { - float minRange = VISIBLE_RANGE; - float range; - Player* target = NULL; - - Map::PlayerList const& players = instance->GetPlayers(); - for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* i_pl = itr->getSource()) { - if (Player* i_pl = itr->getSource()) + if (i_pl->isTargetableForAttack()) { - if (i_pl->isTargetableForAttack()) + range = i_pl->GetDistance(pCreature); + if (range < minRange) { - range = i_pl->GetDistance(pCreature); - if (range < minRange) - { - minRange = range; - target = i_pl; - } + minRange = range; + target = i_pl; } } } + } - if (!target) - { - debug_log("SD2: Instance Magtheridon: AttackNearestTarget failed. No player."); - return; - } - pCreature->AI()->AttackStart(target); + if (!target) + { + debug_log("SD2: Instance Magtheridon: AttackNearestTarget failed. No player."); + return; } + pCreature->AI()->AttackStart(target); +} - void Update(uint32 uiDiff) +void instance_magtheridons_lair::Update(uint32 uiDiff) +{ + if (m_uiCageTimer) { - if (m_uiCageTimer) + if (m_uiCageTimer <= uiDiff) { - if (m_uiCageTimer <= uiDiff) - { - SetData(TYPE_MAGTHERIDON_EVENT, IN_PROGRESS); - m_uiCageTimer = 0; - } - else - m_uiCageTimer -= uiDiff; + SetData(TYPE_MAGTHERIDON_EVENT, IN_PROGRESS); + m_uiCageTimer = 0; } + else + m_uiCageTimer -= uiDiff; + } - if (m_uiRespawnTimer) + if (m_uiRespawnTimer) + { + if (m_uiRespawnTimer <= uiDiff) { - if (m_uiRespawnTimer <= uiDiff) + for(GUIDSet::const_iterator itr = m_sChannelerGuid.begin(); itr != m_sChannelerGuid.end(); ++itr) { - for(GUIDSet::const_iterator itr = ChannelerGUID.begin(); itr != ChannelerGUID.end(); ++itr) + if (Creature* pChanneler = instance->GetCreature(*itr)) { - if (Creature* pChanneler = instance->GetCreature(*itr)) - { - if (pChanneler->isAlive()) - pChanneler->AI()->EnterEvadeMode(); - else - pChanneler->Respawn(); - } + if (pChanneler->isAlive()) + pChanneler->AI()->EnterEvadeMode(); + else + pChanneler->Respawn(); } - - m_uiRespawnTimer = 0; } - else - m_uiRespawnTimer -= uiDiff; + + m_uiRespawnTimer = 0; } + else + m_uiRespawnTimer -= uiDiff; } -}; +} InstanceData* GetInstanceData_instance_magtheridons_lair(Map* pMap) { @@ -278,9 +255,10 @@ InstanceData* GetInstanceData_instance_magtheridons_lair(Map* pMap) void AddSC_instance_magtheridons_lair() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_magtheridons_lair"; - newscript->GetInstanceData = &GetInstanceData_instance_magtheridons_lair; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_magtheridons_lair"; + pNewScript->GetInstanceData = &GetInstanceData_instance_magtheridons_lair; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h b/scripts/outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h index 971efcc..91a10ea 100644 --- a/scripts/outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h +++ b/scripts/outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h @@ -11,18 +11,56 @@ enum TYPE_MAGTHERIDON_EVENT = 1, TYPE_CHANNELER_EVENT = 2, - DATA_MAGTHERIDON = 3, TYPE_HALL_COLLAPSE = 4, DATA_CHANNELER = 5, - NPC_MAGTHERION = 17257, + NPC_MAGTHERIDON = 17257, NPC_CHANNELER = 17256, SPELL_SOUL_TRANSFER = 30531, SPELL_BLAZE_TARGET = 30541, SPELL_DEBRIS_DAMAGE = 30631, - SPELL_DEBRIS_KNOCKDOWN = 36449 + SPELL_DEBRIS_KNOCKDOWN = 36449, + + GO_MANTICRON_CUBE = 181713, + GO_DOODAD_HF_MAG_DOOR01 = 183847, + GO_DOODAD_HF_RAID_FX01 = 184653, + GO_MAGTHERIDON_COLUMN_003 = 184634, + GO_MAGTHERIDON_COLUMN_002 = 184635, + GO_MAGTHERIDON_COLUMN_004 = 184636, + GO_MAGTHERIDON_COLUMN_005 = 184637, + GO_MAGTHERIDON_COLUMN_000 = 184638, + GO_MAGTHERIDON_COLUMN_001 = 184639, +}; + +class MANGOS_DLL_DECL instance_magtheridons_lair : public ScriptedInstance +{ + public: + instance_magtheridons_lair(Map* pMap); + + void Initialize(); + + bool IsEncounterInProgress() const; + + void OnCreatureCreate(Creature* pCreature); + void OnObjectCreate(GameObject* pGo); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + void AttackNearestTarget(Creature* pCreature); + + void Update(uint32 uiDiff); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; + + GUIDSet m_sChannelerGuid; + GUIDSet m_sColumnGuid; + + uint32 m_uiCageTimer; + uint32 m_uiRespawnTimer; }; #endif diff --git a/scripts/outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp b/scripts/outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp index ffe19a1..ff1ef38 100644 --- a/scripts/outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp +++ b/scripts/outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp @@ -107,7 +107,7 @@ struct MANGOS_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI uint32 m_uiShadowFissureTimer; uint32 m_uiCleaveTimer; - uint64 m_uiLastEventInvokerGUID; + ObjectGuid m_lastEventInvokerGuid; void Reset() { @@ -127,7 +127,7 @@ struct MANGOS_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI m_uiShadowFissureTimer = 8000; m_uiCleaveTimer = 5000; - m_uiLastEventInvokerGUID = 0; + m_lastEventInvokerGuid.Clear(); } void DoYellForPeonAggro(Unit* pWho) @@ -139,7 +139,7 @@ struct MANGOS_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI ++m_uiPeonEngagedCount; if (pWho) - m_uiLastEventInvokerGUID = pWho->GetGUID(); + m_lastEventInvokerGuid = pWho->GetObjectGuid(); } void DoYellForPeonDeath(Unit* pKiller) @@ -182,7 +182,7 @@ struct MANGOS_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI m_bIsMainEvent = true; m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* pEnemy = m_creature->GetMap()->GetUnit(m_uiLastEventInvokerGUID)) + if (Unit* pEnemy = m_creature->GetMap()->GetUnit(m_lastEventInvokerGuid)) AttackStart(pEnemy); } @@ -215,7 +215,7 @@ struct MANGOS_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI m_bIntroOnce = true; m_bIsIntroEvent = true; - m_uiLastEventInvokerGUID = pWho->GetGUID(); + m_lastEventInvokerGuid = pWho->GetObjectGuid(); if (m_pInstance) m_pInstance->SetData(TYPE_NETHEKURSE, IN_PROGRESS); @@ -369,7 +369,7 @@ struct MANGOS_DLL_DECL mob_fel_orc_convertAI : public ScriptedAI { if (m_pInstance) { - Creature* pKurse = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_NETHEKURSE)); + Creature* pKurse = m_pInstance->GetSingleCreatureFromStorage(NPC_NETHEKURSE); if (pKurse && m_creature->IsWithinDist(pKurse, 45.0f)) { if (boss_grand_warlock_nethekurseAI* pKurseAI = dynamic_cast(pKurse->AI())) @@ -390,7 +390,7 @@ struct MANGOS_DLL_DECL mob_fel_orc_convertAI : public ScriptedAI if (m_pInstance->GetData(TYPE_NETHEKURSE) != IN_PROGRESS) return; - if (Creature* pKurse = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_NETHEKURSE))) + if (Creature* pKurse = m_pInstance->GetSingleCreatureFromStorage(NPC_NETHEKURSE)) { if (boss_grand_warlock_nethekurseAI* pKurseAI = dynamic_cast(pKurse->AI())) pKurseAI->DoYellForPeonDeath(pKiller); diff --git a/scripts/outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp b/scripts/outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp index e2fc514..b68fe31 100644 --- a/scripts/outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp +++ b/scripts/outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp @@ -134,8 +134,6 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI { boss_warbringer_omroggAI(Creature* pCreature) : ScriptedAI(pCreature) { - m_uiLeftHeadGUID = 0; - m_uiRightHeadGUID = 0; m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); Reset(); @@ -144,8 +142,8 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI ScriptedInstance* m_pInstance; bool m_bIsRegularMode; - uint64 m_uiLeftHeadGUID; - uint64 m_uiRightHeadGUID; + ObjectGuid m_leftHeadGuid; + ObjectGuid m_rightHeadGuid; int m_iAggro; int m_iThreat; @@ -166,16 +164,16 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI void Reset() { - if (Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_uiLeftHeadGUID)) + if (Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_leftHeadGuid)) { pLeftHead->SetDeathState(JUST_DIED); - m_uiLeftHeadGUID = 0; + m_leftHeadGuid.Clear(); } - if (Creature* pRightHead = m_creature->GetMap()->GetCreature(m_uiRightHeadGUID)) + if (Creature* pRightHead = m_creature->GetMap()->GetCreature(m_rightHeadGuid)) { pRightHead->SetDeathState(JUST_DIED); - m_uiRightHeadGUID = 0; + m_rightHeadGuid.Clear(); } m_bAggroYell = false; @@ -197,8 +195,8 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI void DoYellForThreat() { - Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_uiLeftHeadGUID); - Creature* pRightHead = m_creature->GetMap()->GetCreature(m_uiRightHeadGUID); + Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_leftHeadGuid); + Creature* pRightHead = m_creature->GetMap()->GetCreature(m_rightHeadGuid); if (!pLeftHead || !pRightHead) return; @@ -218,7 +216,7 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI m_creature->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); m_creature->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - if (Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_uiLeftHeadGUID)) + if (Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_leftHeadGuid)) { m_iAggro = irand(0, 2); @@ -235,10 +233,10 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI void JustSummoned(Creature* pSummoned) { if (pSummoned->GetEntry() == NPC_LEFT_HEAD) - m_uiLeftHeadGUID = pSummoned->GetGUID(); + m_leftHeadGuid = pSummoned->GetObjectGuid(); if (pSummoned->GetEntry() == NPC_RIGHT_HEAD) - m_uiRightHeadGUID = pSummoned->GetGUID(); + m_rightHeadGuid = pSummoned->GetObjectGuid(); //summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -247,8 +245,8 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI void KilledUnit(Unit* pVictim) { - Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_uiLeftHeadGUID); - Creature* pRightHead = m_creature->GetMap()->GetCreature(m_uiRightHeadGUID); + Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_leftHeadGuid); + Creature* pRightHead = m_creature->GetMap()->GetCreature(m_rightHeadGuid); if (!pLeftHead || !pRightHead) return; @@ -273,8 +271,8 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI void JustDied(Unit* pKiller) { - Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_uiLeftHeadGUID); - Creature* pRightHead = m_creature->GetMap()->GetCreature(m_uiRightHeadGUID); + Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_leftHeadGuid); + Creature* pRightHead = m_creature->GetMap()->GetCreature(m_rightHeadGuid); if (!pLeftHead || !pRightHead) return; @@ -295,8 +293,8 @@ struct MANGOS_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI { m_uiDelay_Timer = 3500; - Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_uiLeftHeadGUID); - Creature* pRightHead = m_creature->GetMap()->GetCreature(m_uiRightHeadGUID); + Creature* pLeftHead = m_creature->GetMap()->GetCreature(m_leftHeadGuid); + Creature* pRightHead = m_creature->GetMap()->GetCreature(m_rightHeadGuid); if (!pLeftHead || !pRightHead) return; diff --git a/scripts/outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp b/scripts/outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp index a3acfcf..c080e30 100644 --- a/scripts/outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp +++ b/scripts/outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp @@ -113,10 +113,10 @@ struct MANGOS_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0)) summoned->AI()->AttackStart(pTarget); - adds.push_back(summoned->GetGUID()); + adds.push_back(summoned->GetObjectGuid()); break; case MOB_SHATTERED_ASSASSIN: - assassins.push_back(summoned->GetGUID()); + assassins.push_back(summoned->GetObjectGuid()); break; } } diff --git a/scripts/outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp b/scripts/outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp index 093fffe..26c6e15 100644 --- a/scripts/outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp +++ b/scripts/outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp @@ -24,10 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "shattered_halls.h" -instance_shattered_halls::instance_shattered_halls(Map* pMap) : ScriptedInstance(pMap), - m_uiNethekurseGUID(0), - m_uiNethekurseDoorGUID(0), - m_uiNethekurseEnterDoorGUID(0) +instance_shattered_halls::instance_shattered_halls(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } @@ -42,22 +39,25 @@ void instance_shattered_halls::OnObjectCreate(GameObject* pGo) switch (pGo->GetEntry()) { case GO_NETHEKURSE_DOOR: - m_uiNethekurseDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_NETHEKURSE] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_NETHERKURSE_ENTER_DOOR: - m_uiNethekurseEnterDoorGUID = pGo->GetGUID(); if (m_auiEncounter[TYPE_NETHEKURSE] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; + + default: + return; } + + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); } void instance_shattered_halls::OnCreatureCreate(Creature* pCreature) { if (pCreature->GetEntry() == NPC_NETHEKURSE) - m_uiNethekurseGUID = pCreature->GetGUID(); + m_mNpcEntryGuidStore[NPC_NETHEKURSE] = pCreature->GetObjectGuid(); } void instance_shattered_halls::SetData(uint32 uiType, uint32 uiData) @@ -67,7 +67,7 @@ void instance_shattered_halls::SetData(uint32 uiType, uint32 uiData) case TYPE_NETHEKURSE: m_auiEncounter[uiType] = uiData; if (uiData == DONE) - DoUseDoorOrButton(m_uiNethekurseDoorGUID); + DoUseDoorOrButton(GO_NETHEKURSE_DOOR); break; case TYPE_OMROGG: m_auiEncounter[uiType] = uiData; @@ -119,18 +119,6 @@ uint32 instance_shattered_halls::GetData(uint32 uiType) return 0; } -uint64 instance_shattered_halls::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_NETHEKURSE: return m_uiNethekurseGUID; - case GO_NETHEKURSE_DOOR: return m_uiNethekurseDoorGUID; - case GO_NETHERKURSE_ENTER_DOOR: return m_uiNethekurseEnterDoorGUID; - default: - return 0; - } -} - InstanceData* GetInstanceData_instance_shattered_halls(Map* pMap) { return new instance_shattered_halls(pMap); diff --git a/scripts/outland/hellfire_citadel/shattered_halls/shattered_halls.h b/scripts/outland/hellfire_citadel/shattered_halls/shattered_halls.h index 48dde86..bc342ff 100644 --- a/scripts/outland/hellfire_citadel/shattered_halls/shattered_halls.h +++ b/scripts/outland/hellfire_citadel/shattered_halls/shattered_halls.h @@ -31,7 +31,6 @@ class MANGOS_DLL_DECL instance_shattered_halls : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); const char* Save() { return m_strInstData.c_str(); } void Load(const char* chrIn); @@ -39,11 +38,6 @@ class MANGOS_DLL_DECL instance_shattered_halls : public ScriptedInstance private: uint32 m_auiEncounter[MAX_ENCOUNTER]; std::string m_strInstData; - - uint64 m_uiNethekurseGUID; - - uint64 m_uiNethekurseDoorGUID; - uint64 m_uiNethekurseEnterDoorGUID; }; #endif diff --git a/scripts/outland/netherstorm.cpp b/scripts/outland/netherstorm.cpp index 8a43b2d..71f70ac 100644 --- a/scripts/outland/netherstorm.cpp +++ b/scripts/outland/netherstorm.cpp @@ -615,8 +615,6 @@ bool AreaTrigger_at_commander_dawnforge(Player* pPlayer, AreaTriggerEntry const* pDawnforgeAI->CanStartEvent(pPlayer); return true; } - - } return false; } diff --git a/scripts/outland/shadowmoon_valley.cpp b/scripts/outland/shadowmoon_valley.cpp index 78ed7e7..7055cbf 100644 --- a/scripts/outland/shadowmoon_valley.cpp +++ b/scripts/outland/shadowmoon_valley.cpp @@ -331,7 +331,7 @@ struct MANGOS_DLL_DECL npc_dragonmaw_peonAI : public ScriptedAI bool SetPlayerTarget(ObjectGuid playerGuid) { // Check if event already started - if (!m_playerGuid.IsEmpty()) + if (m_playerGuid) return false; m_playerGuid = playerGuid; @@ -1225,7 +1225,7 @@ struct MANGOS_DLL_DECL npc_lord_illidan_stormrageAI : public Scripted_NoMovement // increment mob count ++m_uiMobCount; - if (m_playerGuid.IsEmpty()) + if (!m_playerGuid) return; if (pSummoned->GetEntry() == NPC_TORLOTH_THE_MAGNIFICENT) @@ -1320,7 +1320,7 @@ struct MANGOS_DLL_DECL npc_lord_illidan_stormrageAI : public Scripted_NoMovement void UpdateAI(const uint32 uiDiff) { - if (m_playerGuid.IsEmpty() || !m_bEventStarted) + if (!m_playerGuid || !m_bEventStarted) return; if (!m_uiMobCount && m_uiWaveCount < 4) diff --git a/scripts/outland/tempest_keep/arcatraz/arcatraz.cpp b/scripts/outland/tempest_keep/arcatraz/arcatraz.cpp index 66088f1..0f960cc 100644 --- a/scripts/outland/tempest_keep/arcatraz/arcatraz.cpp +++ b/scripts/outland/tempest_keep/arcatraz/arcatraz.cpp @@ -320,7 +320,7 @@ struct MANGOS_DLL_DECL npc_warden_mellicharAI : public ScriptedAI { m_pInstance->SetData(TYPE_HARBINGERSKYRISS, IN_PROGRESS); - if (GameObject* pSphere = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_SEAL_SPHERE))) + if (GameObject* pSphere = m_pInstance->GetSingleGameObjectFromStorage(GO_SEAL_SPHERE)) pSphere->SetGoState(GO_STATE_READY); m_bIsEventRunning = true; diff --git a/scripts/outland/tempest_keep/arcatraz/arcatraz.h b/scripts/outland/tempest_keep/arcatraz/arcatraz.h index 7ee57a5..dbaf1ee 100644 --- a/scripts/outland/tempest_keep/arcatraz/arcatraz.h +++ b/scripts/outland/tempest_keep/arcatraz/arcatraz.h @@ -31,4 +31,21 @@ enum GO_POD_OMEGA = 183965, // Pod fifth boss wave }; +class MANGOS_DLL_DECL instance_arcatraz : public ScriptedInstance +{ + public: + instance_arcatraz(Map* pMap); + + void Initialize(); + + void OnObjectCreate(GameObject* pGo); + void OnCreatureCreate(Creature* pCreature); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; +}; + #endif diff --git a/scripts/outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp b/scripts/outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp index f317f16..ec1e214 100644 --- a/scripts/outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp +++ b/scripts/outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp @@ -147,14 +147,14 @@ struct MANGOS_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI { case 1: DoScriptText(SAY_INTRO, m_creature); - if (GameObject* pSphere = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_SEAL_SPHERE))) + if (GameObject* pSphere = m_pInstance->GetSingleGameObjectFromStorage(GO_SEAL_SPHERE)) pSphere->SetGoState(GO_STATE_ACTIVE); ++m_uiIntroPhase; m_uiIntroTimer = 25000; break; case 2: DoScriptText(SAY_AGGRO, m_creature); - if (Creature* pMellic = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_MELLICHAR))) + if (Creature* pMellic = m_pInstance->GetSingleCreatureFromStorage(NPC_MELLICHAR)) { // should have a better way to do this. possibly spell exist. pMellic->SetDeathState(JUST_DIED); diff --git a/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp b/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp index 165307e..cc3e8b5 100644 --- a/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp +++ b/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp @@ -31,164 +31,115 @@ EndScriptData */ 4 - Harbinger Skyriss event, 5 sub-events */ -struct MANGOS_DLL_DECL instance_arcatraz : public ScriptedInstance -{ - instance_arcatraz(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - uint64 m_uiCore_Security_Field_AlphaGUID; - uint64 m_uiCore_Security_Field_BetaGUID; - uint64 m_uiPod_AlphaGUID; - uint64 m_uiPod_GammaGUID; - uint64 m_uiPod_BetaGUID; - uint64 m_uiPod_DeltaGUID; - uint64 m_uiPod_OmegaGUID; - - uint64 m_uiGoSphereGUID; - uint64 m_uiMellicharGUID; - - void Initialize() - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - m_uiCore_Security_Field_AlphaGUID = 0; - m_uiCore_Security_Field_BetaGUID = 0; - m_uiPod_AlphaGUID = 0; - m_uiPod_BetaGUID = 0; - m_uiPod_DeltaGUID = 0; - m_uiPod_GammaGUID = 0; - m_uiPod_OmegaGUID = 0; - - m_uiGoSphereGUID = 0; - m_uiMellicharGUID = 0; - } +instance_arcatraz::instance_arcatraz(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } - bool IsEncounterInProgress() const - { - for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) return true; - - return false; - } - - void OnObjectCreate(GameObject* pGo) - { - switch(pGo->GetEntry()) - { - case GO_CORE_SECURITY_FIELD_ALPHA: m_uiCore_Security_Field_AlphaGUID = pGo->GetGUID(); break; - case GO_CORE_SECURITY_FIELD_BETA: m_uiCore_Security_Field_BetaGUID = pGo->GetGUID(); break; - case GO_SEAL_SPHERE: m_uiGoSphereGUID = pGo->GetGUID(); break; - case GO_POD_ALPHA: m_uiPod_AlphaGUID = pGo->GetGUID(); break; - case GO_POD_BETA: m_uiPod_BetaGUID = pGo->GetGUID(); break; - case GO_POD_DELTA: m_uiPod_DeltaGUID = pGo->GetGUID(); break; - case GO_POD_GAMMA: m_uiPod_GammaGUID = pGo->GetGUID(); break; - case GO_POD_OMEGA: m_uiPod_OmegaGUID = pGo->GetGUID(); break; - } - } +void instance_arcatraz::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void OnCreatureCreate(Creature* pCreature) +void instance_arcatraz::OnObjectCreate(GameObject* pGo) +{ + switch(pGo->GetEntry()) { - if (pCreature->GetEntry() == NPC_MELLICHAR) - m_uiMellicharGUID = pCreature->GetGUID(); + case GO_CORE_SECURITY_FIELD_ALPHA: + case GO_CORE_SECURITY_FIELD_BETA: + case GO_SEAL_SPHERE: + case GO_POD_ALPHA: + case GO_POD_BETA: + case GO_POD_DELTA: + case GO_POD_GAMMA: + case GO_POD_OMEGA: + m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); + break; } +} - void SetData(uint32 uiType, uint32 uiData) - { - switch(uiType) - { - case TYPE_ZEREKETH: - m_auiEncounter[0] = uiData; - break; - - case TYPE_DALLIAH: - if (uiData == DONE) - DoUseDoorOrButton(m_uiCore_Security_Field_BetaGUID); - m_auiEncounter[1] = uiData; - break; - - case TYPE_SOCCOTHRATES: - if (uiData == DONE) - DoUseDoorOrButton(m_uiCore_Security_Field_AlphaGUID); - m_auiEncounter[2] = uiData; - break; - - case TYPE_HARBINGERSKYRISS: - if (uiData == NOT_STARTED || uiData == FAIL) - { - m_auiEncounter[4] = NOT_STARTED; - m_auiEncounter[5] = NOT_STARTED; - m_auiEncounter[6] = NOT_STARTED; - m_auiEncounter[7] = NOT_STARTED; - m_auiEncounter[8] = NOT_STARTED; - } - m_auiEncounter[3] = uiData; - break; - - case TYPE_WARDEN_1: - if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiPod_AlphaGUID); - m_auiEncounter[4] = uiData; - break; - - case TYPE_WARDEN_2: - if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiPod_BetaGUID); - m_auiEncounter[5] = uiData; - break; - - case TYPE_WARDEN_3: - if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiPod_DeltaGUID); - m_auiEncounter[6] = uiData; - break; - - case TYPE_WARDEN_4: - if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiPod_GammaGUID); - m_auiEncounter[7] = uiData; - break; - - case TYPE_WARDEN_5: - if (uiData == IN_PROGRESS) - DoUseDoorOrButton(m_uiPod_OmegaGUID); - m_auiEncounter[8] = uiData; - break; - } - } +void instance_arcatraz::OnCreatureCreate(Creature* pCreature) +{ + if (pCreature->GetEntry() == NPC_MELLICHAR) + m_mNpcEntryGuidStore[NPC_MELLICHAR] = pCreature->GetObjectGuid(); +} - uint32 GetData(uint32 uiType) +void instance_arcatraz::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_HARBINGERSKYRISS: - return m_auiEncounter[3]; - case TYPE_WARDEN_1: - return m_auiEncounter[4]; - case TYPE_WARDEN_2: - return m_auiEncounter[5]; - case TYPE_WARDEN_3: - return m_auiEncounter[6]; - case TYPE_WARDEN_4: - return m_auiEncounter[7]; - case TYPE_WARDEN_5: - return m_auiEncounter[8]; - } - return 0; + case TYPE_ZEREKETH: + m_auiEncounter[0] = uiData; + break; + + case TYPE_DALLIAH: + if (uiData == DONE) + DoUseDoorOrButton(GO_CORE_SECURITY_FIELD_BETA); + m_auiEncounter[1] = uiData; + break; + + case TYPE_SOCCOTHRATES: + if (uiData == DONE) + DoUseDoorOrButton(GO_CORE_SECURITY_FIELD_ALPHA); + m_auiEncounter[2] = uiData; + break; + + case TYPE_HARBINGERSKYRISS: + if (uiData == NOT_STARTED || uiData == FAIL) + { + m_auiEncounter[4] = NOT_STARTED; + m_auiEncounter[5] = NOT_STARTED; + m_auiEncounter[6] = NOT_STARTED; + m_auiEncounter[7] = NOT_STARTED; + m_auiEncounter[8] = NOT_STARTED; + } + m_auiEncounter[3] = uiData; + break; + + case TYPE_WARDEN_1: + if (uiData == IN_PROGRESS) + DoUseDoorOrButton(GO_POD_ALPHA); + m_auiEncounter[4] = uiData; + break; + + case TYPE_WARDEN_2: + if (uiData == IN_PROGRESS) + DoUseDoorOrButton(GO_POD_BETA); + m_auiEncounter[5] = uiData; + break; + + case TYPE_WARDEN_3: + if (uiData == IN_PROGRESS) + DoUseDoorOrButton(GO_POD_DELTA); + m_auiEncounter[6] = uiData; + break; + + case TYPE_WARDEN_4: + if (uiData == IN_PROGRESS) + DoUseDoorOrButton(GO_POD_GAMMA); + m_auiEncounter[7] = uiData; + break; + + case TYPE_WARDEN_5: + if (uiData == IN_PROGRESS) + DoUseDoorOrButton(GO_POD_OMEGA); + m_auiEncounter[8] = uiData; + break; } +} - uint64 GetData64(uint32 uiData) +uint32 instance_arcatraz::GetData(uint32 uiType) +{ + switch(uiType) { - switch(uiData) - { - case NPC_MELLICHAR: - return m_uiMellicharGUID; - case GO_SEAL_SPHERE: - return m_uiGoSphereGUID; - } - return 0; + case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3]; + case TYPE_WARDEN_1: return m_auiEncounter[4]; + case TYPE_WARDEN_2: return m_auiEncounter[5]; + case TYPE_WARDEN_3: return m_auiEncounter[6]; + case TYPE_WARDEN_4: return m_auiEncounter[7]; + case TYPE_WARDEN_5: return m_auiEncounter[8]; + + default: + return 0; } -}; +} InstanceData* GetInstanceData_instance_arcatraz(Map* pMap) { @@ -197,9 +148,10 @@ InstanceData* GetInstanceData_instance_arcatraz(Map* pMap) void AddSC_instance_arcatraz() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_arcatraz"; - newscript->GetInstanceData = &GetInstanceData_instance_arcatraz; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_arcatraz"; + pNewScript->GetInstanceData = &GetInstanceData_instance_arcatraz; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp b/scripts/outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp index 605d33d..08d9eca 100644 --- a/scripts/outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp +++ b/scripts/outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp @@ -72,7 +72,7 @@ struct MANGOS_DLL_DECL boss_high_botanist_freywinnAI : public ScriptedAI void JustSummoned(Creature *summoned) { if (summoned->GetEntry() == ENTRY_FRAYER) - Adds_List.push_back(summoned->GetGUID()); + Adds_List.push_back(summoned->GetObjectGuid()); } void DoSummonSeedling() diff --git a/scripts/outland/tempest_keep/botanica/boss_warp_splinter.cpp b/scripts/outland/tempest_keep/botanica/boss_warp_splinter.cpp index 8141733..09b3391 100644 --- a/scripts/outland/tempest_keep/botanica/boss_warp_splinter.cpp +++ b/scripts/outland/tempest_keep/botanica/boss_warp_splinter.cpp @@ -31,11 +31,10 @@ struct MANGOS_DLL_DECL mob_treantAI : public ScriptedAI { mob_treantAI (Creature* pCreature) : ScriptedAI(pCreature) { - WarpGuid = 0; Reset(); } - uint64 WarpGuid; + ObjectGuid m_warpGuid; void Reset() { @@ -49,7 +48,7 @@ struct MANGOS_DLL_DECL mob_treantAI : public ScriptedAI if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; - if (m_creature->getVictim()->GetGUID() != WarpGuid) + if (m_creature->getVictim()->GetObjectGuid() != m_warpGuid) DoMeleeAttackIfReady(); } }; @@ -97,7 +96,7 @@ struct MANGOS_DLL_DECL boss_warp_splinterAI : public ScriptedAI uint32 Arcane_Volley_Timer; uint32 CheckTreantLOS_Timer; uint32 TreantLife_Timer; - uint64 Treant_GUIDs[6]; + ObjectGuid m_aTreantGuid[6]; float Treant_Spawn_Pos_X; float Treant_Spawn_Pos_Y; @@ -111,7 +110,7 @@ struct MANGOS_DLL_DECL boss_warp_splinterAI : public ScriptedAI TreantLife_Timer = 999999; for(int i = 0; i < 6; ++i) - Treant_GUIDs[i] = 0; + m_aTreantGuid[i].Clear(); m_creature->SetSpeedRate(MOVE_RUN, 0.7f); } @@ -147,10 +146,10 @@ struct MANGOS_DLL_DECL boss_warp_splinterAI : public ScriptedAI { //pTreant->GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature)); pTreant->AddThreat(m_creature); - Treant_GUIDs[i] = pTreant->GetGUID(); + m_aTreantGuid[i] = pTreant->GetObjectGuid(); if (mob_treantAI* pTreantAI = dynamic_cast(pTreant->AI())) - pTreantAI->WarpGuid = m_creature->GetGUID(); + pTreantAI->m_warpGuid = m_creature->GetObjectGuid(); } } @@ -162,7 +161,7 @@ struct MANGOS_DLL_DECL boss_warp_splinterAI : public ScriptedAI { for(int i=0; i<6; ++i) { - Creature* pTreant = m_creature->GetMap()->GetCreature(Treant_GUIDs[i]); + Creature* pTreant = m_creature->GetMap()->GetCreature(m_aTreantGuid[i]); if (pTreant) { diff --git a/scripts/outland/tempest_keep/the_eye/boss_astromancer.cpp b/scripts/outland/tempest_keep/the_eye/boss_astromancer.cpp index b02a5c7..2d340c9 100644 --- a/scripts/outland/tempest_keep/the_eye/boss_astromancer.cpp +++ b/scripts/outland/tempest_keep/the_eye/boss_astromancer.cpp @@ -461,7 +461,7 @@ struct MANGOS_DLL_DECL mob_solarium_priestAI : public ScriptedAI { case 0: if (m_pInstance) - pTarget = m_creature->GetMap()->GetCreature(m_pInstance->GetData64(NPC_ASTROMANCER)); + pTarget = m_pInstance->GetSingleCreatureFromStorage(NPC_ASTROMANCER); break; case 1: pTarget = m_creature; diff --git a/scripts/outland/tempest_keep/the_eye/boss_kaelthas.cpp b/scripts/outland/tempest_keep/the_eye/boss_kaelthas.cpp index 29facdb..80691a8 100644 --- a/scripts/outland/tempest_keep/the_eye/boss_kaelthas.cpp +++ b/scripts/outland/tempest_keep/the_eye/boss_kaelthas.cpp @@ -126,6 +126,8 @@ enum MAX_ADVISORS = 4 }; +static const uint32 aAdvisors[MAX_ADVISORS] = {NPC_THALADRED, NPC_SANGUINAR, NPC_CAPERNIAN, NPC_TELONICUS}; + uint32 m_auiSpellSummonWeapon[]= { SPELL_SUMMON_WEAPONA, SPELL_SUMMON_WEAPONB, SPELL_SUMMON_WEAPONC, SPELL_SUMMON_WEAPOND, @@ -157,7 +159,7 @@ struct MANGOS_DLL_DECL advisorbase_ai : public ScriptedAI bool m_bFakeDeath; bool m_bDoubled_Health; uint32 m_uiDelayRes_Timer; - uint64 m_uiDelayRes_Target; + ObjectGuid m_delayResTargetGuid; void Reset() { @@ -169,7 +171,7 @@ struct MANGOS_DLL_DECL advisorbase_ai : public ScriptedAI m_bFakeDeath = false; m_uiDelayRes_Timer = 0; - m_uiDelayRes_Target = 0; + m_delayResTargetGuid.Clear(); m_creature->SetStandState(UNIT_STAND_STATE_STAND); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -178,7 +180,7 @@ struct MANGOS_DLL_DECL advisorbase_ai : public ScriptedAI //reset encounter if (m_pInstance && (m_pInstance->GetData(TYPE_KAELTHAS_PHASE) == PHASE_1_ADVISOR || m_pInstance->GetData(TYPE_KAELTHAS_PHASE) == PHASE_3_ADVISOR_ALL)) { - if (Creature* pKaelthas = m_pInstance->instance->GetCreature(m_pInstance->GetData64(NPC_KAELTHAS))) + if (Creature* pKaelthas = m_pInstance->GetSingleCreatureFromStorage(NPC_KAELTHAS)) pKaelthas->AI()->EnterEvadeMode(); } } @@ -251,6 +253,9 @@ struct MANGOS_DLL_DECL advisorbase_ai : public ScriptedAI m_creature->GetMotionMaster()->MoveIdle(); m_creature->SetStandState(UNIT_STAND_STATE_DEAD); JustDied(pKiller); + + if (m_creature->getVictim()) + m_delayResTargetGuid = m_creature->getVictim()->GetObjectGuid(); } } @@ -263,16 +268,21 @@ struct MANGOS_DLL_DECL advisorbase_ai : public ScriptedAI m_uiDelayRes_Timer = 0; m_bFakeDeath = false; - Unit* pTarget = m_creature->GetMap()->GetUnit(m_uiDelayRes_Target); + Unit* pTarget = m_creature->GetMap()->GetUnit(m_delayResTargetGuid); - if (!pTarget) + if (!pTarget || !pTarget->isAlive()) pTarget = m_creature->getVictim(); + if (!pTarget) + return; + DoResetThreat(); AttackStart(pTarget); + // In case of same target as before, AttackStart and Attack won't set the target guid. + m_creature->SetTargetGuid(pTarget->GetObjectGuid()); + m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveChase(pTarget); - m_creature->AddThreat(pTarget); } else m_uiDelayRes_Timer -= uiDiff; @@ -287,7 +297,6 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI boss_kaelthasAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - memset(&m_auiAdvisorGuid, 0, sizeof(m_auiAdvisorGuid)); Reset(); } @@ -312,8 +321,6 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI bool m_bIsCastingFireball; bool m_bChainPyros; - uint64 m_auiAdvisorGuid[MAX_ADVISORS]; - void Reset() { m_uiFireball_Timer = urand(5000, 15000); @@ -344,9 +351,12 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI void PrepareAdvisors() { + if (!m_pInstance) + return; + for(uint8 i = 0; i < MAX_ADVISORS; ++i) { - if (Creature* pCreature = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[i])) + if (Creature* pCreature = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[i])) { pCreature->Respawn(); pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -361,12 +371,14 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI if (!m_pInstance) return; - m_auiAdvisorGuid[0] = m_pInstance->GetData64(NPC_THALADRED); - m_auiAdvisorGuid[1] = m_pInstance->GetData64(NPC_SANGUINAR); - m_auiAdvisorGuid[2] = m_pInstance->GetData64(NPC_CAPERNIAN); - m_auiAdvisorGuid[3] = m_pInstance->GetData64(NPC_TELONICUS); + bool bAdivsorsFound = true; + for (uint8 i = 0; i < MAX_ADVISORS; ++i) + { + if (!m_pInstance->GetSingleCreatureFromStorage(aAdvisors[i])) + bAdivsorsFound = false; + } - if (!m_auiAdvisorGuid[0] || !m_auiAdvisorGuid[1] || !m_auiAdvisorGuid[2] || !m_auiAdvisorGuid[3]) + if (!bAdivsorsFound) { error_log("SD2: Kael'Thas One or more advisors missing, Skipping Phases 1-3"); @@ -468,12 +480,14 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI DoScriptText(SAY_DEATH, m_creature); if (m_pInstance) + { m_pInstance->SetData(TYPE_KAELTHAS_PHASE, PHASE_6_COMPLETE); - for(uint8 i = 0; i < MAX_ADVISORS; ++i) - { - if (Creature* pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[i])) - pAdvisor->DealDamage(pAdvisor, pAdvisor->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + for (uint8 i = 0; i < MAX_ADVISORS; ++i) + { + if (Creature* pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[i])) + pAdvisor->DealDamage(pAdvisor, pAdvisor->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } } } @@ -509,7 +523,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI case 1: if (m_uiPhase_Timer < uiDiff) { - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[0]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[0]); if (pAdvisor) { @@ -530,7 +545,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI //Subphase 2 - Start case 2: - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[0]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[0]); if (pAdvisor && (pAdvisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -546,7 +562,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI case 3: if (m_uiPhase_Timer < uiDiff) { - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[1]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[1]); if (pAdvisor) { @@ -567,7 +584,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI //Subphase 3 - Start case 4: - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[1]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[1]); if (pAdvisor && (pAdvisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -583,7 +601,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI case 5: if (m_uiPhase_Timer < uiDiff) { - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[2]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[2]); if (pAdvisor) { @@ -604,7 +623,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI //Subphase 4 - Start case 6: - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[2]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[2]); if (pAdvisor && (pAdvisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -620,7 +640,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI case 7: if (m_uiPhase_Timer < uiDiff) { - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[3]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[3]); if (pAdvisor) { @@ -639,7 +660,8 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI //End of phase 1 case 8: - pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[3]); + if (m_pInstance) + pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[3]); if (pAdvisor && (pAdvisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -707,14 +729,13 @@ struct MANGOS_DLL_DECL boss_kaelthasAI : public ScriptedAI for (uint32 i = 0; i < MAX_ADVISORS; ++i) { - Creature* pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorGuid[i]); - - if (!pAdvisor) - error_log("SD2: Kael'Thas Advisor %u does not exist. Possibly despawned? Incorrectly Killed?", i); - else + if (m_pInstance) { - if (advisorbase_ai* pAdvisorAI = dynamic_cast(pAdvisor->AI())) - pAdvisorAI->Revive(pTarget); + if (Creature* pAdvisor = m_pInstance->GetSingleCreatureFromStorage(aAdvisors[i])) + { + if (advisorbase_ai* pAdvisorAI = dynamic_cast(pAdvisor->AI())) + pAdvisorAI->Revive(pTarget); + } } } diff --git a/scripts/outland/tempest_keep/the_eye/instance_the_eye.cpp b/scripts/outland/tempest_keep/the_eye/instance_the_eye.cpp index 28b2ade..486947f 100644 --- a/scripts/outland/tempest_keep/the_eye/instance_the_eye.cpp +++ b/scripts/outland/tempest_keep/the_eye/instance_the_eye.cpp @@ -25,13 +25,6 @@ EndScriptData */ #include "the_eye.h" instance_the_eye::instance_the_eye(Map* pMap) : ScriptedInstance(pMap), - m_uiThaladredGUID(0), - m_uiSanguinarGUID(0), - m_uiCapernianGUID(0), - m_uiTelonicusGUID(0), - m_uiKaelthasGUID(0), - m_uiAstromancerGUID(0), - m_uiKaelthasEventPhase(0) { Initialize(); @@ -60,12 +53,14 @@ void instance_the_eye::OnCreatureCreate(Creature* pCreature) { switch (pCreature->GetEntry()) { - case NPC_THALADRED: m_uiThaladredGUID = pCreature->GetGUID(); break; - case NPC_TELONICUS: m_uiTelonicusGUID = pCreature->GetGUID(); break; - case NPC_CAPERNIAN: m_uiCapernianGUID = pCreature->GetGUID(); break; - case NPC_SANGUINAR: m_uiSanguinarGUID = pCreature->GetGUID(); break; - case NPC_KAELTHAS: m_uiKaelthasGUID = pCreature->GetGUID(); break; - case NPC_ASTROMANCER: m_uiAstromancerGUID = pCreature->GetGUID(); break; + case NPC_THALADRED: + case NPC_TELONICUS: + case NPC_CAPERNIAN: + case NPC_SANGUINAR: + case NPC_KAELTHAS: + case NPC_ASTROMANCER: + m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid(); + break; } } @@ -101,22 +96,6 @@ uint32 instance_the_eye::GetData(uint32 uiType) } } -uint64 instance_the_eye::GetData64(uint32 uiData) -{ - switch(uiData) - { - case NPC_THALADRED: return m_uiThaladredGUID; - case NPC_SANGUINAR: return m_uiSanguinarGUID; - case NPC_CAPERNIAN: return m_uiCapernianGUID; - case NPC_TELONICUS: return m_uiTelonicusGUID; - case NPC_KAELTHAS: return m_uiKaelthasGUID; - case NPC_ASTROMANCER: return m_uiAstromancerGUID; - - default: - return 0; - } -} - InstanceData* GetInstanceData_instance_the_eye(Map* pMap) { return new instance_the_eye(pMap); diff --git a/scripts/outland/tempest_keep/the_eye/the_eye.h b/scripts/outland/tempest_keep/the_eye/the_eye.h index 8aa4ee6..1c1a573 100644 --- a/scripts/outland/tempest_keep/the_eye/the_eye.h +++ b/scripts/outland/tempest_keep/the_eye/the_eye.h @@ -47,7 +47,6 @@ class MANGOS_DLL_DECL instance_the_eye : public ScriptedInstance void SetData(uint32 uiType, uint32 uiData); uint32 GetData(uint32 uiType); - uint64 GetData64(uint32 uiData); // No Save or Load needed to current knowledge @@ -55,13 +54,6 @@ class MANGOS_DLL_DECL instance_the_eye : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; uint32 m_uiKaelthasEventPhase; - - uint64 m_uiThaladredGUID; - uint64 m_uiSanguinarGUID; - uint64 m_uiCapernianGUID; - uint64 m_uiTelonicusGUID; - uint64 m_uiKaelthasGUID; - uint64 m_uiAstromancerGUID; }; #endif diff --git a/scripts/outland/tempest_keep/the_mechanar/instance_mechanar.cpp b/scripts/outland/tempest_keep/the_mechanar/instance_mechanar.cpp index d3ebeac..9918e51 100644 --- a/scripts/outland/tempest_keep/the_mechanar/instance_mechanar.cpp +++ b/scripts/outland/tempest_keep/the_mechanar/instance_mechanar.cpp @@ -24,35 +24,30 @@ EndScriptData */ #include "precompiled.h" #include "mechanar.h" -struct MANGOS_DLL_DECL instance_mechanar : public ScriptedInstance -{ - instance_mechanar(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; +instance_mechanar::instance_mechanar(Map* pMap) : ScriptedInstance(pMap) { Initialize(); } - void Initialize() - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - } +void instance_mechanar::Initialize() +{ + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); +} - void SetData(uint32 uiType, uint32 uiData) +void instance_mechanar::SetData(uint32 uiType, uint32 uiData) +{ + switch(uiType) { - switch(uiType) - { - case TYPE_SEPETHREA: - m_auiEncounter[0] = uiData; - break; - } + case TYPE_SEPETHREA: + m_auiEncounter[0] = uiData; + break; } +} - uint32 GetData(uint32 uiType) - { - if (uiType == TYPE_SEPETHREA) - return m_auiEncounter[0]; +uint32 instance_mechanar::GetData(uint32 uiType) +{ + if (uiType == TYPE_SEPETHREA) + return m_auiEncounter[0]; - return 0; - } -}; + return 0; +} InstanceData* GetInstanceData_instance_mechanar(Map* pMap) { @@ -61,9 +56,10 @@ InstanceData* GetInstanceData_instance_mechanar(Map* pMap) void AddSC_instance_mechanar() { - Script *newscript; - newscript = new Script; - newscript->Name = "instance_mechanar"; - newscript->GetInstanceData = &GetInstanceData_instance_mechanar; - newscript->RegisterSelf(); + Script* pNewScript; + + pNewScript = new Script; + pNewScript->Name = "instance_mechanar"; + pNewScript->GetInstanceData = &GetInstanceData_instance_mechanar; + pNewScript->RegisterSelf(); } diff --git a/scripts/outland/tempest_keep/the_mechanar/mechanar.h b/scripts/outland/tempest_keep/the_mechanar/mechanar.h index fe1faee..afe025a 100644 --- a/scripts/outland/tempest_keep/the_mechanar/mechanar.h +++ b/scripts/outland/tempest_keep/the_mechanar/mechanar.h @@ -12,4 +12,18 @@ enum TYPE_SEPETHREA = 1 }; +class MANGOS_DLL_DECL instance_mechanar : public ScriptedInstance +{ + public: + instance_mechanar(Map* pMap); + + void Initialize(); + + void SetData(uint32 uiType, uint32 uiData); + uint32 GetData(uint32 uiType); + + private: + uint32 m_auiEncounter[MAX_ENCOUNTER]; +}; + #endif diff --git a/scripts/world/mob_generic_creature.cpp b/scripts/world/mob_generic_creature.cpp index 6b7d9cb..9a7688c 100644 --- a/scripts/world/mob_generic_creature.cpp +++ b/scripts/world/mob_generic_creature.cpp @@ -145,7 +145,6 @@ struct MANGOS_DLL_DECL generic_creatureAI : public ScriptedAI //Set our global cooldown GlobalCooldown = GENERIC_CREATURE_COOLDOWN; - }//If no spells available and we arn't moving run to target else if (IsSelfRooted) { diff --git a/scripts/world/npcs_special.cpp b/scripts/world/npcs_special.cpp index ab49fb6..54f5114 100644 --- a/scripts/world/npcs_special.cpp +++ b/scripts/world/npcs_special.cpp @@ -179,7 +179,7 @@ struct MANGOS_DLL_DECL npc_air_force_botsAI : public ScriptedAI if (!pPlayerTarget) return; - Creature* pLastSpawnedGuard = m_spawnedGuid.IsEmpty() ? NULL : GetSummonedGuard(); + Creature* pLastSpawnedGuard = m_spawnedGuid ? GetSummonedGuard() : NULL; // prevent calling GetCreature at next MoveInLineOfSight call - speedup if (!pLastSpawnedGuard) @@ -561,7 +561,7 @@ struct MANGOS_DLL_DECL npc_injured_patientAI : public ScriptedAI { if ((((Player*)caster)->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (((Player*)caster)->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)) { - if (!m_doctorGuid.IsEmpty()) + if (m_doctorGuid) { if (Creature* pDoctor = m_creature->GetMap()->GetCreature(m_doctorGuid)) { @@ -619,7 +619,7 @@ struct MANGOS_DLL_DECL npc_injured_patientAI : public ScriptedAI m_creature->SetDeathState(JUST_DIED); m_creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - if (!m_doctorGuid.IsEmpty()) + if (m_doctorGuid) { if (Creature* pDoctor = m_creature->GetMap()->GetCreature(m_doctorGuid)) { @@ -760,7 +760,7 @@ void npc_doctorAI::UpdateAI(const uint32 diff) //303, this flag appear to be required for client side item->spell to work (TARGET_SINGLE_FRIEND) Patient->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); - Patients.push_back(Patient->GetGUID()); + Patients.push_back(Patient->GetObjectGuid()); npc_injured_patientAI* pPatientAI = dynamic_cast(Patient->AI()); @@ -1274,7 +1274,7 @@ bool GossipHello_npc_rogue_trainer(Player* pPlayer, Creature* pCreature) { pPlayer->PrepareGossipMenu(pCreature,50195); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - pPlayer->SEND_GOSSIP_MENU(5996, pCreature->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(5996, pCreature->GetObjectGuid()); return true; } return false; @@ -1621,7 +1621,6 @@ enum #define GOSSIP_LOST_THE_MASTERS_KEY "I've lost my key to the Karazhan." #define GOSSIP_LOST_VIOLET_HOLD_KEY "I've lost my key to the Violet Hold." - bool GossipHello_npc_locksmith(Player* pPlayer, Creature* pCreature) { @@ -1764,7 +1763,7 @@ struct MANGOS_DLL_DECL npc_mirror_imageAI : public ScriptedAI if (m_creature->Attack(pWho, true)) { if (owner) - m_creature->CastSpell(m_creature, SPELL_CLONE_THREAT, true, NULL, NULL, owner->GetGUID()); + m_creature->CastSpell(m_creature, SPELL_CLONE_THREAT, true, NULL, NULL, owner->GetObjectGuid()); m_creature->clearUnitState(UNIT_STAT_FOLLOW); m_creature->SetInCombatWith(pWho); pWho->SetInCombatWith(m_creature); @@ -1798,10 +1797,10 @@ struct MANGOS_DLL_DECL npc_mirror_imageAI : public ScriptedAI m_creature->ForcedDespawn(); if (owner && !m_creature->HasAura(SPELL_CLONE_CASTER)) - m_creature->CastSpell(m_creature, SPELL_CLONE_CASTER, true, NULL, NULL, owner->GetGUID()); + m_creature->CastSpell(m_creature, SPELL_CLONE_CASTER, true, NULL, NULL, owner->GetObjectGuid()); if (owner && !m_creature->HasAura(SPELL_CLONE_CASTER_1)) - m_creature->CastSpell(m_creature, SPELL_CLONE_CASTER_1, true, NULL, NULL, owner->GetGUID()); + m_creature->CastSpell(m_creature, SPELL_CLONE_CASTER_1, true, NULL, NULL, owner->GetObjectGuid()); if (owner && owner->HasAura(SPELL_FROSTSHIELD) && !m_creature->HasAura(SPELL_FROSTSHIELD)) m_creature->CastSpell(m_creature, SPELL_FROSTSHIELD, false); diff --git a/scripts/world/pet_scripts.cpp b/scripts/world/pet_scripts.cpp new file mode 100644 index 0000000..34efe81 --- /dev/null +++ b/scripts/world/pet_scripts.cpp @@ -0,0 +1,211 @@ +/* Copyright (C) 2006 - 2011 ScriptDev2 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* ScriptData +SDName: pet_scripts +SD%Complete: +SDComment: To be used for pets. +SDCategory: Pet's +EndScriptData +*/ + +#include "precompiled.h" +#include "pet_ai.h" + +/* ContentData +pet_greater_fire_elemental ?% support for shaman pet Greater fire elemental +pet_greater_earth_elemental ?% support for shaman pet Greater earth elemental +EndContentData */ + +enum greater_fire_elemental_spells +{ + SPELL_FIRE_RING = 12470, + SPELL_FIRE_EXPLODE = 57984, +}; + +struct MANGOS_DLL_DECL pet_greater_fire_elemental : public ScriptedPetAI +{ + pet_greater_fire_elemental(Creature* pCreature) : ScriptedPetAI(pCreature) + { + Reset(); + } + + uint32 m_uiFireRingTimer; + uint32 m_uiFireExplodeTimer; + Pet* m_pet; + + void Reset() + { + m_pet = (Pet*)m_creature; + m_pet->GetCharmInfo()->SetReactState(REACT_AGGRESSIVE); + m_pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); + m_uiFireRingTimer = urand(3000,9000); + m_uiFireExplodeTimer = urand(4000,8000); + + if(m_pet->GetOwner()->IsPvP()) + m_pet->SetPvP(true); + if(m_pet->GetOwner()->IsFFAPvP()) + m_pet->SetFFAPvP(true); + } + + void UpdatePetAI(const uint32 diff) + { + if (!m_pet->GetOwner() || !m_pet->GetOwner()->isAlive()) + m_pet->ForcedDespawn(); + + if (m_pet->GetOwner()->getVictim() && m_pet->getVictim() != m_pet->GetOwner()->getVictim()) + AttackStart(m_pet->GetOwner()->getVictim()); + + if (m_uiFireRingTimer <= diff) + { + if (m_pet->IsWithinDistInMap(m_pet->getVictim(),ATTACK_DISTANCE)) + DoCastSpellIfCan(m_pet,SPELL_FIRE_RING); + m_uiFireRingTimer = urand(4000,12000); + } + else m_uiFireRingTimer -= diff; + + if (m_uiFireExplodeTimer <= diff) + { + DoCastSpellIfCan(m_pet->getVictim(),SPELL_FIRE_EXPLODE); + m_uiFireExplodeTimer = urand(4000,8000); + } else m_uiFireExplodeTimer -= diff; + + DoMeleeAttackIfReady(); + } + + void UpdatePetOOCAI(const uint32 diff) + { + if (!m_pet->GetOwner() || !m_pet->GetOwner()->isAlive()) + m_pet->ForcedDespawn(); + + if (m_pet->GetOwner() && m_pet->GetOwner()->getVictim()) + { + AttackStart(m_pet->GetOwner()->getVictim()); + } + else if (m_pet->GetOwner()->isInCombat()) + { + AttackStart(m_pet->GetOwner()->getAttackerForHelper()); + } + } +}; + +CreatureAI* GetAI_pet_greater_fire_elemental(Creature* pCreature) +{ + return new pet_greater_fire_elemental(pCreature); +} + +enum greater_earth_elemental_spells +{ + SPELL_EARTH_THREAT = 36213, + SPELL_EARTH_EXPLODE = 12374, + SPELL_EARTH_AOE = 33840, +}; + +struct MANGOS_DLL_DECL pet_greater_earth_elemental : public ScriptedPetAI +{ + pet_greater_earth_elemental(Creature* pCreature) : ScriptedPetAI(pCreature) + { + Reset(); + } + + uint32 m_uiEarthThreatTimer; + uint32 m_uiEarthAOETimer; + uint32 m_uiEarthAttackTimer; + Pet* m_pet; + + void Reset() + { + m_pet = (Pet*)m_creature; + m_pet->GetCharmInfo()->SetReactState(REACT_AGGRESSIVE); + m_pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); + m_uiEarthThreatTimer = urand(5000,12000); + m_uiEarthAOETimer = urand(10000,30000); + m_uiEarthAttackTimer = urand(2000,8000); + + if(m_pet->GetOwner()->IsPvP()) + m_pet->SetPvP(true); + if(m_pet->GetOwner()->IsFFAPvP()) + m_pet->SetFFAPvP(true); + } + + void UpdatePetAI(const uint32 diff) + { + if (!m_pet->GetOwner() || !m_pet->GetOwner()->isAlive()) + m_pet->ForcedDespawn(); + + if (m_pet->GetOwner()->getVictim() && m_pet->getVictim() != m_pet->GetOwner()->getVictim()) + AttackStart(m_pet->GetOwner()->getVictim()); + + if (m_uiEarthThreatTimer <= diff) + { + DoCastSpellIfCan(m_pet,SPELL_EARTH_THREAT); + m_uiEarthThreatTimer = urand(4000,12000); + } + else m_uiEarthThreatTimer -= diff; + + if (m_uiEarthAOETimer <= diff) + { + if (m_pet->IsWithinDistInMap(m_pet->getVictim(),ATTACK_DISTANCE)) + DoCastSpellIfCan(m_pet,SPELL_EARTH_AOE); + m_uiEarthAOETimer = urand(10000,30000); + } + else m_uiEarthAOETimer -= diff; + + if (m_uiEarthAttackTimer <= diff) + { + DoCastSpellIfCan(m_pet->getVictim(),SPELL_EARTH_EXPLODE); + m_uiEarthAttackTimer = urand(2000,8000); + } + else m_uiEarthAttackTimer -= diff; + + DoMeleeAttackIfReady(); + } + + void UpdatePetOOCAI(const uint32 diff) + { + if (!m_pet->GetOwner() || !m_pet->GetOwner()->isAlive()) + m_pet->ForcedDespawn(); + + if (m_pet->GetOwner() && m_pet->GetOwner()->getVictim()) + { + AttackStart(m_pet->GetOwner()->getVictim()); + } + else if (m_pet->GetOwner()->isInCombat()) + { + AttackStart(m_pet->GetOwner()->getAttackerForHelper()); + } + } +}; + +CreatureAI* GetAI_pet_greater_earth_elemental(Creature* pCreature) +{ + return new pet_greater_earth_elemental(pCreature); +} + +void AddSC_pet_scripts() +{ + Script* newscript; + + newscript = new Script; + newscript->Name = "pet_greater_fire_elemental"; + newscript->GetAI = &GetAI_pet_greater_fire_elemental; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "pet_greater_earth_elemental"; + newscript->GetAI = &GetAI_pet_greater_earth_elemental; + newscript->RegisterSelf(); +} diff --git a/sd2_revision_nr.h b/sd2_revision_nr.h index a00400e..36b6727 100644 --- a/sd2_revision_nr.h +++ b/sd2_revision_nr.h @@ -1,4 +1,4 @@ #ifndef __SD2_REVISION_NR_H__ #define __SD2_REVISION_NR_H__ - #define SD2_REVISION_NR "2129" + #define SD2_REVISION_NR "2225" #endif // __SD2_REVISION_NR_H__ diff --git a/sql/Updates/r2130_scriptdev2.sql b/sql/Updates/r2130_scriptdev2.sql new file mode 100644 index 0000000..452934a --- /dev/null +++ b/sql/Updates/r2130_scriptdev2.sql @@ -0,0 +1 @@ +UPDATE sd2_db_version SET version='ScriptDev2 (for MaNGOS 11526+) '; diff --git a/sql/Updates/r2134_scriptdev2.sql b/sql/Updates/r2134_scriptdev2.sql new file mode 100644 index 0000000..75eb8eb --- /dev/null +++ b/sql/Updates/r2134_scriptdev2.sql @@ -0,0 +1 @@ +UPDATE script_texts SET type=6 WHERE entry BETWEEN -1568078 AND -1568067; diff --git a/sql/Updates/r2138_mangos.sql b/sql/Updates/r2138_mangos.sql new file mode 100644 index 0000000..c349910 --- /dev/null +++ b/sql/Updates/r2138_mangos.sql @@ -0,0 +1 @@ +UPDATE creature_template SET ScriptName='npc_corrupted_soul_fragment' WHERE entry=36535; diff --git a/sql/Updates/r2139_scriptdev2.sql b/sql/Updates/r2139_scriptdev2.sql new file mode 100644 index 0000000..175b7f8 --- /dev/null +++ b/sql/Updates/r2139_scriptdev2.sql @@ -0,0 +1 @@ +UPDATE sd2_db_version SET version='ScriptDev2 (for MaNGOS 11558+) '; diff --git a/sql/Updates/r2146_scriptdev2.sql b/sql/Updates/r2146_scriptdev2.sql new file mode 100644 index 0000000..ff337ad --- /dev/null +++ b/sql/Updates/r2146_scriptdev2.sql @@ -0,0 +1,3 @@ +UPDATE sd2_db_version SET version='ScriptDev2 (for MaNGOS 11576+) '; + +UPDATE script_texts SET type=6 WHERE entry=-1533089; diff --git a/sql/Updates/r2147_mangos.sql b/sql/Updates/r2147_mangos.sql new file mode 100644 index 0000000..6734b26 --- /dev/null +++ b/sql/Updates/r2147_mangos.sql @@ -0,0 +1,5 @@ +UPDATE gameobject_template SET ScriptName='go_eternal_flame' WHERE entry IN (148418,148419,148420,148421); +UPDATE creature_template SET ScriptName='npc_shade_of_hakkar' WHERE entry=8440; +DELETE FROM scripted_event_id WHERE id=8502; +INSERT INTO scripted_event_id VALUES +(8502,'event_avatar_of_hakkar'); diff --git a/sql/Updates/r2147_scriptdev2.sql b/sql/Updates/r2147_scriptdev2.sql new file mode 100644 index 0000000..ed879ee --- /dev/null +++ b/sql/Updates/r2147_scriptdev2.sql @@ -0,0 +1,7 @@ +DELETE FROM script_texts WHERE entry BETWEEN -1109010 AND -1109006; +INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES +(-1109006,'HAKKAR LIVES!',5870,1,0,0,'avatar SAY_AVATAR_BRAZIER_1'), +(-1109007,'I TASTE THE BLOOD OF LIFE!',5868,1,0,0,'avatar SAY_AVATAR_BRAZIER_2'), +(-1109008,'I DRAW CLOSER TO YOUR WORLD!',5867,1,0,0,'avatar SAY_AVATAR_BRAZIER_3'), +(-1109009,'I AM NEAR!',5869,1,0,0,'avatar SAY_AVATAR_BRAZIER_4'), +(-1109010,'I AM HERE!',0,1,0,0,'avatar SAY_AVATAR_SPAWN'); diff --git a/sql/Updates/r2162_scriptdev2.sql b/sql/Updates/r2162_scriptdev2.sql new file mode 100644 index 0000000..1408a1e --- /dev/null +++ b/sql/Updates/r2162_scriptdev2.sql @@ -0,0 +1 @@ +UPDATE sd2_db_version SET version='ScriptDev2 (for MaNGOS 11590+) '; diff --git a/sql/Updates/r2181_scriptdev2.sql b/sql/Updates/r2181_scriptdev2.sql new file mode 100644 index 0000000..bc886cc --- /dev/null +++ b/sql/Updates/r2181_scriptdev2.sql @@ -0,0 +1,3 @@ +DELETE FROM gossip_texts WHERE entry=-3033000; +INSERT INTO gossip_texts (entry,content_default,comment) VALUES +(-3033000,'Please unlock the courtyard door.','deathstalker adamant/ sorcerer ashcrombe - GOSSIP_ITEM_DOOR'); diff --git a/sql/Updates/r2212_mangos.sql b/sql/Updates/r2212_mangos.sql new file mode 100644 index 0000000..f1d2df2 --- /dev/null +++ b/sql/Updates/r2212_mangos.sql @@ -0,0 +1 @@ +UPDATE gameobject_template SET ScriptName='go_prison_cell_lever' WHERE entry=181982; diff --git a/sql/Updates/r2212_scriptdev2.sql b/sql/Updates/r2212_scriptdev2.sql new file mode 100644 index 0000000..9eddb3e --- /dev/null +++ b/sql/Updates/r2212_scriptdev2.sql @@ -0,0 +1,3 @@ +DELETE FROM script_texts WHERE entry=-1542015; +INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES +(-1542015,'Kill them!',0,1,0,0,'broggok SAY_BROGGOK_INTRO'); diff --git a/sql/Updates/r2220_scriptdev2.sql b/sql/Updates/r2220_scriptdev2.sql new file mode 100644 index 0000000..eba22a5 --- /dev/null +++ b/sql/Updates/r2220_scriptdev2.sql @@ -0,0 +1,45 @@ +DELETE FROM script_texts WHERE entry BETWEEN -1724038 AND -1724000; +INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES +(-1724000,'Help! I am trapped within this tree! I require aid!',17490,6,0,0,'xerestraza SAY_XERESTRASZA_HELP'), +(-1724001,'Your power wanes, ancient one! Soon, you will join your friends!',17525,6,0,0,'baltharus SAY_BALTHARUS_INTRO'), +(-1724002,'Thank you! I could have not held out for much longer. A terrible thing has happened here.',17491,1,0,0,'xerestraza SAY_XERESTRASZA_THANKS'), +(-1724003,'We believed that the Sanctum was well fortified, but we were not prepareted for the nature of this assault.',17492,0,0,0,'xerestraza SAY_OUTRO_1'), +(-1724004,'The Black Dragonkin materialized from thin air, and set upon us before we could react.',17493,0,0,0,'xerestraza SAY_OUTRO_2'), +(-1724005,'We did not stand a chance. As my brethren perished around me, I managed to retreat hear and bar the entrance.',17494,0,0,0,'xerestraza SAY_OUTRO_3'), +(-1724006,'They slaughtered us with cold efficiency, but the true focus of their interest seemed to be the eggs kept here in the sanctum.',17495,0,0,0,'xerestraza SAY_OUTRO_4'), +(-1724007,'The commander of the forces on the ground here is a cruel brute named Zarithrian. But I fear there are greater powers at work.',17496,0,0,0,'xerestraza SAY_OUTRO_5'), +(-1724008,'In their initial assault I caught a glimpse of their true leader, a fearsome full-grown Twilight Dragon.',17497,0,0,0,'xerestraza SAY_OUTRO_6'), +(-1724009,'I know not the extent of their plans heroes, but I know this: they cannot be allowed to succeed!',17498,0,0,0,'xerestraza SAY_OUTRO_7'), + +(-1724010,'Ah, the entertainment has arrived.',17520,1,0,0,'baltharus SAY_AGGRO'), +(-1724011,'Baltharus leaves no survivors!',17521,1,0,0,'baltharus SAY_SLAY_1'), +(-1724012,'This world has enough heroes.',17522,1,0,0,'baltharus SAY_SLAY_2'), +(-1724013,'I... Didn\'t see that coming...',17523,1,0,0,'baltharus SAY_DEATH'), +(-1724014,'Twice the pain and half the fun.',17524,1,0,0,'baltharus SAY_SPLIT'), + +(-1724015,'You will suffer for this intrusion!',17528,1,0,0,'saviana SAY_AGGRO'), +(-1724016,'As it should be...',17529,1,0,0,'saviana SAY_SLAY_1'), +(-1724017,'Halion will be pleased.',17530,1,0,0,'saviana SAY_SLAY_2'), +(-1724018,'Burn in the master\'s flame!',17532,1,0,0,'saviana SAY_SPECIAL'), + +(-1724019,'Alexstrasza has chosen capable allies... A pity that I must END YOU!',17512,1,0,0,'zarithrian SAY_AGGRO'), +(-1724020,'You thought you stood a chance?',17513,1,0,0,'zarithrian SAY_SLAY_1'), +(-1724021,'It\'s for the best.',17514,1,0,0,'zarithrian SAY_SLAY_2'), +(-1724022,'HALION! I...',17515,1,0,0,'zarithrian SAY_DEATH'), +(-1724023,'Turn them to ash, minions!',17516,1,0,0,'zarithrian SAY_SUMMON'), + +(-1724024,'Meddlesome insects! You\'re too late: The Ruby Sanctum\'s lost.',17499,6,0,0,'halion SAY_SPAWN'), +(-1724025,'Your world teeters on the brink of annihilation. You will ALL bear witness to the coming of a new age of DESTRUCTION!',17500,1,0,0,'halion SAY_AGGRO'), +(-1724026,'Another hero falls.',17501,1,0,0,'halion SAY_SLAY'), +(-1724027,'Relish this victory, mortals, for it will be your last! This world will burn with the master\'s return!',17503,1,0,0,'halion SAY_DEATH'), +(-1724028,'Not good enough.',17504,1,0,0,'halion SAY_BERSERK'), +(-1724029,'The heavens burn!',17505,1,0,0,'halion SAY_FIREBALL'), +(-1724030,'Beware the shadow!',17506,1,0,0,'halion SAY_SPHERES'), +(-1724031,'You will find only suffering within the realm of twilight! Enter if you dare!',17507,1,0,0,'halion SAY_PHASE_2'), +(-1724032,'I am the light and the darkness! Cower, mortals, before the herald of Deathwing!',17508,1,0,0,'halion SAY_PHASE_3'), +(-1724033,'The orbining spheres pulse with dark energy!',0,3,0,0,'halion EMOTE_SPHERES'), +(-1724034,'Your efforts force %s further out of the twillight realm!',0,3,0,0,'halion EMOTE_OUT_OF_TWILLIGHT'), +(-1724035,'Your efforts force %s further out of the physical realm!',0,3,0,0,'halion EMOTE_OUT_OF_PHYSICAL'), +(-1724036,'Your companions\' efforts force Halion further into the twillight realm!',0,3,0,0,'halion EMOTE_INTO_TWILLIGHT'), +(-1724037,'Your companions\' efforts force Halion further into the physical realm!',0,3,0,0,'halion EMOTE_INTO_PHYSICAL'), +(-1724038,'Without pressure in both realms %s begins to regenerate.',0,3,0,0,'halion EMOTE_REGENERATE'); diff --git a/sql/mangos_scriptname_full.sql b/sql/mangos_scriptname_full.sql index 47d8fe5..be6e295 100644 --- a/sql/mangos_scriptname_full.sql +++ b/sql/mangos_scriptname_full.sql @@ -617,6 +617,7 @@ UPDATE creature_template SET ScriptName='boss_broggok' WHERE entry=17380; UPDATE creature_template SET ScriptName='boss_kelidan_the_breaker' WHERE entry=17377; UPDATE creature_template SET ScriptName='mob_broggok_poisoncloud' WHERE entry=17662; UPDATE creature_template SET ScriptName='mob_shadowmoon_channeler' WHERE entry=17653; +UPDATE gameobject_template SET ScriptName='go_prison_cell_lever' WHERE entry=181982; UPDATE instance_template SET ScriptName='instance_blood_furnace' WHERE map=542; /* HELLFIRE RAMPARTS */ @@ -681,6 +682,7 @@ UPDATE creature_template SET ScriptName='npc_silvermoon_harry' WHERE entry=24539 /* FORGE OF SOULS */ UPDATE creature_template SET ScriptName='boss_bronjahm' WHERE entry=36497; +UPDATE creature_template SET ScriptName='npc_corrupted_soul_fragment' WHERE entry=36535; UPDATE creature_template SET ScriptName='boss_devourer_of_souls' WHERE entry=36502; UPDATE instance_template SET ScriptName='instance_forge_of_souls' WHERE map=632; @@ -1047,6 +1049,11 @@ INSERT INTO scripted_event_id VALUES (3098,'event_antalarion_statue_activation'), (3099,'event_antalarion_statue_activation'), (3100,'event_antalarion_statue_activation'); +UPDATE creature_template SET ScriptName='npc_shade_of_hakkar' WHERE entry=8440; +UPDATE gameobject_template SET ScriptName='go_eternal_flame' WHERE entry IN (148418,148419,148420,148421); +DELETE FROM scripted_event_id WHERE id=8502; +INSERT INTO scripted_event_id VALUES +(8502,'event_avatar_of_hakkar'); /* SUNWELL PLATEAU */ UPDATE instance_template SET ScriptName='instance_sunwell_plateau' WHERE map=580; diff --git a/sql/scriptdev2_script_full.sql b/sql/scriptdev2_script_full.sql index cdb49fa..f272e4d 100644 --- a/sql/scriptdev2_script_full.sql +++ b/sql/scriptdev2_script_full.sql @@ -3,7 +3,7 @@ -- DELETE FROM sd2_db_version; -INSERT INTO sd2_db_version (version) VALUES ('ScriptDev2 (for MaNGOS 11432+) '); +INSERT INTO sd2_db_version (version) VALUES ('ScriptDev2 (for MaNGOS 11590+) '); -- -- Below contains data for table `script_texts` mainly used in C++ parts. @@ -849,7 +849,13 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,commen (-1109003,'Understand this, Eranikus wants nothing more than to be brought to Azeroth from the Dream. Once he is out, he will stop at nothing to destroy my physical manifestation. This, however, is the only way in which you could recover the scepter shard.',0,0,0,0,'malfurion stormrge SAY_MAFLURION3'), (-1109004,'You will bring him back into this world, champion.',0,0,0,0,'malfurion Stormrge SAY_MALFURION4'), -(-1109005,'The shield be down! Rise up Atal\'ai! Rise up!',5861,6,0,0,'jammalan SAY_JAMMALAN_INTRO'); +(-1109005,'The shield be down! Rise up Atal\'ai! Rise up!',5861,6,0,0,'jammalan SAY_JAMMALAN_INTRO'), + +(-1109006,'HAKKAR LIVES!',5870,1,0,0,'avatar SAY_AVATAR_BRAZIER_1'), +(-1109007,'I TASTE THE BLOOD OF LIFE!',5868,1,0,0,'avatar SAY_AVATAR_BRAZIER_2'), +(-1109008,'I DRAW CLOSER TO YOUR WORLD!',5867,1,0,0,'avatar SAY_AVATAR_BRAZIER_3'), +(-1109009,'I AM NEAR!',5869,1,0,0,'avatar SAY_AVATAR_BRAZIER_4'), +(-1109010,'I AM HERE!',0,1,0,0,'avatar SAY_AVATAR_SPAWN'); -- -1 129 000 RAZORFEN DOWNS INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES @@ -1427,7 +1433,7 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,commen (-1533086,'I see no complications... Wait... What is this?',14468,1,0,0,'kelthuzad SAY_SAPP_DIALOG3'), (-1533087,'Your security measures have failed! See to this interruption immediately!',8882,1,0,0,'kelthuzad SAY_SAPP_DIALOG4_LICH'), (-1533088,'Yes, master!',14469,1,0,0,'kelthuzad SAY_SAPP_DIALOG5'), -(-1533089,'No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...',14484,1,0,0,'kelthuzad SAY_CAT_DIED'), +(-1533089,'No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...',14484,6,0,0,'kelthuzad SAY_CAT_DIED'), (-1533090,'Who dares violate the sanctity of my domain? Be warned, all who trespass here are doomed.',14463,6,0,0,'kelthuzad SAY_TAUNT1'), (-1533091,'Fools, you think yourselves triumphant? You have only taken one step closer to the abyss! ',14464,6,0,0,'kelthuzad SAY_TAUNT2'), (-1533092,'I grow tired of these games. Proceed, and I will banish your souls to oblivion!',14465,6,0,0,'kelthuzad SAY_TAUNT3'), @@ -1619,7 +1625,9 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,commen (-1542011,'Anger... Hate... These are tools I can use.',10288,1,0,0,'the_maker SAY_AGGRO_3'), (-1542012,'Let\'s see what I can make of you.',10289,1,0,0,'the_maker SAY_KILL_1'), (-1542013,'It is pointless to resist.',10290,1,0,0,'the_maker SAY_KILL_2'), -(-1542014,'Stay away from... me.',10291,1,0,0,'the_maker SAY_DIE'); +(-1542014,'Stay away from... me.',10291,1,0,0,'the_maker SAY_DIE'), + +(-1542015,'Kill them!',0,1,0,0,'broggok SAY_BROGGOK_INTRO'); -- -1 543 000 HELLFIRE RAMPARTS INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES @@ -2319,18 +2327,18 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,commen (-1568065,'Lot more gonna fall like you!',12099,1,0,0,'zuljin SAY_KILL2'), (-1568066,'Mebbe me fall...but da Amani empire...never gonna die...',12100,1,0,0,'zuljin SAY_DEATH'), -(-1568067,'Zul\'jin got a surprise for ya...',12052,1,0,0,'zulaman SAY_INST_RELEASE'), -(-1568068,'Da spirits gonna feast today! Begin da ceremonies, sacrifice da prisoners... make room for our new guests!',12053,1,0,0,'zulaman SAY_INST_BEGIN'), -(-1568069,'Take your pick, trespassers! Any of ma priests be happy to accommodate ya.',12054,1,0,0,'zulaman SAY_INST_PROGRESS_1'), -(-1568070,'Don\'t be shy. Thousands have come before you. Ya not be alone in your service.',12055,1,0,0,'zulaman SAY_INST_PROGRESS_2'), -(-1568071,'Ya gonna fail, strangers. Many try before you, but dey only make us stronger!',12056,1,0,0,'zulaman SAY_INST_PROGRESS_3'), -(-1568072,'Your efforts was in vain, trespassers. The rituals nearly be complete.',12057,1,0,0,'zulaman SAY_INST_WARN_1'), -(-1568073,'Soon da cages gonna be empty, da sacrifices be complete, and you gonna take dere places.',12058,1,0,0,'zulaman SAY_INST_WARN_2'), -(-1568074,'Time be running low, strangers. Soon you gonna join da souls of dem ya failed to save.',12059,1,0,0,'zulaman SAY_INST_WARN_3'), -(-1568075,'Make haste, ma priests! Da rituals must not be interrupted!',12060,1,0,0,'zulaman SAY_INST_WARN_4'), -(-1568076,'Ya make a good try... but now you gonna join da ones who already fall.',12061,1,0,0,'zulaman SAY_INST_SACRIF1'), -(-1568077,'Ya not do too bad. Ya efforts [...] for a small time. Come to me now. Ya prove yourself worthy offerings.',12062,1,0,0,'zulaman SAY_INST_SACRIF2'), -(-1568078,'Watch now. Every offering gonna strengthen our ties to da spirit world. Soon, we gonna be unstoppable!',12065,1,0,0,'zulaman SAY_INST_COMPLETE'), +(-1568067,'Zul\'jin got a surprise for ya...',12052,6,0,0,'zulaman SAY_INST_RELEASE'), +(-1568068,'Da spirits gonna feast today! Begin da ceremonies, sacrifice da prisoners... make room for our new guests!',12053,6,0,0,'zulaman SAY_INST_BEGIN'), +(-1568069,'Take your pick, trespassers! Any of ma priests be happy to accommodate ya.',12054,6,0,0,'zulaman SAY_INST_PROGRESS_1'), +(-1568070,'Don\'t be shy. Thousands have come before you. Ya not be alone in your service.',12055,6,0,0,'zulaman SAY_INST_PROGRESS_2'), +(-1568071,'Ya gonna fail, strangers. Many try before you, but dey only make us stronger!',12056,6,0,0,'zulaman SAY_INST_PROGRESS_3'), +(-1568072,'Your efforts was in vain, trespassers. The rituals nearly be complete.',12057,6,0,0,'zulaman SAY_INST_WARN_1'), +(-1568073,'Soon da cages gonna be empty, da sacrifices be complete, and you gonna take dere places.',12058,6,0,0,'zulaman SAY_INST_WARN_2'), +(-1568074,'Time be running low, strangers. Soon you gonna join da souls of dem ya failed to save.',12059,6,0,0,'zulaman SAY_INST_WARN_3'), +(-1568075,'Make haste, ma priests! Da rituals must not be interrupted!',12060,6,0,0,'zulaman SAY_INST_WARN_4'), +(-1568076,'Ya make a good try... but now you gonna join da ones who already fall.',12061,6,0,0,'zulaman SAY_INST_SACRIF1'), +(-1568077,'Ya not do too bad. Ya efforts [...] for a small time. Come to me now. Ya prove yourself worthy offerings.',12062,6,0,0,'zulaman SAY_INST_SACRIF2'), +(-1568078,'Watch now. Every offering gonna strengthen our ties to da spirit world. Soon, we gonna be unstoppable!',12065,6,0,0,'zulaman SAY_INST_COMPLETE'), (-1568079,'Suit yourself. At least five of you must assist me if we\'re to get inside. Follow me.',0,1,0,0,'harrison SAY_START'), (-1568080,'According to my calculations, if enough of us bang the gong at once the seal on these doors will break and we can enter.',0,1,0,0,'harrison SAY_AT_GONG'), @@ -3458,7 +3466,50 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,commen -- -1 668 000 ICC: HALLS OF REFLECTION -- -1 724 000 RUBY SANCTUM - +INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES +(-1724000,'Help! I am trapped within this tree! I require aid!',17490,6,0,0,'xerestraza SAY_HELP'), +(-1724001,'Your power wanes, ancient one! Soon, you will join your friends!',17525,6,0,0,'baltharus SAY_INTRO'), +(-1724002,'Thank you! I could have not held out for much longer. A terrible thing has happened here.',17491,1,0,0,'xerestraza SAY_THANKS'), +(-1724003,'We believed that the Sanctum was well fortified, but we were not prepareted for the nature of this assault.',17492,0,0,0,'xerestraza SAY_OUTRO_1'), +(-1724004,'The Black Dragonkin materialized from thin air, and set upon us before we could react.',17493,0,0,0,'xerestraza SAY_OUTRO_2'), +(-1724005,'We did not stand a chance. As my brethren perished around me, I managed to retreat hear and bar the entrance.',17494,0,0,0,'xerestraza SAY_OUTRO_3'), +(-1724006,'They slaughtered us with cold efficiency, but the true focus of their interest seemed to be the eggs kept here in the sanctum.',17495,0,0,0,'xerestraza SAY_OUTRO_4'), +(-1724007,'The commander of the forces on the ground here is a cruel brute named Zarithrian. But I fear there are greater powers at work.',17496,0,0,0,'xerestraza SAY_OUTRO_5'), +(-1724008,'In their initial assault I caught a glimpse of their true leader, a fearsome full-grown Twilight Dragon.',17497,0,0,0,'xerestraza SAY_OUTRO_6'), +(-1724009,'I know not the extent of their plans heroes, but I know this: they cannot be allowed to succeed!',17498,0,0,0,'xerestraza SAY_OUTRO_7'), + +(-1724010,'Ah, the entertainment has arrived.',17520,1,0,0,'baltharus SAY_AGGRO'), +(-1724011,'Baltharus leaves no survivors!',17521,1,0,0,'baltharus SAY_SLAY_1'), +(-1724012,'This world has enough heroes.',17522,1,0,0,'baltharus SAY_SLAY_2'), +(-1724013,'I... Didn\'t see that coming...',17523,1,0,0,'baltharus SAY_DEATH'), +(-1724014,'Twice the pain and half the fun.',17524,1,0,0,'baltharus SAY_SPLIT'), + +(-1724015,'You will suffer for this intrusion!',17528,1,0,0,'saviana SAY_AGGRO'), +(-1724016,'As it should be...',17529,1,0,0,'saviana SAY_SLAY_1'), +(-1724017,'Halion will be pleased.',17530,1,0,0,'saviana SAY_SLAY_2'), +(-1724018,'Burn in the master\'s flame!',17532,1,0,0,'saviana SAY_SPECIAL'), + +(-1724019,'Alexstrasza has chosen capable allies... A pity that I must END YOU!',17512,1,0,0,'zarithrian SAY_AGGRO'), +(-1724020,'You thought you stood a chance?',17513,1,0,0,'zarithrian SAY_SLAY_1'), +(-1724021,'It\'s for the best.',17514,1,0,0,'zarithrian SAY_SLAY_2'), +(-1724022,'HALION! I...',17515,1,0,0,'zarithrian SAY_DEATH'), +(-1724023,'Turn them to ash, minions!',17516,1,0,0,'zarithrian SAY_SUMMON'), + +(-1724024,'Meddlesome insects! You\'re too late: The Ruby Sanctum\'s lost.',17499,6,0,0,'halion SAY_SPAWN'), +(-1724025,'Your world teeters on the brink of annihilation. You will ALL bear witness to the coming of a new age of DESTRUCTION!',17500,1,0,0,'halion SAY_AGGRO'), +(-1724026,'Another hero falls.',17501,1,0,0,'halion SAY_SLAY'), +(-1724027,'Relish this victory, mortals, for it will be your last! This world will burn with the master\'s return!',17503,1,0,0,'halion SAY_DEATH'), +(-1724028,'Not good enough.',17504,1,0,0,'halion SAY_BERSERK'), +(-1724029,'The heavens burn!',17505,1,0,0,'halion SAY_FIREBALL'), +(-1724030,'Beware the shadow!',17506,1,0,0,'halion SAY_SPHERES'), +(-1724031,'You will find only suffering within the realm of twilight! Enter if you dare!',17507,1,0,0,'halion SAY_PHASE_2'), +(-1724032,'I am the light and the darkness! Cower, mortals, before the herald of Deathwing!',17508,1,0,0,'halion SAY_PHASE_3'), +(-1724033,'The orbining spheres pulse with dark energy!',0,3,0,0,'halion EMOTE_SPHERES'), +(-1724034,'Your efforts force %s further out of the twillight realm!',0,3,0,0,'halion EMOTE_OUT_OF_TWILLIGHT'), +(-1724035,'Your efforts force %s further out of the physical realm!',0,3,0,0,'halion EMOTE_OUT_OF_PHYSICAL'), +(-1724036,'Your companions\' efforts force Halion further into the twillight realm!',0,3,0,0,'halion EMOTE_INTO_TWILLIGHT'), +(-1724037,'Your companions\' efforts force Halion further into the physical realm!',0,3,0,0,'halion EMOTE_INTO_PHYSICAL'), +(-1724038,'Without pressure in both realms %s begins to regenerate.',0,3,0,0,'halion EMOTE_REGENERATE'); -- -1 999 900 EXAMPLE TEXT INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES @@ -3518,6 +3569,10 @@ INSERT INTO gossip_texts (entry,content_default,comment) VALUES (-3000107,'[PH] Get Presicion Bombs','greer orehammer GOSSIP_ITEM_GET_BOMBS'), (-3000108,'[PH] Start bombing mission','greer orehammer GOSSIP_ITEM_FLIGHT'); +-- -3 033 000 SHADOWFANG KEEP +INSERT INTO gossip_texts (entry,content_default,comment) VALUES +(-3033000,'Please unlock the courtyard door.','deathstalker adamant/ sorcerer ashcrombe - GOSSIP_ITEM_DOOR'); + -- -3 043 000 WAILING CAVERNS INSERT INTO gossip_texts (entry,content_default,comment) VALUES (-3043000,'Let the event begin!','Disciple of Naralex - GOSSIP_ITEM_BEGIN'); diff --git a/system/MangosdRev.cpp b/system/MangosdRev.cpp index 7220d38..8ca6116 100644 --- a/system/MangosdRev.cpp +++ b/system/MangosdRev.cpp @@ -12,7 +12,6 @@ # define MANGOS_DLL_EXPORT extern "C" export #endif - MANGOS_DLL_EXPORT char const* GetMangosRevStr() { diff --git a/system/ScriptLoader.cpp b/system/ScriptLoader.cpp index f6a5dc2..3a92651 100644 --- a/system/ScriptLoader.cpp +++ b/system/ScriptLoader.cpp @@ -4,13 +4,17 @@ #include "precompiled.h" -//battlegrounds +// battlegrounds extern void AddSC_battleground(); -//custom +// custom extern void AddSC_custom_cybernetic(); -extern void AddSC_npc_arena_honor(); extern void AddSC_mob_teleguy(); +extern void AddSC_npc_arena_honor(); + +// OutdoorPvP zone scripts +extern void AddSC_outdoor_pvp_eastern_plaguelands(); +extern void AddSC_outdoor_pvp_silithus(); // OutdoorPvP extern void AddSC_outdoor_pvp_eastern_kingdoms(); @@ -18,17 +22,13 @@ extern void AddSC_outdoor_pvp_kalimdor(); extern void AddSC_outdoor_pvp_northrend(); extern void AddSC_outdoor_pvp_outland(); -// OutdoorPvP zone scripts -extern void AddSC_outdoor_pvp_eastern_plaguelands(); -extern void AddSC_outdoor_pvp_silithus(); - -//examples +// examples extern void AddSC_example_creature(); extern void AddSC_example_escort(); extern void AddSC_example_gossip_codebox(); extern void AddSC_example_misc(); -//world +// world extern void AddSC_areatrigger_scripts(); extern void AddSC_bosses_emerald_dragons(); extern void AddSC_generic_creature(); @@ -38,11 +38,13 @@ extern void AddSC_item_scripts(); extern void AddSC_npc_professions(); extern void AddSC_npcs_special(); extern void AddSC_spell_scripts(); +extern void AddSC_pet_scripts(); -//eastern kingdoms -extern void AddSC_blackrock_depths(); //blackrock_depths +// eastern kingdoms +extern void AddSC_blackrock_depths(); // blackrock_depths extern void AddSC_boss_ambassador_flamelash(); extern void AddSC_boss_anubshiah(); +extern void AddSC_boss_coren_direbrew(); extern void AddSC_boss_draganthaurissan(); extern void AddSC_boss_general_angerforge(); extern void AddSC_boss_gorosh_the_dervish(); @@ -51,7 +53,7 @@ extern void AddSC_boss_high_interrogator_gerstahn(); extern void AddSC_boss_magmus(); extern void AddSC_boss_tomb_of_seven(); extern void AddSC_instance_blackrock_depths(); -extern void AddSC_boss_drakkisath(); //blackrock_spire +extern void AddSC_boss_drakkisath(); // blackrock_spire extern void AddSC_boss_halycon(); extern void AddSC_boss_highlordomokk(); extern void AddSC_boss_mothersmolderweb(); @@ -73,30 +75,32 @@ extern void AddSC_boss_flamegor(); extern void AddSC_boss_chromaggus(); extern void AddSC_boss_nefarian(); extern void AddSC_boss_victor_nefarius(); -extern void AddSC_deadmines(); //deadmines +extern void AddSC_instance_blackwing_lair(); +extern void AddSC_deadmines(); // deadmines extern void AddSC_instance_deadmines(); -extern void AddSC_gnomeregan(); //gnomeregan +extern void AddSC_gnomeregan(); // gnomeregan extern void AddSC_boss_thermaplugg(); extern void AddSC_instance_gnomeregan(); -extern void AddSC_boss_attumen(); //karazhan +extern void AddSC_boss_attumen(); // karazhan extern void AddSC_boss_curator(); extern void AddSC_boss_maiden_of_virtue(); extern void AddSC_boss_shade_of_aran(); extern void AddSC_boss_netherspite(); -extern void AddSC_boss_malchezaar(); +extern void AddSC_boss_nightbane(); +extern void AddSC_boss_prince_malchezaar(); extern void AddSC_boss_terestian_illhoof(); -extern void AddSC_netherspite_infernal(); extern void AddSC_boss_moroes(); extern void AddSC_bosses_opera(); +extern void AddSC_chess_event(); extern void AddSC_instance_karazhan(); extern void AddSC_karazhan(); -extern void AddSC_boss_felblood_kaelthas(); //magisters_terrace +extern void AddSC_boss_felblood_kaelthas(); // magisters_terrace extern void AddSC_boss_selin_fireheart(); extern void AddSC_boss_vexallus(); extern void AddSC_boss_priestess_delrissa(); extern void AddSC_instance_magisters_terrace(); extern void AddSC_magisters_terrace(); -extern void AddSC_boss_lucifron(); //molten_core +extern void AddSC_boss_lucifron(); // molten_core extern void AddSC_boss_magmadar(); extern void AddSC_boss_gehennas(); extern void AddSC_boss_garr(); @@ -108,8 +112,8 @@ extern void AddSC_boss_majordomo(); extern void AddSC_boss_ragnaros(); extern void AddSC_instance_molten_core(); extern void AddSC_molten_core(); -extern void AddSC_ebon_hold(); //scarlet_enclave -extern void AddSC_boss_arcanist_doan(); //scarlet_monastery +extern void AddSC_ebon_hold(); // scarlet_enclave +extern void AddSC_boss_arcanist_doan(); // scarlet_monastery extern void AddSC_boss_azshir_the_sleepless(); extern void AddSC_boss_bloodmage_thalnos(); extern void AddSC_boss_herod(); @@ -120,15 +124,16 @@ extern void AddSC_boss_mograine_and_whitemane(); extern void AddSC_boss_scorn(); extern void AddSC_boss_headless_horseman(); extern void AddSC_instance_scarlet_monastery(); -extern void AddSC_boss_darkmaster_gandling(); //scholomance +extern void AddSC_boss_darkmaster_gandling(); // scholomance extern void AddSC_boss_death_knight_darkreaver(); extern void AddSC_boss_jandicebarov(); extern void AddSC_boss_kormok(); extern void AddSC_boss_vectus(); extern void AddSC_instance_scholomance(); -extern void AddSC_shadowfang_keep(); //shadowfang_keep +extern void AddSC_boss_hummel(); // shadowfang_keep +extern void AddSC_shadowfang_keep(); extern void AddSC_instance_shadowfang_keep(); -extern void AddSC_boss_magistrate_barthilas(); //stratholme +extern void AddSC_boss_magistrate_barthilas(); // stratholme extern void AddSC_boss_maleki_the_pallid(); extern void AddSC_boss_nerubenkan(); extern void AddSC_boss_cannon_master_willey(); @@ -141,15 +146,19 @@ extern void AddSC_boss_dathrohan_balnazzar(); extern void AddSC_boss_order_of_silver_hand(); extern void AddSC_instance_stratholme(); extern void AddSC_stratholme(); -extern void AddSC_instance_sunken_temple(); //sunken_temple +extern void AddSC_instance_sunken_temple(); // sunken_temple extern void AddSC_sunken_temple(); -extern void AddSC_boss_brutallus(); //sunwell_plateau +extern void AddSC_boss_brutallus(); // sunwell_plateau +extern void AddSC_boss_eredar_twins(); +extern void AddSC_boss_felmyst(); extern void AddSC_boss_kalecgos(); +extern void AddSC_boss_kiljaeden(); +extern void AddSC_boss_muru(); extern void AddSC_instance_sunwell_plateau(); -extern void AddSC_boss_archaedas(); //uldaman +extern void AddSC_boss_archaedas(); // uldaman extern void AddSC_instance_uldaman(); extern void AddSC_uldaman(); -extern void AddSC_boss_akilzon(); //zulaman +extern void AddSC_boss_akilzon(); // zulaman extern void AddSC_boss_halazzi(); extern void AddSC_boss_janalai(); extern void AddSC_boss_malacrass(); @@ -157,7 +166,7 @@ extern void AddSC_boss_nalorakk(); extern void AddSC_instance_zulaman(); extern void AddSC_zulaman(); extern void AddSC_boss_zuljin(); -extern void AddSC_boss_arlokk(); //zulgurub +extern void AddSC_boss_arlokk(); // zulgurub extern void AddSC_boss_gahzranka(); extern void AddSC_boss_grilek(); extern void AddSC_boss_hakkar(); @@ -173,7 +182,7 @@ extern void AddSC_boss_venoxis(); extern void AddSC_boss_wushoolay(); extern void AddSC_instance_zulgurub(); -//extern void AddSC_alterac_mountains(); +// extern void AddSC_alterac_mountains(); extern void AddSC_arathi_highlands(); extern void AddSC_blasted_lands(); extern void AddSC_boss_kruul(); @@ -200,30 +209,39 @@ extern void AddSC_western_plaguelands(); extern void AddSC_westfall(); extern void AddSC_wetlands(); -//kalimdor -extern void AddSC_instance_blackfathom_deeps(); //blackfathom_deeps -extern void AddSC_boss_aeonus(); //COT, dark_portal +// kalimdor +extern void AddSC_instance_blackfathom_deeps(); // blackfathom_deeps +extern void AddSC_boss_aeonus(); // COT, dark_portal extern void AddSC_boss_chrono_lord_deja(); extern void AddSC_boss_temporus(); extern void AddSC_dark_portal(); extern void AddSC_instance_dark_portal(); -extern void AddSC_hyjal(); //COT, hyjal +extern void AddSC_hyjal(); // COT, hyjal extern void AddSC_boss_archimonde(); extern void AddSC_instance_mount_hyjal(); -extern void AddSC_boss_captain_skarloc(); //COT, old_hillsbrad +extern void AddSC_boss_captain_skarloc(); // COT, old_hillsbrad extern void AddSC_boss_epoch_hunter(); extern void AddSC_boss_lieutenant_drake(); extern void AddSC_instance_old_hillsbrad(); extern void AddSC_old_hillsbrad(); +extern void AddSC_culling_of_stratholme(); // COT, culling_of_stratholme +extern void AddSC_boss_infinite_corruptor(); +extern void AddSC_boss_lord_epoch(); +extern void AddSC_boss_malganis(); +extern void AddSC_boss_meathook(); +extern void AddSC_boss_salramm(); +extern void AddSC_culling_of_stratholmeAI(); +extern void AddSC_instance_culling_of_stratholme(); +extern void AddSC_trash_culling_of_stratholme(); extern void AddSC_dire_maul(); // dire_maul extern void AddSC_instance_dire_maul(); -extern void AddSC_boss_celebras_the_cursed(); //maraudon +extern void AddSC_boss_celebras_the_cursed(); // maraudon extern void AddSC_boss_landslide(); extern void AddSC_boss_noxxion(); extern void AddSC_boss_ptheradras(); -extern void AddSC_boss_onyxia(); //onyxias_lair +extern void AddSC_boss_onyxia(); // onyxias_lair extern void AddSC_instance_onyxias_lair(); -extern void AddSC_boss_amnennar_the_coldbringer(); //razorfen_downs +extern void AddSC_boss_amnennar_the_coldbringer(); // razorfen_downs extern void AddSC_razorfen_downs(); extern void AddSC_instance_razorfen_kraul(); // razorfen_kraul extern void AddSC_razorfen_kraul(); @@ -239,6 +257,7 @@ extern void AddSC_bug_trio(); extern void AddSC_boss_sartura(); extern void AddSC_boss_skeram(); extern void AddSC_boss_twinemperors(); +extern void AddSC_boss_viscidus(); extern void AddSC_mob_anubisath_sentinel(); extern void AddSC_instance_temple_of_ahnqiraj(); extern void AddSC_instance_wailing_caverns(); // wailing_caverns @@ -247,17 +266,6 @@ extern void AddSC_boss_zumrah(); // zulfarrak extern void AddSC_instance_zulfarrak(); extern void AddSC_zulfarrak(); -// culling of stratholme -extern void AddSC_boss_lord_epoch(); -extern void AddSC_boss_malganis(); -extern void AddSC_boss_meathook(); -extern void AddSC_boss_salramm(); -extern void AddSC_boss_infinite_corruptor(); -extern void AddSC_culling_of_stratholme(); -extern void AddSC_culling_of_stratholmeAI(); -extern void AddSC_instance_culling_of_stratholme(); -extern void AddSC_trash_culling_of_stratholme(); - extern void AddSC_ashenvale(); extern void AddSC_azshara(); extern void AddSC_azuremyst_isle(); @@ -281,58 +289,75 @@ extern void AddSC_thunder_bluff(); extern void AddSC_ungoro_crater(); extern void AddSC_winterspring(); -//northrend - -extern void AddSC_trial_of_the_champion(); //trial_of_the_champion -extern void AddSC_boss_argent_challenge(); -extern void AddSC_boss_black_knight(); -extern void AddSC_boss_grand_champions(); -extern void AddSC_instance_trial_of_the_champion(); - -extern void AddSC_boss_jedoga(); //ahnkahet +// northrend +extern void AddSC_boss_jedoga(); // azjol-nerub, ahnkahet extern void AddSC_boss_amanitar(); extern void AddSC_boss_nadox(); extern void AddSC_boss_taldaram(); extern void AddSC_boss_volazj(); extern void AddSC_instance_ahnkahet(); -extern void AddSC_boss_anubarak(); //azjol-nerub +extern void AddSC_boss_anubarak(); // azjol-nerub, azjol-nerub extern void AddSC_boss_hadronox(); extern void AddSC_boss_krikthir(); extern void AddSC_instance_azjol_nerub(); - -extern void AddSC_northrend_beasts(); //Crusaders' Coliseum, trial_of_the_crusader -extern void AddSC_boss_jaraxxus(); -extern void AddSC_boss_anubarak_trial(); +extern void AddSC_trial_of_the_champion(); // CC, trial_of_the_champion +extern void AddSC_boss_argent_challenge(); +extern void AddSC_boss_black_knight(); +extern void AddSC_boss_grand_champions(); +extern void AddSC_instance_trial_of_the_champion(); +extern void AddSC_boss_anubarak_trial(); // CC, trial_of_the_crusader extern void AddSC_boss_faction_champions(); -extern void AddSC_twin_valkyr(); +extern void AddSC_boss_jaraxxus(); extern void AddSC_instance_trial_of_the_crusader(); +extern void AddSC_northrend_beasts(); extern void AddSC_trial_of_the_crusader(); - -extern void AddSC_boss_novos(); //draktharon_keep +extern void AddSC_twin_valkyr(); +extern void AddSC_boss_novos(); // draktharon_keep extern void AddSC_boss_dred(); extern void AddSC_boss_tharonja(); extern void AddSC_boss_trollgore(); extern void AddSC_instance_draktharon_keep(); -extern void AddSC_boss_colossus(); //gundrak +extern void AddSC_boss_colossus(); // gundrak extern void AddSC_boss_eck(); extern void AddSC_boss_galdarah(); extern void AddSC_boss_moorabi(); extern void AddSC_boss_sladran(); extern void AddSC_instance_gundrak(); - +extern void AddSC_boss_bronjahm(); // ICC, forge_of_souls +extern void AddSC_boss_devourer_of_souls(); +extern void AddSC_instance_forge_of_souls(); +extern void AddSC_forge_of_souls(); +extern void AddSC_boss_falric(); // ICC, halls_of_reflection +extern void AddSC_boss_lich_king_hr(); +extern void AddSC_boss_marwyn(); +extern void AddSC_halls_of_reflection(); +extern void AddSC_instance_halls_of_reflection(); extern void AddSC_boss_garfrost(); // ICC, pit_of_saron - extern void AddSC_boss_krick_and_ick(); extern void AddSC_boss_tyrannus(); extern void AddSC_instance_pit_of_saron(); extern void AddSC_pit_of_saron(); - -extern void AddSC_boss_anubrekhan(); //naxxramas +extern void AddSC_blood_prince_council(); // ICC, icecrown_citadel +extern void AddSC_boss_blood_queen_lanathel(); +extern void AddSC_boss_deathbringer_saurfang(); +extern void AddSC_boss_festergut(); +extern void AddSC_boss_lady_deathwhisper(); +extern void AddSC_boss_lord_marrowgar(); +extern void AddSC_boss_professor_putricide(); +extern void AddSC_boss_rotface(); +extern void AddSC_boss_sindragosa(); +extern void AddSC_boss_lich_king_icc(); +extern void AddSC_boss_valithria_dreamwalker(); +extern void AddSC_gunship_battle(); +extern void AddSC_instance_icecrown_spire(); +extern void AddSC_icecrown_spire(); +extern void AddSC_icecrown_teleporter(); +extern void AddSC_boss_anubrekhan(); // naxxramas extern void AddSC_boss_four_horsemen(); extern void AddSC_boss_faerlina(); -extern void AddSC_boss_grobbulus(); extern void AddSC_boss_gluth(); extern void AddSC_boss_gothik(); +extern void AddSC_boss_grobbulus(); extern void AddSC_boss_kelthuzad(); extern void AddSC_boss_loatheb(); extern void AddSC_boss_maexxna(); @@ -343,66 +368,77 @@ extern void AddSC_boss_razuvious(); extern void AddSC_boss_sapphiron(); extern void AddSC_boss_thaddius(); extern void AddSC_instance_naxxramas(); - -extern void AddSC_boss_anomalus(); //nexus +extern void AddSC_boss_malygos(); // nexus, eye_of_eternity +extern void AddSC_instance_eye_of_eternity(); +extern void AddSC_boss_anomalus(); // nexus, nexus extern void AddSC_boss_keristrasza(); extern void AddSC_boss_ormorok(); extern void AddSC_boss_telestra(); extern void AddSC_instance_nexus(); - -extern void AddSC_oculus(); //Oculus -extern void AddSC_instance_oculus(); -extern void AddSC_boss_drakos(); +extern void AddSC_boss_drakos(); // nexus, oculus +extern void AddSC_boss_eregos(); extern void AddSC_boss_varos(); extern void AddSC_boss_urom(); -extern void AddSC_boss_eregos(); - -extern void AddSC_boss_malygos(); //eye of eternity -extern void AddSC_instance_eye_of_eternity(); - -extern void AddSC_boss_sartharion(); //obsidian_sanctum +extern void AddSC_instance_oculus(); +extern void AddSC_oculus(); +extern void AddSC_boss_sartharion(); // obsidian_sanctum extern void AddSC_instance_obsidian_sanctum(); -extern void AddSC_instance_vault_of_archavon(); //vault_of_archavon -extern void AddSC_boss_toravon(); -extern void AddSC_boss_koralon(); -extern void AddSC_boss_emalon(); -extern void AddSC_boss_archavon(); -extern void AddSC_boss_bjarngrim(); //Ulduar, halls_of_lightning +extern void AddSC_boss_baltharus(); // ruby_sanctum +extern void AddSC_boss_halion(); +extern void AddSC_boss_ragefire(); +extern void AddSC_boss_zarithrian(); +extern void AddSC_instance_ruby_sanctum(); +extern void AddSC_ruby_sanctum(); +extern void AddSC_boss_bjarngrim(); // ulduar, halls_of_lightning extern void AddSC_boss_ionar(); extern void AddSC_boss_loken(); extern void AddSC_boss_volkhan(); extern void AddSC_instance_halls_of_lightning(); -extern void AddSC_boss_maiden_of_grief(); //Ulduar, halls_of_stone +extern void AddSC_boss_maiden_of_grief(); // ulduar, halls_of_stone extern void AddSC_boss_sjonnir(); extern void AddSC_boss_krystallus(); extern void AddSC_halls_of_stone(); extern void AddSC_instance_halls_of_stone(); -extern void AddSC_boss_algalon(); //Ulduar raid +extern void AddSC_boss_iron_council(); // ulduar, ulduar +extern void AddSC_boss_algalon(); extern void AddSC_boss_auriaya(); +extern void AddSC_boss_leviathan(); extern void AddSC_boss_freya(); +extern void AddSC_boss_vezax(); extern void AddSC_boss_hodir(); extern void AddSC_boss_ignis(); -extern void AddSC_boss_iron_council(); extern void AddSC_boss_kologarn(); -extern void AddSC_boss_leviathan(); extern void AddSC_boss_mimiron(); extern void AddSC_boss_razorscale(); extern void AddSC_boss_thorim(); -extern void AddSC_boss_vezax(); -extern void AddSC_boss_xt_002(); +extern void AddSC_boss_xt002(); extern void AddSC_boss_yogg_saron(); extern void AddSC_instance_ulduar(); extern void AddSC_ulduar(); -extern void AddSC_boss_ingvar(); //utgarde_keep +extern void AddSC_boss_ingvar(); // utgarde_keep extern void AddSC_boss_keleseth(); extern void AddSC_boss_skarvald_and_dalronn(); extern void AddSC_instance_utgarde_keep(); extern void AddSC_utgarde_keep(); -extern void AddSC_boss_gortok(); //utgarde_pinnacle +extern void AddSC_boss_gortok(); // utgarde_keep, utgarde_pinnacle extern void AddSC_boss_skadi(); extern void AddSC_boss_svala(); extern void AddSC_boss_ymiron(); extern void AddSC_instance_pinnacle(); +extern void AddSC_boss_archavon(); // vault_of_archavon +extern void AddSC_boss_emalon(); +extern void AddSC_boss_koralon(); +extern void AddSC_boss_toravon(); +extern void AddSC_instance_vault_of_archavon(); +extern void AddSC_boss_erekem(); // violet_hold +extern void AddSC_boss_ichoron(); +extern void AddSC_instance_violet_hold(); +extern void AddSC_violet_hold(); +extern void AddSC_boss_cyanigosa(); +extern void AddSC_boss_moragg(); +extern void AddSC_boss_xevozz(); +extern void AddSC_boss_zuramat(); +extern void AddSC_boss_lavanthor(); extern void AddSC_borean_tundra(); extern void AddSC_dalaran(); @@ -414,62 +450,21 @@ extern void AddSC_sholazar_basin(); extern void AddSC_storm_peaks(); extern void AddSC_zuldrak(); -extern void AddSC_instance_violet_hold(); -extern void AddSC_violet_hold(); -extern void AddSC_boss_cyanigosa(); -extern void AddSC_boss_moragg(); -extern void AddSC_boss_erekem(); -extern void AddSC_boss_xevozz(); -extern void AddSC_boss_ichoron(); -extern void AddSC_boss_zuramat(); -extern void AddSC_boss_lavanthor(); -//IceCrown Citadel -extern void AddSC_instance_icecrown_spire(); -extern void AddSC_icecrown_spire(); -extern void AddSC_icecrown_teleporter(); -extern void AddSC_boss_lord_marrowgar(); -extern void AddSC_boss_lady_deathwhisper(); -extern void AddSC_boss_deathbringer_saurfang(); -extern void AddSC_boss_rotface(); -extern void AddSC_boss_festergut(); -extern void AddSC_boss_proffesor_putricide(); -extern void AddSC_blood_prince_council(); -extern void AddSC_boss_blood_queen_lanathel(); -extern void AddSC_boss_valithria_dreamwalker(); -extern void AddSC_boss_sindragosa(); -extern void AddSC_boss_lich_king_icc(); - -extern void AddSC_instance_forge_of_souls(); -extern void AddSC_boss_devourer_of_souls(); -extern void AddSC_boss_bronjahm(); -extern void AddSC_forge_of_souls(); - -extern void AddSC_instance_halls_of_reflection(); -extern void AddSC_halls_of_reflection(); -extern void AddSC_boss_falric(); -extern void AddSC_boss_marwyn(); -extern void AddSC_boss_lich_king_hr(); - -extern void AddSC_instance_ruby_sanctum(); // Ruby Sanctum -extern void AddSC_ruby_sanctum(); -extern void AddSC_boss_halion(); -extern void AddSC_boss_ragefire(); -extern void AddSC_boss_zarithrian(); -extern void AddSC_boss_baltharus(); - -//outland -extern void AddSC_boss_exarch_maladaar(); //auchindoun, auchenai_crypts -extern void AddSC_boss_nexusprince_shaffar(); //auchindoun, mana_tombs +// outland +extern void AddSC_boss_exarch_maladaar(); // auchindoun, auchenai_crypts +extern void AddSC_boss_shirrak(); +extern void AddSC_boss_nexusprince_shaffar(); // auchindoun, mana_tombs extern void AddSC_boss_pandemonius(); -extern void AddSC_boss_darkweaver_syth(); //auchindoun, sethekk_halls +extern void AddSC_boss_anzu(); // auchindoun, sethekk_halls +extern void AddSC_boss_darkweaver_syth(); extern void AddSC_boss_talon_king_ikiss(); extern void AddSC_instance_sethekk_halls(); -extern void AddSC_boss_ambassador_hellmaw(); //auchindoun, shadow_labyrinth +extern void AddSC_boss_ambassador_hellmaw(); // auchindoun, shadow_labyrinth extern void AddSC_boss_blackheart_the_inciter(); extern void AddSC_boss_grandmaster_vorpil(); extern void AddSC_boss_murmur(); extern void AddSC_instance_shadow_labyrinth(); -extern void AddSC_black_temple(); //black_temple +extern void AddSC_black_temple(); // black_temple extern void AddSC_boss_illidan(); extern void AddSC_boss_shade_of_akama(); extern void AddSC_boss_supremus(); @@ -480,39 +475,40 @@ extern void AddSC_boss_teron_gorefiend(); extern void AddSC_boss_najentus(); extern void AddSC_boss_illidari_council(); extern void AddSC_instance_black_temple(); -extern void AddSC_boss_fathomlord_karathress(); //CR, serpent_shrine +extern void AddSC_boss_fathomlord_karathress(); // CR, serpent_shrine extern void AddSC_boss_hydross_the_unstable(); extern void AddSC_boss_lady_vashj(); extern void AddSC_boss_leotheras_the_blind(); extern void AddSC_boss_morogrim_tidewalker(); extern void AddSC_boss_the_lurker_below(); extern void AddSC_instance_serpentshrine_cavern(); -extern void AddSC_boss_hydromancer_thespia(); //CR, steam_vault +extern void AddSC_boss_ahune(); // CR, slave_pens +extern void AddSC_boss_hydromancer_thespia(); // CR, steam_vault extern void AddSC_boss_mekgineer_steamrigger(); extern void AddSC_boss_warlord_kalithresh(); extern void AddSC_instance_steam_vault(); -extern void AddSC_boss_hungarfen(); //CR, Underbog -extern void AddSC_boss_gruul(); //gruuls_lair +extern void AddSC_boss_hungarfen(); // CR, Underbog +extern void AddSC_boss_gruul(); // gruuls_lair extern void AddSC_boss_high_king_maulgar(); extern void AddSC_instance_gruuls_lair(); -extern void AddSC_boss_broggok(); //HC, blood_furnace +extern void AddSC_boss_broggok(); // HC, blood_furnace extern void AddSC_boss_kelidan_the_breaker(); extern void AddSC_boss_the_maker(); extern void AddSC_instance_blood_furnace(); -extern void AddSC_boss_nazan_and_vazruden(); //HC, hellfire_ramparts +extern void AddSC_boss_nazan_and_vazruden(); // HC, hellfire_ramparts extern void AddSC_boss_omor_the_unscarred(); extern void AddSC_boss_watchkeeper_gargolmar(); extern void AddSC_instance_ramparts(); -extern void AddSC_boss_magtheridon(); //HC, magtheridons_lair +extern void AddSC_boss_magtheridon(); // HC, magtheridons_lair extern void AddSC_instance_magtheridons_lair(); -extern void AddSC_boss_grand_warlock_nethekurse(); //HC, shattered_halls +extern void AddSC_boss_grand_warlock_nethekurse(); // HC, shattered_halls extern void AddSC_boss_warbringer_omrogg(); extern void AddSC_boss_warchief_kargath_bladefist(); extern void AddSC_instance_shattered_halls(); -extern void AddSC_arcatraz(); //TK, arcatraz +extern void AddSC_arcatraz(); // TK, arcatraz extern void AddSC_boss_harbinger_skyriss(); extern void AddSC_instance_arcatraz(); -extern void AddSC_boss_high_botanist_freywinn(); //TK, botanica +extern void AddSC_boss_high_botanist_freywinn(); // TK, botanica extern void AddSC_boss_laj(); extern void AddSC_boss_warp_splinter(); extern void AddSC_boss_alar(); // TK, the_eye @@ -521,7 +517,7 @@ extern void AddSC_boss_kaelthas(); extern void AddSC_boss_void_reaver(); extern void AddSC_instance_the_eye(); extern void AddSC_the_eye(); -extern void AddSC_boss_gatewatcher_iron_hand(); //TK, the_mechanar +extern void AddSC_boss_gatewatcher_iron_hand(); // TK, the_mechanar extern void AddSC_boss_nethermancer_sepethrea(); extern void AddSC_boss_pathaleon_the_calculator(); extern void AddSC_instance_mechanar(); @@ -539,32 +535,27 @@ extern void AddSC_zangarmarsh(); void AddScripts() { - //battlegrounds + // battlegrounds AddSC_battleground(); - //custom + // custom AddSC_custom_cybernetic(); - AddSC_npc_arena_honor(); AddSC_mob_teleguy(); - - // OutdoorPvP zone scripts - // Must be _before_ map scripts call! - AddSC_outdoor_pvp_eastern_plaguelands(); + AddSC_npc_arena_honor(); + AddSC_outdoor_pvp_eastern_plaguelands(); // OutdoorPvP zone scripts. Must be _before_ map scripts call! AddSC_outdoor_pvp_silithus(); - - // OutdoorPvP - AddSC_outdoor_pvp_eastern_kingdoms(); + AddSC_outdoor_pvp_eastern_kingdoms(); // OutdoorPvP AddSC_outdoor_pvp_kalimdor(); AddSC_outdoor_pvp_northrend(); AddSC_outdoor_pvp_outland(); - //examples + // examples AddSC_example_creature(); AddSC_example_escort(); AddSC_example_gossip_codebox(); AddSC_example_misc(); - //world + // world AddSC_areatrigger_scripts(); AddSC_bosses_emerald_dragons(); AddSC_generic_creature(); @@ -574,11 +565,13 @@ void AddScripts() AddSC_npc_professions(); AddSC_npcs_special(); AddSC_spell_scripts(); + AddSC_pet_scripts(); - //eastern kingdoms - AddSC_blackrock_depths(); //blackrock_depths + // eastern kingdoms + AddSC_blackrock_depths(); // blackrock_depths AddSC_boss_ambassador_flamelash(); AddSC_boss_anubshiah(); + AddSC_boss_coren_direbrew(); AddSC_boss_draganthaurissan(); AddSC_boss_general_angerforge(); AddSC_boss_gorosh_the_dervish(); @@ -587,7 +580,7 @@ void AddScripts() AddSC_boss_magmus(); AddSC_boss_tomb_of_seven(); AddSC_instance_blackrock_depths(); - AddSC_boss_drakkisath(); //blackrock_spire + AddSC_boss_drakkisath(); // blackrock_spire AddSC_boss_halycon(); AddSC_boss_highlordomokk(); AddSC_boss_mothersmolderweb(); @@ -609,30 +602,32 @@ void AddScripts() AddSC_boss_chromaggus(); AddSC_boss_nefarian(); AddSC_boss_victor_nefarius(); - AddSC_deadmines(); //deadmines + AddSC_instance_blackwing_lair(); + AddSC_deadmines(); // deadmines AddSC_instance_deadmines(); - AddSC_gnomeregan(); //gnomeregan + AddSC_gnomeregan(); // gnomeregan AddSC_boss_thermaplugg(); AddSC_instance_gnomeregan(); - AddSC_boss_attumen(); //karazhan + AddSC_boss_attumen(); // karazhan AddSC_boss_curator(); AddSC_boss_maiden_of_virtue(); AddSC_boss_shade_of_aran(); AddSC_boss_netherspite(); - AddSC_boss_malchezaar(); + AddSC_boss_nightbane(); + AddSC_boss_prince_malchezaar(); AddSC_boss_terestian_illhoof(); - AddSC_netherspite_infernal(); AddSC_boss_moroes(); AddSC_bosses_opera(); + AddSC_chess_event(); AddSC_instance_karazhan(); AddSC_karazhan(); - AddSC_boss_felblood_kaelthas(); //magisters_terrace + AddSC_boss_felblood_kaelthas(); // magisters_terrace AddSC_boss_selin_fireheart(); AddSC_boss_vexallus(); AddSC_boss_priestess_delrissa(); AddSC_instance_magisters_terrace(); AddSC_magisters_terrace(); - AddSC_boss_lucifron(); //molten_core + AddSC_boss_lucifron(); // molten_core AddSC_boss_magmadar(); AddSC_boss_gehennas(); AddSC_boss_garr(); @@ -644,8 +639,8 @@ void AddScripts() AddSC_boss_ragnaros(); AddSC_instance_molten_core(); AddSC_molten_core(); - AddSC_ebon_hold(); //scarlet_enclave - AddSC_boss_arcanist_doan(); //scarlet_monastery + AddSC_ebon_hold(); // scarlet_enclave + AddSC_boss_arcanist_doan(); // scarlet_monastery AddSC_boss_azshir_the_sleepless(); AddSC_boss_bloodmage_thalnos(); AddSC_boss_herod(); @@ -656,15 +651,16 @@ void AddScripts() AddSC_boss_scorn(); AddSC_boss_headless_horseman(); AddSC_instance_scarlet_monastery(); - AddSC_boss_darkmaster_gandling(); //scholomance + AddSC_boss_darkmaster_gandling(); // scholomance AddSC_boss_death_knight_darkreaver(); AddSC_boss_jandicebarov(); AddSC_boss_kormok(); AddSC_boss_vectus(); AddSC_instance_scholomance(); - AddSC_shadowfang_keep(); //shadowfang_keep + AddSC_boss_hummel(); // shadowfang_keep + AddSC_shadowfang_keep(); AddSC_instance_shadowfang_keep(); - AddSC_boss_magistrate_barthilas(); //stratholme + AddSC_boss_magistrate_barthilas(); // stratholme AddSC_boss_maleki_the_pallid(); AddSC_boss_nerubenkan(); AddSC_boss_cannon_master_willey(); @@ -677,15 +673,19 @@ void AddScripts() AddSC_boss_order_of_silver_hand(); AddSC_instance_stratholme(); AddSC_stratholme(); - AddSC_instance_sunken_temple(); //sunken_temple + AddSC_instance_sunken_temple(); // sunken_temple AddSC_sunken_temple(); - AddSC_boss_brutallus(); //sunwell_plateau + AddSC_boss_brutallus(); // sunwell_plateau + AddSC_boss_eredar_twins(); + AddSC_boss_felmyst(); AddSC_boss_kalecgos(); + AddSC_boss_kiljaeden(); + AddSC_boss_muru(); AddSC_instance_sunwell_plateau(); - AddSC_boss_archaedas(); //uldaman + AddSC_boss_archaedas(); // uldaman AddSC_instance_uldaman(); AddSC_uldaman(); - AddSC_boss_akilzon(); //zulaman + AddSC_boss_akilzon(); // zulaman AddSC_boss_halazzi(); AddSC_boss_janalai(); AddSC_boss_malacrass(); @@ -693,7 +693,7 @@ void AddScripts() AddSC_instance_zulaman(); AddSC_zulaman(); AddSC_boss_zuljin(); - AddSC_boss_arlokk(); //zulgurub + AddSC_boss_arlokk(); // zulgurub AddSC_boss_gahzranka(); AddSC_boss_grilek(); AddSC_boss_hakkar(); @@ -709,7 +709,7 @@ void AddScripts() AddSC_boss_wushoolay(); AddSC_instance_zulgurub(); - //AddSC_alterac_mountains(); + // AddSC_alterac_mountains(); AddSC_arathi_highlands(); AddSC_blasted_lands(); AddSC_boss_kruul(); @@ -736,30 +736,39 @@ void AddScripts() AddSC_westfall(); AddSC_wetlands(); - //kalimdor + // kalimdor AddSC_instance_blackfathom_deeps(); // blackfathom deeps - AddSC_boss_aeonus(); // Opening the Dark Portal + AddSC_boss_aeonus(); // COT, dark_portal AddSC_boss_chrono_lord_deja(); AddSC_boss_temporus(); AddSC_dark_portal(); AddSC_instance_dark_portal(); - AddSC_hyjal(); // Battle of Mount Hyjal + AddSC_hyjal(); // COT, hyjal AddSC_boss_archimonde(); AddSC_instance_mount_hyjal(); - AddSC_boss_captain_skarloc(); // Escape from Durnholde Keep + AddSC_boss_captain_skarloc(); // CoT, old_hillsbrand AddSC_boss_epoch_hunter(); AddSC_boss_lieutenant_drake(); AddSC_instance_old_hillsbrad(); + AddSC_old_hillsbrad(); + AddSC_culling_of_stratholme(); // COT, culling_of_stratholme + AddSC_boss_infinite_corruptor(); + AddSC_boss_lord_epoch(); + AddSC_boss_malganis(); + AddSC_boss_meathook(); + AddSC_boss_salramm(); + AddSC_culling_of_stratholmeAI(); + AddSC_instance_culling_of_stratholme(); + AddSC_trash_culling_of_stratholme(); AddSC_dire_maul(); // dire_maul AddSC_instance_dire_maul(); - AddSC_old_hillsbrad(); - AddSC_boss_celebras_the_cursed(); //maraudon + AddSC_boss_celebras_the_cursed(); // maraudon AddSC_boss_landslide(); AddSC_boss_noxxion(); AddSC_boss_ptheradras(); - AddSC_boss_onyxia(); //onyxias_lair + AddSC_boss_onyxia(); // onyxias_lair AddSC_instance_onyxias_lair(); - AddSC_boss_amnennar_the_coldbringer(); //razorfen_downs + AddSC_boss_amnennar_the_coldbringer(); // razorfen_downs AddSC_razorfen_downs(); AddSC_instance_razorfen_kraul(); // razorfen_kraul AddSC_razorfen_kraul(); @@ -775,6 +784,7 @@ void AddScripts() AddSC_boss_sartura(); AddSC_boss_skeram(); AddSC_boss_twinemperors(); + AddSC_boss_viscidus(); AddSC_mob_anubisath_sentinel(); AddSC_instance_temple_of_ahnqiraj(); AddSC_instance_wailing_caverns(); // wailing_caverns @@ -806,114 +816,129 @@ void AddScripts() AddSC_ungoro_crater(); AddSC_winterspring(); - //northrend - AddSC_trial_of_the_champion(); //trial_of_the_champion - AddSC_boss_argent_challenge(); - AddSC_boss_black_knight(); - AddSC_boss_grand_champions(); - AddSC_instance_trial_of_the_champion(); - - AddSC_boss_jedoga(); //ahnkahet + // northrend + AddSC_boss_jedoga(); // azjol-nerub, ahnkahet AddSC_boss_amanitar(); AddSC_boss_nadox(); AddSC_boss_taldaram(); AddSC_boss_volazj(); AddSC_instance_ahnkahet(); - AddSC_boss_anubarak(); //azjol-nerub + AddSC_boss_anubarak(); // azjol-nerub, azjol-nerub AddSC_boss_hadronox(); AddSC_boss_krikthir(); AddSC_instance_azjol_nerub(); - - AddSC_northrend_beasts(); //Crusaders' Coliseum, trial_of_the_crusader - AddSC_boss_jaraxxus(); - AddSC_boss_anubarak_trial(); + AddSC_boss_grand_champions(); // CC, trial_of_the_champion + AddSC_instance_trial_of_the_champion(); + AddSC_trial_of_the_champion(); + AddSC_boss_argent_challenge(); + AddSC_boss_black_knight(); + AddSC_boss_anubarak_trial(); // CC, trial_of_the_crusader AddSC_boss_faction_champions(); - AddSC_twin_valkyr(); + AddSC_boss_jaraxxus(); AddSC_instance_trial_of_the_crusader(); + AddSC_northrend_beasts(); AddSC_trial_of_the_crusader(); - - AddSC_boss_novos(); //draktharon_keep + AddSC_twin_valkyr(); + AddSC_boss_novos(); // draktharon_keep AddSC_boss_dred(); AddSC_boss_tharonja(); AddSC_boss_trollgore(); AddSC_instance_draktharon_keep(); - AddSC_boss_colossus(); //gundrak + AddSC_boss_colossus(); // gundrak AddSC_boss_eck(); AddSC_boss_galdarah(); AddSC_boss_moorabi(); AddSC_boss_sladran(); AddSC_instance_gundrak(); - - AddSC_boss_garfrost(); // ICC, FH, pit_of_saron - + AddSC_boss_bronjahm(); // ICC, FH, forge_of_souls + AddSC_boss_devourer_of_souls(); + AddSC_instance_forge_of_souls(); + AddSC_forge_of_souls(); + AddSC_boss_falric(); // ICC, FH, halls_of_reflection + AddSC_boss_lich_king_hr(); + AddSC_boss_marwyn(); + AddSC_halls_of_reflection(); + AddSC_instance_halls_of_reflection(); + AddSC_boss_garfrost(); // ICC, pit_of_saron AddSC_boss_krick_and_ick(); AddSC_boss_tyrannus(); AddSC_instance_pit_of_saron(); AddSC_pit_of_saron(); - - AddSC_boss_anubrekhan(); //naxxramas + AddSC_blood_prince_council(); // ICC, icecrown_citadel + AddSC_boss_blood_queen_lanathel(); + AddSC_boss_deathbringer_saurfang(); + AddSC_boss_festergut(); + AddSC_boss_lady_deathwhisper(); + AddSC_boss_lord_marrowgar(); + AddSC_boss_professor_putricide(); + AddSC_boss_rotface(); + AddSC_boss_sindragosa(); + AddSC_boss_lich_king_icc(); + AddSC_boss_valithria_dreamwalker(); + AddSC_gunship_battle(); + AddSC_instance_icecrown_spire(); + AddSC_icecrown_spire(); + AddSC_icecrown_teleporter(); + AddSC_boss_anubrekhan(); // naxxramas AddSC_boss_four_horsemen(); AddSC_boss_faerlina(); AddSC_boss_gluth(); AddSC_boss_gothik(); + AddSC_boss_grobbulus(); AddSC_boss_kelthuzad(); AddSC_boss_loatheb(); AddSC_boss_maexxna(); AddSC_boss_noth(); - AddSC_boss_grobbulus(); AddSC_boss_heigan(); AddSC_boss_patchwerk(); AddSC_boss_razuvious(); AddSC_boss_sapphiron(); - AddSC_boss_thaddius(); + AddSC_boss_thaddius(); AddSC_instance_naxxramas(); - - AddSC_boss_anomalus(); //nexus + AddSC_boss_malygos(); // nexus, eye_of_eternity + AddSC_instance_eye_of_eternity(); + AddSC_boss_anomalus(); // nexus, nexus AddSC_boss_keristrasza(); AddSC_boss_ormorok(); AddSC_boss_telestra(); AddSC_instance_nexus(); - - AddSC_oculus(); //Oculus - AddSC_instance_oculus(); - AddSC_boss_drakos(); + AddSC_boss_drakos(); // nexus, oculus + AddSC_boss_eregos(); AddSC_boss_varos(); AddSC_boss_urom(); - AddSC_boss_eregos(); - - AddSC_boss_malygos(); //eye of eternity - AddSC_instance_eye_of_eternity(); - - AddSC_boss_sartharion(); //obsidian_sanctum + AddSC_instance_oculus(); + AddSC_oculus(); + AddSC_boss_sartharion(); // obsidian_sanctum AddSC_instance_obsidian_sanctum(); - AddSC_instance_vault_of_archavon(); //vault_of_archavon - AddSC_boss_toravon(); - AddSC_boss_koralon(); - AddSC_boss_emalon(); - AddSC_boss_archavon(); - AddSC_boss_bjarngrim(); //Ulduar, halls_of_lightning + AddSC_boss_baltharus(); // ruby_sanctum + AddSC_boss_halion(); + AddSC_boss_ragefire(); + AddSC_boss_zarithrian(); + AddSC_instance_ruby_sanctum(); + AddSC_ruby_sanctum(); + AddSC_boss_bjarngrim(); // ulduar, halls_of_lightning AddSC_boss_ionar(); AddSC_boss_loken(); AddSC_boss_volkhan(); AddSC_instance_halls_of_lightning(); - AddSC_boss_maiden_of_grief(); //Ulduar, halls_of_stone + AddSC_boss_maiden_of_grief(); // ulduar, halls_of_stone AddSC_boss_sjonnir(); AddSC_boss_krystallus(); AddSC_halls_of_stone(); AddSC_instance_halls_of_stone(); - AddSC_boss_algalon(); //Ulduar + AddSC_boss_iron_council(); // ulduar, ulduar + AddSC_boss_algalon(); AddSC_boss_auriaya(); + AddSC_boss_leviathan(); AddSC_boss_freya(); + AddSC_boss_vezax(); AddSC_boss_hodir(); AddSC_boss_ignis(); - AddSC_boss_iron_council(); AddSC_boss_kologarn(); - AddSC_boss_leviathan(); AddSC_boss_mimiron(); AddSC_boss_razorscale(); AddSC_boss_thorim(); - AddSC_boss_vezax(); - AddSC_boss_xt_002(); + AddSC_boss_xt002(); AddSC_boss_yogg_saron(); AddSC_instance_ulduar(); AddSC_ulduar(); @@ -922,11 +947,25 @@ void AddScripts() AddSC_boss_skarvald_and_dalronn(); AddSC_instance_utgarde_keep(); AddSC_utgarde_keep(); - AddSC_boss_gortok(); //utgarde_pinnacle + AddSC_boss_gortok(); // UK, utgarde_pinnacle AddSC_boss_skadi(); AddSC_boss_svala(); AddSC_boss_ymiron(); AddSC_instance_pinnacle(); + AddSC_boss_archavon(); // vault_of_archavon + AddSC_boss_emalon(); + AddSC_boss_koralon(); + AddSC_boss_toravon(); + AddSC_instance_vault_of_archavon(); + AddSC_boss_erekem(); // violet_hold + AddSC_boss_ichoron(); + AddSC_instance_violet_hold(); + AddSC_violet_hold(); + AddSC_boss_cyanigosa(); + AddSC_boss_moragg(); + AddSC_boss_xevozz(); + AddSC_boss_zuramat(); + AddSC_boss_lavanthor(); AddSC_borean_tundra(); AddSC_dalaran(); @@ -938,62 +977,21 @@ void AddScripts() AddSC_storm_peaks(); AddSC_zuldrak(); - AddSC_instance_violet_hold(); - AddSC_boss_cyanigosa(); - AddSC_boss_moragg(); - AddSC_boss_erekem(); - AddSC_boss_xevozz(); - AddSC_boss_ichoron(); - AddSC_boss_zuramat(); - AddSC_boss_lavanthor(); - AddSC_violet_hold(); - - AddSC_instance_icecrown_spire(); - AddSC_icecrown_spire(); - AddSC_icecrown_teleporter(); - AddSC_boss_lord_marrowgar(); - AddSC_boss_lady_deathwhisper(); - AddSC_boss_deathbringer_saurfang(); - AddSC_boss_rotface(); - AddSC_boss_festergut(); - AddSC_boss_proffesor_putricide(); - AddSC_blood_prince_council(); - AddSC_boss_blood_queen_lanathel(); - AddSC_boss_valithria_dreamwalker(); - AddSC_boss_sindragosa(); - AddSC_boss_lich_king_icc(); - - AddSC_instance_forge_of_souls(); - AddSC_boss_devourer_of_souls(); - AddSC_boss_bronjahm(); - AddSC_forge_of_souls(); - - AddSC_instance_halls_of_reflection(); - AddSC_halls_of_reflection(); - AddSC_boss_falric(); - AddSC_boss_marwyn(); - AddSC_boss_lich_king_hr(); - - AddSC_instance_ruby_sanctum(); // Ruby Sanctum - AddSC_ruby_sanctum(); - AddSC_boss_halion(); - AddSC_boss_ragefire(); - AddSC_boss_zarithrian(); - AddSC_boss_baltharus(); - - //outland - AddSC_boss_exarch_maladaar(); //auchindoun, auchenai_crypts - AddSC_boss_nexusprince_shaffar(); //auchindoun, mana_tombs + // outland + AddSC_boss_exarch_maladaar(); // auchindoun, auchenai_crypts + AddSC_boss_shirrak(); + AddSC_boss_nexusprince_shaffar(); // auchindoun, mana_tombs AddSC_boss_pandemonius(); - AddSC_boss_darkweaver_syth(); //auchindoun, sethekk_halls + AddSC_boss_anzu(); // auchindoun, sethekk_halls + AddSC_boss_darkweaver_syth(); AddSC_boss_talon_king_ikiss(); AddSC_instance_sethekk_halls(); - AddSC_boss_ambassador_hellmaw(); //auchindoun, shadow_labyrinth + AddSC_boss_ambassador_hellmaw(); // auchindoun, shadow_labyrinth AddSC_boss_blackheart_the_inciter(); AddSC_boss_grandmaster_vorpil(); AddSC_boss_murmur(); AddSC_instance_shadow_labyrinth(); - AddSC_black_temple(); //black_temple + AddSC_black_temple(); // black_temple AddSC_boss_illidan(); AddSC_boss_shade_of_akama(); AddSC_boss_supremus(); @@ -1004,39 +1002,40 @@ void AddScripts() AddSC_boss_najentus(); AddSC_boss_illidari_council(); AddSC_instance_black_temple(); - AddSC_boss_fathomlord_karathress(); //CR, serpent_shrine + AddSC_boss_fathomlord_karathress(); // CR, serpent_shrine AddSC_boss_hydross_the_unstable(); AddSC_boss_lady_vashj(); AddSC_boss_leotheras_the_blind(); AddSC_boss_morogrim_tidewalker(); AddSC_boss_the_lurker_below(); AddSC_instance_serpentshrine_cavern(); - AddSC_boss_hydromancer_thespia(); //CR, steam_vault + AddSC_boss_ahune(); // CR, slave_pens + AddSC_boss_hydromancer_thespia(); // CR, steam_vault AddSC_boss_mekgineer_steamrigger(); AddSC_boss_warlord_kalithresh(); AddSC_instance_steam_vault(); - AddSC_boss_hungarfen(); //CR, Underbog - AddSC_boss_gruul(); //gruuls_lair + AddSC_boss_hungarfen(); // CR, Underbog + AddSC_boss_gruul(); // gruuls_lair AddSC_boss_high_king_maulgar(); AddSC_instance_gruuls_lair(); - AddSC_boss_broggok(); //HC, blood_furnace + AddSC_boss_broggok(); // HC, blood_furnace AddSC_boss_kelidan_the_breaker(); AddSC_boss_the_maker(); AddSC_instance_blood_furnace(); - AddSC_boss_nazan_and_vazruden(); //HC, hellfire_ramparts + AddSC_boss_nazan_and_vazruden(); // HC, hellfire_ramparts AddSC_boss_omor_the_unscarred(); AddSC_boss_watchkeeper_gargolmar(); AddSC_instance_ramparts(); - AddSC_boss_magtheridon(); //HC, magtheridons_lair + AddSC_boss_magtheridon(); // HC, magtheridons_lair AddSC_instance_magtheridons_lair(); - AddSC_boss_grand_warlock_nethekurse(); //HC, shattered_halls + AddSC_boss_grand_warlock_nethekurse(); // HC, shattered_halls AddSC_boss_warbringer_omrogg(); AddSC_boss_warchief_kargath_bladefist(); AddSC_instance_shattered_halls(); - AddSC_arcatraz(); //TK, arcatraz + AddSC_arcatraz(); // TK, arcatraz AddSC_boss_harbinger_skyriss(); AddSC_instance_arcatraz(); - AddSC_boss_high_botanist_freywinn(); //TK, botanica + AddSC_boss_high_botanist_freywinn(); // TK, botanica AddSC_boss_laj(); AddSC_boss_warp_splinter(); AddSC_boss_alar(); // TK, the_eye @@ -1045,21 +1044,11 @@ void AddScripts() AddSC_boss_void_reaver(); AddSC_instance_the_eye(); AddSC_the_eye(); - AddSC_boss_gatewatcher_iron_hand(); //TK, the_mechanar + AddSC_boss_gatewatcher_iron_hand(); // TK, the_mechanar AddSC_boss_nethermancer_sepethrea(); AddSC_boss_pathaleon_the_calculator(); AddSC_instance_mechanar(); - AddSC_boss_lord_epoch(); //culling of stratholme - AddSC_boss_malganis(); - AddSC_boss_meathook(); - AddSC_boss_salramm(); - AddSC_boss_infinite_corruptor(); - AddSC_culling_of_stratholme(); - AddSC_culling_of_stratholmeAI(); - AddSC_instance_culling_of_stratholme(); - AddSC_trash_culling_of_stratholme(); - AddSC_blades_edge_mountains(); AddSC_boss_doomlordkazzak(); AddSC_boss_doomwalker(); diff --git a/system/system.cpp b/system/system.cpp index ed192e0..c912d39 100644 --- a/system/system.cpp +++ b/system/system.cpp @@ -59,7 +59,7 @@ void SystemMgr::LoadScriptTexts() if (pResult) { - barGoLink bar(pResult->GetRowCount()); + BarGoLink bar(pResult->GetRowCount()); uint32 uiCount = 0; do @@ -103,7 +103,7 @@ void SystemMgr::LoadScriptTexts() } else { - barGoLink bar(1); + BarGoLink bar(1); bar.step(); outstring_log(""); outstring_log(">> Loaded 0 additional Script Texts data. DB table `script_texts` is empty."); @@ -121,7 +121,7 @@ void SystemMgr::LoadScriptTextsCustom() if (pResult) { - barGoLink bar(pResult->GetRowCount()); + BarGoLink bar(pResult->GetRowCount()); uint32 uiCount = 0; do @@ -165,7 +165,7 @@ void SystemMgr::LoadScriptTextsCustom() } else { - barGoLink bar(1); + BarGoLink bar(1); bar.step(); outstring_log(""); outstring_log(">> Loaded 0 additional Custom Texts data. DB table `custom_texts` is empty."); @@ -199,7 +199,7 @@ void SystemMgr::LoadScriptWaypoints() if (pResult) { - barGoLink bar(pResult->GetRowCount()); + BarGoLink bar(pResult->GetRowCount()); uint32 uiNodeCount = 0; do @@ -238,7 +238,7 @@ void SystemMgr::LoadScriptWaypoints() } else { - barGoLink bar(1); + BarGoLink bar(1); bar.step(); outstring_log(""); outstring_log(">> Loaded 0 Script Waypoints. DB table `script_waypoint` is empty.");