From 55deb00ce0c05665703cd0da9938bdeba7a9f434 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 27 Aug 2018 02:53:03 +0200 Subject: [PATCH] Core/LFG: implement new DBC storage for generating multiple random categories with identical dungeon id's * fixed another visual issue for call to arms rewards --- src/server/game/DataStores/DBCStores.cpp | 2 ++ src/server/game/DataStores/DBCStores.h | 1 + src/server/game/DataStores/DBCStructure.h | 8 ++++++ src/server/game/DataStores/DBCfmt.h | 1 + src/server/game/DungeonFinding/LFGMgr.cpp | 18 +++++++++++++- src/server/game/DungeonFinding/LFGMgr.h | 1 + src/server/game/Handlers/LFGHandler.cpp | 30 +++++++++-------------- 7 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 69bf3a8a371..4e1c88b9a06 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -144,6 +144,7 @@ DBCStorage sItemRandomSuffixStore(ItemRandomSuffixfmt); DBCStorage sItemSetStore(ItemSetEntryfmt); DBCStorage sLFGDungeonStore(LFGDungeonEntryfmt); +DBCStorage sLFGDungeonsGroupingMapStore(LFGDungeonsGroupingMapfmt); DBCStorage sLightStore(LightEntryfmt); DBCStorage sLiquidTypeStore(LiquidTypefmt); DBCStorage sLockStore(LockEntryfmt); @@ -419,6 +420,7 @@ void LoadDBCStores(const std::string& dataPath) LOAD_DBC(sItemDamageWandStore, "ItemDamageWand.dbc");//15595 LOAD_DBC(sItemDisenchantLootStore, "ItemDisenchantLoot.dbc"); LOAD_DBC(sLFGDungeonStore, "LFGDungeons.dbc");//15595 + LOAD_DBC(sLFGDungeonsGroupingMapStore, "LFGDungeonsGroupingMap.dbc");//15595 LOAD_DBC(sLightStore, "Light.dbc"); //15595 LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//15595 LOAD_DBC(sLockStore, "Lock.dbc");//15595 diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 391be99a7b6..9c66874f179 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -174,6 +174,7 @@ TC_GAME_API extern DBCStorage sItemRandomProperti TC_GAME_API extern DBCStorage sItemRandomSuffixStore; TC_GAME_API extern DBCStorage sItemSetStore; TC_GAME_API extern DBCStorage sLFGDungeonStore; +TC_GAME_API extern DBCStorage sLFGDungeonsGroupingMapStore; TC_GAME_API extern DBCStorage sLiquidTypeStore; TC_GAME_API extern DBCStorage sLockStore; TC_GAME_API extern DBCStorage sMailTemplateStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 80bd45e6d01..c49ee719db7 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1549,6 +1549,14 @@ struct LFGDungeonEntry uint32 Entry() const { return ID + (type << 24); } }; +struct LFGDungeonsGroupingMapEntry +{ + uint32 ID; // 0 + uint32 dungeonId; // 1 + uint32 randomLfgDungeonId; // 2 + uint32 groupId; // 3 +}; + struct LightEntry { uint32 Id; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index f3342ffead4..6d86ab259c0 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -102,6 +102,7 @@ char const ItemRandomPropertiesfmt[] = "nxiiixxs"; char const ItemRandomSuffixfmt[] = "nsxiiiiiiiiii"; char const ItemSetEntryfmt[] = "dsiiiiiiiiiixxxxxxxiiiiiiiiiiiiiiiiii"; char const LFGDungeonEntryfmt[] = "nsiiiiiiiiixxixixiiii"; +char const LFGDungeonsGroupingMapfmt[] = "niii"; char const LightEntryfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; char const LockEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 14f160508f1..ca4e67987f7 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -275,8 +275,11 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */) dungeon.o = at->target_Orientation; } - if (dungeon.type != LFG_TYPE_RANDOM) + if (dungeon.type == LFG_TYPE_RANDOM) + AddDungeonsFromGroupingMap(CachedDungeonMapStore, dungeon.group, dungeon.id); + else CachedDungeonMapStore[dungeon.group].insert(dungeon.id); + CachedDungeonMapStore[0].insert(dungeon.id); } @@ -2177,4 +2180,17 @@ bool LFGDungeonData::IsRaid() const return false; } +void LFGMgr::AddDungeonsFromGroupingMap(LfgCachedDungeonContainer& container, uint32 groupId, uint32 dungeonId) +{ + // Check for grouped dungeons from grouping map + for (auto itr : sLFGDungeonsGroupingMapStore) + { + if (itr->randomLfgDungeonId == dungeonId) + { + if (container[groupId].find(itr->dungeonId) == container[groupId].end()) + container[groupId].insert(itr->dungeonId); + } + } +} + } // namespace lfg diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 287b718cd8d..302a042eb73 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -459,6 +459,7 @@ class TC_GAME_API LFGMgr void RemovePlayerData(ObjectGuid guid); void GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& players, LfgLockPartyMap& lockMap, bool isContinue); void _SaveToDB(ObjectGuid guid, uint32 db_guid); + void AddDungeonsFromGroupingMap(LfgCachedDungeonContainer& container, uint32 groupId, uint32 dungeonId); // Proposals void RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdateType type); diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 6f95e22444d..caad8873b6d 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -412,31 +412,23 @@ void WorldSession::SendLfgPlayerLockInfo() if (isCallToArmsEligible && ctaQuest) { uint8 callToArmsRoleMask = sLFGMgr->GetRolesForCallToArms(); - bool rewardSent = false; + callToArmsRoleMask |= player->GetCallToArmsTempRoles(); - uint8 roleSet[] = - { - lfg::PLAYER_ROLE_TANK, - lfg::PLAYER_ROLE_HEALER, - lfg::PLAYER_ROLE_DAMAGE - }; + bool rewardSent = false; for (uint8 i = 0; i < 3; i++) { data << uint32(callToArmsRoleMask); - if (callToArmsRoleMask & roleSet[i]) + if (!rewardSent) { - if (!rewardSent) - { - BuildQuestReward(data, ctaQuest, player); - rewardSent = true; - } - else - { - data << uint32(0); - data << uint32(0); - data << uint8(0); - } + rewardSent = true; + BuildQuestReward(data, ctaQuest, player); + } + else + { + data << uint32(0); + data << uint32(0); + data << uint8(0); } } }