aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp11
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp13
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp378
-rw-r--r--src/server/game/Globals/ObjectMgr.h61
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp8
-rw-r--r--src/server/game/Instances/InstanceScript.cpp11
-rw-r--r--src/server/game/Loot/LootMgr.cpp88
-rw-r--r--src/server/game/Spells/SpellMgr.cpp13
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp155
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp42
-rw-r--r--src/server/scripts/Commands/cs_quest.cpp10
11 files changed, 395 insertions, 395 deletions
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
index be29b4636c3..1b2ac2797b7 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
@@ -65,11 +65,12 @@ bool AuctionBotSeller::Initialize()
TC_LOG_DEBUG("ahbot", "Forced Exclusion %u items", (uint32)excludeItems.size());
TC_LOG_DEBUG("ahbot", "Loading npc vendor items for filter..");
- CreatureTemplateContainer const* creatures = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator it = creatures->begin(); it != creatures->end(); ++it)
- if (VendorItemData const* data = sObjectMgr->GetNpcVendorItemList(it->first))
- for (VendorItem const& it2 : data->m_items)
- npcItems.insert(it2.item);
+ CreatureTemplateContainer const& creatures = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : creatures)
+ if (creatureTemplate)
+ if (VendorItemData const* data = sObjectMgr->GetNpcVendorItemList(creatureTemplate->Entry))
+ for (VendorItem const& vendorItem : data->m_items)
+ npcItems.insert(vendorItem.item);
TC_LOG_DEBUG("ahbot", "Npc vendor filter has %u items", (uint32)npcItems.size());
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index b84c4cf43bd..fb3bfe4d79f 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -926,13 +926,16 @@ void BattlegroundMgr::LoadBattleMastersEntry()
void BattlegroundMgr::CheckBattleMasters()
{
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : ctc)
{
- if ((itr->second.npcflag & UNIT_NPC_FLAG_BATTLEMASTER) && mBattleMastersMap.find(itr->second.Entry) == mBattleMastersMap.end())
+ if (!creatureTemplate)
+ continue;
+
+ if ((creatureTemplate->npcflag & UNIT_NPC_FLAG_BATTLEMASTER) && mBattleMastersMap.find(creatureTemplate->Entry) == mBattleMastersMap.end())
{
- TC_LOG_ERROR("sql.sql", "Creature_Template Entry: %u has UNIT_NPC_FLAG_BATTLEMASTER, but no data in the `battlemaster_entry` table. Removing flag.", itr->second.Entry);
- const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_BATTLEMASTER;
+ TC_LOG_ERROR("sql.sql", "Creature_Template Entry: %u has UNIT_NPC_FLAG_BATTLEMASTER, but no data in the `battlemaster_entry` table. Removing flag.", creatureTemplate->Entry);
+ const_cast<CreatureTemplate*>(creatureTemplate.get())->npcflag &= ~UNIT_NPC_FLAG_BATTLEMASTER;
}
}
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index a79a5b5ce76..733db52597e 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -236,12 +236,6 @@ ObjectMgr::ObjectMgr():
_gameObjectSpawnId(1),
DBCLocaleIndex(LOCALE_enUS)
{
- for (uint8 i = 0; i < MAX_CLASSES; ++i)
- {
- _playerClassInfo[i] = nullptr;
- for (uint8 j = 0; j < MAX_RACES; ++j)
- _playerInfo[j][i] = nullptr;
- }
}
ObjectMgr* ObjectMgr::instance()
@@ -252,41 +246,6 @@ ObjectMgr* ObjectMgr::instance()
ObjectMgr::~ObjectMgr()
{
- for (QuestMap::iterator i = _questTemplates.begin(); i != _questTemplates.end(); ++i)
- delete i->second;
-
- for (PetLevelInfoContainer::iterator i = _petInfoStore.begin(); i != _petInfoStore.end(); ++i)
- delete[] i->second;
-
- // free only if loaded
- for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
- {
- if (_playerClassInfo[class_])
- delete[] _playerClassInfo[class_]->levelInfo;
- delete _playerClassInfo[class_];
- }
-
- for (int race = 0; race < MAX_RACES; ++race)
- {
- for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
- {
- if (_playerInfo[race][class_])
- delete[] _playerInfo[race][class_]->levelInfo;
- delete _playerInfo[race][class_];
- }
- }
-
- for (CacheVendorItemContainer::iterator itr = _cacheVendorItemStore.begin(); itr != _cacheVendorItemStore.end(); ++itr)
- itr->second.Clear();
-
- _cacheTrainerSpellStore.clear();
-
- for (DungeonEncounterContainer::iterator itr =_dungeonEncounterStore.begin(); itr != _dungeonEncounterStore.end(); ++itr)
- for (DungeonEncounterList::iterator encounterItr = itr->second.begin(); encounterItr != itr->second.end(); ++encounterItr)
- delete *encounterItr;
-
- for (AccessRequirementContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
- delete itr->second;
}
void ObjectMgr::AddLocaleString(std::string const& value, LocaleConstant localeConstant, std::vector<std::string>& data)
@@ -417,7 +376,7 @@ void ObjectMgr::LoadCreatureTemplates()
"InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, "
// 70 71 72 73 74 75
"movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName "
- "FROM creature_template;");
+ "FROM creature_template ORDER BY entry DESC");
if (!result)
{
@@ -425,26 +384,32 @@ void ObjectMgr::LoadCreatureTemplates()
return;
}
- _creatureTemplateStore.rehash(result->GetRowCount());
+ uint32 count = 0;
+
+ uint32 const maxCreatureId = (*result)[0].GetUInt32();
+ _creatureTemplateStore.resize(maxCreatureId + 1);
do
{
Field* fields = result->Fetch();
LoadCreatureTemplate(fields);
- }
- while (result->NextRow());
+
+ ++count;
+ } while (result->NextRow());
// Checking needs to be done after loading because of the difficulty self referencing
- for (CreatureTemplateContainer::const_iterator itr = _creatureTemplateStore.begin(); itr != _creatureTemplateStore.end(); ++itr)
- CheckCreatureTemplate(&itr->second);
+ for (auto const& creatureTemplate : _creatureTemplateStore)
+ if (creatureTemplate)
+ CheckCreatureTemplate(creatureTemplate.get());
- TC_LOG_INFO("server.loading", ">> Loaded %u creature definitions in %u ms", uint32(_creatureTemplateStore.size()), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u creature definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadCreatureTemplate(Field* fields)
{
uint32 entry = fields[0].GetUInt32();
- CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry];
+ _creatureTemplateStore[entry] = Trinity::make_unique<CreatureTemplate>();
+ CreatureTemplate& creatureTemplate = *_creatureTemplateStore[entry].get();
creatureTemplate.Entry = entry;
@@ -1786,7 +1751,7 @@ void ObjectMgr::LoadCreatures()
std::map<uint32, uint32> spawnMasks;
for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
if (sMapStore.LookupEntry(i))
- for (int k = 0; k < MAX_DIFFICULTY; ++k)
+ for (uint8 k = 0; k < MAX_DIFFICULTY; ++k)
if (GetMapDifficultyData(i, Difficulty(k)))
spawnMasks[i] |= (1 << k);
@@ -2074,7 +2039,7 @@ void ObjectMgr::LoadGameObjects()
std::map<uint32, uint32> spawnMasks;
for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
if (sMapStore.LookupEntry(i))
- for (int k = 0; k < MAX_DIFFICULTY; ++k)
+ for (uint8 k = 0; k < MAX_DIFFICULTY; ++k)
if (GetMapDifficultyData(i, Difficulty(k)))
spawnMasks[i] |= (1 << k);
@@ -2514,7 +2479,7 @@ void ObjectMgr::LoadItemTemplates()
// 126 127 128 129 130 131 132 133
"GemProperties, RequiredDisenchantSkill, ArmorDamageModifier, duration, ItemLimitCategory, HolidayId, ScriptName, DisenchantID, "
// 134 135 136
- "FoodType, minMoneyLoot, maxMoneyLoot, flagsCustom FROM item_template");
+ "FoodType, minMoneyLoot, maxMoneyLoot, flagsCustom FROM item_template ORDER BY entry DESC");
if (!result)
{
@@ -2522,7 +2487,8 @@ void ObjectMgr::LoadItemTemplates()
return;
}
- _itemTemplateStore.rehash(result->GetRowCount());
+ uint32 const maxItemId = (*result)[0].GetUInt32();
+ _itemTemplateStore.resize(maxItemId + 1);
uint32 count = 0;
bool enforceDBCAttributes = sWorld->getBoolConfig(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES);
@@ -2532,7 +2498,8 @@ void ObjectMgr::LoadItemTemplates()
uint32 entry = fields[0].GetUInt32();
- ItemTemplate& itemTemplate = _itemTemplateStore[entry];
+ _itemTemplateStore[entry] = std::make_unique<ItemTemplate>();
+ ItemTemplate& itemTemplate = *_itemTemplateStore[entry].get();
itemTemplate.ItemId = entry;
itemTemplate.Class = uint32(fields[1].GetUInt8());
@@ -3067,7 +3034,7 @@ void ObjectMgr::LoadItemTemplates()
if (!entry)
continue;
- for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
+ for (uint8 j = 0; j < MAX_OUTFIT_ITEMS; ++j)
{
if (entry->ItemId[j] <= 0)
continue;
@@ -3087,11 +3054,7 @@ void ObjectMgr::LoadItemTemplates()
ItemTemplate const* ObjectMgr::GetItemTemplate(uint32 entry) const
{
- ItemTemplateContainer::const_iterator itr = _itemTemplateStore.find(entry);
- if (itr != _itemTemplateStore.end())
- return &(itr->second);
-
- return nullptr;
+ return entry < _itemTemplateStore.size() ? _itemTemplateStore[entry].get() : nullptr;
}
void ObjectMgr::LoadItemSetNameLocales()
@@ -3348,21 +3311,19 @@ void ObjectMgr::LoadPetLevelInfo()
continue;
}
- PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
+ auto& pInfoMapEntry = _petInfoStore[creature_id];
if (!pInfoMapEntry)
- pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
+ pInfoMapEntry = Trinity::make_unique<PetLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
// data for level 1 stored in [0] array element, ...
- PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level-1];
+ PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
pLevelInfo->health = fields[2].GetUInt16();
pLevelInfo->mana = fields[3].GetUInt16();
pLevelInfo->armor = fields[9].GetUInt32();
- for (int i = 0; i < MAX_STATS; i++)
- {
- pLevelInfo->stats[i] = fields[i+4].GetUInt16();
- }
+ for (uint8 i = 0; i < MAX_STATS; i++)
+ pLevelInfo->stats[i] = fields[i + 4].GetUInt16();
++count;
}
@@ -3371,13 +3332,13 @@ void ObjectMgr::LoadPetLevelInfo()
// Fill gaps and check integrity
for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
{
- PetLevelInfo* pInfo = itr->second;
+ auto& pInfo = itr->second;
// fatal error if no level 1 data
if (!pInfo || pInfo[0].health == 0)
{
TC_LOG_ERROR("sql.sql", "Creature %u does not have pet stats data for Level 1!", itr->first);
- exit(1);
+ ABORT();
}
// fill level gaps
@@ -3399,11 +3360,11 @@ PetLevelInfo const* ObjectMgr::GetPetLevelInfo(uint32 creature_id, uint8 level)
if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
- PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
+ auto itr = _petInfoStore.find(creature_id);
if (itr == _petInfoStore.end())
return nullptr;
- return &itr->second[level-1]; // data for level 1 stored in [0] array element, ...
+ return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
}
void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
@@ -3451,7 +3412,7 @@ void ObjectMgr::LoadPlayerInfo()
if (!result)
{
TC_LOG_ERROR("server.loading", ">> Loaded 0 player create definitions. DB table `playercreateinfo` is empty.");
- exit(1);
+ ABORT();
}
else
{
@@ -3508,7 +3469,7 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- PlayerInfo* info = new PlayerInfo();
+ std::unique_ptr<PlayerInfo> info = Trinity::make_unique<PlayerInfo>();
info->mapId = mapId;
info->areaId = areaId;
info->positionX = positionX;
@@ -3517,7 +3478,7 @@ void ObjectMgr::LoadPlayerInfo()
info->orientation = orientation;
info->displayId_m = rEntry->model_m;
info->displayId_f = rEntry->model_f;
- _playerInfo[current_race][current_class] = info;
+ _playerInfo[current_race][current_class] = std::move(info);
++count;
}
@@ -3657,7 +3618,7 @@ void ObjectMgr::LoadPlayerInfo()
if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex))
continue;
- if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
+ if (auto& info = _playerInfo[raceIndex][classIndex])
{
info->skills.push_back(skill);
++count;
@@ -3714,7 +3675,7 @@ void ObjectMgr::LoadPlayerInfo()
{
if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
{
- if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
+ if (auto& info = _playerInfo[raceIndex][classIndex])
{
info->customSpells.push_back(spellId);
++count;
@@ -3774,7 +3735,7 @@ void ObjectMgr::LoadPlayerInfo()
{
if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
{
- if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
+ if (auto& info = _playerInfo[raceIndex][classIndex])
{
info->castSpells.push_back(spellId);
++count;
@@ -3823,7 +3784,7 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- if (PlayerInfo* info = _playerInfo[current_race][current_class])
+ if (auto& info = _playerInfo[current_race][current_class])
info->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
++count;
@@ -3845,7 +3806,7 @@ void ObjectMgr::LoadPlayerInfo()
if (!result)
{
TC_LOG_ERROR("server.loading", ">> Loaded 0 level health/mana definitions. DB table `player_classlevelstats` is empty.");
- exit(1);
+ ABORT();
}
uint32 count = 0;
@@ -3869,16 +3830,14 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- PlayerClassInfo* info = _playerClassInfo[current_class];
+ auto& info = _playerClassInfo[current_class];
if (!info)
{
- info = new PlayerClassInfo();
- info->levelInfo = new PlayerClassLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
- _playerClassInfo[current_class] = info;
+ info = Trinity::make_unique<PlayerClassInfo>();
+ info->levelInfo = Trinity::make_unique<PlayerClassLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
}
- PlayerClassLevelInfo& levelInfo = info->levelInfo[current_level-1];
-
+ PlayerClassLevelInfo& levelInfo = info->levelInfo[current_level - 1];
levelInfo.basehealth = fields[2].GetUInt16();
levelInfo.basemana = fields[3].GetUInt16();
@@ -3887,19 +3846,19 @@ void ObjectMgr::LoadPlayerInfo()
while (result->NextRow());
// Fill gaps and check integrity
- for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
+ for (uint8 class_ = 0; class_ < MAX_CLASSES; ++class_)
{
// skip non existed classes
if (!sChrClassesStore.LookupEntry(class_))
continue;
- PlayerClassInfo* pClassInfo = _playerClassInfo[class_];
+ auto& pClassInfo = _playerClassInfo[class_];
// fatal error if no level 1 data
if (!pClassInfo->levelInfo || pClassInfo->levelInfo[0].basehealth == 0)
{
TC_LOG_ERROR("sql.sql", "Class %i Level 1 does not have health/mana data!", class_);
- exit(1);
+ ABORT();
}
// fill level gaps
@@ -3927,7 +3886,7 @@ void ObjectMgr::LoadPlayerInfo()
if (!result)
{
TC_LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_levelstats` is empty.");
- exit(1);
+ ABORT();
}
uint32 count = 0;
@@ -3963,13 +3922,13 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- if (PlayerInfo* info = _playerInfo[current_race][current_class])
+ if (auto& info = _playerInfo[current_race][current_class])
{
if (!info->levelInfo)
- info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
+ info->levelInfo = Trinity::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
- for (int i = 0; i < MAX_STATS; i++)
+ for (uint8 i = 0; i < MAX_STATS; ++i)
levelInfo.stats[i] = fields[i + 3].GetUInt8();
}
@@ -3978,19 +3937,19 @@ void ObjectMgr::LoadPlayerInfo()
while (result->NextRow());
// Fill gaps and check integrity
- for (int race = 0; race < MAX_RACES; ++race)
+ for (uint8 race = 0; race < MAX_RACES; ++race)
{
// skip non existed races
if (!sChrRacesStore.LookupEntry(race))
continue;
- for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
+ for (uint8 class_ = 0; class_ < MAX_CLASSES; ++class_)
{
// skip non existed classes
if (!sChrClassesStore.LookupEntry(class_))
continue;
- PlayerInfo* info = _playerInfo[race][class_];
+ auto& info = _playerInfo[race][class_];
if (!info)
continue;
@@ -4006,7 +3965,7 @@ void ObjectMgr::LoadPlayerInfo()
if (!info->levelInfo || info->levelInfo[0].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race %i Class %i Level 1 does not have stats data!", race, class_);
- exit(1);
+ ABORT();
}
// fill level gaps
@@ -4039,7 +3998,7 @@ void ObjectMgr::LoadPlayerInfo()
if (!result)
{
TC_LOG_ERROR("server.loading", ">> Loaded 0 xp for level definitions. DB table `player_xp_for_level` is empty.");
- exit(1);
+ ABORT();
}
uint32 count = 0;
@@ -4087,12 +4046,12 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, PlayerClassL
if (level < 1 || class_ >= MAX_CLASSES)
return;
- PlayerClassInfo const* pInfo = _playerClassInfo[class_];
+ auto const& pInfo = _playerClassInfo[class_];
if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
- *info = pInfo->levelInfo[level-1];
+ *info = pInfo->levelInfo[level - 1];
}
void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const
@@ -4100,12 +4059,12 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play
if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
return;
- PlayerInfo const* pInfo = _playerInfo[race][class_];
+ auto const& pInfo = _playerInfo[race][class_];
if (!pInfo)
return;
if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
- *info = pInfo->levelInfo[level-1];
+ *info = pInfo->levelInfo[level - 1];
else
BuildPlayerLevelInfo(race, class_, level, info);
}
@@ -4113,10 +4072,10 @@ 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 = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)-1];
+ *info = _playerInfo[race][_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)
+ for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
{
switch (_class)
{
@@ -4190,9 +4149,6 @@ void ObjectMgr::LoadQuests()
{
uint32 oldMSTime = getMSTime();
- // For reload case
- for (auto itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
- delete itr->second;
_questTemplates.clear();
_exclusiveQuestGroups.clear();
@@ -4224,13 +4180,18 @@ void ObjectMgr::LoadQuests()
"RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
// 99 100 101 102 103
"Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4"
- " FROM quest_template");
+ " FROM quest_template ORDER BY ID DESC");
if (!result)
{
TC_LOG_INFO("server.loading", ">> Loaded 0 quests definitions. DB table `quest_template` is empty.");
return;
}
+ uint32 const maxQuestId = (*result)[0].GetUInt32();
+ _questTemplates.resize(maxQuestId + 1);
+
+ uint32 count = 0;
+
// create multimap previous quest for each existed quest
// some quests can have many previous maps set by NextQuestId in previous quest
// for example set of race quests can lead to single not race specific quest
@@ -4238,8 +4199,9 @@ void ObjectMgr::LoadQuests()
{
Field* fields = result->Fetch();
- Quest* newQuest = new Quest(fields);
- _questTemplates[newQuest->GetQuestId()] = newQuest;
+ std::unique_ptr<Quest> newQuest = Trinity::make_unique<Quest>(fields);
+ _questTemplates[newQuest->GetQuestId()] = std::move(newQuest);
+ ++count;
} while (result->NextRow());
std::unordered_map<uint32, uint32> usedMailTemplates;
@@ -4286,9 +4248,11 @@ void ObjectMgr::LoadQuests()
Field* fields = result->Fetch();
uint32 questId = fields[0].GetUInt32();
- auto itr = _questTemplates.find(questId);
- if (itr != _questTemplates.end())
- (itr->second->*loader.LoaderFunction)(fields);
+ if (questId < _questTemplates.size() && _questTemplates[questId])
+ {
+ Quest* const quest = _questTemplates[questId].get();
+ (quest->*loader.LoaderFunction)(fields);
+ }
else
TC_LOG_ERROR("server.loading", "Table `%s` has data for quest %u but such quest does not exist", loader.TableName, questId);
} while (result->NextRow());
@@ -4296,13 +4260,14 @@ void ObjectMgr::LoadQuests()
}
// Post processing
- for (auto iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter)
+ for (auto& qinfo : _questTemplates)
{
- // skip post-loading checks for disabled quests
- if (DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, iter->first, nullptr))
+ if (!qinfo)
continue;
- Quest* qinfo = iter->second;
+ // skip post-loading checks for disabled quests
+ if (DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, qinfo->GetQuestId(), nullptr))
+ continue;
// additional quest integrity checks (GO, creature_template and item_template must be loaded already)
@@ -4793,10 +4758,9 @@ void ObjectMgr::LoadQuests()
usedMailTemplates.emplace(qinfo->_rewardMailTemplateId, qinfo->GetQuestId());
}
- if (qinfo->_rewardNextQuest)
+ if (uint32 rewardNextQuest = qinfo->_rewardNextQuest)
{
- auto qNextItr = _questTemplates.find(qinfo->_rewardNextQuest);
- if (qNextItr == _questTemplates.end())
+ if (rewardNextQuest >= _questTemplates.size() || !_questTemplates[rewardNextQuest])
{
TC_LOG_ERROR("sql.sql", "Quest %u has `RewardNextQuest` = %u but quest %u does not exist, quest chain will not work.",
qinfo->GetQuestId(), qinfo->_rewardNextQuest, qinfo->_rewardNextQuest);
@@ -4805,19 +4769,18 @@ void ObjectMgr::LoadQuests()
}
// fill additional data stores
- if (qinfo->_prevQuestId)
+ if (uint32 prevQuestId = std::abs(qinfo->_prevQuestId))
{
- if (_questTemplates.find(std::abs(qinfo->_prevQuestId)) == _questTemplates.end())
+ if (prevQuestId >= _questTemplates.size() || !_questTemplates[prevQuestId])
TC_LOG_ERROR("sql.sql", "Quest %u has PrevQuestId %i, but no such quest", qinfo->GetQuestId(), qinfo->_prevQuestId);
}
- if (qinfo->_nextQuestId)
+ if (uint32 nextQuestId = qinfo->_nextQuestId)
{
- auto qNextItr = _questTemplates.find(qinfo->_nextQuestId);
- if (qNextItr == _questTemplates.end())
+ if (nextQuestId >= _questTemplates.size() || !_questTemplates[nextQuestId])
TC_LOG_ERROR("sql.sql", "Quest %u has NextQuestId %u, but no such quest", qinfo->GetQuestId(), qinfo->_nextQuestId);
else
- qNextItr->second->DependentPreviousQuests.push_back(qinfo->GetQuestId());
+ _questTemplates[nextQuestId]->DependentPreviousQuests.push_back(qinfo->GetQuestId());
}
if (qinfo->_exclusiveGroup)
@@ -4878,7 +4841,7 @@ void ObjectMgr::LoadQuests()
}
}
- TC_LOG_INFO("server.loading", ">> Loaded %lu quests definitions in %u ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u quests definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadQuestStartersAndEnders()
@@ -5274,10 +5237,14 @@ void ObjectMgr::LoadEventScripts()
std::set<uint32> evt_scripts;
// Load all possible script entries from gameobjects
- GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
- for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
- if (uint32 eventId = itr->second.GetEventScriptId())
+ for (auto const& gameObjectTemplate : _gameObjectTemplateStore)
+ {
+ if (!gameObjectTemplate)
+ continue;
+
+ if (uint32 eventId = gameObjectTemplate->GetEventScriptId())
evt_scripts.insert(eventId);
+ }
// Load all possible script entries from spells
for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
@@ -5643,7 +5610,7 @@ void ObjectMgr::LoadInstanceEncounters()
continue;
}
- std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
+ auto itr = dungeonLastBosses.find(lastEncounterDungeon);
if (lastEncounterDungeon)
{
if (itr != dungeonLastBosses.end())
@@ -5689,7 +5656,7 @@ void ObjectMgr::LoadInstanceEncounters()
}
DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
- encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
+ encounters.emplace_back(Trinity::make_unique<DungeonEncounter>(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
++count;
} while (result->NextRow());
@@ -6308,6 +6275,11 @@ uint32 ObjectMgr::GetTaxiMountDisplayId(uint32 id, uint32 team, bool allowed_alt
return mount_id;
}
+Quest const* ObjectMgr::GetQuestTemplate(uint32 quest_id) const
+{
+ return quest_id < _questTemplates.size() ? _questTemplates[quest_id].get() : nullptr;
+}
+
void ObjectMgr::LoadGraveyardZones()
{
uint32 oldMSTime = getMSTime();
@@ -6532,7 +6504,7 @@ AccessRequirement const* ObjectMgr::GetAccessRequirement(uint32 mapid, Difficult
{
AccessRequirementContainer::const_iterator itr = _accessRequirementStore.find(MAKE_PAIR32(mapid, difficulty));
if (itr != _accessRequirementStore.end())
- return itr->second;
+ return itr->second.get();
return nullptr;
}
@@ -6675,13 +6647,7 @@ void ObjectMgr::LoadAccessRequirements()
{
uint32 oldMSTime = getMSTime();
- if (!_accessRequirementStore.empty())
- {
- for (AccessRequirementContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
- delete itr->second;
-
- _accessRequirementStore.clear(); // need for reload case
- }
+ _accessRequirementStore.clear(); // need for reload case
// 0 1 2 3 4 5 6 7 8 9 10
QueryResult result = WorldDatabase.Query("SELECT mapid, difficulty, level_min, level_max, item_level, item, item2, quest_done_A, quest_done_H, completed_achievement, quest_failed_text FROM access_requirement");
@@ -6704,7 +6670,8 @@ void ObjectMgr::LoadAccessRequirements()
uint8 difficulty = fields[1].GetUInt8();
uint32 requirement_ID = MAKE_PAIR32(mapid, difficulty);
- AccessRequirement* ar = new AccessRequirement();
+ auto& ar = _accessRequirementStore[requirement_ID];
+ ar = Trinity::make_unique<AccessRequirement>();
ar->levelMin = fields[2].GetUInt8();
ar->levelMax = fields[3].GetUInt8();
@@ -6762,8 +6729,6 @@ void ObjectMgr::LoadAccessRequirements()
ar->achievement = 0;
}
}
-
- _accessRequirementStore[requirement_ID] = ar;
} while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded %u access requirement definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
@@ -7035,7 +7000,7 @@ void ObjectMgr::LoadGameObjectTemplate()
"Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
// 21 22 23 24 25 26 27 28 29 30 31 32 33
"Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
- "FROM gameobject_template");
+ "FROM gameobject_template ORDER BY entry DESC");
if (!result)
{
@@ -7043,7 +7008,8 @@ void ObjectMgr::LoadGameObjectTemplate()
return;
}
- _gameObjectTemplateStore.rehash(result->GetRowCount());
+ uint32 const maxGameObjectId = (*result)[0].GetUInt32();
+ _gameObjectTemplateStore.resize(maxGameObjectId + 1);
uint32 count = 0;
do
{
@@ -7051,7 +7017,8 @@ void ObjectMgr::LoadGameObjectTemplate()
uint32 entry = fields[0].GetUInt32();
- GameObjectTemplate& got = _gameObjectTemplateStore[entry];
+ _gameObjectTemplateStore[entry] = Trinity::make_unique<GameObjectTemplate>();
+ GameObjectTemplate& got = *_gameObjectTemplateStore[entry].get();
got.entry = entry;
got.type = uint32(fields[1].GetUInt8());
got.displayId = fields[2].GetUInt32();
@@ -7681,13 +7648,16 @@ void ObjectMgr::LoadQuestPOI()
uint32 count = 0;
// 0 1 2 3 4 5 6 7
- QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
+ QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID DESC");
if (!result)
{
TC_LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
return;
}
+ uint32 const maxQuestId = (*result)[0].GetUInt32();
+ _questPOIStore.resize(maxQuestId + 1);
+
// 0 1 2 3
QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
@@ -7696,8 +7666,8 @@ void ObjectMgr::LoadQuestPOI()
{
// The first result should have the highest questId
Field* fields = points->Fetch();
- uint32 questIdMax = fields[0].GetUInt32();
- POIs.resize(questIdMax + 1);
+ uint32 const maxQuestPOIId = fields[0].GetUInt32();
+ POIs.resize(maxQuestPOIId + 1);
do
{
@@ -7744,18 +7714,19 @@ void ObjectMgr::LoadQuestPOI()
if (questId < POIs.size() && id < POIs[questId].size())
{
POI.QuestPOIBlobPointStats = POIs[questId][id];
- auto itr = _questPOIStore.find(questId);
- if (itr == _questPOIStore.end())
+
+ auto& questPOI = _questPOIStore[questId];
+ if (!questPOI)
{
QuestPOIWrapper wrapper;
QuestPOIData data;
data.QuestID = questId;
wrapper.POIData = data;
- _questPOIStore.emplace(questId, std::move(wrapper));
+ questPOI = Trinity::make_unique<QuestPOIWrapper>(std::move(wrapper));
}
- _questPOIStore.at(questId).POIData.QuestPOIBlobDataStats.push_back(POI);
+ questPOI->POIData.QuestPOIBlobDataStats.push_back(POI);
}
else
TC_LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest %u POI id %u", questId, id);
@@ -7819,13 +7790,15 @@ void ObjectMgr::LoadNPCSpellClickSpells()
// all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
// NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ for (auto const& creatureTemplate : _creatureTemplateStore)
{
- if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
+ if (!creatureTemplate)
+ continue;
+
+ if ((creatureTemplate->npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(creatureTemplate->Entry) == _spellClickInfoStore.end())
{
- TC_LOG_ERROR("sql.sql", "npc_spellclick_spells: Creature template %u has UNIT_NPC_FLAG_SPELLCLICK but no data in spellclick table! Removing flag", itr->second.Entry);
- const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
+ TC_LOG_ERROR("sql.sql", "npc_spellclick_spells: Creature template %u has UNIT_NPC_FLAG_SPELLCLICK but no data in spellclick table! Removing flag", creatureTemplate->Entry);
+ const_cast<CreatureTemplate*>(creatureTemplate.get())->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
}
}
@@ -7884,7 +7857,7 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReve
uint32 quest = result->Fetch()[1].GetUInt32();
uint32 poolId = result->Fetch()[2].GetUInt32();
- if (_questTemplates.find(quest) == _questTemplates.end())
+ if (quest >= _questTemplates.size() || !_questTemplates[quest])
{
TC_LOG_ERROR("sql.sql", "Table `%s`: Quest %u listed for entry %u does not exist.", table.c_str(), quest, id);
continue;
@@ -8164,7 +8137,7 @@ void ObjectMgr::LoadGameObjectForQuests()
_gameObjectForQuestStore.clear(); // need for reload case
- if (sObjectMgr->GetGameObjectTemplates()->empty())
+ if (_gameObjectTemplateStore.empty())
{
TC_LOG_INFO("server.loading", ">> Loaded 0 GameObjects for quests");
return;
@@ -8173,42 +8146,43 @@ void ObjectMgr::LoadGameObjectForQuests()
uint32 count = 0;
// collect GO entries for GO that must activated
- GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
- for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
+ for (auto const& gameObjectTemplate : _gameObjectTemplateStore)
{
- switch (itr->second.type)
+ if (!gameObjectTemplate)
+ continue;
+
+ switch (gameObjectTemplate->type)
{
case GAMEOBJECT_TYPE_QUESTGIVER:
- _gameObjectForQuestStore.insert(itr->second.entry);
+ _gameObjectForQuestStore.insert(gameObjectTemplate->entry);
++count;
break;
case GAMEOBJECT_TYPE_CHEST:
{
// scan GO chest with loot including quest items
- uint32 loot_id = (itr->second.GetLootId());
-
+ uint32 lootId = gameObjectTemplate->GetLootId();
// find quest loot for GO
- if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
+ if (gameObjectTemplate->chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(lootId))
{
- _gameObjectForQuestStore.insert(itr->second.entry);
+ _gameObjectForQuestStore.insert(gameObjectTemplate->entry);
++count;
}
break;
}
case GAMEOBJECT_TYPE_GENERIC:
{
- if (itr->second._generic.questID > 0) //quests objects
+ if (gameObjectTemplate->_generic.questID > 0) //quests objects
{
- _gameObjectForQuestStore.insert(itr->second.entry);
+ _gameObjectForQuestStore.insert(gameObjectTemplate->entry);
++count;
}
break;
}
case GAMEOBJECT_TYPE_GOOBER:
{
- if (itr->second.goober.questId > 0) //quests objects
+ if (gameObjectTemplate->goober.questId > 0) //quests objects
{
- _gameObjectForQuestStore.insert(itr->second.entry);
+ _gameObjectForQuestStore.insert(gameObjectTemplate->entry);
++count;
}
break;
@@ -8349,7 +8323,7 @@ int32 ObjectMgr::GetBaseReputationOf(FactionEntry const* factionEntry, uint8 rac
uint32 raceMask = (1 << (race - 1));
uint32 classMask = (1 << (playerClass-1));
- for (int i = 0; i < 4; i++)
+ for (uint8 i = 0; i < 4; ++i)
{
if ((!factionEntry->BaseRepClassMask[i] ||
factionEntry->BaseRepClassMask[i] & classMask) &&
@@ -8719,7 +8693,7 @@ void ObjectMgr::LoadTrainerSpell()
TC_LOG_INFO("server.loading", ">> Loaded %d Trainers in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
-int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set<uint32> *skip_vendors)
+uint32 ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set<uint32> *skip_vendors)
{
// find all items from the reference vendor
PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_NPC_VENDOR_REF);
@@ -9327,13 +9301,15 @@ void ObjectMgr::LoadCreatureClassLevelStats()
}
while (result->NextRow());
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ for (auto const& creatureTemplate : _creatureTemplateStore)
{
- for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
+ if (!creatureTemplate)
+ continue;
+
+ for (uint16 lvl = creatureTemplate->minlevel; lvl <= creatureTemplate->maxlevel; ++lvl)
{
- if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
- TC_LOG_ERROR("sql.sql", "Missing base stats for creature class %u level %u", itr->second.unit_class, lvl);
+ if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, creatureTemplate->unit_class)) == _creatureBaseStatsStore.end())
+ TC_LOG_ERROR("sql.sql", "Missing base stats for creature class %u level %u", creatureTemplate->unit_class, lvl);
}
}
@@ -9552,11 +9528,7 @@ void ObjectMgr::LoadFactionChangeTitles()
GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry) const
{
- GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
- if (itr != _gameObjectTemplateStore.end())
- return &(itr->second);
-
- return nullptr;
+ return entry < _gameObjectTemplateStore.size() ? _gameObjectTemplateStore[entry].get() : nullptr;
}
GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entry) const
@@ -9570,11 +9542,12 @@ GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entr
CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry) const
{
- CreatureTemplateContainer::const_iterator itr = _creatureTemplateStore.find(entry);
- if (itr != _creatureTemplateStore.end())
- return &(itr->second);
+ return entry < _creatureTemplateStore.size() ? _creatureTemplateStore[entry].get() : nullptr;
+}
- return nullptr;
+QuestPOIWrapper const* ObjectMgr::GetQuestPOIWrapper(uint32 questId) const
+{
+ return questId < _questPOIStore.size() ? _questPOIStore[questId].get() : nullptr;
}
VehicleAccessoryList const* ObjectMgr::GetVehicleAccessoryList(Vehicle* veh) const
@@ -9596,7 +9569,7 @@ VehicleAccessoryList const* ObjectMgr::GetVehicleAccessoryList(Vehicle* veh) con
DungeonEncounterList const* ObjectMgr::GetDungeonEncounterList(uint32 mapId, Difficulty difficulty) const
{
- std::unordered_map<uint32, DungeonEncounterList>::const_iterator itr = _dungeonEncounterStore.find(MAKE_PAIR32(mapId, difficulty));
+ auto itr = _dungeonEncounterStore.find(MAKE_PAIR32(mapId, difficulty));
if (itr != _dungeonEncounterStore.end())
return &itr->second;
return nullptr;
@@ -9608,10 +9581,10 @@ PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const
return nullptr;
if (class_ >= MAX_CLASSES)
return nullptr;
- PlayerInfo const* info = _playerInfo[race][class_];
+ auto const& info = _playerInfo[race][class_];
if (!info)
return nullptr;
- return info;
+ return info.get();
}
void ObjectMgr::LoadGameObjectQuestItems()
@@ -9712,28 +9685,33 @@ void ObjectMgr::InitializeQueriesData(QueryDataGroup mask)
// Initialize Query data for creatures
if (mask & QUERY_DATA_CREATURES)
- for (auto& creaturePair : _creatureTemplateStore)
- creaturePair.second.InitializeQueryData();
+ for (auto const& creatureTemplate : _creatureTemplateStore)
+ if (creatureTemplate)
+ creatureTemplate->InitializeQueryData();
// Initialize Query Data for gameobjects
if (mask & QUERY_DATA_GAMEOBJECTS)
- for (auto& gameobjectPair : _gameObjectTemplateStore)
- gameobjectPair.second.InitializeQueryData();
+ for (auto const& gameObjectTemplate : _gameObjectTemplateStore)
+ if (gameObjectTemplate)
+ gameObjectTemplate->InitializeQueryData();
// Initialize Query Data for items
if (mask & QUERY_DATA_ITEMS)
- for (auto& itemPair : _itemTemplateStore)
- itemPair.second.InitializeQueryData();
+ for (auto const& itemTemplate : _itemTemplateStore)
+ if (itemTemplate)
+ itemTemplate->InitializeQueryData();
// Initialize Query Data for quests
if (mask & QUERY_DATA_QUESTS)
- for (auto& questPair : _questTemplates)
- questPair.second->InitializeQueryData();
+ for (auto const& questTemplate : _questTemplates)
+ if (questTemplate)
+ questTemplate->InitializeQueryData();
// Initialize Quest POI data
if (mask & QUERY_DATA_POIS)
- for (auto& poiPair : _questPOIStore)
- poiPair.second.InitializeQueryData();
+ for (auto const& poiTemplate : _questPOIStore)
+ if (poiTemplate)
+ poiTemplate->InitializeQueryData();
}
void QuestPOIWrapper::InitializeQueryData()
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index e5f8cb7f3bc..9ee1f8c8c40 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -538,7 +538,7 @@ struct QuestGreetingLocale
};
typedef std::map<ObjectGuid, ObjectGuid> LinkedRespawnContainer;
-typedef std::unordered_map<uint32, CreatureTemplate> CreatureTemplateContainer;
+typedef std::vector<std::unique_ptr<CreatureTemplate>> CreatureTemplateContainer;
typedef std::unordered_map<uint32, CreatureAddon> CreatureTemplateAddonContainer;
typedef std::unordered_map<ObjectGuid::LowType, CreatureData> CreatureDataContainer;
typedef std::unordered_map<ObjectGuid::LowType, CreatureAddon> CreatureAddonContainer;
@@ -547,7 +547,7 @@ typedef std::unordered_map<uint8, EquipmentInfo> EquipmentInfoContainerInternal;
typedef std::unordered_map<uint32, EquipmentInfoContainerInternal> EquipmentInfoContainer;
typedef std::unordered_map<uint32, CreatureModelInfo> CreatureModelContainer;
typedef std::unordered_map<uint32, std::vector<uint32>> CreatureQuestItemMap;
-typedef std::unordered_map<uint32, GameObjectTemplate> GameObjectTemplateContainer;
+typedef std::vector<std::unique_ptr<GameObjectTemplate>> GameObjectTemplateContainer;
typedef std::unordered_map<uint32, GameObjectTemplateAddon> GameObjectTemplateAddonContainer;
typedef std::unordered_map<ObjectGuid::LowType, GameObjectData> GameObjectDataContainer;
typedef std::unordered_map<ObjectGuid::LowType, GameObjectAddon> GameObjectAddonContainer;
@@ -558,7 +558,7 @@ typedef std::unordered_map<uint16, std::vector<InstanceSpawnGroupInfo>> Instance
typedef std::map<TempSummonGroupKey, std::vector<TempSummonData>> TempSummonDataContainer;
typedef std::unordered_map<uint32, CreatureLocale> CreatureLocaleContainer;
typedef std::unordered_map<uint32, GameObjectLocale> GameObjectLocaleContainer;
-typedef std::unordered_map<uint32, ItemTemplate> ItemTemplateContainer;
+typedef std::vector<std::unique_ptr<ItemTemplate>> ItemTemplateContainer;
typedef std::unordered_map<uint32, ItemLocale> ItemLocaleContainer;
typedef std::unordered_map<uint32, ItemSetNameLocale> ItemSetNameLocaleContainer;
typedef std::unordered_map<uint32, QuestLocale> QuestLocaleContainer;
@@ -607,7 +607,7 @@ struct PlayerClassLevelInfo
struct PlayerClassInfo
{
//[level-1] 0..MaxPlayerLevel-1
- PlayerClassLevelInfo* levelInfo = nullptr;
+ std::unique_ptr<PlayerClassLevelInfo[]> levelInfo;
};
struct PlayerLevelInfo
@@ -654,7 +654,7 @@ struct PlayerInfo
PlayerCreateInfoSkills skills;
//[level-1] 0..MaxPlayerLevel-1
- PlayerLevelInfo* levelInfo = nullptr;
+ std::unique_ptr<PlayerLevelInfo[]> levelInfo;
};
@@ -798,7 +798,7 @@ struct QuestPOIWrapper
QuestPOIWrapper() : QueryDataBuffer(0) { }
};
-typedef std::unordered_map<uint32, QuestPOIWrapper> QuestPOIContainer;
+typedef std::vector<std::unique_ptr<QuestPOIWrapper>> QuestPOIContainer;
struct QuestGreeting
{
@@ -872,7 +872,7 @@ struct DungeonEncounter
uint32 lastEncounterDungeon;
};
-typedef std::list<DungeonEncounter const*> DungeonEncounterList;
+typedef std::vector<std::unique_ptr<DungeonEncounter const>> DungeonEncounterList;
typedef std::unordered_map<uint32, DungeonEncounterList> DungeonEncounterContainer;
enum QueryDataGroup
@@ -905,13 +905,13 @@ class TC_GAME_API ObjectMgr
static ObjectMgr* instance();
- typedef std::unordered_map<uint32, Quest*> QuestMap;
+ typedef std::vector<std::unique_ptr<Quest>> QuestContainer;
typedef std::unordered_map<uint32, AreaTrigger> AreaTriggerContainer;
typedef std::unordered_map<uint32, uint32> AreaTriggerScriptContainer;
- typedef std::unordered_map<uint32, AccessRequirement*> AccessRequirementContainer;
+ typedef std::unordered_map<uint32, std::unique_ptr<AccessRequirement>> AccessRequirementContainer;
typedef std::unordered_map<uint32, RepRewardRate > RepRewardRateContainer;
typedef std::unordered_map<uint32, ReputationOnKillEntry> RepOnKillContainer;
@@ -924,14 +924,14 @@ class TC_GAME_API ObjectMgr
typedef std::map<uint32, uint32> CharacterConversionMap;
GameObjectTemplate const* GetGameObjectTemplate(uint32 entry) const;
- GameObjectTemplateContainer const* GetGameObjectTemplates() const { return &_gameObjectTemplateStore; }
- int LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32> *skip_vendors);
+ GameObjectTemplateContainer const& GetGameObjectTemplates() const { return _gameObjectTemplateStore; }
+ uint32 LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32> *skip_vendors);
void LoadGameObjectTemplate();
void LoadGameObjectTemplateAddons();
CreatureTemplate const* GetCreatureTemplate(uint32 entry) const;
- CreatureTemplateContainer const* GetCreatureTemplates() const { return &_creatureTemplateStore; }
+ CreatureTemplateContainer const& GetCreatureTemplates() const { return _creatureTemplateStore; }
CreatureModelInfo const* GetCreatureModelInfo(uint32 modelId) const;
CreatureModelInfo const* GetCreatureModelRandomGender(uint32* displayID) const;
static uint32 ChooseDisplayId(CreatureTemplate const* cinfo, CreatureData const* data = nullptr);
@@ -942,7 +942,7 @@ class TC_GAME_API ObjectMgr
GameObjectTemplateAddon const* GetGameObjectTemplateAddon(uint32 entry) const;
CreatureAddon const* GetCreatureTemplateAddon(uint32 entry) const;
ItemTemplate const* GetItemTemplate(uint32 entry) const;
- ItemTemplateContainer const* GetItemTemplateStore() const { return &_itemTemplateStore; }
+ ItemTemplateContainer const& GetItemTemplateStore() const { return _itemTemplateStore; }
ItemSetNameEntry const* GetItemSetNameEntry(uint32 itemId) const
{
@@ -956,12 +956,8 @@ class TC_GAME_API ObjectMgr
PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint8 level) const;
- PlayerClassInfo const* GetPlayerClassInfo(uint32 class_) const
- {
- if (class_ >= MAX_CLASSES)
- return nullptr;
- return _playerClassInfo[class_];
- }
+ PlayerClassInfo const* GetPlayerClassInfo(uint32 class_) const { return class_ < MAX_CLASSES ? _playerClassInfo[class_].get() : nullptr; }
+
void GetPlayerClassLevelInfo(uint32 class_, uint8 level, PlayerClassLevelInfo* info) const;
PlayerInfo const* GetPlayerInfo(uint32 race, uint32 class_) const;
@@ -990,13 +986,9 @@ class TC_GAME_API ObjectMgr
void GetTaxiPath(uint32 source, uint32 destination, uint32 &path, uint32 &cost);
uint32 GetTaxiMountDisplayId(uint32 id, uint32 team, bool allowed_alt_team = false);
- Quest const* GetQuestTemplate(uint32 quest_id) const
- {
- QuestMap::const_iterator itr = _questTemplates.find(quest_id);
- return itr != _questTemplates.end() ? itr->second : nullptr;
- }
+ Quest const* GetQuestTemplate(uint32 quest_id) const;
- QuestMap const& GetQuestTemplates() const { return _questTemplates; }
+ QuestContainer const& GetQuestTemplates() const { return _questTemplates; }
uint32 GetQuestForAreaTrigger(uint32 Trigger_ID) const
{
@@ -1070,13 +1062,7 @@ class TC_GAME_API ObjectMgr
return nullptr;
}
- QuestPOIWrapper const* GetQuestPOIWrapper(uint32 questId)
- {
- QuestPOIContainer::const_iterator itr = _questPOIStore.find(questId);
- if (itr != _questPOIStore.end())
- return &itr->second;
- return nullptr;
- }
+ QuestPOIWrapper const* GetQuestPOIWrapper(uint32 questId) const;
VehicleAccessoryList const* GetVehicleAccessoryList(Vehicle* veh) const;
@@ -1544,7 +1530,7 @@ class TC_GAME_API ObjectMgr
}
std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase>> _guidGenerators;
- QuestMap _questTemplates;
+ QuestContainer _questTemplates;
typedef std::unordered_map<uint32, GossipText> GossipTextContainer;
typedef std::unordered_map<uint32, uint32> QuestAreaTriggerContainer;
@@ -1609,15 +1595,14 @@ class TC_GAME_API ObjectMgr
CreatureBaseStatsContainer _creatureBaseStatsStore;
- typedef std::map<uint32, PetLevelInfo*> PetLevelInfoContainer;
- // PetLevelInfoContainer[creature_id][level]
- PetLevelInfoContainer _petInfoStore; // [creature_id][level]
+ typedef std::unordered_map<uint32 /*creatureId*/, std::unique_ptr<PetLevelInfo[] /*level*/>> PetLevelInfoContainer;
+ PetLevelInfoContainer _petInfoStore;
- PlayerClassInfo* _playerClassInfo[MAX_CLASSES];
+ std::unique_ptr<PlayerClassInfo> _playerClassInfo[MAX_CLASSES];
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo* plinfo) const;
- PlayerInfo* _playerInfo[MAX_RACES][MAX_CLASSES];
+ std::unique_ptr<PlayerInfo> _playerInfo[MAX_RACES][MAX_CLASSES];
typedef std::vector<uint32> PlayerXPperLevel; // [level]
PlayerXPperLevel _playerXPperLevel;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index bf798bb50ed..1fd4f19d94e 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1958,10 +1958,12 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptr<Charact
// Disable all old-faction specific quests
{
- ObjectMgr::QuestMap const& questTemplates = sObjectMgr->GetQuestTemplates();
- for (ObjectMgr::QuestMap::const_iterator iter = questTemplates.begin(); iter != questTemplates.end(); ++iter)
+ ObjectMgr::QuestContainer const& questTemplates = sObjectMgr->GetQuestTemplates();
+ for (auto const& quest : questTemplates)
{
- Quest const* quest = iter->second;
+ if (!quest)
+ continue;
+
uint32 newRaceMask = (newTeam == ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE;
if (!(quest->GetAllowableRaces() & newRaceMask))
{
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index fa14e3246d8..341e75b1402 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -698,9 +698,8 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi
uint32 dungeonId = 0;
- for (DungeonEncounterList::const_iterator itr = encounters->begin(); itr != encounters->end(); ++itr)
+ for (auto const& encounter : *encounters)
{
- DungeonEncounter const* encounter = *itr;
if (encounter->creditType == type && encounter->creditEntry == creditEntry)
{
completedEncounters |= 1 << encounter->dbcEntry->encounterIndex;
@@ -716,15 +715,19 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi
if (dungeonId)
{
Map::PlayerList const& players = instance->GetPlayers();
- for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
+ for (auto const& ref : players)
{
- if (Player* player = i->GetSource())
+ if (Player* player = ref.GetSource())
+ {
if (Group* grp = player->GetGroup())
+ {
if (grp->isLFGGroup())
{
sLFGMgr->FinishDungeon(grp->GetGUID(), dungeonId, instance);
return;
}
+ }
+ }
}
}
}
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 232eb18b298..0f8236c723c 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -788,13 +788,16 @@ void LoadLootTemplates_Creature()
uint32 count = LootTemplates_Creature.LoadAndCollectLootIds(lootIdSet);
// Remove real entries and check loot existence
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : ctc)
{
- if (uint32 lootid = itr->second.lootid)
+ if (!creatureTemplate)
+ continue;
+
+ if (uint32 lootid = creatureTemplate->lootid)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Creature.ReportNonExistingId(lootid, "Creature", itr->second.Entry);
+ LootTemplates_Creature.ReportNonExistingId(lootid, "Creature", creatureTemplate->Entry);
else
lootIdSetUsed.insert(lootid);
}
@@ -824,13 +827,16 @@ void LoadLootTemplates_Disenchant()
LootIdSet lootIdSet, lootIdSetUsed;
uint32 count = LootTemplates_Disenchant.LoadAndCollectLootIds(lootIdSet);
- ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
- for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
+ ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
+ for (auto const& itemTemplate : its)
{
- if (uint32 lootid = itr->second.DisenchantID)
+ if (!itemTemplate)
+ continue;
+
+ if (uint32 lootid = itemTemplate->DisenchantID)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Disenchant.ReportNonExistingId(lootid, "Item", itr->second.ItemId);
+ LootTemplates_Disenchant.ReportNonExistingId(lootid, "Item", itemTemplate->ItemId);
else
lootIdSetUsed.insert(lootid);
}
@@ -881,13 +887,16 @@ void LoadLootTemplates_Gameobject()
uint32 count = LootTemplates_Gameobject.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
- for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
+ GameObjectTemplateContainer const& gotc = sObjectMgr->GetGameObjectTemplates();
+ for (auto const& gameObjectTemplate : gotc)
{
- if (uint32 lootid = itr->second.GetLootId())
+ if (!gameObjectTemplate)
+ continue;
+
+ if (uint32 lootid = gameObjectTemplate->GetLootId())
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Gameobject.ReportNonExistingId(lootid, "Gameobject", itr->second.entry);
+ LootTemplates_Gameobject.ReportNonExistingId(lootid, "Gameobject", gameObjectTemplate->entry);
else
lootIdSetUsed.insert(lootid);
}
@@ -915,10 +924,15 @@ void LoadLootTemplates_Item()
uint32 count = LootTemplates_Item.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
- for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
- if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end() && itr->second.Flags & ITEM_FLAG_HAS_LOOT)
- lootIdSet.erase(itr->second.ItemId);
+ ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
+ for (auto const& itemTemplate : its)
+ {
+ if (!itemTemplate)
+ continue;
+
+ if (lootIdSet.find(itemTemplate->ItemId) != lootIdSet.end() && (itemTemplate->Flags & ITEM_FLAG_HAS_LOOT))
+ lootIdSet.erase(itemTemplate->ItemId);
+ }
// output error for any still listed (not referenced from appropriate table) ids
LootTemplates_Item.ReportUnusedIds(lootIdSet);
@@ -939,14 +953,14 @@ void LoadLootTemplates_Milling()
uint32 count = LootTemplates_Milling.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
- for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
+ ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
+ for (auto const& itemTemplate : its)
{
- if (!(itr->second.Flags & ITEM_FLAG_IS_MILLABLE))
+ if (!itemTemplate || !(itemTemplate->Flags & ITEM_FLAG_IS_MILLABLE))
continue;
- if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end())
- lootIdSet.erase(itr->second.ItemId);
+ if (lootIdSet.find(itemTemplate->ItemId) != lootIdSet.end())
+ lootIdSet.erase(itemTemplate->ItemId);
}
// output error for any still listed (not referenced from appropriate table) ids
@@ -968,13 +982,16 @@ void LoadLootTemplates_Pickpocketing()
uint32 count = LootTemplates_Pickpocketing.LoadAndCollectLootIds(lootIdSet);
// Remove real entries and check loot existence
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : ctc)
{
- if (uint32 lootid = itr->second.pickpocketLootId)
+ if (!creatureTemplate)
+ continue;
+
+ if (uint32 lootid = creatureTemplate->pickpocketLootId)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Pickpocketing.ReportNonExistingId(lootid, "Creature", itr->second.Entry);
+ LootTemplates_Pickpocketing.ReportNonExistingId(lootid, "Creature", creatureTemplate->Entry);
else
lootIdSetUsed.insert(lootid);
}
@@ -1002,14 +1019,14 @@ void LoadLootTemplates_Prospecting()
uint32 count = LootTemplates_Prospecting.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
- for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
+ ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
+ for (auto const& itemTemplate : its)
{
- if (!(itr->second.Flags & ITEM_FLAG_IS_PROSPECTABLE))
+ if (!itemTemplate || !(itemTemplate->Flags & ITEM_FLAG_IS_PROSPECTABLE))
continue;
- if (lootIdSet.find(itr->second.ItemId) != lootIdSet.end())
- lootIdSet.erase(itr->second.ItemId);
+ if (lootIdSet.find(itemTemplate->ItemId) != lootIdSet.end())
+ lootIdSet.erase(itemTemplate->ItemId);
}
// output error for any still listed (not referenced from appropriate table) ids
@@ -1055,13 +1072,16 @@ void LoadLootTemplates_Skinning()
uint32 count = LootTemplates_Skinning.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : ctc)
{
- if (uint32 lootid = itr->second.SkinLootId)
+ if (!creatureTemplate)
+ continue;
+
+ if (uint32 lootid = creatureTemplate->SkinLootId)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Skinning.ReportNonExistingId(lootid, "Creature", itr->second.Entry);
+ LootTemplates_Skinning.ReportNonExistingId(lootid, "Creature", creatureTemplate->Entry);
else
lootIdSetUsed.insert(lootid);
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 731d4f4dfb7..ca05c9c8b02 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2269,24 +2269,23 @@ void SpellMgr::LoadPetDefaultSpells()
uint32 countCreature = 0;
uint32 countData = 0;
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : ctc)
{
-
- if (!itr->second.PetSpellDataId)
+ if (!creatureTemplate || !creatureTemplate->PetSpellDataId)
continue;
// for creature with PetSpellDataId get default pet spells from dbc
- CreatureSpellDataEntry const* spellDataEntry = sCreatureSpellDataStore.LookupEntry(itr->second.PetSpellDataId);
+ CreatureSpellDataEntry const* spellDataEntry = sCreatureSpellDataStore.LookupEntry(creatureTemplate->PetSpellDataId);
if (!spellDataEntry)
continue;
- int32 petSpellsId = -int32(itr->second.PetSpellDataId);
+ int32 petSpellsId = -int32(creatureTemplate->PetSpellDataId);
PetDefaultSpellsEntry petDefSpells;
for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
petDefSpells.spellid[j] = spellDataEntry->spellId[j];
- if (LoadPetDefaultSpells_helper(&itr->second, petDefSpells))
+ if (LoadPetDefaultSpells_helper(creatureTemplate.get(), petDefSpells))
{
mPetDefaultSpellsMap[petSpellsId] = petDefSpells;
++countData;
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index 36706034d03..44e137b5567 100644
--- a/src/server/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
@@ -107,7 +107,7 @@ public:
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i);
if (areaEntry)
{
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = areaEntry->area_name[locale];
if (name.empty())
continue;
@@ -176,16 +176,19 @@ public:
uint32 count = 0;
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
- CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
- for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
+ CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
+ for (auto const& creatureTemplate : ctc)
{
- uint32 id = itr->second.Entry;
+ if (!creatureTemplate)
+ continue;
+
+ uint32 id = creatureTemplate->Entry;
uint8 localeIndex = handler->GetSessionDbLocaleIndex();
if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(id))
{
if (creatureLocale->Name.size() > localeIndex && !creatureLocale->Name[localeIndex].empty())
{
- std::string name = creatureLocale->Name[localeIndex];
+ std::string const& name = creatureLocale->Name[localeIndex];
if (Utf8FitTo(name, wNamePart))
{
@@ -208,7 +211,7 @@ public:
}
}
- std::string name = itr->second.Name;
+ std::string const& name = creatureTemplate->Name;
if (name.empty())
continue;
@@ -319,7 +322,7 @@ public:
{
FactionState const* factionState = target ? target->GetReputationMgr().GetState(factionEntry) : nullptr;
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = factionEntry->name[locale];
if (name.empty())
continue;
@@ -412,18 +415,21 @@ public:
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
// Search in `item_template`
- ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
- for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
+ ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
+ for (auto const& itemTemplate : its)
{
- int localeIndex = handler->GetSessionDbLocaleIndex();
+ if (!itemTemplate)
+ continue;
+
+ uint8 localeIndex = handler->GetSessionDbLocaleIndex();
if (localeIndex >= 0)
{
uint8 ulocaleIndex = uint8(localeIndex);
- if (ItemLocale const* il = sObjectMgr->GetItemLocale(itr->second.ItemId))
+ if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
{
if (il->Name.size() > ulocaleIndex && !il->Name[ulocaleIndex].empty())
{
- std::string name = il->Name[ulocaleIndex];
+ std::string const& name = il->Name[ulocaleIndex];
if (Utf8FitTo(name, wNamePart))
{
@@ -434,9 +440,9 @@ public:
}
if (handler->GetSession())
- handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itr->second.ItemId, itr->second.ItemId, name.c_str());
+ handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate->ItemId, itemTemplate->ItemId, name.c_str());
else
- handler->PSendSysMessage(LANG_ITEM_LIST_CONSOLE, itr->second.ItemId, name.c_str());
+ handler->PSendSysMessage(LANG_ITEM_LIST_CONSOLE, itemTemplate->ItemId, name.c_str());
if (!found)
found = true;
@@ -447,7 +453,7 @@ public:
}
}
- std::string name = itr->second.Name1;
+ std::string const& name = itemTemplate->Name1;
if (name.empty())
continue;
@@ -460,9 +466,9 @@ public:
}
if (handler->GetSession())
- handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itr->second.ItemId, itr->second.ItemId, name.c_str());
+ handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate->ItemId, itemTemplate->ItemId, name.c_str());
else
- handler->PSendSysMessage(LANG_ITEM_LIST_CONSOLE, itr->second.ItemId, name.c_str());
+ handler->PSendSysMessage(LANG_ITEM_LIST_CONSOLE, itemTemplate->ItemId, name.c_str());
if (!found)
found = true;
@@ -499,7 +505,7 @@ public:
ItemSetEntry const* set = sItemSetStore.LookupEntry(id);
if (set)
{
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = set->name[locale];
if (name.empty())
continue;
@@ -564,16 +570,18 @@ public:
uint32 count = 0;
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
- GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
- for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
+ GameObjectTemplateContainer const& gotc = sObjectMgr->GetGameObjectTemplates();
+ for (auto const& gameObjectTemplate : gotc)
{
+ if (!gameObjectTemplate)
+ continue;
+
uint8 localeIndex = handler->GetSessionDbLocaleIndex();
- if (GameObjectLocale const* objectLocalte = sObjectMgr->GetGameObjectLocale(itr->second.entry))
+ if (GameObjectLocale const* objectLocalte = sObjectMgr->GetGameObjectLocale(gameObjectTemplate->entry))
{
if (objectLocalte->Name.size() > localeIndex && !objectLocalte->Name[localeIndex].empty())
{
- std::string name = objectLocalte->Name[localeIndex];
-
+ std::string const& name = objectLocalte->Name[localeIndex];
if (Utf8FitTo(name, wNamePart))
{
if (maxResults && count++ == maxResults)
@@ -583,9 +591,9 @@ public:
}
if (handler->GetSession())
- handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, itr->second.entry, itr->second.entry, name.c_str());
+ handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, gameObjectTemplate->entry, gameObjectTemplate->entry, name.c_str());
else
- handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, itr->second.entry, name.c_str());
+ handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, gameObjectTemplate->entry, name.c_str());
if (!found)
found = true;
@@ -595,7 +603,7 @@ public:
}
}
- std::string name = itr->second.name;
+ std::string const& name = gameObjectTemplate->name;
if (name.empty())
continue;
@@ -608,9 +616,9 @@ public:
}
if (handler->GetSession())
- handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, itr->second.entry, itr->second.entry, name.c_str());
+ handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, gameObjectTemplate->entry, gameObjectTemplate->entry, name.c_str());
else
- handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, itr->second.entry, name.c_str());
+ handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, gameObjectTemplate->entry, name.c_str());
if (!found)
found = true;
@@ -644,12 +652,13 @@ public:
uint32 count = 0;
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
- ObjectMgr::QuestMap const& qTemplates = sObjectMgr->GetQuestTemplates();
- for (ObjectMgr::QuestMap::const_iterator iter = qTemplates.begin(); iter != qTemplates.end(); ++iter)
+ ObjectMgr::QuestContainer const& questTemplates = sObjectMgr->GetQuestTemplates();
+ for (auto const& qInfo : questTemplates)
{
- Quest* qInfo = iter->second;
+ if (!qInfo)
+ continue;
- int localeIndex = handler->GetSessionDbLocaleIndex();
+ uint8 localeIndex = handler->GetSessionDbLocaleIndex();
if (localeIndex >= 0)
{
uint8 ulocaleIndex = uint8(localeIndex);
@@ -780,7 +789,7 @@ public:
SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(id);
if (skillInfo)
{
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = skillInfo->name[locale];
if (name.empty())
continue;
@@ -868,7 +877,7 @@ public:
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id);
if (spellInfo)
{
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = spellInfo->SpellName[locale];
if (name.empty())
continue;
@@ -965,7 +974,7 @@ public:
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id))
{
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = spellInfo->SpellName[locale];
if (name.empty())
{
@@ -973,49 +982,49 @@ public:
return true;
}
- bool known = target && target->HasSpell(id);
- bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL);
+ bool known = target && target->HasSpell(id);
+ bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL);
- SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell);
+ SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell);
- uint32 talentCost = GetTalentSpellCost(id);
+ uint32 talentCost = GetTalentSpellCost(id);
- bool talent = (talentCost > 0);
- bool passive = spellInfo->IsPassive();
- bool active = target && target->HasAura(id);
+ bool talent = (talentCost > 0);
+ bool passive = spellInfo->IsPassive();
+ bool active = target && target->HasAura(id);
- // unit32 used to prevent interpreting uint8 as char at output
- // find rank of learned spell for learning spell, or talent rank
- uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank();
+ // unit32 used to prevent interpreting uint8 as char at output
+ // find rank of learned spell for learning spell, or talent rank
+ uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank();
- // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
- std::ostringstream ss;
- if (handler->GetSession())
- ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
- else
- ss << id << " - " << name;
+ // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
+ std::ostringstream ss;
+ if (handler->GetSession())
+ ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
+ else
+ ss << id << " - " << name;
- // include rank in link name
- if (rank)
- ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank;
+ // include rank in link name
+ if (rank)
+ ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank;
- if (handler->GetSession())
- ss << ' ' << localeNames[locale] << "]|h|r";
- else
- ss << ' ' << localeNames[locale];
-
- if (talent)
- ss << handler->GetTrinityString(LANG_TALENT);
- if (passive)
- ss << handler->GetTrinityString(LANG_PASSIVE);
- if (learn)
- ss << handler->GetTrinityString(LANG_LEARN);
- if (known)
- ss << handler->GetTrinityString(LANG_KNOWN);
- if (active)
- ss << handler->GetTrinityString(LANG_ACTIVE);
-
- handler->SendSysMessage(ss.str().c_str());
+ if (handler->GetSession())
+ ss << ' ' << localeNames[locale] << "]|h|r";
+ else
+ ss << ' ' << localeNames[locale];
+
+ if (talent)
+ ss << handler->GetTrinityString(LANG_TALENT);
+ if (passive)
+ ss << handler->GetTrinityString(LANG_PASSIVE);
+ if (learn)
+ ss << handler->GetTrinityString(LANG_LEARN);
+ if (known)
+ ss << handler->GetTrinityString(LANG_KNOWN);
+ if (active)
+ ss << handler->GetTrinityString(LANG_ACTIVE);
+
+ handler->SendSysMessage(ss.str().c_str());
}
else
handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND);
@@ -1047,7 +1056,7 @@ public:
TaxiNodesEntry const* nodeEntry = sTaxiNodesStore.LookupEntry(id);
if (nodeEntry)
{
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = nodeEntry->name[locale];
if (name.empty())
continue;
@@ -1185,7 +1194,7 @@ public:
if (titleInfo)
{
/// @todo: implement female support
- int locale = handler->GetSessionDbcLocale();
+ uint8 locale = handler->GetSessionDbcLocale();
std::string name = titleInfo->nameMale[locale];
if (name.empty())
continue;
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 459aed93621..ba3a34f98b1 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1342,31 +1342,31 @@ public:
TC_LOG_DEBUG("misc", handler->GetTrinityString(LANG_ADDITEMSET), itemSetId);
bool found = false;
- ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
- for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
+ ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
+ for (auto const& itemTemplate : its)
{
- if (itr->second.ItemSet == itemSetId)
+ if (!itemTemplate || itemTemplate->ItemSet != itemSetId)
+ continue;
+
+ found = true;
+ ItemPosCountVec dest;
+ InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemTemplate->ItemId, 1);
+ if (msg == EQUIP_ERR_OK)
{
- found = true;
- ItemPosCountVec dest;
- InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itr->second.ItemId, 1);
- if (msg == EQUIP_ERR_OK)
- {
- Item* item = playerTarget->StoreNewItem(dest, itr->second.ItemId, true);
+ Item* item = playerTarget->StoreNewItem(dest, itemTemplate->ItemId, true);
- // remove binding (let GM give it to another player later)
- if (player == playerTarget)
- item->SetBinding(false);
+ // remove binding (let GM give it to another player later)
+ if (player == playerTarget)
+ item->SetBinding(false);
- player->SendNewItem(item, 1, false, true);
- if (player != playerTarget)
- playerTarget->SendNewItem(item, 1, true, false);
- }
- else
- {
- player->SendEquipError(msg, nullptr, nullptr, itr->second.ItemId);
- handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itr->second.ItemId, 1);
- }
+ player->SendNewItem(item, 1, false, true);
+ if (player != playerTarget)
+ playerTarget->SendNewItem(item, 1, true, false);
+ }
+ else
+ {
+ player->SendEquipError(msg, nullptr, nullptr, itemTemplate->ItemId);
+ handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemTemplate->ItemId, 1);
}
}
diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp
index b4622ba0179..c31f5462e8f 100644
--- a/src/server/scripts/Commands/cs_quest.cpp
+++ b/src/server/scripts/Commands/cs_quest.cpp
@@ -81,15 +81,15 @@ public:
}
// check item starting quest (it can work incorrectly if added without item in inventory)
- ItemTemplateContainer const* itc = sObjectMgr->GetItemTemplateStore();
- ItemTemplateContainer::const_iterator result = std::find_if(itc->begin(), itc->end(), [quest](ItemTemplateContainer::value_type const& value)
+ ItemTemplateContainer const& itc = sObjectMgr->GetItemTemplateStore();
+ auto itr = std::find_if(std::begin(itc), std::end(itc), [quest](ItemTemplateContainer::value_type const& value)
{
- return value.second.StartQuest == quest->GetQuestId();
+ return value && value->StartQuest == quest->GetQuestId();
});
- if (result != itc->end())
+ if (itr != std::end(itc))
{
- handler->PSendSysMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, result->second.ItemId);
+ handler->PSendSysMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, (*itr)->ItemId);
handler->SetSentErrorMessage(true);
return false;
}