diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 62 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 12 |
3 files changed, 75 insertions, 1 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index b8d5726345a..5c1fa139569 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -27,6 +27,7 @@ #include "Group.h" #include "InstanceScript.h" #include "Item.h" +#include "LFGMgr.h" #include "Log.h" #include "LootMgr.h" #include "Map.h" @@ -2493,6 +2494,51 @@ inline bool PlayerConditionLogic(uint32 logic, std::array<bool, N>& results) return result; } +uint32 ConditionMgr::GetPlayerConditionLfgValue(Player const* player, PlayerConditionLfgStatus status) +{ + Group const* group = player->GetGroup(); + if (!group) + return 0; + + switch (status) + { + case PlayerConditionLfgStatus::InLFGDungeon: + return sLFGMgr->inLfgDungeonMap(player->GetGUID(), player->GetMapId(), player->GetMap()->GetDifficultyID()) ? 1 : 0; + case PlayerConditionLfgStatus::InLFGRandomDungeon: + return sLFGMgr->inLfgDungeonMap(player->GetGUID(), player->GetMapId(), player->GetMap()->GetDifficultyID()) && + sLFGMgr->selectedRandomLfgDungeon(player->GetGUID()) ? 1 : 0; + case PlayerConditionLfgStatus::InLFGFirstRandomDungeon: + { + if (!sLFGMgr->inLfgDungeonMap(player->GetGUID(), player->GetMapId(), player->GetMap()->GetDifficultyID())) + return 0; + + uint32 selectedRandomDungeon = sLFGMgr->GetSelectedRandomDungeon(player->GetGUID()); + if (!selectedRandomDungeon) + return 0; + + if (lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(selectedRandomDungeon, player->getLevel())) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest)) + if (player->CanRewardQuest(quest, false)) + return 1; + return 0; + } + case PlayerConditionLfgStatus::PartialClear: + break; + case PlayerConditionLfgStatus::StrangerCount: + break; + case PlayerConditionLfgStatus::VoteKickCount: + break; + case PlayerConditionLfgStatus::BootCount: + break; + case PlayerConditionLfgStatus::GearDiff: + break; + default: + break; + } + + return 0; +} + bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditionEntry const* condition) { if (condition->MinLevel && player->getLevel() < condition->MinLevel) @@ -2807,7 +2853,21 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio return false; } - // TODO: research lfg status for player conditions + if (condition->LfgStatus[0]) + { + using LfgCount = std::extent<decltype(condition->LfgStatus)>; + + std::array<bool, LfgCount::value> results; + results.fill(true); + for (std::size_t i = 0; i < LfgCount::value; ++i) + if (condition->LfgStatus[i]) + results[i] = PlayerConditionCompare(condition->LfgCompare[i], + GetPlayerConditionLfgValue(player, PlayerConditionLfgStatus(condition->LfgStatus[i])), + condition->LfgValue[i]); + + if (!PlayerConditionLogic(condition->LfgLogic, results)) + return false; + } if (condition->AreaID[0]) { diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index eab6c09b16f..cc8aa3d2074 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -33,6 +33,7 @@ class LootTemplate; struct Condition; struct PlayerConditionEntry; struct WorldStateExpressionEntry; +enum class PlayerConditionLfgStatus : uint8; /*! Documentation on implementing a new ConditionType: Step 1: Check for the lowest free ID. Look for CONDITION_UNUSED_XX in the enum. @@ -286,6 +287,7 @@ class TC_GAME_API ConditionMgr bool IsObjectMeetingSmartEventConditions(int64 entryOrGuid, uint32 eventId, uint32 sourceType, Unit* unit, WorldObject* baseObject) const; bool IsObjectMeetingVendorItemConditions(uint32 creatureId, uint32 itemId, Player* player, Creature* vendor) const; + static uint32 GetPlayerConditionLfgValue(Player const* player, PlayerConditionLfgStatus status); static bool IsPlayerMeetingCondition(Player const* player, PlayerConditionEntry const* condition); static bool IsPlayerMeetingExpression(Player const* player, WorldStateExpressionEntry const* expression); diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 9c2515c5b44..db3cf14b909 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -935,6 +935,18 @@ enum PhaseUseFlagsValues : uint8 PHASE_USE_FLAGS_ALL = PHASE_USE_FLAGS_ALWAYS_VISIBLE | PHASE_USE_FLAGS_INVERSE }; +enum class PlayerConditionLfgStatus : uint8 +{ + InLFGDungeon = 1, + InLFGRandomDungeon = 2, + InLFGFirstRandomDungeon = 3, + PartialClear = 4, + StrangerCount = 5, + VoteKickCount = 6, + BootCount = 7, + GearDiff = 8 +}; + enum PrestigeLevelInfoFlags : uint8 { PRESTIGE_FLAG_DISABLED = 0x01 // Prestige levels with this flag won't be included to calculate max prestigelevel. |