mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Globals: revert back to unordered_map for templates
Partial revert of commitb64c504314See discussion onb64c504314(cherry picked from commitb75ff7d4bf)
This commit is contained in:
@@ -4214,12 +4214,9 @@ void CriteriaMgr::LoadCriteriaList()
|
||||
scenarioCriteriaTreeIds[scenarioStep->Criteriatreeid] = scenarioStep;
|
||||
|
||||
std::unordered_map<uint32 /*criteriaTreeID*/, QuestObjective const*> questObjectiveCriteriaTreeIds;
|
||||
for (auto const& questTemplate : sObjectMgr->GetQuestTemplates())
|
||||
for (auto const& questTemplatePair : sObjectMgr->GetQuestTemplates())
|
||||
{
|
||||
if (!questTemplate)
|
||||
continue;
|
||||
|
||||
for (QuestObjective const& objective : questTemplate->Objectives)
|
||||
for (QuestObjective const& objective : questTemplatePair.second.Objectives)
|
||||
{
|
||||
if (objective.Type != QUEST_OBJECTIVE_CRITERIA_TREE)
|
||||
continue;
|
||||
|
||||
@@ -66,11 +66,10 @@ bool AuctionBotSeller::Initialize()
|
||||
|
||||
TC_LOG_DEBUG("ahbot", "Loading npc vendor items for filter..");
|
||||
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);
|
||||
for (auto const& creatureTemplatePair : creatures)
|
||||
if (VendorItemData const* data = sObjectMgr->GetNpcVendorItemList(creatureTemplatePair.first))
|
||||
for (VendorItem const& vendorItem : data->m_items)
|
||||
npcItems.insert(vendorItem.item);
|
||||
|
||||
TC_LOG_DEBUG("ahbot", "Npc vendor filter has " SZFMTD " items", npcItems.size());
|
||||
|
||||
|
||||
@@ -750,15 +750,12 @@ void BattlegroundMgr::LoadBattleMastersEntry()
|
||||
void BattlegroundMgr::CheckBattleMasters()
|
||||
{
|
||||
CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
|
||||
for (auto const& creatureTemplate : ctc)
|
||||
for (auto const& creatureTemplatePair : ctc)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
if ((creatureTemplate->npcflag & UNIT_NPC_FLAG_BATTLEMASTER) && mBattleMastersMap.find(creatureTemplate->Entry) == mBattleMastersMap.end())
|
||||
if ((creatureTemplatePair.second.npcflag & UNIT_NPC_FLAG_BATTLEMASTER) && !mBattleMastersMap.count(creatureTemplatePair.first))
|
||||
{
|
||||
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;
|
||||
TC_LOG_ERROR("sql.sql", "Creature_Template Entry: %u has UNIT_NPC_FLAG_BATTLEMASTER, but no data in the `battlemaster_entry` table. Removing flag.", creatureTemplatePair.first);
|
||||
const_cast<CreatureTemplate&>(creatureTemplatePair.second).npcflag &= ~UNIT_NPC_FLAG_BATTLEMASTER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -361,7 +361,7 @@ void ObjectMgr::LoadCreatureTemplates()
|
||||
// 69 70 71 72 73 74 75 76
|
||||
// "RacialLeader, movementId, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, "
|
||||
// 77
|
||||
// "ScriptName FROM creature_template WHERE entry = ? OR 1 = ? ORDER BY entry DESC");
|
||||
// "ScriptName FROM creature_template WHERE entry = ? OR 1 = ?");
|
||||
|
||||
WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEMPLATE);
|
||||
stmt->setUInt32(0, 0);
|
||||
@@ -374,35 +374,27 @@ void ObjectMgr::LoadCreatureTemplates()
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
uint32 const maxCreatureId = (*result)[0].GetUInt32();
|
||||
_creatureTemplateStore.resize(maxCreatureId + 1);
|
||||
_creatureTemplateStore.reserve(result->GetRowCount());
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
LoadCreatureTemplate(fields);
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
|
||||
// We load the creature models after loading but before checking
|
||||
LoadCreatureTemplateModels();
|
||||
|
||||
// Checking needs to be done after loading because of the difficulty self referencing
|
||||
for (auto const& creatureTemplate : _creatureTemplateStore)
|
||||
if (creatureTemplate)
|
||||
CheckCreatureTemplate(creatureTemplate.get());
|
||||
for (auto const& ctPair : _creatureTemplateStore)
|
||||
CheckCreatureTemplate(&ctPair.second);
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u creature definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " creature definitions in %u ms", _creatureTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadCreatureTemplate(Field* fields)
|
||||
{
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
|
||||
_creatureTemplateStore[entry] = std::make_unique<CreatureTemplate>();
|
||||
CreatureTemplate& creatureTemplate = *_creatureTemplateStore[entry].get();
|
||||
CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry];
|
||||
|
||||
creatureTemplate.Entry = entry;
|
||||
|
||||
@@ -663,8 +655,8 @@ void ObjectMgr::LoadCreatureScalingData()
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
Difficulty difficulty = Difficulty(fields[1].GetUInt8());
|
||||
|
||||
CreatureTemplate const* creatureTemplate = GetCreatureTemplate(entry);
|
||||
if (!creatureTemplate)
|
||||
auto itr = _creatureTemplateStore.find(entry);
|
||||
if (itr == _creatureTemplateStore.end())
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Creature template (Entry: %u) does not exist but has a record in `creature_template_scaling`", entry);
|
||||
continue;
|
||||
@@ -677,7 +669,7 @@ void ObjectMgr::LoadCreatureScalingData()
|
||||
creatureLevelScaling.DeltaLevelMax = fields[5].GetInt16();
|
||||
creatureLevelScaling.ContentTuningID = fields[6].GetInt32();
|
||||
|
||||
const_cast<CreatureTemplate*>(creatureTemplate)->scalingStore[difficulty] = creatureLevelScaling;
|
||||
itr->second.scalingStore[difficulty] = creatureLevelScaling;
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
@@ -2995,17 +2987,13 @@ void ObjectMgr::LoadItemTemplates()
|
||||
uint32 oldMSTime = getMSTime();
|
||||
uint32 sparseCount = 0;
|
||||
|
||||
uint32 const maxItemId = sItemSparseStore.GetNumRows();
|
||||
_itemTemplateStore.resize(maxItemId + 1);
|
||||
|
||||
for (ItemSparseEntry const* sparse : sItemSparseStore)
|
||||
{
|
||||
ItemEntry const* db2Data = sItemStore.LookupEntry(sparse->ID);
|
||||
if (!db2Data)
|
||||
continue;
|
||||
|
||||
_itemTemplateStore[sparse->ID] = std::make_unique<ItemTemplate>();
|
||||
ItemTemplate& itemTemplate = *_itemTemplateStore[sparse->ID].get();
|
||||
ItemTemplate& itemTemplate = _itemTemplateStore[sparse->ID];
|
||||
|
||||
itemTemplate.BasicData = db2Data;
|
||||
itemTemplate.ExtendedData = sparse;
|
||||
@@ -3082,14 +3070,14 @@ void ObjectMgr::LoadItemTemplates()
|
||||
// Load item effects (spells)
|
||||
for (ItemEffectEntry const* effectEntry : sItemEffectStore)
|
||||
{
|
||||
ItemTemplate const* itemTemplate = GetItemTemplate(effectEntry->ParentItemID);
|
||||
if (!itemTemplate)
|
||||
auto itemItr = _itemTemplateStore.find(effectEntry->ParentItemID);
|
||||
if (itemItr == _itemTemplateStore.end())
|
||||
continue;
|
||||
|
||||
const_cast<ItemTemplate*>(itemTemplate)->Effects.push_back(effectEntry);
|
||||
itemItr->second.Effects.push_back(effectEntry);
|
||||
}
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u item templates in %u ms", sparseCount, GetMSTimeDiffToNow(oldMSTime));
|
||||
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " item templates in %u ms", _itemTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadItemTemplateAddon()
|
||||
@@ -3159,7 +3147,7 @@ void ObjectMgr::LoadItemScriptNames()
|
||||
|
||||
ItemTemplate const* ObjectMgr::GetItemTemplate(uint32 entry) const
|
||||
{
|
||||
return entry < _itemTemplateStore.size() ? _itemTemplateStore[entry].get() : nullptr;
|
||||
return Trinity::Containers::MapGetValuePtr(_itemTemplateStore, entry);
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadVehicleTemplateAccessories()
|
||||
@@ -4153,17 +4141,14 @@ void ObjectMgr::LoadQuests()
|
||||
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, QuestSessionBonus, "
|
||||
//107 108 109 110 111 112 113 114 115
|
||||
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog"
|
||||
" FROM quest_template ORDER BY ID DESC");
|
||||
" FROM quest_template");
|
||||
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;
|
||||
_questTemplates.reserve(result->GetRowCount());
|
||||
|
||||
// create multimap previous quest for each existed quest
|
||||
// some quests can have many previous maps set by NextQuestId in previous quest
|
||||
@@ -4172,11 +4157,10 @@ void ObjectMgr::LoadQuests()
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
std::unique_ptr<Quest> newQuest = std::make_unique<Quest>(fields);
|
||||
_questTemplates[newQuest->GetQuestId()] = std::move(newQuest);
|
||||
++count;
|
||||
if (newQuest->IsAutoPush())
|
||||
_questTemplatesAutoPush.push_back(newQuest.get()); // BROKEN BUT WILL BE FIXED IN THE REVERT CHERRY-PICK
|
||||
uint32 questId = fields[0].GetUInt32();
|
||||
auto itr = _questTemplates.emplace(std::piecewise_construct, std::forward_as_tuple(questId), std::forward_as_tuple(fields)).first;
|
||||
if (itr->second.IsAutoPush())
|
||||
_questTemplatesAutoPush.push_back(&itr->second);
|
||||
} while (result->NextRow());
|
||||
|
||||
struct QuestLoaderHelper
|
||||
@@ -4235,11 +4219,9 @@ void ObjectMgr::LoadQuests()
|
||||
Field* fields = result->Fetch();
|
||||
uint32 questId = fields[0].GetUInt32();
|
||||
|
||||
if (questId < _questTemplates.size() && _questTemplates[questId])
|
||||
{
|
||||
Quest* const quest = _questTemplates[questId].get();
|
||||
(quest->*loader.LoaderFunction)(fields);
|
||||
}
|
||||
auto itr = _questTemplates.find(questId);
|
||||
if (itr != _questTemplates.end())
|
||||
(itr->second.*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());
|
||||
@@ -4278,23 +4260,22 @@ void ObjectMgr::LoadQuests()
|
||||
uint32 questId = fields[2].GetUInt32();
|
||||
|
||||
// Do not throw error here because error for non existing quest is thrown while loading quest objectives. we do not need duplication
|
||||
Quest const* quest = GetQuestTemplate(questId);
|
||||
if (quest)
|
||||
const_cast<Quest*>(quest)->LoadQuestObjectiveVisualEffect(fields);
|
||||
auto itr = _questTemplates.find(questId);
|
||||
if (itr != _questTemplates.end())
|
||||
itr->second.LoadQuestObjectiveVisualEffect(fields);
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
std::map<uint32, uint32> usedMailTemplates;
|
||||
|
||||
// Post processing
|
||||
for (auto& qinfo : _questTemplates)
|
||||
for (auto& questPair : _questTemplates)
|
||||
{
|
||||
if (!qinfo)
|
||||
// skip post-loading checks for disabled quests
|
||||
if (DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, questPair.first, nullptr))
|
||||
continue;
|
||||
|
||||
// skip post-loading checks for disabled quests
|
||||
if (DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, qinfo->GetQuestId(), nullptr))
|
||||
continue;
|
||||
Quest* qinfo = &questPair.second;
|
||||
|
||||
// additional quest integrity checks (GO, creature_template and items must be loaded already)
|
||||
|
||||
@@ -4784,7 +4765,7 @@ void ObjectMgr::LoadQuests()
|
||||
|
||||
if (uint32 nextQuestInChain = qinfo->_nextQuestInChain)
|
||||
{
|
||||
if (nextQuestInChain >= _questTemplates.size() || !_questTemplates[nextQuestInChain])
|
||||
if (!_questTemplates.count(nextQuestInChain))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Quest %u has `NextQuestInChain` = %u but quest %u does not exist, quest chain will not work.",
|
||||
qinfo->GetQuestId(), qinfo->_nextQuestInChain, qinfo->_nextQuestInChain);
|
||||
@@ -4870,16 +4851,17 @@ void ObjectMgr::LoadQuests()
|
||||
// fill additional data stores
|
||||
if (uint32 prevQuestId = std::abs(qinfo->_prevQuestID))
|
||||
{
|
||||
if (prevQuestId >= _questTemplates.size() || !_questTemplates[prevQuestId])
|
||||
if (!_questTemplates.count(prevQuestId))
|
||||
TC_LOG_ERROR("sql.sql", "Quest %d has PrevQuestId %i, but no such quest", qinfo->GetQuestId(), qinfo->GetPrevQuestId());
|
||||
}
|
||||
|
||||
if (uint32 nextQuestId = qinfo->_nextQuestID)
|
||||
{
|
||||
if (nextQuestId >= _questTemplates.size() || !_questTemplates[nextQuestId])
|
||||
auto nextQuestItr = _questTemplates.find(nextQuestId);
|
||||
if (nextQuestItr == _questTemplates.end())
|
||||
TC_LOG_ERROR("sql.sql", "Quest %d has NextQuestId %u, but no such quest", qinfo->GetQuestId(), qinfo->_nextQuestID);
|
||||
else
|
||||
_questTemplates[nextQuestId]->DependentPreviousQuests.push_back(qinfo->GetQuestId());
|
||||
nextQuestItr->second.DependentPreviousQuests.push_back(qinfo->GetQuestId());
|
||||
}
|
||||
|
||||
if (qinfo->_exclusiveGroup)
|
||||
@@ -4921,7 +4903,7 @@ void ObjectMgr::LoadQuests()
|
||||
if (Quest const* quest = GetQuestTemplate(paragonReputation->QuestID))
|
||||
const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_REPEATABLE);
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u quests definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " quests definitions in %u ms", _questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadQuestStartersAndEnders()
|
||||
@@ -5474,14 +5456,9 @@ void ObjectMgr::LoadEventScripts()
|
||||
|
||||
std::set<uint32> evt_scripts;
|
||||
// Load all possible script entries from gameobjects
|
||||
for (auto const& gameObjectTemplate : _gameObjectTemplateStore)
|
||||
{
|
||||
if (!gameObjectTemplate)
|
||||
continue;
|
||||
|
||||
if (uint32 eventId = gameObjectTemplate->GetEventScriptId())
|
||||
for (auto const& gameObjectTemplatePair : _gameObjectTemplateStore)
|
||||
if (uint32 eventId = gameObjectTemplatePair.second.GetEventScriptId())
|
||||
evt_scripts.insert(eventId);
|
||||
}
|
||||
|
||||
// Load all possible script entries from spells
|
||||
for (SpellNameEntry const* spellNameEntry : sSpellNameStore)
|
||||
@@ -5899,14 +5876,14 @@ void ObjectMgr::LoadInstanceEncounters()
|
||||
if (sDB2Manager.GetMapDifficultyData(dungeonEncounter->MapID, Difficulty(difficulty->ID)))
|
||||
{
|
||||
DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR64(dungeonEncounter->MapID, difficulty->ID)];
|
||||
encounters.push_back(std::make_unique<DungeonEncounter>(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
|
||||
encounters.emplace_back(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR64(dungeonEncounter->MapID, dungeonEncounter->DifficultyID)];
|
||||
encounters.push_back(std::make_unique<DungeonEncounter>(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
|
||||
encounters.emplace_back(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon);
|
||||
}
|
||||
|
||||
++count;
|
||||
@@ -6438,7 +6415,7 @@ uint32 ObjectMgr::GetTaxiMountDisplayId(uint32 id, uint32 team, bool allowed_alt
|
||||
|
||||
Quest const* ObjectMgr::GetQuestTemplate(uint32 quest_id) const
|
||||
{
|
||||
return quest_id < _questTemplates.size() ? _questTemplates[quest_id].get() : nullptr;
|
||||
return Trinity::Containers::MapGetValuePtr(_questTemplates, quest_id);
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGraveyardZones()
|
||||
@@ -6709,10 +6686,7 @@ AreaTriggerStruct const* ObjectMgr::GetAreaTrigger(uint32 trigger) const
|
||||
|
||||
AccessRequirement const* ObjectMgr::GetAccessRequirement(uint32 mapid, Difficulty difficulty) const
|
||||
{
|
||||
AccessRequirementContainer::const_iterator itr = _accessRequirementStore.find(MAKE_PAIR64(mapid, difficulty));
|
||||
if (itr != _accessRequirementStore.end())
|
||||
return itr->second.get();
|
||||
return nullptr;
|
||||
return Trinity::Containers::MapGetValuePtr(_accessRequirementStore, MAKE_PAIR64(mapid, difficulty));
|
||||
}
|
||||
|
||||
bool ObjectMgr::AddGraveyardLink(uint32 id, uint32 zoneId, uint32 team, bool persist /*= true*/)
|
||||
@@ -6882,9 +6856,7 @@ void ObjectMgr::LoadAccessRequirements()
|
||||
|
||||
uint64 requirement_ID = MAKE_PAIR64(mapid, difficulty);
|
||||
|
||||
auto& ar = _accessRequirementStore[requirement_ID];
|
||||
ar = std::make_unique<AccessRequirement>();
|
||||
|
||||
AccessRequirement* ar = &_accessRequirementStore[requirement_ID];
|
||||
ar->levelMin = fields[2].GetUInt8();
|
||||
ar->levelMax = fields[3].GetUInt8();
|
||||
ar->item = fields[4].GetUInt32();
|
||||
@@ -7220,12 +7192,9 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
uint32 const maxdb2GameObjectId = sGameObjectsStore.GetNumRows();
|
||||
_gameObjectTemplateStore.resize(maxdb2GameObjectId + 1);
|
||||
for (GameObjectsEntry const* db2go : sGameObjectsStore)
|
||||
{
|
||||
_gameObjectTemplateStore[db2go->ID] = std::make_unique<GameObjectTemplate>();
|
||||
GameObjectTemplate& go = *_gameObjectTemplateStore[db2go->ID].get();
|
||||
GameObjectTemplate& go = _gameObjectTemplateStore[db2go->ID];
|
||||
go.entry = db2go->ID;
|
||||
go.type = db2go->TypeID;
|
||||
go.displayId = db2go->DisplayID;
|
||||
@@ -7245,7 +7214,7 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
"Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, Data24, Data25, Data26, Data27, Data28, "
|
||||
// 37 38 39 40 41 42 43 44
|
||||
"Data29, Data30, Data31, Data32, Data33, ContentTuningId, AIName, ScriptName "
|
||||
"FROM gameobject_template ORDER BY entry DESC");
|
||||
"FROM gameobject_template");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
@@ -7253,18 +7222,14 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 const maxGameObjectId = (*result)[0].GetUInt32();
|
||||
if (maxGameObjectId > maxdb2GameObjectId)
|
||||
_gameObjectTemplateStore.resize(maxGameObjectId + 1);
|
||||
uint32 count = 0;
|
||||
_gameObjectTemplateStore.reserve(result->GetRowCount());
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
|
||||
_gameObjectTemplateStore[entry] = std::make_unique<GameObjectTemplate>();
|
||||
GameObjectTemplate& got = *_gameObjectTemplateStore[entry].get();
|
||||
GameObjectTemplate& got = _gameObjectTemplateStore[entry];
|
||||
got.entry = entry;
|
||||
got.type = uint32(fields[1].GetUInt8());
|
||||
got.displayId = fields[2].GetUInt32();
|
||||
@@ -7435,12 +7400,9 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
CheckGOLinkedTrapId(&got, got.gatheringNode.linkedTrap, 20);
|
||||
break;
|
||||
}
|
||||
} while (result->NextRow());
|
||||
|
||||
++count;
|
||||
}
|
||||
while (result->NextRow());
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u game object templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " game object templates in %u ms", _gameObjectTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGameObjectTemplateAddons()
|
||||
@@ -7926,8 +7888,6 @@ void ObjectMgr::LoadQuestPOI()
|
||||
|
||||
_questPOIStore.clear(); // need for reload case
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
||||
QueryResult result = WorldDatabase.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, UiMapID, Priority, Flags, WorldEffectID, PlayerConditionID, NavigationPlayerConditionID, SpawnTrackingID, AlwaysAllowMergingBlobs FROM quest_poi order by QuestID, Idx1");
|
||||
if (!result)
|
||||
@@ -7988,7 +7948,6 @@ void ObjectMgr::LoadQuestPOI()
|
||||
poiData.QuestID = questID;
|
||||
poiData.Blobs.emplace_back(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapID, priority, flags,
|
||||
worldEffectID, playerConditionID, navigationPlayerConditionID, spawnTrackingID, std::move(*points), alwaysAllowMergingBlobs);
|
||||
++count;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -7997,7 +7956,7 @@ void ObjectMgr::LoadQuestPOI()
|
||||
|
||||
} while (result->NextRow());
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u quest POI definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " quest POI definitions in %u ms", _questPOIStore.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadNPCSpellClickSpells()
|
||||
@@ -8053,15 +8012,12 @@ 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
|
||||
for (auto const& creatureTemplate : _creatureTemplateStore)
|
||||
for (auto& creatureTemplatePair : _creatureTemplateStore)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
if ((creatureTemplate->npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(creatureTemplate->Entry) == _spellClickInfoStore.end())
|
||||
if ((creatureTemplatePair.second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && !_spellClickInfoStore.count(creatureTemplatePair.first))
|
||||
{
|
||||
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;
|
||||
TC_LOG_ERROR("sql.sql", "npc_spellclick_spells: Creature template %u has UNIT_NPC_FLAG_SPELLCLICK but no data in spellclick table! Removing flag", creatureTemplatePair.first);
|
||||
creatureTemplatePair.second.npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8120,7 +8076,7 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReve
|
||||
uint32 quest = result->Fetch()[1].GetUInt32();
|
||||
uint32 poolId = result->Fetch()[2].GetUInt32();
|
||||
|
||||
if (quest >= _questTemplates.size() || !_questTemplates[quest])
|
||||
if (!_questTemplates.count(quest))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Table `%s`: Quest %u listed for entry %u does not exist.", table.c_str(), quest, id);
|
||||
continue;
|
||||
@@ -8398,50 +8354,39 @@ void ObjectMgr::LoadGameObjectForQuests()
|
||||
uint32 count = 0;
|
||||
|
||||
// collect GO entries for GO that must activated
|
||||
for (auto const& gameObjectTemplate : _gameObjectTemplateStore)
|
||||
for (auto const& gameObjectTemplatePair : _gameObjectTemplateStore)
|
||||
{
|
||||
if (!gameObjectTemplate)
|
||||
continue;
|
||||
|
||||
switch (gameObjectTemplate->type)
|
||||
switch (gameObjectTemplatePair.second.type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_QUESTGIVER:
|
||||
_gameObjectForQuestStore.insert(gameObjectTemplate->entry);
|
||||
++count;
|
||||
break;
|
||||
case GAMEOBJECT_TYPE_CHEST:
|
||||
{
|
||||
// scan GO chest with loot including quest items
|
||||
uint32 lootId = gameObjectTemplate->GetLootId();
|
||||
uint32 lootId = gameObjectTemplatePair.second.GetLootId();
|
||||
// find quest loot for GO
|
||||
if (gameObjectTemplate->chest.questID || LootTemplates_Gameobject.HaveQuestLootFor(lootId))
|
||||
{
|
||||
_gameObjectForQuestStore.insert(gameObjectTemplate->entry);
|
||||
++count;
|
||||
}
|
||||
break;
|
||||
if (gameObjectTemplatePair.second.chest.questID || LootTemplates_Gameobject.HaveQuestLootFor(lootId))
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GENERIC:
|
||||
{
|
||||
if (gameObjectTemplate->generic.questID > 0) //quests objects
|
||||
{
|
||||
_gameObjectForQuestStore.insert(gameObjectTemplate->entry);
|
||||
++count;
|
||||
}
|
||||
break;
|
||||
if (gameObjectTemplatePair.second.generic.questID > 0) //quests objects
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GOOBER:
|
||||
{
|
||||
if (gameObjectTemplate->goober.questID > 0) //quests objects
|
||||
{
|
||||
_gameObjectForQuestStore.insert(gameObjectTemplate->entry);
|
||||
++count;
|
||||
}
|
||||
break;
|
||||
if (gameObjectTemplatePair.second.goober.questID > 0) //quests objects
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
_gameObjectForQuestStore.insert(gameObjectTemplatePair.first);
|
||||
++count;
|
||||
}
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u GameObjects for quests in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
@@ -9015,7 +8960,7 @@ void ObjectMgr::LoadCreatureTrainers()
|
||||
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " default trainers in %u ms", _creatureDefaultTrainers.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
uint32 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
|
||||
WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_NPC_VENDOR_REF);
|
||||
@@ -9544,16 +9489,13 @@ void ObjectMgr::LoadCreatureClassLevelStats()
|
||||
}
|
||||
while (result->NextRow());
|
||||
|
||||
for (auto const& creatureTemplate : _creatureTemplateStore)
|
||||
for (auto const& creatureTemplatePair : _creatureTemplateStore)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
std::pair<int16, int16> levels = creatureTemplate->GetMinMaxLevel();
|
||||
std::pair<int16, int16> levels = creatureTemplatePair.second.GetMinMaxLevel();
|
||||
for (int16 lvl = levels.first; lvl <= levels.second; ++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);
|
||||
if (!_creatureBaseStatsStore.count(MAKE_PAIR16(lvl, creatureTemplatePair.second.unit_class)))
|
||||
TC_LOG_ERROR("sql.sql", "Missing base stats for creature class %u level %u", creatureTemplatePair.second.unit_class, lvl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9980,7 +9922,7 @@ TerrainSwapInfo const* ObjectMgr::GetTerrainSwapInfo(uint32 terrainSwapId) const
|
||||
|
||||
GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry) const
|
||||
{
|
||||
return entry < _gameObjectTemplateStore.size() ? _gameObjectTemplateStore[entry].get() : nullptr;
|
||||
return Trinity::Containers::MapGetValuePtr(_gameObjectTemplateStore, entry);
|
||||
}
|
||||
|
||||
GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entry) const
|
||||
@@ -9994,12 +9936,12 @@ GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entr
|
||||
|
||||
CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry) const
|
||||
{
|
||||
return entry < _creatureTemplateStore.size() ? _creatureTemplateStore[entry].get() : nullptr;
|
||||
return Trinity::Containers::MapGetValuePtr(_creatureTemplateStore, entry);
|
||||
}
|
||||
|
||||
QuestPOIData const* ObjectMgr::GetQuestPOIData(int32 QuestID)
|
||||
QuestPOIData const* ObjectMgr::GetQuestPOIData(int32 questId)
|
||||
{
|
||||
return Trinity::Containers::MapGetValuePtr(_questPOIStore, QuestID);
|
||||
return Trinity::Containers::MapGetValuePtr(_questPOIStore, questId);
|
||||
}
|
||||
|
||||
VehicleTemplate const* ObjectMgr::GetVehicleTemplate(Vehicle* veh) const
|
||||
@@ -10351,21 +10293,18 @@ void ObjectMgr::InitializeQueriesData(QueryDataGroup mask)
|
||||
|
||||
// Initialize Query data for creatures
|
||||
if (mask & QUERY_DATA_CREATURES)
|
||||
for (auto const& creatureTemplate : _creatureTemplateStore)
|
||||
if (creatureTemplate)
|
||||
creatureTemplate->InitializeQueryData();
|
||||
for (auto& creatureTemplatePair : _creatureTemplateStore)
|
||||
creatureTemplatePair.second.InitializeQueryData();
|
||||
|
||||
// Initialize Query Data for gameobjects
|
||||
if (mask & QUERY_DATA_GAMEOBJECTS)
|
||||
for (auto const& gameObjectTemplate : _gameObjectTemplateStore)
|
||||
if (gameObjectTemplate)
|
||||
gameObjectTemplate->InitializeQueryData();
|
||||
for (auto& gameObjectTemplatePair : _gameObjectTemplateStore)
|
||||
gameObjectTemplatePair.second.InitializeQueryData();
|
||||
|
||||
// Initialize Query Data for quests
|
||||
if (mask & QUERY_DATA_QUESTS)
|
||||
for (auto const& questTemplate : _questTemplates)
|
||||
if (questTemplate)
|
||||
questTemplate->InitializeQueryData();
|
||||
for (auto& questTemplatePair : _questTemplates)
|
||||
questTemplatePair.second.InitializeQueryData();
|
||||
|
||||
// Initialize Quest POI data
|
||||
if (mask & QUERY_DATA_POIS)
|
||||
|
||||
@@ -170,7 +170,7 @@ struct GameTele
|
||||
std::wstring wnameLow;
|
||||
};
|
||||
|
||||
typedef std::unordered_map<uint32, GameTele > GameTeleContainer;
|
||||
typedef std::unordered_map<uint32, GameTele> GameTeleContainer;
|
||||
|
||||
enum ScriptsType
|
||||
{
|
||||
@@ -417,7 +417,7 @@ struct ScriptInfo
|
||||
};
|
||||
|
||||
typedef std::multimap<uint32, ScriptInfo> ScriptMap;
|
||||
typedef std::map<uint32, ScriptMap > ScriptMapMap;
|
||||
typedef std::map<uint32, ScriptMap> ScriptMapMap;
|
||||
typedef std::multimap<uint32 /*spell id*/, std::pair<uint32 /*script id*/, bool /*enabled*/>> SpellScriptsContainer;
|
||||
typedef std::pair<SpellScriptsContainer::iterator, SpellScriptsContainer::iterator> SpellScriptsBounds;
|
||||
TC_GAME_API extern ScriptMapMap sSpellScripts;
|
||||
@@ -495,7 +495,7 @@ struct TrinityString
|
||||
};
|
||||
|
||||
typedef std::map<ObjectGuid, ObjectGuid> LinkedRespawnContainer;
|
||||
typedef std::vector<std::unique_ptr<CreatureTemplate>> CreatureTemplateContainer;
|
||||
typedef std::unordered_map<uint32, 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;
|
||||
@@ -504,7 +504,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::vector<std::unique_ptr<GameObjectTemplate>> GameObjectTemplateContainer;
|
||||
typedef std::unordered_map<uint32, 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;
|
||||
@@ -515,7 +515,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::vector<std::unique_ptr<ItemTemplate>> ItemTemplateContainer;
|
||||
typedef std::unordered_map<uint32, ItemTemplate> ItemTemplateContainer;
|
||||
typedef std::unordered_map<uint32, QuestTemplateLocale> QuestTemplateLocaleContainer;
|
||||
typedef std::unordered_map<uint32, QuestObjectivesLocale> QuestObjectivesLocaleContainer;
|
||||
typedef std::unordered_map<uint32, QuestOfferRewardLocale> QuestOfferRewardLocaleContainer;
|
||||
@@ -935,7 +935,7 @@ struct DungeonEncounter
|
||||
uint32 lastEncounterDungeon;
|
||||
};
|
||||
|
||||
typedef std::vector<std::unique_ptr<DungeonEncounter const>> DungeonEncounterList;
|
||||
typedef std::vector<DungeonEncounter> DungeonEncounterList;
|
||||
typedef std::unordered_map<uint64, DungeonEncounterList> DungeonEncounterContainer;
|
||||
|
||||
struct TerrainSwapInfo
|
||||
@@ -1010,14 +1010,14 @@ class TC_GAME_API ObjectMgr
|
||||
|
||||
static ObjectMgr* instance();
|
||||
|
||||
typedef std::vector<std::unique_ptr<Quest>> QuestContainer;
|
||||
typedef std::unordered_map<uint32, Quest> QuestContainer;
|
||||
typedef std::unordered_map<uint32 /*questObjectiveId*/, QuestObjective const*> QuestObjectivesByIdContainer;
|
||||
|
||||
typedef std::unordered_map<uint32, AreaTriggerStruct> AreaTriggerContainer;
|
||||
|
||||
typedef std::unordered_map<uint32, uint32> AreaTriggerScriptContainer;
|
||||
|
||||
typedef std::unordered_map<uint64, std::unique_ptr<AccessRequirement>> AccessRequirementContainer;
|
||||
typedef std::unordered_map<uint64, AccessRequirement> AccessRequirementContainer;
|
||||
|
||||
typedef std::unordered_map<uint32, RepRewardRate > RepRewardRateContainer;
|
||||
typedef std::unordered_map<uint32, ReputationOnKillEntry> RepOnKillContainer;
|
||||
@@ -1031,7 +1031,7 @@ class TC_GAME_API ObjectMgr
|
||||
|
||||
GameObjectTemplate const* GetGameObjectTemplate(uint32 entry) const;
|
||||
GameObjectTemplateContainer const& GetGameObjectTemplates() const { return _gameObjectTemplateStore; }
|
||||
uint32 LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32> *skip_vendors);
|
||||
uint32 LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32>* skip_vendors);
|
||||
|
||||
void LoadGameObjectTemplate();
|
||||
void LoadGameObjectTemplateAddons();
|
||||
@@ -1170,7 +1170,7 @@ class TC_GAME_API ObjectMgr
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QuestPOIData const* GetQuestPOIData(int32 QuestID);
|
||||
QuestPOIData const* GetQuestPOIData(int32 questId);
|
||||
|
||||
VehicleTemplate const* GetVehicleTemplate(Vehicle* veh) const;
|
||||
VehicleAccessoryList const* GetVehicleAccessoryList(Vehicle* veh) const;
|
||||
|
||||
@@ -2366,17 +2366,14 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa
|
||||
// Disable all old-faction specific quests
|
||||
{
|
||||
ObjectMgr::QuestContainer const& questTemplates = sObjectMgr->GetQuestTemplates();
|
||||
for (auto const& quest : questTemplates)
|
||||
for (auto const& questTemplatePair : questTemplates)
|
||||
{
|
||||
if (!quest)
|
||||
continue;
|
||||
|
||||
uint64 newRaceMask = (newTeamId == TEAM_ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE;
|
||||
if (quest->GetAllowableRaces().RawValue != uint64(-1) && !(quest->GetAllowableRaces().RawValue & newRaceMask))
|
||||
if (questTemplatePair.second.GetAllowableRaces().RawValue != uint64(-1) && !(questTemplatePair.second.GetAllowableRaces().RawValue & newRaceMask))
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST);
|
||||
stmt->setUInt64(0, lowGuid);
|
||||
stmt->setUInt32(1, quest->GetQuestId());
|
||||
stmt->setUInt32(1, questTemplatePair.first);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -772,14 +772,14 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi
|
||||
|
||||
for (auto const& encounter : *encounters)
|
||||
{
|
||||
if (encounter->creditType == type && encounter->creditEntry == creditEntry)
|
||||
if (encounter.creditType == type && encounter.creditEntry == creditEntry)
|
||||
{
|
||||
completedEncounters |= 1 << encounter->dbcEntry->Bit;
|
||||
if (encounter->lastEncounterDungeon)
|
||||
completedEncounters |= 1 << encounter.dbcEntry->Bit;
|
||||
if (encounter.lastEncounterDungeon)
|
||||
{
|
||||
dungeonId = encounter->lastEncounterDungeon;
|
||||
dungeonId = encounter.lastEncounterDungeon;
|
||||
TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u",
|
||||
instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name[sWorld->GetDefaultDbcLocale()], dungeonId);
|
||||
instance->GetMapName(), instance->GetInstanceId(), encounter.dbcEntry->Name[sWorld->GetDefaultDbcLocale()], dungeonId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,15 +792,12 @@ void LoadLootTemplates_Creature()
|
||||
|
||||
// Remove real entries and check loot existence
|
||||
CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
|
||||
for (auto const& creatureTemplate : ctc)
|
||||
for (auto const& creatureTemplatePair : ctc)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
if (uint32 lootid = creatureTemplate->lootid)
|
||||
if (uint32 lootid = creatureTemplatePair.second.lootid)
|
||||
{
|
||||
if (lootIdSet.find(lootid) == lootIdSet.end())
|
||||
LootTemplates_Creature.ReportNonExistingId(lootid, "Creature", creatureTemplate->Entry);
|
||||
if (!lootIdSet.count(lootid))
|
||||
LootTemplates_Creature.ReportNonExistingId(lootid, "Creature", creatureTemplatePair.first);
|
||||
else
|
||||
lootIdSetUsed.insert(lootid);
|
||||
}
|
||||
@@ -885,15 +882,12 @@ void LoadLootTemplates_Gameobject()
|
||||
|
||||
// remove real entries and check existence loot
|
||||
GameObjectTemplateContainer const& gotc = sObjectMgr->GetGameObjectTemplates();
|
||||
for (auto const& gameObjectTemplate : gotc)
|
||||
for (auto const& gameObjectTemplatePair : gotc)
|
||||
{
|
||||
if (!gameObjectTemplate)
|
||||
continue;
|
||||
|
||||
if (uint32 lootid = gameObjectTemplate->GetLootId())
|
||||
if (uint32 lootid = gameObjectTemplatePair.second.GetLootId())
|
||||
{
|
||||
if (lootIdSet.find(lootid) == lootIdSet.end())
|
||||
LootTemplates_Gameobject.ReportNonExistingId(lootid, "Gameobject", gameObjectTemplate->entry);
|
||||
if (!lootIdSet.count(lootid))
|
||||
LootTemplates_Gameobject.ReportNonExistingId(lootid, "Gameobject", gameObjectTemplatePair.first);
|
||||
else
|
||||
lootIdSetUsed.insert(lootid);
|
||||
}
|
||||
@@ -922,14 +916,9 @@ void LoadLootTemplates_Item()
|
||||
|
||||
// remove real entries and check existence loot
|
||||
ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
|
||||
for (auto const& itemTemplate : its)
|
||||
{
|
||||
if (!itemTemplate)
|
||||
continue;
|
||||
|
||||
if (lootIdSet.find(itemTemplate->GetId()) != lootIdSet.end() && (itemTemplate->GetFlags() & ITEM_FLAG_HAS_LOOT))
|
||||
lootIdSet.erase(itemTemplate->GetId());
|
||||
}
|
||||
for (auto const& itemTemplatePair : its)
|
||||
if (lootIdSet.count(itemTemplatePair.first) > 0 && (itemTemplatePair.second.GetFlags() & ITEM_FLAG_HAS_LOOT))
|
||||
lootIdSet.erase(itemTemplatePair.first);
|
||||
|
||||
// output error for any still listed (not referenced from appropriate table) ids
|
||||
LootTemplates_Item.ReportUnusedIds(lootIdSet);
|
||||
@@ -951,13 +940,13 @@ void LoadLootTemplates_Milling()
|
||||
|
||||
// remove real entries and check existence loot
|
||||
ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
|
||||
for (auto const& itemTemplate : its)
|
||||
for (auto const& itemTemplatePair : its)
|
||||
{
|
||||
if (!itemTemplate || !(itemTemplate->GetFlags() & ITEM_FLAG_IS_MILLABLE))
|
||||
if (!(itemTemplatePair.second.GetFlags() & ITEM_FLAG_IS_MILLABLE))
|
||||
continue;
|
||||
|
||||
if (lootIdSet.find(itemTemplate->GetId()) != lootIdSet.end())
|
||||
lootIdSet.erase(itemTemplate->GetId());
|
||||
if (lootIdSet.count(itemTemplatePair.first) > 0)
|
||||
lootIdSet.erase(itemTemplatePair.first);
|
||||
}
|
||||
|
||||
// output error for any still listed (not referenced from appropriate table) ids
|
||||
@@ -980,15 +969,12 @@ void LoadLootTemplates_Pickpocketing()
|
||||
|
||||
// Remove real entries and check loot existence
|
||||
CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
|
||||
for (auto const& creatureTemplate : ctc)
|
||||
for (auto const& creatureTemplatePair : ctc)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
if (uint32 lootid = creatureTemplate->pickpocketLootId)
|
||||
if (uint32 lootid = creatureTemplatePair.second.pickpocketLootId)
|
||||
{
|
||||
if (lootIdSet.find(lootid) == lootIdSet.end())
|
||||
LootTemplates_Pickpocketing.ReportNonExistingId(lootid, "Creature", creatureTemplate->Entry);
|
||||
if (!lootIdSet.count(lootid))
|
||||
LootTemplates_Pickpocketing.ReportNonExistingId(lootid, "Creature", creatureTemplatePair.first);
|
||||
else
|
||||
lootIdSetUsed.insert(lootid);
|
||||
}
|
||||
@@ -1017,13 +1003,13 @@ void LoadLootTemplates_Prospecting()
|
||||
|
||||
// remove real entries and check existence loot
|
||||
ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
|
||||
for (auto const& itemTemplate : its)
|
||||
for (auto const& itemTemplatePair : its)
|
||||
{
|
||||
if (!itemTemplate || !(itemTemplate->GetFlags() & ITEM_FLAG_IS_PROSPECTABLE))
|
||||
if (!(itemTemplatePair.second.GetFlags() & ITEM_FLAG_IS_PROSPECTABLE))
|
||||
continue;
|
||||
|
||||
if (lootIdSet.find(itemTemplate->GetId()) != lootIdSet.end())
|
||||
lootIdSet.erase(itemTemplate->GetId());
|
||||
if (lootIdSet.count(itemTemplatePair.first) > 0)
|
||||
lootIdSet.erase(itemTemplatePair.first);
|
||||
}
|
||||
|
||||
// output error for any still listed (not referenced from appropriate table) ids
|
||||
@@ -1070,15 +1056,12 @@ void LoadLootTemplates_Skinning()
|
||||
|
||||
// remove real entries and check existence loot
|
||||
CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
|
||||
for (auto const& creatureTemplate : ctc)
|
||||
for (auto const& creatureTemplatePair : ctc)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
if (uint32 lootid = creatureTemplate->SkinLootId)
|
||||
if (uint32 lootid = creatureTemplatePair.second.SkinLootId)
|
||||
{
|
||||
if (lootIdSet.find(lootid) == lootIdSet.end())
|
||||
LootTemplates_Skinning.ReportNonExistingId(lootid, "Creature", creatureTemplate->Entry);
|
||||
if (!lootIdSet.count(lootid))
|
||||
LootTemplates_Skinning.ReportNonExistingId(lootid, "Creature", creatureTemplatePair.first);
|
||||
else
|
||||
lootIdSetUsed.insert(lootid);
|
||||
}
|
||||
|
||||
@@ -178,12 +178,9 @@ public:
|
||||
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
|
||||
|
||||
CreatureTemplateContainer const& ctc = sObjectMgr->GetCreatureTemplates();
|
||||
for (auto const& creatureTemplate : ctc)
|
||||
for (auto const& creatureTemplatePair : ctc)
|
||||
{
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
uint32 id = creatureTemplate->Entry;
|
||||
uint32 id = creatureTemplatePair.first;
|
||||
uint8 localeIndex = handler->GetSessionDbLocaleIndex();
|
||||
if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(id))
|
||||
{
|
||||
@@ -212,7 +209,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
std::string const& name = creatureTemplate->Name;
|
||||
std::string const& name = creatureTemplatePair.second.Name;
|
||||
if (name.empty())
|
||||
continue;
|
||||
|
||||
@@ -416,9 +413,9 @@ public:
|
||||
|
||||
// Search in ItemSparse
|
||||
ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
|
||||
for (auto const& itemTemplate : its)
|
||||
for (auto const& itemTemplatePair : its)
|
||||
{
|
||||
std::string name = itemTemplate->GetName(handler->GetSessionDbcLocale());
|
||||
std::string name = itemTemplatePair.second.GetName(handler->GetSessionDbcLocale());
|
||||
if (name.empty())
|
||||
continue;
|
||||
|
||||
@@ -431,9 +428,9 @@ public:
|
||||
}
|
||||
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate->GetId(), itemTemplate->GetId(), name.c_str());
|
||||
handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplatePair.first, itemTemplatePair.first, name.c_str());
|
||||
else
|
||||
handler->PSendSysMessage(LANG_ITEM_LIST_CONSOLE, itemTemplate->GetId(), name.c_str());
|
||||
handler->PSendSysMessage(LANG_ITEM_LIST_CONSOLE, itemTemplatePair.first, name.c_str());
|
||||
|
||||
if (!found)
|
||||
found = true;
|
||||
@@ -536,13 +533,10 @@ public:
|
||||
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
|
||||
|
||||
GameObjectTemplateContainer const& gotc = sObjectMgr->GetGameObjectTemplates();
|
||||
for (auto const& gameObjectTemplate : gotc)
|
||||
for (auto const& gameObjectTemplatePair : gotc)
|
||||
{
|
||||
if (!gameObjectTemplate)
|
||||
continue;
|
||||
|
||||
uint8 localeIndex = handler->GetSessionDbLocaleIndex();
|
||||
if (GameObjectLocale const* objectLocalte = sObjectMgr->GetGameObjectLocale(gameObjectTemplate->entry))
|
||||
if (GameObjectLocale const* objectLocalte = sObjectMgr->GetGameObjectLocale(gameObjectTemplatePair.first))
|
||||
{
|
||||
if (objectLocalte->Name.size() > localeIndex && !objectLocalte->Name[localeIndex].empty())
|
||||
{
|
||||
@@ -556,9 +550,9 @@ public:
|
||||
}
|
||||
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, gameObjectTemplate->entry, gameObjectTemplate->entry, name.c_str());
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, gameObjectTemplatePair.first, gameObjectTemplatePair.first, name.c_str());
|
||||
else
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, gameObjectTemplate->entry, name.c_str());
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, gameObjectTemplatePair.first, name.c_str());
|
||||
|
||||
if (!found)
|
||||
found = true;
|
||||
@@ -568,7 +562,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
std::string const& name = gameObjectTemplate->name;
|
||||
std::string const& name = gameObjectTemplatePair.second.name;
|
||||
if (name.empty())
|
||||
continue;
|
||||
|
||||
@@ -581,9 +575,9 @@ public:
|
||||
}
|
||||
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, gameObjectTemplate->entry, gameObjectTemplate->entry, name.c_str());
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, gameObjectTemplatePair.first, gameObjectTemplatePair.first, name.c_str());
|
||||
else
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, gameObjectTemplate->entry, name.c_str());
|
||||
handler->PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, gameObjectTemplatePair.first, name.c_str());
|
||||
|
||||
if (!found)
|
||||
found = true;
|
||||
@@ -618,16 +612,13 @@ public:
|
||||
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
|
||||
|
||||
ObjectMgr::QuestContainer const& questTemplates = sObjectMgr->GetQuestTemplates();
|
||||
for (auto const& qInfo : questTemplates)
|
||||
for (auto const& questTemplatePair : questTemplates)
|
||||
{
|
||||
if (!qInfo)
|
||||
continue;
|
||||
|
||||
uint8 localeIndex = handler->GetSessionDbLocaleIndex();
|
||||
if (localeIndex >= 0)
|
||||
{
|
||||
uint8 ulocaleIndex = uint8(localeIndex);
|
||||
if (QuestTemplateLocale const* questLocale = sObjectMgr->GetQuestLocale(qInfo->GetQuestId()))
|
||||
if (QuestTemplateLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplatePair.first))
|
||||
{
|
||||
if (questLocale->LogTitle.size() > ulocaleIndex && !questLocale->LogTitle[ulocaleIndex].empty())
|
||||
{
|
||||
@@ -645,9 +636,7 @@ public:
|
||||
|
||||
if (target)
|
||||
{
|
||||
QuestStatus status = target->GetQuestStatus(qInfo->GetQuestId());
|
||||
|
||||
switch (status)
|
||||
switch (target->GetQuestStatus(questTemplatePair.first))
|
||||
{
|
||||
case QUEST_STATUS_COMPLETE:
|
||||
statusStr = handler->GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
|
||||
@@ -666,22 +655,22 @@ public:
|
||||
if (handler->GetSession())
|
||||
{
|
||||
int32 maxLevel = 0;
|
||||
if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(qInfo->GetContentTuningId(),
|
||||
if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(questTemplatePair.second.GetContentTuningId(),
|
||||
handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask))
|
||||
maxLevel = questLevels->MaxLevel;
|
||||
|
||||
int32 scalingFactionGroup = 0;
|
||||
if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(qInfo->GetContentTuningId()))
|
||||
if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(questTemplatePair.second.GetContentTuningId()))
|
||||
scalingFactionGroup = contentTuning->GetScalingFactionGroup();
|
||||
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CHAT, qInfo->GetQuestId(), qInfo->GetQuestId(),
|
||||
handler->GetSession()->GetPlayer()->GetQuestLevel(qInfo.get()),
|
||||
handler->GetSession()->GetPlayer()->GetQuestMinLevel(qInfo.get()),
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CHAT, questTemplatePair.first, questTemplatePair.first,
|
||||
handler->GetSession()->GetPlayer()->GetQuestLevel(&questTemplatePair.second),
|
||||
handler->GetSession()->GetPlayer()->GetQuestMinLevel(&questTemplatePair.second),
|
||||
maxLevel, scalingFactionGroup,
|
||||
title.c_str(), statusStr);
|
||||
}
|
||||
else
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CONSOLE, qInfo->GetQuestId(), title.c_str(), statusStr);
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CONSOLE, questTemplatePair.first, title.c_str(), statusStr);
|
||||
|
||||
if (!found)
|
||||
found = true;
|
||||
@@ -692,7 +681,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
std::string title = qInfo->GetLogTitle();
|
||||
std::string title = questTemplatePair.second.GetLogTitle();
|
||||
if (title.empty())
|
||||
continue;
|
||||
|
||||
@@ -708,9 +697,7 @@ public:
|
||||
|
||||
if (target)
|
||||
{
|
||||
QuestStatus status = target->GetQuestStatus(qInfo->GetQuestId());
|
||||
|
||||
switch (status)
|
||||
switch (target->GetQuestStatus(questTemplatePair.first))
|
||||
{
|
||||
case QUEST_STATUS_COMPLETE:
|
||||
statusStr = handler->GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
|
||||
@@ -729,22 +716,22 @@ public:
|
||||
if (handler->GetSession())
|
||||
{
|
||||
int32 maxLevel = 0;
|
||||
if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(qInfo->GetContentTuningId(),
|
||||
if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(questTemplatePair.second.GetContentTuningId(),
|
||||
handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask))
|
||||
maxLevel = questLevels->MaxLevel;
|
||||
|
||||
int32 scalingFactionGroup = 0;
|
||||
if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(qInfo->GetContentTuningId()))
|
||||
if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(questTemplatePair.second.GetContentTuningId()))
|
||||
scalingFactionGroup = contentTuning->GetScalingFactionGroup();
|
||||
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CHAT, qInfo->GetQuestId(), qInfo->GetQuestId(),
|
||||
handler->GetSession()->GetPlayer()->GetQuestLevel(qInfo.get()),
|
||||
handler->GetSession()->GetPlayer()->GetQuestMinLevel(qInfo.get()),
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CHAT, questTemplatePair.first, questTemplatePair.first,
|
||||
handler->GetSession()->GetPlayer()->GetQuestLevel(&questTemplatePair.second),
|
||||
handler->GetSession()->GetPlayer()->GetQuestMinLevel(&questTemplatePair.second),
|
||||
maxLevel, scalingFactionGroup,
|
||||
title.c_str(), statusStr);
|
||||
}
|
||||
else
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CONSOLE, qInfo->GetQuestId(), title.c_str(), statusStr);
|
||||
handler->PSendSysMessage(LANG_QUEST_LIST_CONSOLE, questTemplatePair.first, title.c_str(), statusStr);
|
||||
|
||||
if (!found)
|
||||
found = true;
|
||||
|
||||
@@ -1440,24 +1440,24 @@ public:
|
||||
|
||||
bool found = false;
|
||||
ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
|
||||
for (auto const& itemTemplate : its)
|
||||
for (auto const& itemTemplatePair : its)
|
||||
{
|
||||
if (!itemTemplate || itemTemplate->GetItemSet() != itemSetId)
|
||||
if (itemTemplatePair.second.GetItemSet() != itemSetId)
|
||||
continue;
|
||||
|
||||
found = true;
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemTemplate->GetId(), 1);
|
||||
InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemTemplatePair.first, 1);
|
||||
if (msg == EQUIP_ERR_OK)
|
||||
{
|
||||
std::vector<int32> bonusListIDsForItem = bonusListIDs; // copy, bonuses for each depending on context might be different for each item
|
||||
if (itemContext != ItemContext::NONE && itemContext < ItemContext::Max)
|
||||
{
|
||||
std::set<uint32> contextBonuses = sDB2Manager.GetDefaultItemBonusTree(itemTemplate->GetId(), itemContext);
|
||||
std::set<uint32> contextBonuses = sDB2Manager.GetDefaultItemBonusTree(itemTemplatePair.first, itemContext);
|
||||
bonusListIDsForItem.insert(bonusListIDsForItem.begin(), contextBonuses.begin(), contextBonuses.end());
|
||||
}
|
||||
|
||||
Item* item = playerTarget->StoreNewItem(dest, itemTemplate->GetId(), true, {}, GuidSet(), itemContext, bonusListIDsForItem);
|
||||
Item* item = playerTarget->StoreNewItem(dest, itemTemplatePair.first, true, {}, GuidSet(), itemContext, bonusListIDsForItem);
|
||||
|
||||
// remove binding (let GM give it to another player later)
|
||||
if (player == playerTarget)
|
||||
@@ -1469,8 +1469,8 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
player->SendEquipError(msg, nullptr, nullptr, itemTemplate->GetId());
|
||||
handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemTemplate->GetId(), 1);
|
||||
player->SendEquipError(msg, nullptr, nullptr, itemTemplatePair.first);
|
||||
handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemTemplatePair.first, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -84,12 +84,12 @@ public:
|
||||
ItemTemplateContainer const& itc = sObjectMgr->GetItemTemplateStore();
|
||||
auto itr = std::find_if(std::begin(itc), std::end(itc), [quest](ItemTemplateContainer::value_type const& value)
|
||||
{
|
||||
return value && value->GetStartQuest() == quest->GetQuestId();
|
||||
return value.second.GetStartQuest() == quest->GetQuestId();
|
||||
});
|
||||
|
||||
if (itr != std::end(itc))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, (*itr)->GetId());
|
||||
handler->PSendSysMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, itr->first);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user