diff options
Diffstat (limited to 'src')
28 files changed, 390 insertions, 385 deletions
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 8e5766407f1..5bdaf0e661d 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -821,7 +821,8 @@ void BattlegroundMgr::ToggleArenaTesting() void BattlegroundMgr::SetHolidayWeekends(uint32 mask) { - for (uint32 bgtype = 1; bgtype < MAX_BATTLEGROUND_TYPE_ID; ++bgtype) + // The current code supports battlegrounds up to BattlegroundTypeId(31) + for (uint32 bgtype = 1; bgtype < MAX_BATTLEGROUND_TYPE_ID && bgtype < 32; ++bgtype) if (Battleground* bg = GetBattlegroundTemplate(BattlegroundTypeId(bgtype))) bg->SetHoliday((mask & (1 << bgtype)) != 0); } diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 5ccd5d2b7e5..c680494cd72 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -2072,7 +2072,12 @@ struct VehicleSeatEntry uint32 m_flagsB; // 45 // 46-57 added in 3.1, floats mostly - bool CanEnterOrExit() const { return (m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0; } + bool CanEnterOrExit() const + { + return ((m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0 || + //If it has anmation for enter/ride, means it can be entered/exited by logic + (m_flags & (VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_ENTER | VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_RIDE)) != 0); + } bool CanSwitchFromSeat() const { return (m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH) != 0; } bool IsUsableByOverride() const { return (m_flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18) || (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 59eedaaffed..1f52623461c 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -585,7 +585,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const @param[in] guid Player or group guid */ -void LFGMgr::LeaveLfg(ObjectGuid guid) +void LFGMgr::LeaveLfg(ObjectGuid guid, bool disconnected) { ObjectGuid gguid = guid.IsGroup() ? guid : GetGroup(guid); @@ -646,7 +646,7 @@ void LFGMgr::LeaveLfg(ObjectGuid guid) break; case LFG_STATE_DUNGEON: case LFG_STATE_FINISHED_DUNGEON: - if (guid != gguid) // Player + if (guid != gguid && !disconnected) // Player SetState(guid, LFG_STATE_NONE); break; } diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index fda9a8b7ce9..90fbc36a114 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -399,7 +399,7 @@ class LFGMgr /// Join Lfg with selected roles, dungeons and comment void JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, std::string const& comment); /// Leaves lfg - void LeaveLfg(ObjectGuid guid); + void LeaveLfg(ObjectGuid guid, bool disconnected = false); // LfgQueue /// Get last lfg state (NONE, DUNGEON or FINISHED_DUNGEON) diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index 6ac20541574..d2140a96a46 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -80,6 +80,49 @@ char const* GetCompatibleString(LfgCompatibility compatibles) } } +std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) +{ + if (check.empty()) + return ""; + + // need the guids in order to avoid duplicates + GuidSet guids(check.begin(), check.end()); + + std::ostringstream o; + + GuidSet::const_iterator it = guids.begin(); + o << it->GetRawValue(); + LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(*it); + if (itQueue == QueueDataStore.end()) + { + TC_LOG_ERROR("lfg.queue.data.details", "Queue data not found for [%s]", it->ToString().c_str()); + o << ' ' << GetRolesString(PLAYER_ROLE_NONE); + } + else + { + // skip leader flag, log only dps/tank/healer + o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); + } + + for (++it; it != guids.end(); ++it) + { + o << '|' << it->GetRawValue(); + itQueue = QueueDataStore.find(*it); + if (itQueue == QueueDataStore.end()) + { + TC_LOG_ERROR("lfg.queue.data.details", "Queue data not found for [%s]", it->ToString().c_str()); + o << ' ' << GetRolesString(PLAYER_ROLE_NONE); + } + else + { + // skip leader flag, log only dps/tank/healer + o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); + } + } + + return o.str(); +} + void LFGQueue::AddToQueue(ObjectGuid guid) { LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(guid); @@ -278,13 +321,13 @@ LfgCompatibility LFGQueue::FindNewGroups(GuidList& check, GuidList& all) std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); - TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s): %s - all(%s)", strGuids.c_str(), GetCompatibleString(compatibles), ConcatenateGuids(all).c_str()); + TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s): %s - all(%s)", GetDetailedMatchRoles(check).c_str(), GetCompatibleString(compatibles), GetDetailedMatchRoles(all).c_str()); if (compatibles == LFG_COMPATIBILITY_PENDING) // Not previously cached, calculate compatibles = CheckCompatibility(check); if (compatibles == LFG_COMPATIBLES_BAD_STATES && sLFGMgr->AllQueued(check)) { - TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s) compatibles (cached) changed from bad states to match", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s) compatibles (cached) changed from bad states to match", GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_MATCH); return LFG_COMPATIBLES_MATCH; } @@ -322,7 +365,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Check for correct size if (check.size() > MAXGROUPSIZE || check.empty()) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s): Size wrong - Not compatibles", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s): Size wrong - Not compatibles", GetDetailedMatchRoles(check).c_str()); return LFG_INCOMPATIBLES_WRONG_GROUP_SIZE; } @@ -336,7 +379,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) LfgCompatibility child_compatibles = CheckCompatibility(check); if (child_compatibles < LFG_COMPATIBLES_WITH_LESS_PLAYERS) // Group not compatible { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) child %s not compatibles", strGuids.c_str(), ConcatenateGuids(check).c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) child %s not compatibles", strGuids.c_str(), GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, child_compatibles); return child_compatibles; } @@ -374,7 +417,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Group with less that MAXGROUPSIZE members always compatible if (check.size() == 1 && numPlayers != MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", GetDetailedMatchRoles(check).c_str()); LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(check.front()); LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS); @@ -388,14 +431,14 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (numLfgGroups > 1) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) More than one Lfggroup (%u)", strGuids.c_str(), numLfgGroups); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) More than one Lfggroup (%u)", GetDetailedMatchRoles(check).c_str(), numLfgGroups); SetCompatibles(strGuids, LFG_INCOMPATIBLES_MULTIPLE_LFG_GROUPS); return LFG_INCOMPATIBLES_MULTIPLE_LFG_GROUPS; } if (numPlayers > MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Too much players (%u)", strGuids.c_str(), numPlayers); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Too much players (%u)", GetDetailedMatchRoles(check).c_str(), numPlayers); SetCompatibles(strGuids, LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS); return LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS; } @@ -423,7 +466,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (uint8 playersize = numPlayers - proposalRoles.size()) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) not compatible, %u players are ignoring each other", strGuids.c_str(), playersize); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) not compatible, %u players are ignoring each other", GetDetailedMatchRoles(check).c_str(), playersize); SetCompatibles(strGuids, LFG_INCOMPATIBLES_HAS_IGNORES); return LFG_INCOMPATIBLES_HAS_IGNORES; } @@ -435,7 +478,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) for (LfgRolesMap::const_iterator it = debugRoles.begin(); it != debugRoles.end(); ++it) o << ", " << it->first.GetRawValue() << ": " << GetRolesString(it->second); - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Roles not compatible%s", strGuids.c_str(), o.str().c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Roles not compatible%s", GetDetailedMatchRoles(check).c_str(), o.str().c_str()); SetCompatibles(strGuids, LFG_INCOMPATIBLES_NO_ROLES); return LFG_INCOMPATIBLES_NO_ROLES; } @@ -455,7 +498,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (proposalDungeons.empty()) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) No compatible dungeons%s", strGuids.c_str(), o.str().c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) No compatible dungeons%s", GetDetailedMatchRoles(check).c_str(), o.str().c_str()); SetCompatibles(strGuids, LFG_INCOMPATIBLES_NO_DUNGEONS); return LFG_INCOMPATIBLES_NO_DUNGEONS; } @@ -472,7 +515,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Enough players? if (numPlayers != MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Compatibles but not enough players(%u)", strGuids.c_str(), numPlayers); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Compatibles but not enough players(%u)", GetDetailedMatchRoles(check).c_str(), numPlayers); LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS); data.roles = proposalRoles; @@ -489,7 +532,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (!sLFGMgr->AllQueued(check)) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Group MATCH but can't create proposal!", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Group MATCH but can't create proposal!", GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_BAD_STATES); return LFG_COMPATIBLES_BAD_STATES; } @@ -531,7 +574,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) sLFGMgr->AddProposal(proposal); - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) MATCH! Group formed", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) MATCH! Group formed", GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_MATCH); return LFG_COMPATIBLES_MATCH; } diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h index 9bf8ee64b78..77683614d49 100644 --- a/src/server/game/DungeonFinding/LFGQueue.h +++ b/src/server/game/DungeonFinding/LFGQueue.h @@ -88,6 +88,7 @@ class LFGQueue public: // Add/Remove from queue + std::string GetDetailedMatchRoles(GuidList const& check); void AddToQueue(ObjectGuid guid); void RemoveFromQueue(ObjectGuid guid); void AddQueueData(ObjectGuid guid, time_t joinTime, LfgDungeonSet const& dungeons, LfgRolesMap const& rolesMap); diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 852eb7d8c5f..b1ae61cef11 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -44,6 +44,8 @@ void LFGPlayerScript::OnLogout(Player* player) player->GetSession()->SendLfgLfrList(false); sLFGMgr->LeaveLfg(player->GetGUID()); } + else if (player->GetSession()->PlayerDisconnected()) + sLFGMgr->LeaveLfg(player->GetGUID(), true); } void LFGPlayerScript::OnLogin(Player* player, bool /*loginFirst*/) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4597f18eedb..d02a22d43f4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3192,7 +3192,7 @@ bool Unit::IsUnderWater() const void Unit::UpdateUnderwaterState(Map* m, float x, float y, float z) { - if (!IsPet() && !IsVehicle()) + if (IsFlying() || (!IsPet() && !IsVehicle())) return; LiquidData liquid_status; @@ -11947,9 +11947,9 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo || target->GetReactionTo(this) > REP_NEUTRAL) return false; - // Not all neutral creatures can be attacked + // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar) if (GetReactionTo(target) == REP_NEUTRAL && - target->GetReactionTo(this) == REP_NEUTRAL) + target->GetReactionTo(this) <= REP_NEUTRAL) { if (!(target->GetTypeId() == TYPEID_PLAYER && GetTypeId() == TYPEID_PLAYER) && !(target->GetTypeId() == TYPEID_UNIT && GetTypeId() == TYPEID_UNIT)) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 3cb818eeac0..a568409d918 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2755,7 +2755,8 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Spells[j].SpellId = 0; } - if (spellInfo && itemTemplate.Spells[j].SpellCategory) + if (spellInfo && itemTemplate.Spells[j].SpellCategory + && itemTemplate.Spells[j].SpellCategory != SPELL_CATEGORY_FOOD) { bool added = sSpellsByCategoryStore[itemTemplate.Spells[j].SpellCategory].insert(itemTemplate.Spells[j].SpellId).second; if (added) @@ -3981,18 +3982,16 @@ void ObjectMgr::LoadQuests() "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5," // 62 63 64 65 "PointMapId, PointX, PointY, PointOption, " - // 66 67 68 69 70 71 72 - "LogTitle, LogDescription, QuestDescription, EndText, OfferRewardText, RequestItemsText, QuestCompletionLog, " - // 73 74 75 76 77 78 79 80 + // 66 67 68 69 70 + "LogTitle, LogDescription, QuestDescription, EndText, QuestCompletionLog, " + // 71 72 73 74 75 76 77 78 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, " - // 81 82 83 84 85 86 87 88 + // 79 80 81 82 83 84 85 86 "RequiredSourceItemId1, RequiredSourceItemId2, RequiredSourceItemId3, RequiredSourceItemId4, RequiredSourceItemCount1, RequiredSourceItemCount2, RequiredSourceItemCount3, RequiredSourceItemCount4, " - // 89 90 91 92 93 94 95 96 97 98 99 100 + // 87 88 89 90 91 92 93 94 95 96 97 98 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, " - // 101 102 103 104 105 106 107 108 109 110 111 112 113 - "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, " - // 114 115 116 117 118 119 120 121 122 123 - "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4" + // 99 100 101 102 103 + "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4" " FROM quest_template"); if (!result) { @@ -4012,6 +4011,75 @@ void ObjectMgr::LoadQuests() } while (result->NextRow()); std::map<uint32, uint32> usedMailTemplates; + + // Load `quest_details` + // 0 1 2 3 4 5 6 7 8 + result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestDetails(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_details` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } + + // Load `quest_request_items` + // 0 1 2 3 + result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestRequestItems(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_request_items` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } + + // Load `quest_offer_reward` + // 0 1 2 3 4 5 6 7 8 9 + result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestOfferReward(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_offer_reward` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } // Load `quest_template_addon` // 0 1 2 3 4 5 6 7 8 diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 63390ad61da..a4ba9866064 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -379,7 +379,8 @@ enum TrinityStrings LANG_COMMAND_CHEAT_POWER = 361, LANG_COMMAND_CHEAT_WW = 362, LANG_COMMAND_WHISPEROFFPLAYER = 363, - // Room for more level 2 364-399 not used + LANG_COMMAND_CHEAT_TAXINODES = 364, + // Room for more level 2 365-399 not used // level 3 chat LANG_SCRIPTS_RELOADED = 400, diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 4582c93b673..eea0fd72e8b 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -77,49 +77,32 @@ Quest::Quest(Field* questRecord) Objectives = questRecord[67].GetString(); Details = questRecord[68].GetString(); EndText = questRecord[69].GetString(); - OfferRewardText = questRecord[70].GetString(); - RequestItemsText = questRecord[71].GetString(); - CompletedText = questRecord[72].GetString(); + CompletedText = questRecord[70].GetString(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGo[i] = questRecord[73+i].GetInt32(); + RequiredNpcOrGo[i] = questRecord[71+i].GetInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGoCount[i] = questRecord[77+i].GetUInt16(); + RequiredNpcOrGoCount[i] = questRecord[75+i].GetUInt16(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemId[i] = questRecord[81+i].GetUInt32(); + RequiredSourceItemId[i] = questRecord[79+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemCount[i] = questRecord[85+i].GetUInt16(); + RequiredSourceItemCount[i] = questRecord[83+i].GetUInt16(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemId[i] = questRecord[89+i].GetUInt32(); + RequiredItemId[i] = questRecord[87+i].GetUInt32(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemCount[i] = questRecord[95+i].GetUInt16(); + RequiredItemCount[i] = questRecord[93+i].GetUInt16(); - // int8 Unknown0 = questRecord[101].GetUInt8(); + // int8 Unknown0 = questRecord[99].GetUInt8(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ObjectiveText[i] = questRecord[102+i].GetString(); + ObjectiveText[i] = questRecord[100+i].GetString(); - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = questRecord[106+i].GetUInt16(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmoteDelay[i] = questRecord[110+i].GetUInt32(); - - EmoteOnIncomplete = questRecord[114].GetUInt16(); - EmoteOnComplete = questRecord[115].GetUInt16(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = questRecord[116+i].GetInt16(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmoteDelay[i] = questRecord[120+i].GetInt32(); - - //int32 VerifiedBuild = questRecord[124].GetInt32(); + //int32 VerifiedBuild = questRecord[104].GetInt32(); _reqItemsCount = 0; _reqCreatureOrGOcount = 0; @@ -143,6 +126,33 @@ Quest::Quest(Field* questRecord) ++_rewChoiceItemsCount; } +void Quest::LoadQuestDetails(Field* fields) +{ + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + DetailsEmote[i] = fields[1+i].GetUInt16(); + + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + DetailsEmoteDelay[i] = fields[5+i].GetUInt32(); +} + +void Quest::LoadQuestRequestItems(Field* fields) +{ + EmoteOnComplete = fields[1].GetUInt16(); + EmoteOnIncomplete = fields[2].GetUInt16(); + RequestItemsText = fields[3].GetString(); +} + +void Quest::LoadQuestOfferReward(Field* fields) +{ + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + OfferRewardEmote[i] = fields[1+i].GetUInt16(); + + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + OfferRewardEmoteDelay[i] = fields[5+i].GetUInt32(); + + OfferRewardText = fields[9].GetString(); +} + void Quest::LoadQuestTemplateAddon(Field* fields) { MaxLevel = fields[1].GetUInt8(); diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index fdfb2a8e8b9..78fd065e9bd 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -195,6 +195,9 @@ class Quest friend class ObjectMgr; public: Quest(Field* questRecord); + void LoadQuestDetails(Field* fields); + void LoadQuestRequestItems(Field* fields); + void LoadQuestOfferReward(Field* fields); void LoadQuestTemplateAddon(Field* fields); uint32 XPValue(Player* player) const; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 87a40657e24..3753f796768 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -256,6 +256,7 @@ class WorldSession bool PlayerLogout() const { return m_playerLogout; } bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; } bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } + bool PlayerDisconnected() const { return !m_Socket; } void ReadAddonsInfo(WorldPacket& data); void SendAddonsInfo(); diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp index 54ae72c3d8a..78ba5a4dc74 100644 --- a/src/server/scripts/Commands/cs_cheat.cpp +++ b/src/server/scripts/Commands/cs_cheat.cpp @@ -24,7 +24,6 @@ EndScriptData */ #include "Chat.h" #include "Language.h" -#include "ObjectMgr.h" #include "Player.h" #include "ScriptMgr.h" @@ -166,8 +165,8 @@ public: { Player* player = handler->GetSession()->GetPlayer(); - const char* enabled = "enabled"; - const char* disabled = "disabled"; + const char* enabled = "ON"; + const char* disabled = "OFF"; handler->SendSysMessage(LANG_COMMAND_CHEAT_STATUS); handler->PSendSysMessage(LANG_COMMAND_CHEAT_GOD, player->GetCommandStatus(CHEAT_GOD) ? enabled : disabled); @@ -175,6 +174,8 @@ public: handler->PSendSysMessage(LANG_COMMAND_CHEAT_CT, player->GetCommandStatus(CHEAT_CASTTIME) ? enabled : disabled); handler->PSendSysMessage(LANG_COMMAND_CHEAT_POWER, player->GetCommandStatus(CHEAT_POWER) ? enabled : disabled); handler->PSendSysMessage(LANG_COMMAND_CHEAT_WW, player->GetCommandStatus(CHEAT_WATERWALK) ? enabled : disabled); + handler->PSendSysMessage(LANG_COMMAND_CHEAT_TAXINODES, player->isTaxiCheater() ? enabled : disabled); + return true; } @@ -186,13 +187,7 @@ public: std::string argstr = (char*)args; if (!*args) - { argstr = (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) ? "off" : "on"; - if (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) - argstr = "off"; - else - argstr = "on"; - } if (argstr == "off") { @@ -214,15 +209,7 @@ public: static bool HandleTaxiCheatCommand(ChatHandler* handler, const char* args) { - if (!*args) - { - handler->SendSysMessage(LANG_USE_BOL); - handler->SetSentErrorMessage(true); - return false; - } - std::string argstr = (char*)args; - Player* chr = handler->getSelectedPlayer(); if (!chr) @@ -230,13 +217,9 @@ public: else if (handler->HasLowerSecurity(chr, ObjectGuid::Empty)) // check online security return false; - if (argstr == "on") + if (!*args) { - chr->SetTaxiCheater(true); - handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str()); - if (handler->needReportToTarget(chr)) - ChatHandler(chr->GetSession()).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str()); - return true; + argstr = (chr->isTaxiCheater()) ? "off" : "on"; } if (argstr == "off") @@ -245,7 +228,14 @@ public: handler->PSendSysMessage(LANG_YOU_REMOVE_TAXIS, handler->GetNameLink(chr).c_str()); if (handler->needReportToTarget(chr)) ChatHandler(chr->GetSession()).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, handler->GetNameLink().c_str()); - + return true; + } + else if (argstr == "on") + { + chr->SetTaxiCheater(true); + handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str()); + if (handler->needReportToTarget(chr)) + ChatHandler(chr->GetSession()).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str()); return true; } @@ -259,10 +249,11 @@ public: if (!*args) return false; + // std::int flag = (char*)args; int flag = atoi((char*)args); Player* chr = handler->getSelectedPlayer(); - if (chr == NULL) + if (!chr) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index c79a57d0746..12798833a3f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -25,14 +25,18 @@ uint32 const EncounterCount = 8; enum BWLEncounter { - BOSS_RAZORGORE = 0, - BOSS_VAELASTRAZ = 1, - BOSS_BROODLORD = 2, - BOSS_FIREMAW = 3, - BOSS_EBONROC = 4, - BOSS_FLAMEGOR = 5, - BOSS_CHROMAGGUS = 6, - BOSS_NEFARIAN = 7 + // Encounter States/Boss GUIDs + DATA_RAZORGORE_THE_UNTAMED = 0, + DATA_VAELASTRAZ_THE_CORRUPT = 1, + DATA_BROODLORD_LASHLAYER = 2, + DATA_FIREMAW = 3, + DATA_EBONROC = 4, + DATA_FLAMEGOR = 5, + DATA_CHROMAGGUS = 6, + DATA_NEFARIAN = 7, + + // Additional Data + DATA_LORD_VICTOR_NEFARIUS = 8 }; enum CreatureIds @@ -44,7 +48,7 @@ enum CreatureIds NPC_BLACKWING_WARLOCK = 12459, NPC_VAELASTRAZ = 13020, NPC_BROODLORD = 12017, - NPC_FIRENAW = 11983, + NPC_FIREMAW = 11983, NPC_EBONROC = 14601, NPC_FLAMEGOR = 11981, NPC_CHROMAGGUS = 14020, @@ -52,17 +56,14 @@ enum CreatureIds NPC_NEFARIAN = 11583 }; -enum BWLData64 +enum GameObjectIds { - DATA_RAZORGORE_THE_UNTAMED = 1, - DATA_VAELASTRAZ_THE_CORRUPT, - DATA_BROODLORD_LASHLAYER, - DATA_FIRENAW, - DATA_EBONROC, - DATA_FLAMEGOR, - DATA_CHROMAGGUS, - DATA_LORD_VICTOR_NEFARIUS, - DATA_NEFARIAN + GO_BLACK_DRAGON_EGG = 177807, + GO_BOSSGATE01 = 175946, + GO_DRAKE_RIDER_PORTCULLIS = 175185, + GO_ALTERAC_VALLEY_GATE = 180424, + GO_GATE = 185483, + GO_VACCUUM_EXIT_GATE = 181125 }; enum BWLEvents @@ -79,4 +80,4 @@ enum BWLMisc DATA_EGG_EVENT }; -#endif
\ No newline at end of file +#endif diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp index 2609cf5fdf8..5ba933005ec 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp @@ -50,16 +50,10 @@ public: struct boss_broodlordAI : public BossAI { - boss_broodlordAI(Creature* creature) : BossAI(creature, BOSS_BROODLORD) { } + boss_broodlordAI(Creature* creature) : BossAI(creature, DATA_BROODLORD_LASHLAYER) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_VAELASTRAZ) != DONE) - { - EnterEvadeMode(); - return; - } - _EnterCombat(); Talk(SAY_AGGRO); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 61d6c052cdf..9a49b96e68e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -71,7 +71,7 @@ public: struct boss_chromaggusAI : public BossAI { - boss_chromaggusAI(Creature* creature) : BossAI(creature, BOSS_CHROMAGGUS) + boss_chromaggusAI(Creature* creature) : BossAI(creature, DATA_CHROMAGGUS) { Initialize(); @@ -193,11 +193,6 @@ public: void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_FLAMEGOR) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHIMMER, 0); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index 8bd3ae0ebce..7a7e30f7913 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -41,15 +41,10 @@ public: struct boss_ebonrocAI : public BossAI { - boss_ebonrocAI(Creature* creature) : BossAI(creature, BOSS_EBONROC) { } + boss_ebonrocAI(Creature* creature) : BossAI(creature, DATA_EBONROC) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp index e41153796e5..3dcdbfe01df 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp @@ -41,15 +41,10 @@ public: struct boss_firemawAI : public BossAI { - boss_firemawAI(Creature* creature) : BossAI(creature, BOSS_FIREMAW) { } + boss_firemawAI(Creature* creature) : BossAI(creature, DATA_FIREMAW) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp index 011c695b61f..20e69211da2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp @@ -46,15 +46,10 @@ public: struct boss_flamegorAI : public BossAI { - boss_flamegorAI(Creature* creature) : BossAI(creature, BOSS_FLAMEGOR) { } + boss_flamegorAI(Creature* creature) : BossAI(creature, DATA_FLAMEGOR) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 1ff18b845a1..51e1bf67f16 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -166,7 +166,7 @@ public: struct boss_victor_nefariusAI : public BossAI { - boss_victor_nefariusAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) + boss_victor_nefariusAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { Initialize(); } @@ -394,7 +394,7 @@ public: struct boss_nefarianAI : public BossAI { - boss_nefarianAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) + boss_nefarianAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { Initialize(); } @@ -458,7 +458,7 @@ public: { if (canDespawn && DespawnTimer <= diff) { - instance->SetBossState(BOSS_NEFARIAN, FAIL); + instance->SetBossState(DATA_NEFARIAN, FAIL); std::list<Creature*> constructList; me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 8d660fc17d1..1d66964ce6b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -68,7 +68,7 @@ public: struct boss_razorgoreAI : public BossAI { - boss_razorgoreAI(Creature* creature) : BossAI(creature, BOSS_RAZORGORE) + boss_razorgoreAI(Creature* creature) : BossAI(creature, DATA_RAZORGORE_THE_UNTAMED) { Initialize(); } @@ -175,7 +175,7 @@ public: { if (InstanceScript* instance = go->GetInstanceScript()) if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razor = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_RAZORGORE_THE_UNTAMED))) + if (Creature* razor = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) { razor->Attack(player, true); player->CastSpell(razor, SPELL_MINDCONTROL); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 0a2a245ece6..636554a0ae4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -68,7 +68,7 @@ public: struct boss_vaelAI : public BossAI { - boss_vaelAI(Creature* creature) : BossAI(creature, BOSS_VAELASTRAZ) + boss_vaelAI(Creature* creature) : BossAI(creature, DATA_VAELASTRAZ_THE_CORRUPT) { Initialize(); creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index 7e38a9265f7..97646b774eb 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -15,23 +15,36 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "ScriptMgr.h" +#include "Player.h" #include "ScriptedCreature.h" -#include "PassiveAI.h" +#include "ScriptMgr.h" #include "blackwing_lair.h" -#include "Player.h" -/* -Blackwing Lair Encounter: -1 - boss_razorgore.cpp -2 - boss_vaelastrasz.cpp -3 - boss_broodlord_lashlayer.cpp -4 - boss_firemaw.cpp -5 - boss_ebonroc.cpp -6 - boss_flamegor.cpp -7 - boss_chromaggus.cpp -8 - boss_nefarian.cpp -*/ +DoorData const doorData[] = +{ + { GO_BOSSGATE01, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_DRAKE_RIDER_PORTCULLIS, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_ALTERAC_VALLEY_GATE, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GATE, DATA_FIREMAW, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GATE, DATA_EBONROC, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GATE, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_VACCUUM_EXIT_GATE, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; + +ObjectData const creatureData[] = +{ + { NPC_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED }, + { NPC_VAELASTRAZ, DATA_VAELASTRAZ_THE_CORRUPT }, + { NPC_BROODLORD, DATA_BROODLORD_LASHLAYER }, + { NPC_FIREMAW, DATA_FIREMAW }, + { NPC_EBONROC, DATA_EBONROC }, + { NPC_FLAMEGOR, DATA_FLAMEGOR }, + { NPC_CHROMAGGUS, DATA_CHROMAGGUS }, + { NPC_NEFARIAN, DATA_NEFARIAN }, + { NPC_VICTOR_NEFARIUS, DATA_LORD_VICTOR_NEFARIUS }, + { 0, 0 } // END +}; Position const SummonPosition[8] = { @@ -57,92 +70,84 @@ public: instance_blackwing_lair_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + LoadObjectData(creatureData, nullptr); + // Razorgore EggCount = 0; EggEvent = 0; - SetBossNumber(EncounterCount); } void OnCreatureCreate(Creature* creature) override { + InstanceScript::OnCreatureCreate(creature); + switch (creature->GetEntry()) { - case NPC_RAZORGORE: - RazorgoreTheUntamedGUID = creature->GetGUID(); - break; case NPC_BLACKWING_DRAGON: case NPC_BLACKWING_TASKMASTER: case NPC_BLACKWING_LEGIONAIRE: case NPC_BLACKWING_WARLOCK: - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = GetCreature(DATA_RAZORGORE_THE_UNTAMED)) razor->AI()->JustSummoned(creature); break; - case NPC_VAELASTRAZ: - VaelastraszTheCorruptGUID = creature->GetGUID(); - break; - case NPC_BROODLORD: - BroodlordLashlayerGUID = creature->GetGUID(); - break; - case NPC_FIRENAW: - FiremawGUID = creature->GetGUID(); - break; - case NPC_EBONROC: - EbonrocGUID = creature->GetGUID(); - break; - case NPC_FLAMEGOR: - FlamegorGUID = creature->GetGUID(); - break; - case NPC_CHROMAGGUS: - ChromaggusGUID = creature->GetGUID(); - break; - case NPC_VICTOR_NEFARIUS: - LordVictorNefariusGUID = creature->GetGUID(); - break; - case NPC_NEFARIAN: - NefarianGUID = creature->GetGUID(); + default: break; } } void OnGameObjectCreate(GameObject* go) override { - switch (go->GetEntry()) + InstanceScript::OnGameObjectCreate(go); + + if (go->GetEntry() == GO_BLACK_DRAGON_EGG) { - case 177807: // Egg - if (GetBossState(BOSS_FIREMAW) == DONE) - go->SetPhaseMask(2, true); - else - EggList.push_back(go->GetGUID()); - break; - case 175946: // Door - RazorgoreDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_RAZORGORE) == DONE, go); - break; - case 175185: // Door - VaelastraszDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_VAELASTRAZ) == DONE, go); - break; - case 180424: // Door - BroodlordDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_BROODLORD) == DONE, go); - break; - case 185483: // Door - ChrommagusDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_FIREMAW) == DONE && GetBossState(BOSS_EBONROC) == DONE && GetBossState(BOSS_FLAMEGOR) == DONE, go); - break; - case 181125: // Door - NefarianDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_CHROMAGGUS) == DONE, go); - break; + if (GetBossState(DATA_FIREMAW) == DONE) + go->SetPhaseMask(2, true); + else + EggList.push_back(go->GetGUID()); } } void OnGameObjectRemove(GameObject* go) override { - if (go->GetEntry() == 177807) // Egg + InstanceScript::OnGameObjectRemove(go); + + if (go->GetEntry() == GO_BLACK_DRAGON_EGG) EggList.remove(go->GetGUID()); } + bool CheckRequiredBosses(uint32 bossId, Player const* player /*= nullptr*/) const override + { + if (_SkipCheckRequiredBosses(player)) + return true; + + switch (bossId) + { + case DATA_BROODLORD_LASHLAYER: + if (GetBossState(DATA_VAELASTRAZ_THE_CORRUPT) != DONE) + return false; + break; + case DATA_FIREMAW: + case DATA_EBONROC: + case DATA_FLAMEGOR: + if (GetBossState(DATA_BROODLORD_LASHLAYER) != DONE) + return false; + break; + case DATA_CHROMAGGUS: + if (GetBossState(DATA_FIREMAW) != DONE + || GetBossState(DATA_EBONROC) != DONE + || GetBossState(DATA_FLAMEGOR) != DONE) + return false; + break; + default: + break; + } + + return true; + } + bool SetBossState(uint32 type, EncounterState state) override { if (!InstanceScript::SetBossState(type, state)) @@ -150,40 +155,25 @@ public: switch (type) { - case BOSS_RAZORGORE: - HandleGameObject(RazorgoreDoorGUID, state == DONE); + case DATA_RAZORGORE_THE_UNTAMED: if (state == DONE) { for (GuidList::const_iterator itr = EggList.begin(); itr != EggList.end(); ++itr) - if (GameObject* egg = instance->GetGameObject((*itr))) + if (GameObject* egg = instance->GetGameObject(*itr)) egg->SetPhaseMask(2, true); } SetData(DATA_EGG_EVENT, NOT_STARTED); break; - case BOSS_VAELASTRAZ: - HandleGameObject(VaelastraszDoorGUID, state == DONE); - break; - case BOSS_BROODLORD: - HandleGameObject(BroodlordDoorGUID, state == DONE); - break; - case BOSS_FIREMAW: - case BOSS_EBONROC: - case BOSS_FLAMEGOR: - HandleGameObject(ChrommagusDoorGUID, GetBossState(BOSS_FIREMAW) == DONE && GetBossState(BOSS_EBONROC) == DONE && GetBossState(BOSS_FLAMEGOR) == DONE); - break; - case BOSS_CHROMAGGUS: - HandleGameObject(NefarianDoorGUID, state == DONE); - break; - case BOSS_NEFARIAN: + case DATA_NEFARIAN: switch (state) { case NOT_STARTED: - if (Creature* nefarian = instance->GetCreature(NefarianGUID)) + if (Creature* nefarian = GetCreature(DATA_NEFARIAN)) nefarian->DespawnOrUnsummon(); break; case FAIL: - _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15*IN_MILLISECONDS*MINUTE); - SetBossState(BOSS_NEFARIAN, NOT_STARTED); + _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15 * IN_MILLISECONDS * MINUTE); + SetBossState(DATA_NEFARIAN, NOT_STARTED); break; default: break; @@ -193,24 +183,6 @@ public: return true; } - ObjectGuid GetGuidData(uint32 id) const override - { - switch (id) - { - case DATA_RAZORGORE_THE_UNTAMED: return RazorgoreTheUntamedGUID; - case DATA_VAELASTRAZ_THE_CORRUPT: return VaelastraszTheCorruptGUID; - case DATA_BROODLORD_LASHLAYER: return BroodlordLashlayerGUID; - case DATA_FIRENAW: return FiremawGUID; - case DATA_EBONROC: return EbonrocGUID; - case DATA_FLAMEGOR: return FlamegorGUID; - case DATA_CHROMAGGUS: return ChromaggusGUID; - case DATA_LORD_VICTOR_NEFARIUS: return LordVictorNefariusGUID; - case DATA_NEFARIAN: return NefarianGUID; - } - - return ObjectGuid::Empty; - } - void SetData(uint32 type, uint32 data) override { if (type == DATA_EGG_EVENT) @@ -218,7 +190,7 @@ public: switch (data) { case IN_PROGRESS: - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45*IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45 * IN_MILLISECONDS); EggEvent = data; EggCount = 0; break; @@ -230,13 +202,13 @@ public: case SPECIAL: if (++EggCount == 15) { - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = GetCreature(DATA_RAZORGORE_THE_UNTAMED)) { SetData(DATA_EGG_EVENT, DONE); razor->RemoveAurasDueToSpell(42013); // MindControl DoRemoveAurasDueToSpellOnPlayers(42013); } - _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, 1 * IN_MILLISECONDS); _events.CancelEvent(EVENT_RAZOR_SPAWN); } if (EggEvent == NOT_STARTED) @@ -249,8 +221,8 @@ public: void OnUnitDeath(Unit* unit) override { //! HACK, needed because of buggy CreatureAI after charm - if (unit->GetEntry() == NPC_RAZORGORE && GetBossState(BOSS_RAZORGORE) != DONE) - SetBossState(BOSS_RAZORGORE, DONE); + if (unit->GetEntry() == NPC_RAZORGORE && GetBossState(DATA_RAZORGORE_THE_UNTAMED) != DONE) + SetBossState(DATA_RAZORGORE_THE_UNTAMED, DONE); } void Update(uint32 diff) override @@ -268,15 +240,15 @@ public: for (uint8 i = urand(2, 5); i > 0 ; --i) if (Creature* summon = instance->SummonCreature(Entry[urand(0, 4)], SummonPosition[urand(0, 7)])) summon->SetInCombatWithZone(); - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, urand(12, 17)*IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, urand(12, 17) * IN_MILLISECONDS); break; case EVENT_RAZOR_PHASE_TWO: _events.CancelEvent(EVENT_RAZOR_SPAWN); - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = GetCreature(DATA_RAZORGORE_THE_UNTAMED)) razor->AI()->DoAction(ACTION_PHASE_TWO); break; case EVENT_RESPAWN_NEFARIUS: - if (Creature* nefarius = instance->GetCreature(LordVictorNefariusGUID)) + if (Creature* nefarius = GetCreature(DATA_LORD_VICTOR_NEFARIUS)) { nefarius->SetPhaseMask(1, true); nefarius->setActive(true); @@ -291,34 +263,11 @@ public: protected: // Misc EventMap _events; + // Razorgore uint8 EggCount; uint32 EggEvent; - ObjectGuid RazorgoreTheUntamedGUID; - ObjectGuid RazorgoreDoorGUID; GuidList EggList; - - // Vaelastrasz the Corrupt - ObjectGuid VaelastraszTheCorruptGUID; - ObjectGuid VaelastraszDoorGUID; - - // Broodlord Lashlayer - ObjectGuid BroodlordLashlayerGUID; - ObjectGuid BroodlordDoorGUID; - - // 3 Dragons - ObjectGuid FiremawGUID; - ObjectGuid EbonrocGUID; - ObjectGuid FlamegorGUID; - ObjectGuid ChrommagusDoorGUID; - - // Chormaggus - ObjectGuid ChromaggusGUID; - ObjectGuid NefarianDoorGUID; - - // Nefarian - ObjectGuid LordVictorNefariusGUID; - ObjectGuid NefarianGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 5b04e4bb0f7..4b60107a182 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -396,8 +396,8 @@ class boss_hodir : public CreatureScript me->SetControlled(true, UNIT_STATE_STUNNED); me->CombatStop(true); - DoCastAOE(SPELL_KILL_CREDIT); /// need to be cast before changing boss faction - /// spell will target enemies only + DoCastAOE(SPELL_KILL_CREDIT, true); /// need to be cast before changing boss faction + /// spell will target enemies only me->setFaction(35); me->DespawnOrUnsummon(10000); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 48f28077e00..59c28cd3a5a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -696,19 +696,22 @@ class boss_sara : public CreatureScript void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (_events.IsInPhase(PHASE_ONE) && damage >= me->GetHealth()) + if (damage >= me->GetHealth()) { - damage = 0; + damage = me->GetHealth() - 1; - if (Creature* voice = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VOICE_OF_YOGG_SARON))) - voice->AI()->DoAction(ACTION_PHASE_TRANSFORM); - - Talk(SAY_SARA_TRANSFORM_1); - _events.SetPhase(PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_1, 4700, 0, PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_2, 9500, 0, PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_3, 14300, 0, PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_4, 14500, 0, PHASE_TRANSFORM); + if (_events.IsInPhase(PHASE_ONE)) + { + if (Creature* voice = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VOICE_OF_YOGG_SARON))) + voice->AI()->DoAction(ACTION_PHASE_TRANSFORM); + + Talk(SAY_SARA_TRANSFORM_1); + _events.SetPhase(PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_1, 4700, 0, PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_2, 9500, 0, PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_3, 14300, 0, PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_4, 14500, 0, PHASE_TRANSFORM); + } } } diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 6069c0d8be7..4cdfa653224 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -596,12 +596,13 @@ public: switch (IntroPhase) { case 1: - Talk(SAY_START_1); + if (Player* player = GetPlayerForEscort()) + Talk(SAY_START_1, player); IntroPhase = 2; IntroTimer = 7500; break; case 2: - Talk(SAY_END_1); + Talk(SAY_START_2); IntroPhase = 3; IntroTimer = 7500; break; @@ -611,12 +612,13 @@ public: IntroTimer = 0; break; case 4: - Talk(SAY_START_2); + Talk(SAY_END_1); IntroPhase = 5; IntroTimer = 8000; break; case 5: - Talk(SAY_END_2); + if (Player* player = GetPlayerForEscort()) + Talk(SAY_END_2, player); IntroPhase = 6; IntroTimer = 2500; break; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index d1d2ddc8a80..57346443390 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -942,6 +942,28 @@ public: { npc_garments_of_questsAI(Creature* creature) : npc_escortAI(creature) { + switch (me->GetEntry()) + { + case ENTRY_SHAYA: + quest = QUEST_MOON; + break; + case ENTRY_ROBERTS: + quest = QUEST_LIGHT_1; + break; + case ENTRY_DOLF: + quest = QUEST_LIGHT_2; + break; + case ENTRY_KORJA: + quest = QUEST_SPIRIT; + break; + case ENTRY_DG_KEL: + quest = QUEST_DARKNESS; + break; + default: + quest = 0; + break; + } + Reset(); } @@ -951,6 +973,7 @@ public: bool CanRun; uint32 RunAwayTimer; + uint32 quest; void Reset() override { @@ -982,93 +1005,20 @@ public: if (Player* player = caster->ToPlayer()) { - switch (me->GetEntry()) + if (quest && player->GetQuestStatus(quest) == QUEST_STATUS_INCOMPLETE) { - case ENTRY_SHAYA: - if (player->GetQuestStatus(QUEST_MOON) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_ROBERTS: - if (player->GetQuestStatus(QUEST_LIGHT_1) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_DOLF: - if (player->GetQuestStatus(QUEST_LIGHT_2) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_KORJA: - if (player->GetQuestStatus(QUEST_SPIRIT) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_DG_KEL: - if (player->GetQuestStatus(QUEST_DARKNESS) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; + if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) + { + Talk(SAY_THANKS, caster); + CanRun = true; + } + else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) + { + CasterGUID = caster->GetGUID(); + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_HEALED, caster); + IsHealed = true; + } } // give quest credit, not expect any special quest objectives |