diff options
Diffstat (limited to 'src')
30 files changed, 1148 insertions, 1253 deletions
diff --git a/src/server/collision/BoundingIntervalHierarchyWrapper.h b/src/server/collision/BoundingIntervalHierarchyWrapper.h index 305d57b0075..8696a759fa8 100644 --- a/src/server/collision/BoundingIntervalHierarchyWrapper.h +++ b/src/server/collision/BoundingIntervalHierarchyWrapper.h @@ -37,20 +37,22 @@ class BIHWrap MDLCallback(RayCallback& callback, const T* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) {} - bool operator() (const G3D::Ray& ray, uint32 Idx, float& MaxDist, bool /*stopAtFirst*/) + /// Intersect ray + bool operator() (const G3D::Ray& ray, uint32 idx, float& maxDist, bool /*stopAtFirst*/) { - if (Idx >= objects_size) + if (idx >= objects_size) return false; - if (const T* obj = objects[Idx]) - return _callback(ray, *obj, MaxDist/*, stopAtFirst*/); + if (const T* obj = objects[idx]) + return _callback(ray, *obj, maxDist/*, stopAtFirst*/); return false; } - void operator() (const G3D::Vector3& p, uint32 Idx) + /// Intersect point + void operator() (const G3D::Vector3& p, uint32 idx) { - if (Idx >= objects_size) - return false; - if (const T* obj = objects[Idx]) + if (idx >= objects_size) + return; + if (const T* obj = objects[idx]) _callback(p, *obj); } }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 73f0d09cace..594d33357b4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -985,7 +985,7 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) if (!IsValidGender(createInfo->Gender)) { - TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%hu) - refusing to do so", + TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%u) - refusing to do so", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Gender); return false; } @@ -6924,6 +6924,7 @@ int32 Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr case REPUTATION_SOURCE_DAILY_QUEST: case REPUTATION_SOURCE_WEEKLY_QUEST: case REPUTATION_SOURCE_MONTHLY_QUEST: + case REPUTATION_SOURCE_REPEATABLE_QUEST: rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST); break; case REPUTATION_SOURCE_SPELL: @@ -6959,6 +6960,9 @@ int32 Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr case REPUTATION_SOURCE_MONTHLY_QUEST: repRate = repData->questMonthlyRate; break; + case REPUTATION_SOURCE_REPEATABLE_QUEST: + repRate = repData->questRepeatableRate; + break; case REPUTATION_SOURCE_SPELL: repRate = repData->spellRate; break; @@ -7062,6 +7066,8 @@ void Player::RewardReputation(Quest const* quest) rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); else if (quest->IsMonthly()) rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); + else if (quest->IsRepeatable()) + rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); else rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); @@ -17127,10 +17133,10 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // overwrite possible wrong/corrupted guid SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)); - uint8 Gender = fields[5].GetUInt8(); - if (!IsValidGender(Gender)) + uint8 gender = fields[5].GetUInt8(); + if (!IsValidGender(gender)) { - TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player (GUID: %u) has wrong gender (%hu), can't be loaded.", guid, Gender); + TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player (GUID: %u) has wrong gender (%u), can't be loaded.", guid, gender); return false; } @@ -17138,7 +17144,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) uint32 bytes0 = 0; bytes0 |= fields[3].GetUInt8(); // race bytes0 |= fields[4].GetUInt8() << 8; // class - bytes0 |= Gender << 16; // gender + bytes0 |= gender << 16; // gender SetUInt32Value(UNIT_FIELD_BYTES_0, bytes0); SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8fc7deb59ff..491f8e39d28 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -319,6 +319,7 @@ enum ReputationSource REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_WEEKLY_QUEST, REPUTATION_SOURCE_MONTHLY_QUEST, + REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_SPELL }; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index fde3c0ddfae..97999cb749d 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2812,8 +2812,6 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell) void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool withInstant) { - ASSERT(spellType < CURRENT_MAX_SPELL); - //TC_LOG_DEBUG(LOG_FILTER_UNITS, "Interrupt spell for unit %u.", GetEntry()); Spell* spell = m_currentSpells[spellType]; if (spell @@ -12260,7 +12258,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u Unit* actionTarget = !isVictim ? target : this; DamageInfo damageInfo = DamageInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL, SPELL_DIRECT_DAMAGE); - HealInfo healInfo = HealInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL); + HealInfo healInfo = HealInfo(damage); ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, 0, procExtra, NULL, &damageInfo, &healInfo); ProcTriggeredList procTriggered; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index ce1763daa23..8dc4b49eec3 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -481,11 +481,10 @@ enum BaseModGroup enum BaseModType { FLAT_MOD, - PCT_MOD + PCT_MOD, + MOD_END }; -#define MOD_END (PCT_MOD+1) - enum DeathState { ALIVE = 0, @@ -887,15 +886,11 @@ public: class HealInfo { private: - Unit* const m_healer; - Unit* const m_target; uint32 m_heal; uint32 m_absorb; - SpellInfo const* const m_spellInfo; - SpellSchoolMask const m_schoolMask; public: - explicit HealInfo(Unit* _healer, Unit* _target, uint32 _heal, SpellInfo const* _spellInfo, SpellSchoolMask _schoolMask) - : m_healer(_healer), m_target(_target), m_heal(_heal), m_spellInfo(_spellInfo), m_schoolMask(_schoolMask) + explicit HealInfo(uint32 heal) + : m_heal(heal) { m_absorb = 0; } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index e95779c1f20..38971cd3e30 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6698,8 +6698,8 @@ void ObjectMgr::LoadReputationRewardRate() _repRewardRateStore.clear(); // for reload case - uint32 count = 0; // 0 1 2 3 4 5 6 - QueryResult result = WorldDatabase.Query("SELECT faction, quest_rate, quest_daily_rate, quest_weekly_rate, quest_monthly_rate, creature_rate, spell_rate FROM reputation_reward_rate"); + uint32 count = 0; // 0 1 2 3 4 5 6 7 + QueryResult result = WorldDatabase.Query("SELECT faction, quest_rate, quest_daily_rate, quest_weekly_rate, quest_monthly_rate, quest_repeatable_rate, creature_rate, spell_rate FROM reputation_reward_rate"); if (!result) { TC_LOG_ERROR(LOG_FILTER_SERVER_LOADING, ">> Loaded `reputation_reward_rate`, table is empty!"); @@ -6718,8 +6718,9 @@ void ObjectMgr::LoadReputationRewardRate() repRate.questDailyRate = fields[2].GetFloat(); repRate.questWeeklyRate = fields[3].GetFloat(); repRate.questMonthlyRate = fields[4].GetFloat(); - repRate.creatureRate = fields[5].GetFloat(); - repRate.spellRate = fields[6].GetFloat(); + repRate.questRepeatableRate = fields[5].GetFloat(); + repRate.creatureRate = fields[6].GetFloat(); + repRate.spellRate = fields[7].GetFloat(); FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); if (!factionEntry) @@ -6752,6 +6753,12 @@ void ObjectMgr::LoadReputationRewardRate() continue; } + if (repRate.questRepeatableRate < 0.0f) + { + TC_LOG_ERROR(LOG_FILTER_SQL, "Table reputation_reward_rate has quest_repeatable_rate with invalid rate %f, skipping data for faction %u", repRate.questRepeatableRate, factionId); + continue; + } + if (repRate.creatureRate < 0.0f) { TC_LOG_ERROR(LOG_FILTER_SQL, "Table reputation_reward_rate has creature_rate with invalid rate %f, skipping data for faction %u", repRate.creatureRate, factionId); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 4779700c092..622fbe339e4 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -485,6 +485,7 @@ struct RepRewardRate float questDailyRate; float questWeeklyRate; float questMonthlyRate; + float questRepeatableRate; float creatureRate; // no reputation are given at all for this faction/rate type. float spellRate; }; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 10ccd6a77f3..813499e91d7 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -740,13 +740,12 @@ namespace Trinity class GameObjectWithDbGUIDCheck { public: - GameObjectWithDbGUIDCheck(WorldObject const& obj, uint32 db_guid) : i_obj(obj), i_db_guid(db_guid) {} + GameObjectWithDbGUIDCheck(WorldObject const& /*obj*/, uint32 db_guid) : i_db_guid(db_guid) {} bool operator()(GameObject const* go) const { return go->GetDBTableGUIDLow() == i_db_guid; } private: - WorldObject const& i_obj; uint32 i_db_guid; }; @@ -874,13 +873,12 @@ namespace Trinity class CreatureWithDbGUIDCheck { public: - CreatureWithDbGUIDCheck(WorldObject const* obj, uint32 lowguid) : i_obj(obj), i_lowguid(lowguid) {} + CreatureWithDbGUIDCheck(WorldObject const* /*obj*/, uint32 lowguid) : i_lowguid(lowguid) {} bool operator()(Creature* u) { return u->GetDBTableGUIDLow() == i_lowguid; } private: - WorldObject const* i_obj; uint32 i_lowguid; }; diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp index 9293f9e9b84..9d1e179db6f 100644 --- a/src/server/game/Grids/ObjectGridLoader.cpp +++ b/src/server/game/Grids/ObjectGridLoader.cpp @@ -50,7 +50,7 @@ class ObjectWorldLoader { public: explicit ObjectWorldLoader(ObjectGridLoader& gloader) - : i_cell(gloader.i_cell), i_grid(gloader.i_grid), i_map(gloader.i_map), i_corpses (0) + : i_cell(gloader.i_cell), i_map(gloader.i_map), i_corpses (0) {} void Visit(CorpseMapType &m); @@ -59,7 +59,6 @@ class ObjectWorldLoader private: Cell i_cell; - NGridType &i_grid; Map* i_map; public: uint32 i_corpses; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index d963750094c..ef8e3712af8 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2827,10 +2827,10 @@ void Guild::SetBankTabText(uint8 tabId, std::string const& text) // Private methods void Guild::_CreateLogHolders() { - m_eventLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT)); - m_newsLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT)); + m_eventLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT)); + m_newsLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT)); for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId) - m_bankEventLog[tabId] = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT)); + m_bankEventLog[tabId] = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT)); } void Guild::_CreateNewBankTab() diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index cf03cb58748..9bf52cb08f2 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -548,7 +548,7 @@ private: class LogHolder { public: - LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } + LogHolder(uint32 maxRecords) : m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } ~LogHolder(); uint8 GetSize() const { return uint8(m_log.size()); } @@ -565,7 +565,6 @@ private: private: GuildLog m_log; - uint32 m_guildId; uint32 m_maxRecords; uint32 m_nextGUID; }; diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index ef55005d0d6..e3717a934c3 100644 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -82,14 +82,14 @@ class InstanceSave does not include the members of the group unless they have permanent saves */ void AddPlayer(Player* player) { TRINITY_GUARD(ACE_Thread_Mutex, _lock); m_playerList.push_back(player); } bool RemovePlayer(Player* player) - { + { _lock.acquire(); m_playerList.remove(player); bool isStillValid = UnloadIfEmpty(); _lock.release(); //delete here if needed, after releasing the lock - if(m_toDelete) + if (m_toDelete) delete this; return isStillValid; @@ -97,10 +97,10 @@ class InstanceSave /* all groups bound to the instance */ void AddGroup(Group* group) { m_groupList.push_back(group); } bool RemoveGroup(Group* group) - { + { m_groupList.remove(group); bool isStillValid = UnloadIfEmpty(); - if(m_toDelete) + if (m_toDelete) delete this; return isStillValid; } diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 437638da16d..5ba6d09553d 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -375,23 +375,36 @@ void AddSC_thunder_bluff(); void AddSC_ungoro_crater(); void AddSC_winterspring(); -//northrend +// Northrend + void AddSC_boss_slad_ran(); void AddSC_boss_moorabi(); void AddSC_boss_drakkari_colossus(); void AddSC_boss_gal_darah(); void AddSC_boss_eck(); void AddSC_instance_gundrak(); -void AddSC_boss_krik_thir(); //Azjol-Nerub + +// Azjol-Nerub - Azjol-Nerub +void AddSC_boss_krik_thir(); void AddSC_boss_hadronox(); void AddSC_boss_anub_arak(); void AddSC_instance_azjol_nerub(); -void AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet -void AddSC_boss_amanitar(); + +// Azjol-Nerub - Ahn'kahet +void AddSC_boss_elder_nadox(); void AddSC_boss_taldaram(); +void AddSC_boss_amanitar(); void AddSC_boss_jedoga_shadowseeker(); -void AddSC_boss_elder_nadox(); void AddSC_boss_volazj(); +void AddSC_instance_ahnkahet(); + +// Drak'Tharon Keep +void AddSC_boss_trollgore(); +void AddSC_boss_novos(); +void AddSC_boss_king_dred(); +void AddSC_boss_tharon_ja(); +void AddSC_instance_drak_tharon_keep(); + void AddSC_boss_argent_challenge(); //Trial of the Champion void AddSC_boss_black_knight(); void AddSC_boss_grand_champions(); @@ -460,26 +473,28 @@ void AddSC_boss_freya(); void AddSC_boss_yogg_saron(); void AddSC_boss_algalon_the_observer(); void AddSC_instance_ulduar(); -void AddSC_boss_keleseth(); //Utgarde Keep + +// Utgarde Keep - Utgarde Keep +void AddSC_boss_keleseth(); void AddSC_boss_skarvald_dalronn(); void AddSC_boss_ingvar_the_plunderer(); void AddSC_instance_utgarde_keep(); -void AddSC_boss_svala(); //Utgarde pinnacle +void AddSC_utgarde_keep(); + +// Utgarde Keep - Utgarde Pinnacle +void AddSC_boss_svala(); void AddSC_boss_palehoof(); void AddSC_boss_skadi(); void AddSC_boss_ymiron(); void AddSC_instance_utgarde_pinnacle(); -void AddSC_utgarde_keep(); -void AddSC_boss_archavon(); //Vault of Archavon + +// Vault of Archavon +void AddSC_boss_archavon(); void AddSC_boss_emalon(); void AddSC_boss_koralon(); void AddSC_boss_toravon(); -void AddSC_instance_archavon(); -void AddSC_boss_trollgore(); //Drak'Tharon Keep -void AddSC_boss_novos(); -void AddSC_boss_king_dred(); -void AddSC_boss_tharon_ja(); -void AddSC_instance_drak_tharon_keep(); +void AddSC_instance_vault_of_archavon(); + void AddSC_boss_cyanigosa(); //Violet Hold void AddSC_boss_erekem(); void AddSC_boss_ichoron(); @@ -1175,12 +1190,28 @@ void AddNorthrendScripts() AddSC_boss_gal_darah(); AddSC_boss_eck(); AddSC_instance_gundrak(); - AddSC_boss_amanitar(); - AddSC_boss_taldaram(); //Azjol-Nerub Ahn'kahet + + // Azjol-Nerub - Ahn'kahet AddSC_boss_elder_nadox(); + AddSC_boss_taldaram(); + AddSC_boss_amanitar(); AddSC_boss_jedoga_shadowseeker(); AddSC_boss_volazj(); AddSC_instance_ahnkahet(); + + // Azjol-Nerub - Azjol-Nerub + AddSC_boss_krik_thir(); + AddSC_boss_hadronox(); + AddSC_boss_anub_arak(); + AddSC_instance_azjol_nerub(); + + // Drak'Tharon Keep + AddSC_boss_trollgore(); + AddSC_boss_novos(); + AddSC_boss_king_dred(); + AddSC_boss_tharon_ja(); + AddSC_instance_drak_tharon_keep(); + AddSC_boss_argent_challenge(); //Trial of the Champion AddSC_boss_black_knight(); AddSC_boss_grand_champions(); @@ -1193,10 +1224,6 @@ void AddNorthrendScripts() AddSC_boss_twin_valkyr(); AddSC_boss_northrend_beasts(); AddSC_instance_trial_of_the_crusader(); - AddSC_boss_krik_thir(); //Azjol-Nerub Azjol-Nerub - AddSC_boss_hadronox(); - AddSC_boss_anub_arak(); - AddSC_instance_azjol_nerub(); AddSC_boss_anubrekhan(); //Naxxramas AddSC_boss_maexxna(); AddSC_boss_patchwerk(); @@ -1253,26 +1280,28 @@ void AddNorthrendScripts() AddSC_boss_yogg_saron(); AddSC_boss_algalon_the_observer(); AddSC_instance_ulduar(); - AddSC_boss_keleseth(); //Utgarde Keep + + // Utgarde Keep - Utgarde Keep + AddSC_boss_keleseth(); AddSC_boss_skarvald_dalronn(); AddSC_boss_ingvar_the_plunderer(); AddSC_instance_utgarde_keep(); - AddSC_boss_svala(); //Utgarde pinnacle + AddSC_utgarde_keep(); + + // Utgarde Keep - Utgarde Pinnacle + AddSC_boss_svala(); AddSC_boss_palehoof(); AddSC_boss_skadi(); AddSC_boss_ymiron(); AddSC_instance_utgarde_pinnacle(); - AddSC_utgarde_keep(); - AddSC_boss_archavon(); //Vault of Archavon + + // Vault of Archavon + AddSC_boss_archavon(); AddSC_boss_emalon(); AddSC_boss_koralon(); AddSC_boss_toravon(); - AddSC_instance_archavon(); - AddSC_boss_trollgore(); //Drak'Tharon Keep - AddSC_boss_novos(); - AddSC_boss_king_dred(); - AddSC_boss_tharon_ja(); - AddSC_instance_drak_tharon_keep(); + AddSC_instance_vault_of_archavon(); + AddSC_boss_cyanigosa(); //Violet Hold AddSC_boss_erekem(); AddSC_boss_ichoron(); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 617a50c2344..94128262388 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -681,7 +681,6 @@ void AuraEffect::CalculateSpellMod() { m_spellmod = new SpellModifier(GetBase()); m_spellmod->op = SpellModOp(GetMiscValue()); - ASSERT(m_spellmod->op < MAX_SPELLMOD); m_spellmod->type = SpellModType(uint32(GetAuraType())); // SpellModType value == spell aura types m_spellmod->spellId = GetId(); @@ -2154,9 +2153,6 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo Unit* target = aurApp->GetTarget(); - if (target->GetTypeId() != TYPEID_PLAYER) - return; - if (apply) { /* @@ -2194,14 +2190,14 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo // stop handling the effect if it was removed by linked event if (aurApp->GetRemoveMode()) return; - // blizz like 2.0.x - target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); - // blizz like 2.0.x - target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - // blizz like 2.0.x - target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); // blizz like 2.0.x + target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); // blizz like 2.0.x + target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); // blizz like 2.0.x target->AddUnitState(UNIT_STATE_DIED); + + if (Creature* creature = target->ToCreature()) + creature->SetReactState(REACT_PASSIVE); } else { @@ -2209,14 +2205,14 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo WorldPacket data(SMSG_FEIGN_DEATH_RESISTED, 0); target->SendMessageToSet(&data, true); */ - // blizz like 2.0.x - target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); - // blizz like 2.0.x - target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - // blizz like 2.0.x - target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); // blizz like 2.0.x + target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); // blizz like 2.0.x + target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); // blizz like 2.0.x target->ClearUnitState(UNIT_STATE_DIED); + + if (Creature* creature = target->ToCreature()) + creature->InitializeReactState(); } } diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index e517afe6b46..92d15322f4c 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -158,8 +158,7 @@ public: DialogueHelper(DialogueEntry const* dialogueArray) : _dialogueArray(dialogueArray), _currentEntry(NULL), - _actionTimer(0), - _isFirstSide(true) + _actionTimer(0) {} // The array MUST be terminated by {0, 0, 0, 0, 0} @@ -237,7 +236,6 @@ private: DialogueEntry const* _currentEntry; uint32 _actionTimer; - bool _isFirstSide; }; const DialogueEntry introDialogue[] = diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt index e04a4c43479..3c56361d096 100644 --- a/src/server/scripts/Northrend/CMakeLists.txt +++ b/src/server/scripts/Northrend/CMakeLists.txt @@ -125,11 +125,11 @@ set(scripts_STAT_SRCS Northrend/VaultOfArchavon/boss_emalon.cpp Northrend/VaultOfArchavon/boss_toravon.cpp Northrend/zone_sholazar_basin.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp - Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp + Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp + Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp + Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 3fb7aef3ae0..c21c43dd161 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -881,8 +881,6 @@ class npc_halion_controller : public CreatureScript InstanceScript* _instance; SummonList _summons; - bool _corporealityCheck; - uint32 _twilightDamageTaken; uint32 _materialDamageTaken; uint8 _materialCorporealityValue; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index f346c796976..53b11de921a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -419,8 +419,6 @@ class boss_anubarak_trial : public CreatureScript uint64 _sphereGUID[6]; bool _intro; bool _reachedPhase3; - uint32 _frostSphereTimer; - uint32 _berserkTimer; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE @@ -579,7 +577,6 @@ class npc_nerubian_burrower : public CreatureScript private: uint32 _submergeTimer; - Phases _phase; EventMap _events; InstanceScript* _instance; }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index d90ed543376..18cc45657f0 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -1135,7 +1135,6 @@ class boss_icehowl : public CreatureScript bool _movementFinish; bool _trampleCasted; uint8 _stage; - Unit* _target; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 0afec32ec84..30174996a42 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -28,21 +28,18 @@ EndScriptData */ enum Yells { - YELL_AGGRO_1 = 0, - YELL_KILL_1 = 1, - YELL_DEAD_1 = 2, - - YELL_AGGRO_2 = 0, - YELL_KILL_2 = 1, - YELL_DEAD_2 = 2 -}; - -enum Creatures -{ - NPC_INGVAR_HUMAN = 23954, - NPC_ANNHYLDE_THE_CALLER = 24068, - NPC_INGVAR_UNDEAD = 23980, - NPC_THROW_TARGET = 23996, + // Ingvar (Human) + SAY_AGGRO_1 = 0, + SAY_SLAY_1 = 1, + SAY_DEATH_1 = 2, + + // Ingvar (Undead) + SAY_AGGRO_2 = 3, + SAY_SLAY_2 = 4, + SAY_DEATH_2 = 5, + + // Annhylde The Caller + YELL_RESURRECT = 0 }; enum Events @@ -57,7 +54,10 @@ enum Events EVENT_WOE_STRIKE, EVENT_SHADOW_AXE, EVENT_JUST_TRANSFORMED, - EVENT_SUMMON_BANSHEE + EVENT_SUMMON_BANSHEE, + + EVENT_RESURRECT_1, + EVENT_RESURRECT_2 }; enum Phases @@ -93,296 +93,270 @@ enum Spells SPELL_INGVAR_TRANSFORM = 42796 }; -class boss_ingvar_the_plunderer : public CreatureScript +enum Misc { -public: - boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { } + ACTION_START_PHASE_2 +}; - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_ingvar_the_plundererAI(creature); - } +class boss_ingvar_the_plunderer : public CreatureScript +{ + public: + boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { } - struct boss_ingvar_the_plundererAI : public ScriptedAI - { - boss_ingvar_the_plundererAI(Creature* creature) : ScriptedAI(creature) + struct boss_ingvar_the_plundererAI : public BossAI { - instance = creature->GetInstanceScript(); - bIsUndead = false; - } + boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR) + { + _isUndead = false; + } - InstanceScript* instance; + void Reset() OVERRIDE + { + _isUndead = false; - bool bIsUndead; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - void Reset() OVERRIDE - { - if (bIsUndead) - me->UpdateEntry(NPC_INGVAR_HUMAN); + _Reset(); + events.SetPhase(PHASE_HUMAN); - bIsUndead = false; + events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN); + events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN); + events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN); + events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN); + } - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->SetStandState(UNIT_STAND_STATE_STAND); + void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE + { + if (damage >= me->GetHealth() && events.IsInPhase(PHASE_HUMAN)) + { + me->RemoveAllAuras(); + DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); - events.Reset(); - events.SetPhase(PHASE_HUMAN); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN); - events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN); - events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN); - events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN); + events.SetPhase(PHASE_EVENT); + events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT); - if (instance) - instance->SetData(DATA_INGVAR_EVENT, NOT_STARTED); - } + Talk(SAY_DEATH_1); + } - void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE - { - if (damage >= me->GetHealth() && !bIsUndead) - { - //DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); // Dont work ??? - // visuel hack - me->SetHealth(0); - me->InterruptNonMeleeSpells(true); - me->RemoveAllAuras(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->GetMotionMaster()->MovementExpired(false); - me->GetMotionMaster()->MoveIdle(); - me->SetStandState(UNIT_STAND_STATE_DEAD); - // visuel hack end - - events.SetPhase(PHASE_EVENT); - events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT); - - Talk(YELL_DEAD_1); + if (events.IsInPhase(PHASE_EVENT)) + damage = 0; } - if (events.IsInPhase(PHASE_EVENT)) - damage = 0; - } - - void StartZombiePhase() - { - bIsUndead = true; - me->UpdateEntry(NPC_INGVAR_UNDEAD); - events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT); - - Talk(YELL_AGGRO_2); - } + void DoAction(int32 actionId) + { + if (actionId == ACTION_START_PHASE_2) + StartZombiePhase(); + } - void EnterCombat(Unit* /*who*/) OVERRIDE - { - if (!bIsUndead) - Talk(YELL_AGGRO_1); + void StartZombiePhase() + { + _isUndead = true; + me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH); + DoCast(me, SPELL_INGVAR_TRANSFORM, true); /// @todo: should be death persistent + events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT); - if (instance) - instance->SetData(DATA_INGVAR_EVENT, IN_PROGRESS); + Talk(SAY_AGGRO_2); + } - me->SetInCombatWithZone(); - } + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); - void JustDied(Unit* /*killer*/) OVERRIDE - { - Talk(YELL_DEAD_2); + if (!_isUndead) + Talk(SAY_AGGRO_1); + } - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE { - // Ingvar has NPC_INGVAR_UNDEAD id in this moment, so we have to update encounter state for his original id - instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_INGVAR_HUMAN, me); - instance->SetData(DATA_INGVAR_EVENT, DONE); + _JustDied(); + Talk(SAY_DEATH_2); } - } - void ScheduleSecondPhase() - { - events.SetPhase(PHASE_UNDEAD); - events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD); - events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD); - events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD); - events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD); - } + void ScheduleSecondPhase() + { + events.SetPhase(PHASE_UNDEAD); + events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD); + events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD); + events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD); + events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD); + } - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - Talk(bIsUndead ? YELL_KILL_1 : YELL_KILL_2); - } + void KilledUnit(Unit* /*victim*/) OVERRIDE + { + Talk(_isUndead ? SAY_SLAY_1 : SAY_SLAY_2); + } - void UpdateAI(uint32 diff) OVERRIDE - { - if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT)) - return; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT)) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) { - // PHASE ONE - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN); - break; - case EVENT_STAGGERING_ROAR: - DoCast(me, SPELL_STAGGERING_ROAR); - events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN); - break; - case EVENT_ENRAGE: - DoCast(me, SPELL_ENRAGE); - events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN); - break; - case EVENT_SMASH: - DoCastAOE(SPELL_SMASH); - events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN); - break; - case EVENT_JUST_TRANSFORMED: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetInCombatWithZone(); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - ScheduleSecondPhase(); - return; - case EVENT_SUMMON_BANSHEE: - DoCast(me, SPELL_SUMMON_BANSHEE); - return; - // PHASE TWO - case EVENT_DARK_SMASH: - DoCastVictim(SPELL_DARK_SMASH); - events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD); - break; - case EVENT_DREADFUL_ROAR: - DoCast(me, SPELL_DREADFUL_ROAR); - events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD); - break; - case EVENT_WOE_STRIKE: - DoCastVictim(SPELL_WOE_STRIKE); - events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD); - break; - case EVENT_SHADOW_AXE: - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1)) - { - DoCast(target, SPELL_SHADOW_AXE_SUMMON); - } - events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD); - break; + switch (eventId) + { + // PHASE ONE + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN); + break; + case EVENT_STAGGERING_ROAR: + DoCast(me, SPELL_STAGGERING_ROAR); + events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN); + break; + case EVENT_ENRAGE: + DoCast(me, SPELL_ENRAGE); + events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN); + break; + case EVENT_SMASH: + DoCastAOE(SPELL_SMASH); + events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN); + break; + case EVENT_JUST_TRANSFORMED: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + DoZoneInCombat(); + ScheduleSecondPhase(); + return; + case EVENT_SUMMON_BANSHEE: + DoCast(me, SPELL_SUMMON_BANSHEE); + return; + // PHASE TWO + case EVENT_DARK_SMASH: + DoCastVictim(SPELL_DARK_SMASH); + events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD); + break; + case EVENT_DREADFUL_ROAR: + DoCast(me, SPELL_DREADFUL_ROAR); + events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD); + break; + case EVENT_WOE_STRIKE: + DoCastVictim(SPELL_WOE_STRIKE); + events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD); + break; + case EVENT_SHADOW_AXE: + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1)) + DoCast(target, SPELL_SHADOW_AXE_SUMMON); + + events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD); + break; + } } + + if (!events.IsInPhase(PHASE_EVENT)) + DoMeleeAttackIfReady(); } - DoMeleeAttackIfReady(); - } - private: - EventMap events; - }; + private: + bool _isUndead; + }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardeKeepAI<boss_ingvar_the_plundererAI>(creature); + } }; class npc_annhylde_the_caller : public CreatureScript { -public: - npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { } + public: + npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_annhylde_the_callerAI(creature); - } - - struct npc_annhylde_the_callerAI : public ScriptedAI - { - npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature) + struct npc_annhylde_the_callerAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - } - - float x, y, z; - InstanceScript* instance; - uint32 uiResurectTimer; - uint32 uiResurectPhase; + npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature) + { + _instance = creature->GetInstanceScript(); + } - void Reset() OVERRIDE - { - //! HACK: Creature's can't have MOVEMENTFLAG_FLYING - me->SetHover(true); + void Reset() OVERRIDE + { + _events.Reset(); - me->GetPosition(x, y, z); - DoTeleportTo(x+1, y, z+30); + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING + me->SetHover(true); - Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0); - if (ingvar) - { + me->GetPosition(x, y, z); + DoTeleportTo(x+1, y, z+30); me->GetMotionMaster()->MovePoint(1, x, y, z+15); - - // Talk(YELL_RESSURECT); } - } - void MovementInform(uint32 type, uint32 id) OVERRIDE - { - if (type != POINT_MOTION_TYPE) - return; - Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0); - if (ingvar) + void MovementInform(uint32 type, uint32 id) OVERRIDE { + if (type != POINT_MOTION_TYPE) + return; + switch (id) { - case 1: - ingvar->RemoveAura(SPELL_SUMMON_BANSHEE); - ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true); - DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM); - uiResurectTimer = 8000; - uiResurectPhase = 1; - break; - case 2: - me->SetVisible(false); - me->DealDamage(me, me->GetHealth()); - me->RemoveCorpse(); - break; + case 1: + Talk(YELL_RESURRECT); + if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR))) + { + ingvar->RemoveAura(SPELL_SUMMON_BANSHEE); + ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true); + DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM); + } + _events.ScheduleEvent(EVENT_RESURRECT_1, 8000); + break; + case 2: + me->DespawnOrUnsummon(); + break; + default: + break; } } - } - void AttackStart(Unit* /*who*/) OVERRIDE {} - void MoveInLineOfSight(Unit* /*who*/) OVERRIDE {} + void AttackStart(Unit* /*who*/) OVERRIDE { } + void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } + void EnterCombat(Unit* /*who*/) OVERRIDE { } - void EnterCombat(Unit* /*who*/) OVERRIDE {} - void UpdateAI(uint32 diff) OVERRIDE - { - if (uiResurectTimer) + void UpdateAI(uint32 diff) OVERRIDE { - if (uiResurectTimer <= diff) + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) { - if (uiResurectPhase == 1) + switch (eventId) { - Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0); - if (ingvar) - { - ingvar->SetStandState(UNIT_STAND_STATE_STAND); - ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false); - } - uiResurectTimer = 3000; - uiResurectPhase = 2; - } - else if (uiResurectPhase == 2) - { - if (Creature* ingvar = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_INGVAR) : 0)) - { - ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY); - - if (ingvar->GetVictim()) - if (boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI* ai = CAST_AI(boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI, ingvar->AI())) - ai->StartZombiePhase(); + case EVENT_RESURRECT_1: + if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR))) + { + ingvar->RemoveAura(SPELL_INGVAR_FEIGN_DEATH); + ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false); + } + _events.ScheduleEvent(EVENT_RESURRECT_2, 3000); + break; + case EVENT_RESURRECT_2: + if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR))) + { + ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY); + ingvar->AI()->DoAction(ACTION_START_PHASE_2); + } me->GetMotionMaster()->MovePoint(2, x+1, y, z+30); - ++uiResurectPhase; - uiResurectTimer = 0; - } + break; + default: + break; } - } else uiResurectTimer -= diff; + } } + + private: + InstanceScript* _instance; + EventMap _events; + float x, y, z; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardeKeepAI<npc_annhylde_the_callerAI>(creature); } - }; }; enum ShadowAxe @@ -427,12 +401,7 @@ public: { DoCast(me, SPELL_SHADOW_AXE_DAMAGE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - if (TempSummon* summon = me->ToTempSummon()) - { - summon->UnSummon(10000); - } - else - me->DisappearAndDie(); + me->DespawnOrUnsummon(10000); } } }; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index 3bfacbaff5e..f8f35ed7142 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -75,268 +75,247 @@ float AttackLoc[3]= {197.636f, 194.046f, 40.8164f}; class npc_frost_tomb : public CreatureScript { -public: - npc_frost_tomb() : CreatureScript("npc_frost_tomb") {} - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_frost_tombAI(creature); - } + public: + npc_frost_tomb() : CreatureScript("npc_frost_tomb") { } - struct npc_frost_tombAI : public ScriptedAI - { - npc_frost_tombAI(Creature* creature) : ScriptedAI(creature) + struct npc_frost_tombAI : public ScriptedAI { - if (me->IsSummon()) - if (Unit* summon = me->ToTempSummon()->GetSummoner()) - DoCast(summon, SPELL_FROST_TOMB, true); + npc_frost_tombAI(Creature* creature) : ScriptedAI(creature) + { + _instance = creature->GetInstanceScript(); + } - instance = creature->GetInstanceScript(); - } + void IsSummonedBy(Unit* summoner) OVERRIDE + { + DoCast(summoner, SPELL_FROST_TOMB, true); + } + + void UpdateAI(uint32 /*diff*/) OVERRIDE { } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_KELESETH))) + keleseth->AI()->SetData(DATA_ON_THE_ROCKS, false); + } - void UpdateAI(uint32 /*diff*/) OVERRIDE {} + private: + InstanceScript* _instance; + }; - void JustDied(Unit* /*killer*/) OVERRIDE + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - if (instance) - if (Unit* boss = me->GetUnit(*me, instance->GetData64(DATA_PRINCEKELESETH))) - if (boss->ToCreature() && boss->ToCreature()->AI()) - boss->ToCreature()->AI()->SetData(DATA_ON_THE_ROCKS, false); + return GetUtgardeKeepAI<npc_frost_tombAI>(creature); } - - private: - InstanceScript* instance; - }; }; class boss_keleseth : public CreatureScript { -public: - boss_keleseth() : CreatureScript("boss_keleseth") {} - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_kelesethAI(creature); - } - - struct boss_kelesethAI : public BossAI - { - boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCEKELESETH_EVENT){} + public: + boss_keleseth() : CreatureScript("boss_keleseth") { } - void Reset() OVERRIDE + struct boss_kelesethAI : public BossAI { - if (instance) - instance->SetData(DATA_PRINCEKELESETH_EVENT, NOT_STARTED); - - events.Reset(); - events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS); + boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) { } - summons.DespawnAll(); + void Reset() OVERRIDE + { + _Reset(); + events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS); - onTheRocks = true; - } + onTheRocks = true; + } - void EnterCombat(Unit* who) OVERRIDE - { - me->SetInCombatWithZone(); - if (instance) - instance->SetData(DATA_PRINCEKELESETH_EVENT, IN_PROGRESS); - Talk(SAY_START_COMBAT); + void EnterCombat(Unit* who) OVERRIDE + { + _EnterCombat(); + Talk(SAY_START_COMBAT); - if (!who) - return; + if (!who) + return; - std::list<Creature*> runemages; - me->GetCreatureListWithEntryInGrid(runemages, NPC_RUNEMAGE, 60.0f); - if (!runemages.empty()) - { - for (std::list<Creature*>::iterator itr = runemages.begin(); itr != runemages.end(); ++itr) + std::list<Creature*> guards; + me->GetCreatureListWithEntryInGrid(guards, NPC_RUNEMAGE, 60.0f); + me->GetCreatureListWithEntryInGrid(guards, NPC_STRATEGIST, 60.0f); + if (!guards.empty()) { - if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me)) - (*itr)->AI()->AttackStart(who); + for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr) + { + if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me)) + (*itr)->AI()->AttackStart(who); + } } } - std::list<Creature*> strategists; - me->GetCreatureListWithEntryInGrid(strategists, NPC_STRATEGIST, 60.0f); - if (!strategists.empty()) + void JustDied(Unit* /*killer*/) OVERRIDE { - for (std::list<Creature*>::iterator itr = strategists.begin(); itr != strategists.end(); ++itr) - { - if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me)) - (*itr)->AI()->AttackStart(who); - } + _JustDied(); + Talk(SAY_DEATH); } - } - - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (instance) - instance->SetData(DATA_PRINCEKELESETH_EVENT, DONE); - summons.DespawnAll(); - Talk(SAY_DEATH); - } - void SetData(uint32 data, uint32 value) OVERRIDE - { - if (data == DATA_ON_THE_ROCKS) - onTheRocks = value; - } + void SetData(uint32 data, uint32 value) OVERRIDE + { + if (data == DATA_ON_THE_ROCKS) + onTheRocks = value; + } - uint32 GetData(uint32 data) const OVERRIDE - { - if (data == DATA_ON_THE_ROCKS) - return onTheRocks; + uint32 GetData(uint32 data) const OVERRIDE + { + if (data == DATA_ON_THE_ROCKS) + return onTheRocks; - return 0; - } + return 0; + } - void UpdateAI(uint32 diff) OVERRIDE - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_SUMMON_SKELETONS: - Talk(SAY_SUMMON_SKELETONS); - SummonSkeletons(); - break; - case EVENT_SHADOWBOLT: - DoCastVictim(SPELL_SHADOWBOLT); - events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS); - break; - case EVENT_FROST_TOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true, -SPELL_FROST_TOMB)) + switch (eventId) { - Talk(SAY_FROST_TOMB); - Talk(SAY_FROST_TOMB_EMOTE, target->GetGUID()); + case EVENT_SUMMON_SKELETONS: + Talk(SAY_SUMMON_SKELETONS); + SummonSkeletons(); + break; + case EVENT_SHADOWBOLT: + DoCastVictim(SPELL_SHADOWBOLT); + events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3) * IN_MILLISECONDS); + break; + case EVENT_FROST_TOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_FROST_TOMB)) + { + Talk(SAY_FROST_TOMB); + Talk(SAY_FROST_TOMB_EMOTE, target->GetGUID()); - DoCast(target, SPELL_FROST_TOMB_STUN, true); - // checked from sniffs - the player casts the spell - target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true); + DoCast(target, SPELL_FROST_TOMB_STUN, true); + // checked from sniffs - the player casts the spell + target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true); + } + events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19) * IN_MILLISECONDS); + break; + default: + break; } - events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS); - break; } + + DoMeleeAttackIfReady(); } - DoMeleeAttackIfReady(); - } + void SummonSkeletons() + { + // I could not found any spell casted for this + for (uint8 i = 0; i < 4; ++i) + me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0); + } + + private: + bool onTheRocks; + }; - void SummonSkeletons() + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - // I could not found any spell casted for this - for (uint8 i = 0; i < 4; ++i) - me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0); + return GetUtgardeKeepAI<boss_kelesethAI>(creature); } - private: - bool onTheRocks; - }; }; class npc_vrykul_skeleton : public CreatureScript { -public: - npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") {} - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_vrykul_skeletonAI(creature); - } - - struct npc_vrykul_skeletonAI : public ScriptedAI - { - npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) {} + public: + npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") { } - void Reset() OVERRIDE + struct npc_vrykul_skeletonAI : public ScriptedAI { - events.Reset(); - events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS); - - } + npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) { } - void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE - { - if (damage >= me->GetHealth()) + void Reset() OVERRIDE { - damage = 0; + events.Reset(); + events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6) * IN_MILLISECONDS); + } - // There are some issues with pets - // they will still attack. I would say it is a PetAI bug - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE + { + if (damage >= me->GetHealth()) { - // from sniffs - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); + damage = 0; - events.Reset(); - events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22)*IN_MILLISECONDS); + // There are some issues with pets + // they will still attack. I would say it is a PetAI bug + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + { + // from sniffs + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); + + events.Reset(); + events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22) * IN_MILLISECONDS); - me->GetMotionMaster()->MovementExpired(false); - me->GetMotionMaster()->MoveIdle(); + me->GetMotionMaster()->MovementExpired(false); + me->GetMotionMaster()->MoveIdle(); + } } } - } - void UpdateAI(uint32 diff) OVERRIDE - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_DECREPIFY: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY), SPELL_DECREPIFY); - events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS); - break; - case EVENT_RESURRECT: - events.ScheduleEvent(EVENT_FULL_HEAL, 1*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1*IN_MILLISECONDS); - break; - case EVENT_FULL_HEAL: - DoCast(me, SPELL_FULL_HEAL, true); - break; - case EVENT_SHADOW_FISSURE: - DoCast(me, SPELL_SHADOW_FISSURE, true); - if (TempSummon* temp = me->ToTempSummon()) - { - if (Unit* summoner = temp->GetSummoner()) - { - DoCast(summoner, SPELL_BONE_ARMOR); - } - } - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS); - break; + switch (eventId) + { + case EVENT_DECREPIFY: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY)) + DoCast(target, SPELL_DECREPIFY); + events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS); + break; + case EVENT_RESURRECT: + events.ScheduleEvent(EVENT_FULL_HEAL, 1 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1 * IN_MILLISECONDS); + break; + case EVENT_FULL_HEAL: + DoCast(me, SPELL_FULL_HEAL, true); + break; + case EVENT_SHADOW_FISSURE: + DoCast(me, SPELL_SHADOW_FISSURE, true); + DoCastAOE(SPELL_BONE_ARMOR, true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6) * IN_MILLISECONDS); + break; + default: + break; + } } + + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + DoMeleeAttackIfReady(); } - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - DoMeleeAttackIfReady(); - } + private: + EventMap events; + }; - private: - EventMap events; - }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardeKeepAI<npc_vrykul_skeletonAI>(creature); + } }; class spell_frost_tomb : public SpellScriptLoader @@ -347,12 +326,14 @@ class spell_frost_tomb : public SpellScriptLoader class spell_frost_tomb_AuraScript : public AuraScript { PrepareAuraScript(spell_frost_tomb_AuraScript); + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) if (Unit* caster = GetCaster()) - if (caster->ToCreature() && caster->IsAlive()) - caster->ToCreature()->DespawnOrUnsummon(1000); + if (caster->IsAlive()) + if (Creature* creature = caster->ToCreature()) + creature->DespawnOrUnsummon(1000); } void Register() OVERRIDE diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp index bbb3d666b32..ffdd8fe232f 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -58,14 +58,6 @@ enum Spells SPELL_SUMMON_DALRONN_GHOST = 48612, }; -enum Creatures -{ - NPC_SKARVALD_THE_CONSTRUCTOR = 24200, - NPC_SKARVALD_GHOST = 27390, - NPC_DALRONN_THE_CONTROLLER = 24201, - NPC_DALRONN_GHOST = 27389 -}; - class SkarvaldChargePredicate { public: @@ -82,355 +74,334 @@ class SkarvaldChargePredicate class boss_skarvald_the_constructor : public CreatureScript { -public: - boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_skarvald_the_constructorAI(creature); - } + public: + boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { } - struct boss_skarvald_the_constructorAI : public ScriptedAI - { - boss_skarvald_the_constructorAI(Creature* creature) : ScriptedAI(creature) + struct boss_skarvald_the_constructorAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_skarvald_the_constructorAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { } - InstanceScript* instance; + bool ghost; + uint32 Charge_Timer; + uint32 StoneStrike_Timer; + uint32 Response_Timer; + uint32 Check_Timer; + bool Dalronn_isDead; + bool Enraged; - bool ghost; - uint32 Charge_Timer; - uint32 StoneStrike_Timer; - uint32 Response_Timer; - uint32 Check_Timer; - bool Dalronn_isDead; - bool Enraged; - - void Reset() OVERRIDE - { - Charge_Timer = 5000; - StoneStrike_Timer = 10000; - Dalronn_isDead = false; - Response_Timer = 0; - Check_Timer = 5000; - Enraged = false; - - ghost = (me->GetEntry() == NPC_SKARVALD_GHOST); - if (!ghost && instance) + void Reset() OVERRIDE { - Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN)); - if (dalronn && dalronn->isDead()) - dalronn->ToCreature()->Respawn(); - - instance->SetData(DATA_SKARVALD_DALRONN_EVENT, NOT_STARTED); + Charge_Timer = 5000; + StoneStrike_Timer = 10000; + Dalronn_isDead = false; + Response_Timer = 0; + Check_Timer = 5000; + Enraged = false; + + ghost = me->GetEntry() == NPC_SKARVALD_GHOST; + if (!ghost) + _Reset(); } - } - void EnterCombat(Unit* who) OVERRIDE - { - if (!ghost && instance) + void EnterCombat(Unit* /*who*/) OVERRIDE { - Talk(YELL_SKARVALD_AGGRO); - - Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN)); - if (dalronn && dalronn->IsAlive() && !dalronn->GetVictim()) - dalronn->getThreatManager().addThreat(who, 0.0f); + if (!ghost) + { + _EnterCombat(); + Talk(YELL_SKARVALD_AGGRO); + } + } - instance->SetData(DATA_SKARVALD_DALRONN_EVENT, IN_PROGRESS); + void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE + { + if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage)) + { + Enraged = true; + DoCast(me, SPELL_ENRAGE); + } } - } - void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE - { - if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage)) + void DoAction(int32 /*actionId*/) { - Enraged = true; - DoCast(me, SPELL_ENRAGE); + summons.DespawnAll(); } - } - void JustDied(Unit* killer) OVERRIDE - { - if (!ghost && instance) + void JustDied(Unit* killer) OVERRIDE { - Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN)); - if (dalronn) + if (!ghost) { - if (dalronn->isDead()) + if (Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN))) { - Talk(YELL_SKARVALD_DAL_DIED); + if (dalronn->IsAlive()) + { + Talk(YELL_SKARVALD_SKA_DIEDFIRST); - instance->SetData(DATA_SKARVALD_DALRONN_EVENT, DONE); - } - else - { - Talk(YELL_SKARVALD_SKA_DIEDFIRST); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - //DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true); - Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 5000); - if (temp) + //DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true); + if (Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000)) + { + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + temp->AI()->AttackStart(killer); + } + } + else { - temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - temp->AI()->AttackStart(killer); + dalronn->AI()->DoAction(0); + _JustDied(); + Talk(YELL_SKARVALD_DAL_DIED); } } } } - } - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - if (!ghost) + void KilledUnit(Unit* who) OVERRIDE { - Talk(YELL_SKARVALD_KILL); + if (!ghost && who->GetTypeId() == TYPEID_PLAYER) + Talk(YELL_SKARVALD_KILL); } - } - void UpdateAI(uint32 diff) OVERRIDE - { - if (ghost) + void UpdateAI(uint32 diff) OVERRIDE { - if (instance && instance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS) - me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } - - if (!UpdateVictim()) - return; + if (!UpdateVictim()) + return; - if (!ghost) - { - if (Check_Timer) + if (!ghost) { - if (Check_Timer <= diff) + if (Check_Timer) { - Check_Timer = 5000; - Unit* dalronn = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_DALRONN) : 0); - if (dalronn && dalronn->isDead()) + if (Check_Timer <= diff) { - Dalronn_isDead = true; - Response_Timer = 2000; - Check_Timer = 0; + Check_Timer = 5000; + Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN)); + if (dalronn && dalronn->isDead()) + { + Dalronn_isDead = true; + Response_Timer = 2000; + Check_Timer = 0; + } } - } else Check_Timer -= diff; - } - if (Response_Timer && Dalronn_isDead) - { - if (Response_Timer <= diff) + else + Check_Timer -= diff; + } + if (Response_Timer && Dalronn_isDead) { - Talk(YELL_SKARVALD_DAL_DIEDFIRST); + if (Response_Timer <= diff) + { + Talk(YELL_SKARVALD_DAL_DIEDFIRST); - Response_Timer = 0; - } else Response_Timer -= diff; + Response_Timer = 0; + } + else + Response_Timer -= diff; + } } - } - if (Charge_Timer <= diff) - { - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)), SPELL_CHARGE); - Charge_Timer = 5000+rand()%5000; - } else Charge_Timer -= diff; + if (Charge_Timer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me))) + DoCast(target, SPELL_CHARGE); + Charge_Timer = 5000+rand()%5000; + } + else + Charge_Timer -= diff; - if (StoneStrike_Timer <= diff) - { - DoCastVictim(SPELL_STONE_STRIKE); - StoneStrike_Timer = 5000+rand()%5000; - } else StoneStrike_Timer -= diff; + if (StoneStrike_Timer <= diff) + { + DoCastVictim(SPELL_STONE_STRIKE); + StoneStrike_Timer = 5000+rand()%5000; + } + else + StoneStrike_Timer -= diff; - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoMeleeAttackIfReady(); - } - }; + if (!me->HasUnitState(UNIT_STATE_CASTING)) + DoMeleeAttackIfReady(); + } + }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardeKeepAI<boss_skarvald_the_constructorAI>(creature); + } }; class boss_dalronn_the_controller : public CreatureScript { -public: - boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_dalronn_the_controllerAI(creature); - } + public: + boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { } - struct boss_dalronn_the_controllerAI : public ScriptedAI - { - boss_dalronn_the_controllerAI(Creature* creature) : ScriptedAI(creature) + struct boss_dalronn_the_controllerAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_dalronn_the_controllerAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { } - InstanceScript* instance; + bool ghost; + uint32 ShadowBolt_Timer; + uint32 Debilitate_Timer; + uint32 Summon_Timer; - bool ghost; - uint32 ShadowBolt_Timer; - uint32 Debilitate_Timer; - uint32 Summon_Timer; + uint32 Response_Timer; + uint32 Check_Timer; + uint32 AggroYell_Timer; + bool Skarvald_isDead; - uint32 Response_Timer; - uint32 Check_Timer; - uint32 AggroYell_Timer; - bool Skarvald_isDead; - - void Reset() OVERRIDE - { - ShadowBolt_Timer = 1000; - Debilitate_Timer = 5000; - Summon_Timer = 10000; - Check_Timer = 5000; - Skarvald_isDead = false; - Response_Timer = 0; - AggroYell_Timer = 0; - - ghost = me->GetEntry() == NPC_DALRONN_GHOST; - if (!ghost && instance) + void Reset() OVERRIDE { - Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD)); - if (skarvald && skarvald->isDead()) - skarvald->ToCreature()->Respawn(); - - instance->SetData(DATA_SKARVALD_DALRONN_EVENT, NOT_STARTED); + ShadowBolt_Timer = 1000; + Debilitate_Timer = 5000; + Summon_Timer = 10000; + Check_Timer = 5000; + Skarvald_isDead = false; + Response_Timer = 0; + AggroYell_Timer = 0; + + ghost = me->GetEntry() == NPC_DALRONN_GHOST; + if (!ghost) + _Reset(); } - } - void EnterCombat(Unit* who) OVERRIDE - { - if (!ghost && instance) + void EnterCombat(Unit* /*who*/) OVERRIDE { - Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD)); - if (skarvald && skarvald->IsAlive() && !skarvald->GetVictim()) - skarvald->getThreatManager().addThreat(who, 0.0f); - - AggroYell_Timer = 5000; + if (!ghost) + { + _EnterCombat(); + AggroYell_Timer = 5000; + } + } - if (instance) - instance->SetData(DATA_SKARVALD_DALRONN_EVENT, IN_PROGRESS); + void DoAction(int32 /*actionId*/) + { + summons.DespawnAll(); } - } - void JustDied(Unit* killer) OVERRIDE - { - if (!ghost && instance) + void JustDied(Unit* killer) OVERRIDE { - Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD)); - if (skarvald) + if (!ghost) { - if (skarvald->isDead()) + if (Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD))) { - Talk(YELL_DALRONN_SKA_DIED); + if (skarvald->IsAlive()) + { + Talk(YELL_DALRONN_DAL_DIEDFIRST); - if (instance) - instance->SetData(DATA_SKARVALD_DALRONN_EVENT, DONE); - } - else - { - Talk(YELL_DALRONN_DAL_DIEDFIRST); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - //DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true); - Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 5000); - if (temp) + //DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true); + if (Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000)) + { + temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + temp->AI()->AttackStart(killer); + } + } + else { - temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - temp->AI()->AttackStart(killer); + skarvald->AI()->DoAction(0); + _JustDied(); + Talk(YELL_DALRONN_SKA_DIED); } } } } - } - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - if (!ghost) + void KilledUnit(Unit* who) OVERRIDE { - Talk(YELL_DALRONN_KILL); + if (!ghost && who->GetTypeId() == TYPEID_PLAYER) + Talk(YELL_DALRONN_KILL); } - } - void UpdateAI(uint32 diff) OVERRIDE - { - if (ghost) + void UpdateAI(uint32 diff) OVERRIDE { - if (instance && instance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS) - me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } + if (!UpdateVictim()) + return; - if (!UpdateVictim()) - return; - - if (AggroYell_Timer) - { - if (AggroYell_Timer <= diff) + if (AggroYell_Timer) { - Talk(YELL_DALRONN_AGGRO); + if (AggroYell_Timer <= diff) + { + Talk(YELL_DALRONN_AGGRO); - AggroYell_Timer = 0; - } else AggroYell_Timer -= diff; - } + AggroYell_Timer = 0; + } + else + AggroYell_Timer -= diff; + } - if (!ghost) - { - if (Check_Timer) + if (!ghost) { - if (Check_Timer <= diff) + if (Check_Timer) { - Check_Timer = 5000; - Unit* skarvald = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_SKARVALD) : 0); - if (skarvald && skarvald->isDead()) + if (Check_Timer <= diff) { - Skarvald_isDead = true; - Response_Timer = 2000; - Check_Timer = 0; + Check_Timer = 5000; + Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD)); + if (skarvald && skarvald->isDead()) + { + Skarvald_isDead = true; + Response_Timer = 2000; + Check_Timer = 0; + } } - } else Check_Timer -= diff; - } + else + Check_Timer -= diff; + } - if (Response_Timer && Skarvald_isDead) - { - if (Response_Timer <= diff) + if (Response_Timer && Skarvald_isDead) { - Talk(YELL_DALRONN_SKA_DIEDFIRST); - Response_Timer = 0; - } else Response_Timer -= diff; + if (Response_Timer <= diff) + { + Talk(YELL_DALRONN_SKA_DIEDFIRST); + Response_Timer = 0; + } + else + Response_Timer -= diff; + } } - } - if (ShadowBolt_Timer <= diff) - { - if (!me->IsNonMeleeSpellCasted(false)) + if (ShadowBolt_Timer <= diff) { - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_SHADOW_BOLT); - ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells + if (!me->IsNonMeleeSpellCasted(false)) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_SHADOW_BOLT); + ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells + } } - } else ShadowBolt_Timer -= diff; + else + ShadowBolt_Timer -= diff; - if (Debilitate_Timer <= diff) - { - if (!me->IsNonMeleeSpellCasted(false)) + if (Debilitate_Timer <= diff) { - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEBILITATE); - Debilitate_Timer = 5000+rand()%5000; + if (!me->IsNonMeleeSpellCasted(false)) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_DEBILITATE); + Debilitate_Timer = 5000+rand()%5000; + } } - } else Debilitate_Timer -= diff; + else + Debilitate_Timer -= diff; - if (IsHeroic()) - { - if (Summon_Timer <= diff) + if (IsHeroic()) { - if (!me->IsNonMeleeSpellCasted(false)) + if (Summon_Timer <= diff) { - DoCast(me, H_SPELL_SUMMON_SKELETONS); - Summon_Timer = (rand()%10000) + 20000; + if (!me->IsNonMeleeSpellCasted(false)) + { + DoCast(me, H_SPELL_SUMMON_SKELETONS); + Summon_Timer = (rand()%10000) + 20000; + } } - } else Summon_Timer -= diff; + else + Summon_Timer -= diff; + } + + DoMeleeAttackIfReady(); } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardeKeepAI<boss_dalronn_the_controllerAI>(creature); } - }; - }; void AddSC_boss_skarvald_dalronn() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp index 92857ce06db..c4e7416f855 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp @@ -15,300 +15,244 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Instance_Utgarde_Keep -SD%Complete: 90 -SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Utgarde Keep Scripts -SDCategory: Utgarde Keep -EndScriptData */ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "utgarde_keep.h" -#include "Player.h" - -#define MAX_ENCOUNTER 3 - -#define ENTRY_BELLOW_1 186688 -#define ENTRY_BELLOW_2 186689 -#define ENTRY_BELLOW_3 186690 - -#define ENTRY_FORGEFIRE_1 186692 -#define ENTRY_FORGEFIRE_2 186693 -#define ENTRY_FORGEFIRE_3 186691 - -#define ENTRY_GLOWING_ANVIL_1 186609 -#define ENTRY_GLOWING_ANVIL_2 186610 -#define ENTRY_GLOWING_ANVIL_3 186611 -#define ENTRY_GIANT_PORTCULLIS_1 186756 -#define ENTRY_GIANT_PORTCULLIS_2 186694 +DoorData const doorData[] = +{ + { GO_GIANT_PORTCULLIS_1, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GIANT_PORTCULLIS_2, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; -/* Utgarde Keep encounters: -0 - Prince Keleseth -1 - Skarvald Dalronn -2 - Ingvar the Plunderer -*/ +MinionData const minionData[] = +{ + { NPC_SKARVALD, DATA_SKARVALD_DALRONN }, + { NPC_DALRONN, DATA_SKARVALD_DALRONN } +}; class instance_utgarde_keep : public InstanceMapScript { -public: - instance_utgarde_keep() : InstanceMapScript("instance_utgarde_keep", 574) { } + public: + instance_utgarde_keep() : InstanceMapScript(UKScriptName, 574) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_utgarde_keep_InstanceMapScript(map); - } - - struct instance_utgarde_keep_InstanceMapScript : public InstanceScript - { - instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint64 Keleseth; - uint64 Skarvald; - uint64 Dalronn; - uint64 Ingvar; - - uint64 forge_bellow[3]; - uint64 forge_fire[3]; - uint64 forge_anvil[3]; - uint64 portcullis[2]; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint32 forge_event[3]; - std::string str_data; - - void Initialize() OVERRIDE - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - Keleseth = 0; - Skarvald = 0; - Dalronn = 0; - Ingvar = 0; - - for (uint8 i = 0; i < 3; ++i) + struct instance_utgarde_keep_InstanceMapScript : public InstanceScript + { + instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map) { - forge_bellow[i] = 0; - forge_fire[i] = 0; - forge_anvil[i] = 0; - forge_event[i] = NOT_STARTED; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + LoadMinionData(minionData); + + PrinceKelesethGUID = 0; + SkarvaldGUID = 0; + DalronnGUID = 0; + IngvarGUID = 0; } - portcullis[0] = 0; - portcullis[1] = 0; - } - - bool IsEncounterInProgress() const OVERRIDE - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } - - Player* GetPlayerInMap() - { - Map::PlayerList const& players = instance->GetPlayers(); - - if (!players.isEmpty()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + switch (creature->GetEntry()) { - if (Player* player = itr->GetSource()) - return player; + case NPC_PRINCE_KELESETH: + PrinceKelesethGUID = creature->GetGUID(); + break; + case NPC_SKARVALD: + SkarvaldGUID = creature->GetGUID(); + AddMinion(creature, true); + break; + case NPC_DALRONN: + DalronnGUID = creature->GetGUID(); + AddMinion(creature, true); + break; + case NPC_INGVAR: + IngvarGUID = creature->GetGUID(); + break; + default: + break; } } - TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Utgarde Keep: GetPlayerInMap, but PlayerList is empty!"); - return NULL; - } - - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + void OnCreatureRemove(Creature* creature) OVERRIDE { - case 23953: Keleseth = creature->GetGUID(); break; - case 24201: Dalronn = creature->GetGUID(); break; - case 24200: Skarvald = creature->GetGUID(); break; - case 23954: Ingvar = creature->GetGUID(); break; + switch (creature->GetEntry()) + { + case NPC_SKARVALD: + case NPC_DALRONN: + AddMinion(creature, false); + break; + default: + break; + } } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - //door and object id - case ENTRY_BELLOW_1: forge_bellow[0] = go->GetGUID(); - if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_BELLOW_2: forge_bellow[1] = go->GetGUID(); - if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_BELLOW_3: forge_bellow[2] = go->GetGUID(); - if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_FORGEFIRE_1: forge_fire[0] = go->GetGUID(); - if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_FORGEFIRE_2: forge_fire[1] = go->GetGUID(); - if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_FORGEFIRE_3: forge_fire[2] = go->GetGUID(); - if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_GLOWING_ANVIL_1: forge_anvil[0] = go->GetGUID(); - if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_GLOWING_ANVIL_2: forge_anvil[1] = go->GetGUID(); - if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_GLOWING_ANVIL_3: forge_anvil[2] = go->GetGUID(); - if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break; - case ENTRY_GIANT_PORTCULLIS_1: portcullis[0] = go->GetGUID(); - if (m_auiEncounter[2] == DONE)HandleGameObject(0, true, go);break; - case ENTRY_GIANT_PORTCULLIS_2: portcullis[1] = go->GetGUID(); - if (m_auiEncounter[2] == DONE)HandleGameObject(0, true, go);break; + switch (go->GetEntry()) + { + case GO_BELLOW_1: + Forges[0].BellowGUID = go->GetGUID(); + HandleGameObject(0, Forges[0].Event != NOT_STARTED, go); + break; + case GO_BELLOW_2: + Forges[1].BellowGUID = go->GetGUID(); + HandleGameObject(0, Forges[1].Event != NOT_STARTED, go); + break; + case GO_BELLOW_3: + Forges[2].BellowGUID = go->GetGUID(); + HandleGameObject(0, Forges[2].Event != NOT_STARTED, go); + break; + case GO_FORGEFIRE_1: + Forges[0].FireGUID = go->GetGUID(); + HandleGameObject(0, Forges[0].Event != NOT_STARTED, go); + break; + case GO_FORGEFIRE_2: + Forges[1].FireGUID = go->GetGUID(); + HandleGameObject(0, Forges[1].Event != NOT_STARTED, go); + break; + case GO_FORGEFIRE_3: + Forges[2].FireGUID = go->GetGUID(); + HandleGameObject(0, Forges[2].Event != NOT_STARTED, go); + break; + case GO_GLOWING_ANVIL_1: + Forges[0].AnvilGUID = go->GetGUID(); + HandleGameObject(0, Forges[0].Event != NOT_STARTED, go); + break; + case GO_GLOWING_ANVIL_2: + Forges[1].AnvilGUID = go->GetGUID(); + HandleGameObject(0, Forges[1].Event != NOT_STARTED, go); + break; + case GO_GLOWING_ANVIL_3: + Forges[2].AnvilGUID = go->GetGUID(); + HandleGameObject(0, Forges[2].Event != NOT_STARTED, go); + break; + case GO_GIANT_PORTCULLIS_1: + case GO_GIANT_PORTCULLIS_2: + AddDoor(go, true); + break; + default: + break; + } } - } - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_PRINCEKELESETH: return Keleseth; - case DATA_DALRONN: return Dalronn; - case DATA_SKARVALD: return Skarvald; - case DATA_INGVAR: return Ingvar; + switch (go->GetEntry()) + { + case GO_GIANT_PORTCULLIS_1: + case GO_GIANT_PORTCULLIS_2: + AddDoor(go, false); + break; + default: + break; + } } - return 0; - } - - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_PRINCEKELESETH_EVENT: - m_auiEncounter[0] = data; - break; - case DATA_SKARVALD_DALRONN_EVENT: - m_auiEncounter[1] = data; - break; - case DATA_INGVAR_EVENT: - if (data == DONE) - { - HandleGameObject(portcullis[0], true); - HandleGameObject(portcullis[1], true); - } - m_auiEncounter[2] = data; - break; - case EVENT_FORGE_1: - if (data == NOT_STARTED) - { - HandleGameObject(forge_bellow[0], false); - HandleGameObject(forge_fire[0], false); - HandleGameObject(forge_anvil[0], false); - }else - { - HandleGameObject(forge_bellow[0], true); - HandleGameObject(forge_fire[0], true); - HandleGameObject(forge_anvil[0], true); - } - forge_event[0] = data; - break; - case EVENT_FORGE_2: - if (data == NOT_STARTED) - { - HandleGameObject(forge_bellow[1], false); - HandleGameObject(forge_fire[1], false); - HandleGameObject(forge_anvil[1], false); - }else - { - HandleGameObject(forge_bellow[1], true); - HandleGameObject(forge_fire[1], true); - HandleGameObject(forge_anvil[1], true); - } - forge_event[1] = data; - break; - case EVENT_FORGE_3: - if (data == NOT_STARTED) - { - HandleGameObject(forge_bellow[2], false); - HandleGameObject(forge_fire[2], false); - HandleGameObject(forge_anvil[2], false); - }else + switch (type) { - HandleGameObject(forge_bellow[2], true); - HandleGameObject(forge_fire[2], true); - HandleGameObject(forge_anvil[2], true); + case DATA_PRINCE_KELESETH: + return PrinceKelesethGUID; + case DATA_SKARVALD: + return SkarvaldGUID; + case DATA_DALRONN: + return DalronnGUID; + case DATA_INGVAR: + return IngvarGUID; + default: + break; } - forge_event[2] = data; - break; - } - if (data == DONE) - { - SaveToDB(); + return 0; } - } - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + void SetData(uint32 type, uint32 data) OVERRIDE { - case DATA_PRINCEKELESETH_EVENT: return m_auiEncounter[0]; - case DATA_SKARVALD_DALRONN_EVENT: return m_auiEncounter[1]; - case DATA_INGVAR_EVENT: return m_auiEncounter[2]; + switch (type) + { + case DATA_FORGE_1: + case DATA_FORGE_2: + case DATA_FORGE_3: + { + uint8 i = type - DATA_FORGE_1; + HandleGameObject(Forges[i].AnvilGUID, data != NOT_STARTED); + HandleGameObject(Forges[i].BellowGUID, data != NOT_STARTED); + HandleGameObject(Forges[i].FireGUID, data != NOT_STARTED); + Forges[i].Event = data; + + if (data == DONE) + SaveToDB(); + break; + } + default: + break; + } } - return 0; - } - - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; + std::string GetSaveData() OVERRIDE + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << "U K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << forge_event[0] << ' ' << forge_event[1] << ' ' << forge_event[2]; + std::ostringstream saveStream; + saveStream << "U K " << GetBossSaveData(); - str_data = saveStream.str(); + for (uint8 i = 0; i < 3; ++i) + saveStream << Forges[i].Event << ' '; - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; - } + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } - void Load(const char* in) OVERRIDE - { - if (!in) + void Load(char const* str) OVERRIDE { - OUT_LOAD_INST_DATA_FAIL; - return; - } + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_LOAD_INST_DATA(in); + OUT_LOAD_INST_DATA(str); - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3, data4, data5; + char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'U' && dataHead2 == 'K') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; + if (dataHead1 == 'U' && dataHead2 == 'K') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + + for (uint8 i = 0; i < 3; ++i) + loadStream >> Forges[i].Event; + } + else + OUT_LOAD_INST_DATA_FAIL; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + OUT_LOAD_INST_DATA_COMPLETE; + } - forge_event[0] = data3; - forge_event[1] = data4; - forge_event[2] = data5; + protected: + ForgeInfo Forges[3]; - } else OUT_LOAD_INST_DATA_FAIL; + uint64 PrinceKelesethGUID; + uint64 SkarvaldGUID; + uint64 DalronnGUID; + uint64 IngvarGUID; + }; - OUT_LOAD_INST_DATA_COMPLETE; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_utgarde_keep_InstanceMapScript(map); } - }; - }; void AddSC_instance_utgarde_keep() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 2de21278953..c1470519f63 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -26,142 +26,97 @@ enum Spells SPELL_UK_SECOUND_WIND_TRIGGER = 42771 }; -uint32 entry_search[3] = +uint32 ForgeSearch[3] = { - 186609, - 186610, - 186611 + GO_GLOWING_ANVIL_1, + GO_GLOWING_ANVIL_2, + GO_GLOWING_ANVIL_3 }; class npc_dragonflayer_forge_master : public CreatureScript { -public: - npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_dragonflayer_forge_masterAI(creature); - } + public: + npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { } - struct npc_dragonflayer_forge_masterAI : public ScriptedAI - { - npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature) + struct npc_dragonflayer_forge_masterAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - fm_Type = 0; - } + npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature) + { + _instance = creature->GetInstanceScript(); + _forgeId = 0; + } - InstanceScript* instance; - uint8 fm_Type; + void Reset() OVERRIDE + { + if (!_forgeId) + _forgeId = GetForgeMasterType(); - void Reset() OVERRIDE - { - if (fm_Type == 0) - fm_Type = GetForgeMasterType(); + if (!me->IsAlive()) + return; - CheckForge(); - } + if (_forgeId) + _instance->SetData(DATA_FORGE_1 + _forgeId - 1, NOT_STARTED); + } - void CheckForge() - { - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE { - switch (fm_Type) - { - case 1: - instance->SetData(EVENT_FORGE_1, me->IsAlive() ? NOT_STARTED : DONE); - break; - - case 2: - instance->SetData(EVENT_FORGE_2, me->IsAlive() ? NOT_STARTED : DONE); - break; + if (!_forgeId) + _forgeId = GetForgeMasterType(); - case 3: - instance->SetData(EVENT_FORGE_3, me->IsAlive() ? NOT_STARTED : DONE); - break; - } + if (_forgeId) + _instance->SetData(DATA_FORGE_1 + _forgeId - 1, DONE); } - } - - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (fm_Type == 0) - fm_Type = GetForgeMasterType(); - if (instance) + void EnterCombat(Unit* /*who*/) OVERRIDE { - switch (fm_Type) - { - case 1: - instance->SetData(EVENT_FORGE_1, DONE); - break; + if (!_forgeId) + _forgeId = GetForgeMasterType(); - case 2: - instance->SetData(EVENT_FORGE_2, DONE); - break; + if (_forgeId) + _instance->SetData(DATA_FORGE_1 + _forgeId - 1, IN_PROGRESS); - case 3: - instance->SetData(EVENT_FORGE_3, DONE); - break; - } + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); } - } - - void EnterCombat(Unit* /*who*/) OVERRIDE - { - if (fm_Type == 0) - fm_Type = GetForgeMasterType(); - if (instance) + void UpdateAI(uint32 /*diff*/) OVERRIDE { - switch (fm_Type) - { - case 1: - instance->SetData(EVENT_FORGE_1, IN_PROGRESS); - break; + if (!_forgeId) + _forgeId = GetForgeMasterType(); - case 2: - instance->SetData(EVENT_FORGE_2, IN_PROGRESS); - break; + if (!UpdateVictim()) + return; - case 3: - instance->SetData(EVENT_FORGE_3, IN_PROGRESS); - break; - } + DoMeleeAttackIfReady(); } - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - } - uint8 GetForgeMasterType() - { - float diff = 30.0f; - uint8 near_f = 0; - - for (uint8 i = 0; i < 3; ++i) + private: + uint8 GetForgeMasterType() { - if (GameObject* go = me->FindNearestGameObject(entry_search[i], 30)) + float diff = 30.0f; + uint8 id = 0; + + for (uint8 i = 0; i < 3; ++i) { - if (me->IsWithinDist(go, diff, false)) + if (GameObject* go = me->FindNearestGameObject(ForgeSearch[i], 30)) { - near_f = i + 1; - diff = me->GetDistance2d(go); + if (me->IsWithinDist(go, diff, false)) + { + id = i + 1; + diff = me->GetDistance2d(go); + } } } + return id > 0 && id < 4 ? id : 0; } - return near_f > 0 && near_f < 4 ? near_f : 0; - } - void UpdateAI(uint32 /* diff */) OVERRIDE - { - if (fm_Type == 0) - fm_Type = GetForgeMasterType(); - - if (!UpdateVictim()) - return; + InstanceScript* _instance; + uint8 _forgeId; + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardeKeepAI<npc_dragonflayer_forge_masterAI>(creature); } - }; }; enum TickingTimeBomb @@ -188,9 +143,7 @@ class spell_ticking_time_bomb : public SpellScriptLoader void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) { if (GetCaster() == GetTarget()) - { GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); - } } void Register() OVERRIDE @@ -209,6 +162,7 @@ enum Fixate { SPELL_FIXATE_TRIGGER = 40415 }; + class spell_fixate : public SpellScriptLoader { public: @@ -227,8 +181,7 @@ class spell_fixate : public SpellScriptLoader void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - // The unit has to cast the taunt on hisself, but we need the original caster for SPELL_AURA_MOD_TAUNT - GetCaster()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true, 0, 0, GetHitUnit()->GetGUID()); + GetHitUnit()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true); } void Register() OVERRIDE @@ -265,86 +218,86 @@ const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f}; class npc_enslaved_proto_drake : public CreatureScript { -public: - npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { } + public: + npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { } - struct npc_enslaved_proto_drakeAI : public ScriptedAI - { - npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature) + struct npc_enslaved_proto_drakeAI : public ScriptedAI { - _setData = false; - } + npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature) + { + _setData = false; + } - void Reset() OVERRIDE - { - _events.Reset(); - _events.ScheduleEvent(EVENT_REND, urand(2000, 3000)); - _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000)); - _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000)); - } + void Reset() OVERRIDE + { + _events.Reset(); + _events.ScheduleEvent(EVENT_REND, urand(2000, 3000)); + _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000)); + _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000)); + } - void MovementInform(uint32 type, uint32 id) OVERRIDE - { - if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST) + void MovementInform(uint32 type, uint32 id) OVERRIDE { - me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST) + { + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + } } - } - void SetData(uint32 type, uint32 data) OVERRIDE - { - if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f) + void SetData(uint32 type, uint32 data) OVERRIDE { - _setData = true; - me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); - me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false); + if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f) + { + _setData = true; + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false); + } } - } - void UpdateAI(uint32 diff) OVERRIDE - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; - _events.Update(diff); + _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventid = _events.ExecuteEvent()) - { - switch (eventid) + while (uint32 eventid = _events.ExecuteEvent()) { - case EVENT_REND: - DoCast(SPELL_REND); - _events.ScheduleEvent(EVENT_REND, urand(15000, 20000)); - break; - case EVENT_FLAME_BREATH: - DoCast(SPELL_FLAME_BREATH); - _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000)); - break; - case EVENT_KNOCKAWAY: - DoCast(SPELL_KNOCK_AWAY); - _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500)); - break; - default: - break; + switch (eventid) + { + case EVENT_REND: + DoCast(SPELL_REND); + _events.ScheduleEvent(EVENT_REND, urand(15000, 20000)); + break; + case EVENT_FLAME_BREATH: + DoCast(SPELL_FLAME_BREATH); + _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000)); + break; + case EVENT_KNOCKAWAY: + DoCast(SPELL_KNOCK_AWAY); + _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500)); + break; + default: + break; + } } - } - DoMeleeAttackIfReady(); - } + DoMeleeAttackIfReady(); + } - private: - bool _setData; - EventMap _events; + private: + bool _setData; + EventMap _events; - }; + }; - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_enslaved_proto_drakeAI(creature); - } + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_enslaved_proto_drakeAI(creature); + } }; class spell_uk_second_wind_proc : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h index b0d9d702db5..873c5d634fa 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h @@ -15,23 +15,79 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_UTGARDE_KEEP_H -#define DEF_UTGARDE_KEEP_H +#ifndef UTGARDE_KEEP_H_ +#define UTGARDE_KEEP_H_ + +#define UKScriptName "instance_utgarde_keep" + +uint32 const EncounterCount = 3; enum DataTypes { - DATA_PRINCEKELESETH = 1, - DATA_SKARVALD = 3, - DATA_DALRONN = 4, - DATA_INGVAR = 6, - - DATA_PRINCEKELESETH_EVENT = 2, - DATA_SKARVALD_DALRONN_EVENT = 5, - DATA_INGVAR_EVENT = 7, - - EVENT_FORGE_1 = 8, - EVENT_FORGE_2 = 9, - EVENT_FORGE_3 = 10 + // Encounter States/Boss GUIDs + DATA_PRINCE_KELESETH = 0, + DATA_SKARVALD_DALRONN = 1, + DATA_INGVAR = 2, + + // Additional Data + DATA_SKARVALD = 3, + DATA_DALRONN = 4, + + DATA_FORGE_1 = 5, + DATA_FORGE_2 = 6, + DATA_FORGE_3 = 7 +}; + +enum CreatureIds +{ + NPC_PRINCE_KELESETH = 23953, + NPC_SKARVALD = 24200, + NPC_DALRONN = 24201, + NPC_INGVAR = 23954, + + // Skarvald - Dalronn + NPC_DALRONN_GHOST = 27389, + NPC_SKARVALD_GHOST = 27390, + + // Ingvar the Plunderer + NPC_INGVAR_UNDEAD = 23980, + NPC_THROW_TARGET = 23996, + NPC_ANNHYLDE_THE_CALLER = 24068 +}; + +enum GameObjectIds +{ + GO_BELLOW_1 = 186688, + GO_BELLOW_2 = 186689, + GO_BELLOW_3 = 186690, + + GO_FORGEFIRE_1 = 186692, + GO_FORGEFIRE_2 = 186693, + GO_FORGEFIRE_3 = 186691, + + GO_GLOWING_ANVIL_1 = 186609, + GO_GLOWING_ANVIL_2 = 186610, + GO_GLOWING_ANVIL_3 = 186611, + + GO_GIANT_PORTCULLIS_1 = 186756, + GO_GIANT_PORTCULLIS_2 = 186694 }; -#endif +struct ForgeInfo +{ + ForgeInfo() : AnvilGUID(0), BellowGUID(0), FireGUID(0), Event(NOT_STARTED) { }; + + uint64 AnvilGUID; + uint64 BellowGUID; + uint64 FireGUID; + + uint32 Event; +}; + +template<class AI> +AI* GetUtgardeKeepAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, UKScriptName); +} + +#endif // UTGARDE_KEEP_H_ diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp index 0277c21cb83..0277c21cb83 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp index 77fc0877056..c6e3894a722 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp @@ -26,14 +26,14 @@ 4 - Toravon the Ice Watcher event */ -class instance_archavon : public InstanceMapScript +class instance_vault_of_archavon : public InstanceMapScript { public: - instance_archavon() : InstanceMapScript("instance_archavon", 624) { } + instance_vault_of_archavon() : InstanceMapScript("instance_vault_of_archavon", 624) { } - struct instance_archavon_InstanceMapScript : public InstanceScript + struct instance_vault_of_archavon_InstanceMapScript : public InstanceScript { - instance_archavon_InstanceMapScript(Map* map) : InstanceScript(map) + instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map) { SetBossNumber(EncounterCount); @@ -135,11 +135,11 @@ class instance_archavon : public InstanceMapScript InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE { - return new instance_archavon_InstanceMapScript(map); + return new instance_vault_of_archavon_InstanceMapScript(map); } }; -void AddSC_instance_archavon() +void AddSC_instance_vault_of_archavon() { - new instance_archavon(); + new instance_vault_of_archavon(); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index a1a965ed015..92647cfb69f 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -845,7 +845,6 @@ public: InstanceScript* instance; EventMap events; uint64 summonerGuid; - float distanceToShade; bool startedBanishing; bool switchToCombat; }; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index 0f5cea6c4c6..a4007a5a7b1 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -186,7 +186,6 @@ class boss_nazan : public CreatureScript uint32 Turn_Timer; bool flight; uint64 VazrudenGUID; - SpellInfo* liquid_fire; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index c81d3aaae62..d80cab12c26 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -750,7 +750,7 @@ class spell_warr_second_wind_proc : public SpellScriptLoader { if (eventInfo.GetProcTarget() == GetTarget()) return false; - if (!(eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN)))) + if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !(eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN)))) return false; return true; } |