diff --git a/data/sql/updates/pending_db_world/LfgDungeons.sql b/data/sql/updates/pending_db_world/LfgDungeons.sql new file mode 100644 index 000000000..aa44d44c4 --- /dev/null +++ b/data/sql/updates/pending_db_world/LfgDungeons.sql @@ -0,0 +1,52 @@ +DROP TABLE IF EXISTS `lfgdungeons_dbc`; +CREATE TABLE `lfgdungeons_dbc` ( +`ID` INT NOT NULL DEFAULT '0', +`Name_Lang_enUS` TEXT NULL, +`Name_Lang_enGB` TEXT NULL, +`Name_Lang_koKR` TEXT NULL, +`Name_Lang_frFR` TEXT NULL, +`Name_Lang_deDE` TEXT NULL, +`Name_Lang_enCN` TEXT NULL, +`Name_Lang_zhCN` TEXT NULL, +`Name_Lang_enTW` TEXT NULL, +`Name_Lang_zhTW` TEXT NULL, +`Name_Lang_esES` TEXT NULL, +`Name_Lang_esMX` TEXT NULL, +`Name_Lang_ruRU` TEXT NULL, +`Name_Lang_ptPT` TEXT NULL, +`Name_Lang_ptBR` TEXT NULL, +`Name_Lang_itIT` TEXT NULL, +`Name_Lang_Unk` TEXT NULL, +`Name_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', +`MinLevel` INT NOT NULL DEFAULT '0', +`MaxLevel` INT NOT NULL DEFAULT '0', +`Target_Level` INT NOT NULL DEFAULT '0', +`Target_Level_Min` INT NOT NULL DEFAULT '0', +`Target_Level_Max` INT NOT NULL DEFAULT '0', +`MapID` INT NOT NULL DEFAULT '0', +`Difficulty` INT NOT NULL DEFAULT '0', +`Flags` INT NOT NULL DEFAULT '0', +`TypeID` INT NOT NULL DEFAULT '0', +`Faction` INT NOT NULL DEFAULT '0', +`TextureFilename` TEXT NULL, +`ExpansionLevel` INT NOT NULL DEFAULT '0', +`Order_Index` INT NOT NULL DEFAULT '0', +`Group_Id` INT NOT NULL DEFAULT '0', +`Description_Lang_enUS` TEXT NULL, +`Description_Lang_enGB` TEXT NULL, +`Description_Lang_koKR` TEXT NULL, +`Description_Lang_frFR` TEXT NULL, +`Description_Lang_deDE` TEXT NULL, +`Description_Lang_enCN` TEXT NULL, +`Description_Lang_zhCN` TEXT NULL, +`Description_Lang_enTW` TEXT NULL, +`Description_Lang_zhTW` TEXT NULL, +`Description_Lang_esES` TEXT NULL, +`Description_Lang_esMX` TEXT NULL, +`Description_Lang_ruRU` TEXT NULL, +`Description_Lang_ptPT` TEXT NULL, +`Description_Lang_ptBR` TEXT NULL, +`Description_Lang_itIT` TEXT NULL, +`Description_Lang_Unk` TEXT NULL, +`Description_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', +PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index fbd483b87..b557ea9ce 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -847,9 +847,15 @@ CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, ui /// Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple dungeons use the same map (such as Scarlet Monastery) LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty) { - for (LFGDungeonEntry const* dungeon : sLFGDungeonStore) - if (dungeon->map == int32(mapId) && Difficulty(dungeon->difficulty) == difficulty) + for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i) + { + LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i); + if (!dungeon) + continue; + + if (dungeon->MapID == uint32(mapId) && Difficulty(dungeon->Difficulty) == difficulty) return dungeon; + } return nullptr; } @@ -858,7 +864,7 @@ LFGDungeonEntry const* GetZoneLFGDungeonEntry(std::string const& zoneName, Local { for (LFGDungeonEntry const* dungeon : sLFGDungeonStore) { - if (dungeon->type == lfg::LFG_TYPE_ZONE && zoneName.find(dungeon->name[locale]) != std::string::npos) + if (dungeon->TypeID == lfg::LFG_TYPE_ZONE && zoneName.find(dungeon->Name[locale]) != std::string::npos) { return dungeon; } diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index da876ce57..98cad8ce2 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -189,7 +189,7 @@ namespace lfg if (!dungeon) continue; - switch (dungeon->type) + switch (dungeon->TypeID) { case LFG_TYPE_DUNGEON: case LFG_TYPE_HEROIC: diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 31a067a60..222f13367 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -394,10 +394,10 @@ namespace lfg { LFGDungeonData(): name("") { } - LFGDungeonData(LFGDungeonEntry const* dbc): id(dbc->ID), name(dbc->name[0]), map(dbc->map), - type(dbc->type), expansion(dbc->expansion), group(dbc->grouptype), - minlevel(dbc->minlevel), maxlevel(dbc->maxlevel), difficulty(Difficulty(dbc->difficulty)), - seasonal(dbc->flags & LFG_FLAG_SEASONAL), x(0.0f), y(0.0f), z(0.0f), o(0.0f) + LFGDungeonData(LFGDungeonEntry const* dbc) : id(dbc->ID), name(dbc->Name[0]), map(dbc->MapID), + type(dbc->TypeID), expansion(uint8(dbc->ExpansionLevel)), group(uint8(dbc->GroupID)), + minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->Difficulty)), + seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f) { } uint32 id{0}; diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index c8fea1191..59508328c 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -445,7 +445,7 @@ namespace lfg { if (Player* player = ObjectAccessor::FindConnectedPlayer(itRoles->first)) { - if (player->GetMapId() == static_cast(dungeon->map)) + if (player->GetMapId() == static_cast(dungeon->MapID)) { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9ec64f7a1..a19c4ed0f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5878,7 +5878,7 @@ void Player::RewardReputation(Unit* victim, float rate) Map const* map = GetMap(); if (map->IsNonRaidDungeon()) if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty())) - if (dungeon->reclevel == 80) + if (dungeon->TargetLevel == 80) ChampioningFaction = GetChampioningFaction(); } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index a5cf4bd44..b0eaa3692 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2256,7 +2256,7 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptrminlevel > level) + if (lfgDungeon->MinLevel > level) { FillTaxiMask(field, 0); continue; diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index 6deff422a..27070cda3 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -1245,25 +1245,28 @@ struct ItemSetEntry struct LFGDungeonEntry { - uint32 ID; // 0 - char const* name[16]; // 1-17 Name lang - uint32 minlevel; // 18 - uint32 maxlevel; // 19 - uint32 reclevel; // 20 - uint32 recminlevel; // 21 - uint32 recmaxlevel; // 22 - int32 map; // 23 - uint32 difficulty; // 24 - uint32 flags; // 25 - uint32 type; // 26 - //uint32 unk; // 27 - //char const* iconname; // 28 - uint32 expansion; // 29 - //uint32 unk4; // 30 - uint32 grouptype; // 31 - //char const* desc[16]; // 32-47 Description + uint32 ID; // 0 + char const* Name[16]; // 1-16 + //uint32 Name_lang_mask; // 17 + uint32 MinLevel; // 18 + uint32 MaxLevel; // 19 + uint32 TargetLevel; // 20 + uint32 TargetLevelMin; // 21 + uint32 TargetLevelMax; // 22 + uint32 MapID; // 23 + uint32 Difficulty; // 24 + uint32 Flags; // 25 + uint32 TypeID; // 26 + //int32 Faction; // 27 + //char const* TextureFilename; // 28 + uint32 ExpansionLevel; // 29 + //uint32 OrderIndex; // 30 + uint32 GroupID; // 31 + //char const* Description[16]; // 32-47 + //uint32 Description_lang_mask; // 48 + // Helpers - [[nodiscard]] uint32 Entry() const { return ID + (type << 24); } + [[nodiscard]] uint32 Entry() const { return ID + (TypeID << 24); } }; struct LightEntry