diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Containers/Utilities/MapUtils.h | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 41 | ||||
-rw-r--r-- | src/server/game/Loot/Loot.cpp | 10 |
5 files changed, 43 insertions, 35 deletions
diff --git a/src/common/Containers/Utilities/MapUtils.h b/src/common/Containers/Utilities/MapUtils.h index 7cf07243b0a..910f16022a6 100644 --- a/src/common/Containers/Utilities/MapUtils.h +++ b/src/common/Containers/Utilities/MapUtils.h @@ -18,6 +18,7 @@ #ifndef TRINITYCORE_MAP_UTILS_H #define TRINITYCORE_MAP_UTILS_H +#include <memory> // std::to_address, std::addressof #include <type_traits> namespace Trinity::Containers @@ -26,13 +27,23 @@ namespace Trinity::Containers * Returns a pointer to mapped value (or the value itself if map stores pointers) */ template<class M> -auto MapGetValuePtr(M& map, typename M::key_type const& key) +inline auto MapGetValuePtr(M& map, typename M::key_type const& key) { + using mapped_type = typename M::mapped_type; + auto itr = map.find(key); - if constexpr (std::is_pointer_v<typename M::mapped_type>) - return itr != map.end() ? itr->second : nullptr; + if constexpr (std::is_pointer_v<mapped_type>) + return itr != map.end() ? std::to_address(itr->second) : nullptr; // raw pointer + else if constexpr (requires(mapped_type const& p) { p.operator->(); }) + { + // smart pointers + if constexpr (std::is_copy_constructible_v<mapped_type>) + return itr != map.end() ? itr->second : nullptr; // copyable (like shared_ptr) + else + return itr != map.end() ? std::to_address(itr->second) : nullptr; // non-copyable unique_ptr like, unwrap it to raw pointer + } else - return itr != map.end() ? &itr->second : nullptr; + return itr != map.end() ? std::addressof(itr->second) : nullptr; // value } template<class K, class V, template<class, class, class...> class M, class... Rest> diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 205b4440041..652ee520ecb 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1396,8 +1396,8 @@ Loot* Creature::GetLootForPlayer(Player const* player) const if (m_personalLoot.empty()) return m_loot.get(); - if (std::unique_ptr<Loot> const* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID())) - return loot->get(); + if (Loot* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID())) + return loot; return nullptr; } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 6fffcbe2b8c..9e615d997c7 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -3974,8 +3974,8 @@ Loot* GameObject::GetLootForPlayer(Player const* player) const if (m_personalLoot.empty()) return m_loot.get(); - if (std::unique_ptr<Loot> const* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID())) - return loot->get(); + if (Loot* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID())) + return loot; return nullptr; } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 673a1678fe0..4ad5aabf6d9 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3706,18 +3706,18 @@ PetLevelInfo const* ObjectMgr::GetPetLevelInfo(uint32 creature_id, uint8 level) void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count) { - std::unique_ptr<PlayerInfo>* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race_), Classes(class_) }); + PlayerInfo* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race_), Classes(class_) }); if (!playerInfo) return; if (count > 0) - playerInfo->get()->item.emplace_back(itemId, count); + playerInfo->item.emplace_back(itemId, count); else { if (count < -1) TC_LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId); - PlayerCreateInfoItems& items = playerInfo->get()->item; + PlayerCreateInfoItems& items = playerInfo->item; auto erased = std::remove_if(items.begin(), items.end(), [itemId](PlayerCreateInfoItem const& item) { return item.item_id == itemId; }); if (erased == items.end()) @@ -3886,7 +3886,7 @@ void ObjectMgr::LoadPlayerInfo() if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(characterLoadout->ChrClassID) })) { - playerInfo->get()->itemContext = ItemContext(characterLoadout->ItemContext); + playerInfo->itemContext = ItemContext(characterLoadout->ItemContext); for (ItemTemplate const* itemTemplate : *items) { @@ -3912,7 +3912,7 @@ void ObjectMgr::LoadPlayerInfo() count = itemTemplate->GetMaxStackSize(); } - playerInfo->get()->item.emplace_back(itemTemplate->GetId(), count); + playerInfo->item.emplace_back(itemTemplate->GetId(), count); } } } @@ -4000,7 +4000,7 @@ void ObjectMgr::LoadPlayerInfo() for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex) if (rcInfo->ClassMask == -1 || rcInfo->ClassMask == 0 || ((1 << (classIndex - 1)) & rcInfo->ClassMask)) if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) })) - playerInfo->get()->skills.push_back(rcInfo); + playerInfo->skills.push_back(rcInfo); TC_LOG_INFO("server.loading", ">> Loaded player create skills in {} ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -4049,7 +4049,7 @@ void ObjectMgr::LoadPlayerInfo() { if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) })) { - playerInfo->get()->customSpells.push_back(spellId); + playerInfo->customSpells.push_back(spellId); ++count; } // We need something better here, the check is not accounting for spells used by multiple races/classes but not all of them. @@ -4116,7 +4116,7 @@ void ObjectMgr::LoadPlayerInfo() { if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) })) { - playerInfo->get()->castSpells[playerCreateMode].push_back(spellId); + playerInfo->castSpells[playerCreateMode].push_back(spellId); ++count; } } @@ -4164,7 +4164,7 @@ void ObjectMgr::LoadPlayerInfo() } if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(current_race), Classes(current_class) })) - playerInfo->get()->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16())); + playerInfo->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16())); ++count; } @@ -4247,10 +4247,10 @@ void ObjectMgr::LoadPlayerInfo() { if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(current_class) })) { - if (!playerInfo->get()->levelInfo) - playerInfo->get()->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)); + if (!playerInfo->levelInfo) + playerInfo->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)); - PlayerLevelInfo& levelInfo = playerInfo->get()->levelInfo[current_level - 1]; + PlayerLevelInfo& levelInfo = playerInfo->levelInfo[current_level - 1]; for (uint8 i = 0; i < MAX_STATS; ++i) levelInfo.stats[i] = fields[i + 2].GetUInt16() + raceStatModifiers[race].StatModifier[i]; } @@ -4299,7 +4299,7 @@ void ObjectMgr::LoadPlayerInfo() continue; // fatal error if no level 1 data - if (!playerInfo->get()->levelInfo || playerInfo->get()->levelInfo[0].stats[0] == 0) + if (!playerInfo->levelInfo || playerInfo->levelInfo[0].stats[0] == 0) { TC_LOG_ERROR("sql.sql", "Race {} Class {} Level 1 does not have stats data!", race, class_); ABORT(); @@ -4308,10 +4308,10 @@ void ObjectMgr::LoadPlayerInfo() // fill level gaps for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level) { - if (playerInfo->get()->levelInfo[level].stats[0] == 0) + if (playerInfo->levelInfo[level].stats[0] == 0) { TC_LOG_ERROR("sql.sql", "Race {} Class {} Level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level); - playerInfo->get()->levelInfo[level] = playerInfo->get()->levelInfo[level - 1]; + playerInfo->levelInfo[level] = playerInfo->levelInfo[level - 1]; } } } @@ -4400,12 +4400,12 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES) return; - auto const& pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) }); + PlayerInfo const* pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, {Races(race), Classes(class_)}); if (!pInfo) return; if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) - *info = pInfo->get()->levelInfo[level - 1]; + *info = pInfo->levelInfo[level - 1]; else BuildPlayerLevelInfo(race, class_, level, info); } @@ -4413,7 +4413,7 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, PlayerLevelInfo* info) const { // base data (last known level) - *info = ASSERT_NOTNULL(Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(_class) }))->get()->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1]; + *info = ASSERT_NOTNULL(Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(_class) }))->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1]; // if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32 for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl) @@ -10620,10 +10620,7 @@ PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const return nullptr; if (class_ >= MAX_CLASSES) return nullptr; - auto const& info = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) }); - if (!info) - return nullptr; - return info->get(); + return Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) }); } void ObjectMgr::LoadRaceAndClassExpansionRequirements() diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp index 050f205eb8c..d1ab49f662e 100644 --- a/src/server/game/Loot/Loot.cpp +++ b/src/server/game/Loot/Loot.cpp @@ -148,13 +148,13 @@ Optional<LootSlotType> LootItem::GetUiTypeForPlayer(Player const* player, Loot c if (freeforall) { - if (std::unique_ptr<NotNormalLootItemList> const* ffaItems = Trinity::Containers::MapGetValuePtr(loot.GetPlayerFFAItems(), player->GetGUID())) + if (NotNormalLootItemList const* ffaItems = Trinity::Containers::MapGetValuePtr(loot.GetPlayerFFAItems(), player->GetGUID())) { - auto ffaItemItr = std::find_if(ffaItems->get()->begin(), ffaItems->get()->end(), [&](NotNormalLootItem const& ffaItem) + auto ffaItemItr = std::ranges::find_if(*ffaItems, [&](NotNormalLootItem const& ffaItem) { return ffaItem.LootListId == LootListId; }); - if (ffaItemItr != ffaItems->get()->end() && !ffaItemItr->is_looted) + if (ffaItemItr != ffaItems->end() && !ffaItemItr->is_looted) return loot.GetLootMethod() == FREE_FOR_ALL ? LOOT_SLOT_TYPE_OWNER : LOOT_SLOT_TYPE_ALLOW_LOOT; } return {}; @@ -969,9 +969,9 @@ bool Loot::hasItemFor(Player const* player) const if (!lootItem.is_looted && !lootItem.follow_loot_rules && lootItem.GetAllowedLooters().find(player->GetGUID()) != lootItem.GetAllowedLooters().end()) return true; - if (std::unique_ptr<NotNormalLootItemList> const* ffaItems = Trinity::Containers::MapGetValuePtr(GetPlayerFFAItems(), player->GetGUID())) + if (NotNormalLootItemList const* ffaItems = Trinity::Containers::MapGetValuePtr(GetPlayerFFAItems(), player->GetGUID())) { - bool hasFfaItem = std::any_of(ffaItems->get()->begin(), ffaItems->get()->end(), [&](NotNormalLootItem const& ffaItem) + bool hasFfaItem = std::ranges::any_of(*ffaItems, [&](NotNormalLootItem const& ffaItem) { return !ffaItem.is_looted; }); |