diff options
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 149 |
1 files changed, 69 insertions, 80 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b033d6b7896..b1bf17ec7d7 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -53,6 +53,7 @@ #include "Random.h" #include "ReputationMgr.h" #include "ScriptMgr.h" +#include "ScriptReloadMgr.h" #include "SpellInfo.h" #include "SpellMgr.h" #include "SpellScript.h" @@ -64,6 +65,7 @@ #include "World.h" #include <G3D/g3dmath.h> #include <numeric> +#include <limits> ScriptMapMap sSpellScripts; ScriptMapMap sEventScripts; @@ -9492,16 +9494,39 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, VendorItem const& vItem, return true; } +ObjectMgr::ScriptNameContainer::ScriptNameContainer() +{ + // We insert an empty placeholder here so we can use the + // script id 0 as dummy for "no script found". + uint32 const id = insert("", false); + + ASSERT(id == 0); + (void)id; +} + void ObjectMgr::ScriptNameContainer::reserve(size_t capacity) { IndexToName.reserve(capacity); } -void ObjectMgr::ScriptNameContainer::insert(std::string&& scriptName) +uint32 ObjectMgr::ScriptNameContainer::insert(std::string const& scriptName, bool isScriptNameBound) { - auto insertResult = NameToIndex.insert({ std::move(scriptName), NameToIndex.size() }); - if (insertResult.second) - IndexToName.push_back(insertResult.first); + // c++17 try_emplace + auto const itr = NameToIndex.find(scriptName); + if (itr != NameToIndex.end()) + { + return itr->second.Id; + } + else + { + ASSERT(NameToIndex.size() < std::numeric_limits<uint32>::max()); + uint32 const id = static_cast<uint32>(NameToIndex.size()); + + auto result = NameToIndex.insert({ scriptName, Entry{ id, isScriptNameBound } }); + IndexToName.emplace_back(result.first); + + return id; + } } size_t ObjectMgr::ScriptNameContainer::size() const @@ -9509,111 +9534,75 @@ size_t ObjectMgr::ScriptNameContainer::size() const return IndexToName.size(); } -std::string const& ObjectMgr::ScriptNameContainer::operator[](size_t index) const +ObjectMgr::ScriptNameContainer::NameMap::const_iterator ObjectMgr::ScriptNameContainer::find(size_t index) const { - static std::string const empty; - return index < IndexToName.size() ? IndexToName[index]->first : empty; + return index < IndexToName.size() ? IndexToName[index] : end(); } -uint32 ObjectMgr::ScriptNameContainer::operator[](std::string const& name) const +ObjectMgr::ScriptNameContainer::NameMap::const_iterator ObjectMgr::ScriptNameContainer::find(std::string const& name) const { // assume "" is the first element if (name.empty()) - return 0; + return end(); - if (uint32 const* id = Trinity::Containers::MapGetValuePtr(NameToIndex, name)) - return *id; + return NameToIndex.find(name); +} - return 0; +ObjectMgr::ScriptNameContainer::NameMap::const_iterator ObjectMgr::ScriptNameContainer::end() const +{ + return NameToIndex.end(); } -std::unordered_set<std::string> ObjectMgr::ScriptNameContainer::GetAllScriptNames() const +std::unordered_set<std::string> ObjectMgr::ScriptNameContainer::GetAllDBScriptNames() const { std::unordered_set<std::string> scriptNames; - std::transform(NameToIndex.begin(), NameToIndex.end(), std::inserter(scriptNames, scriptNames.end()), - [](std::pair<std::string const, uint32> const& pair) + + for (std::pair<std::string const, Entry> const& entry : NameToIndex) { - return pair.first; - }); + if (entry.second.IsScriptDatabaseBound) + { + scriptNames.insert(entry.first); + } + } return scriptNames; } -void ObjectMgr::LoadScriptNames() +std::unordered_set<std::string> ObjectMgr::GetAllDBScriptNames() const { - uint32 oldMSTime = getMSTime(); - - // We insert an empty placeholder here so we can use the - // script id 0 as dummy for "no script found". - _scriptNamesStore.insert(""); - - QueryResult result = WorldDatabase.Query( - "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM conversation_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM creature WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM criteria_data WHERE ScriptName <> '' AND type = 11 " - "UNION " - "SELECT DISTINCT(ScriptName) FROM gameobject WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM item_script_names WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM areatrigger_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM scene_template WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(ScriptName) FROM quest_template_addon WHERE ScriptName <> '' " - "UNION " - "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''"); + return _scriptNamesStore.GetAllDBScriptNames(); +} - if (!result) +std::string const& ObjectMgr::GetScriptName(uint32 id) const +{ + auto const itr = _scriptNamesStore.find(id); + if (itr != _scriptNamesStore.end()) { - TC_LOG_INFO("server.loading", ">> Loaded empty set of Script Names!"); - return; + return itr->first; } - - _scriptNamesStore.reserve(result->GetRowCount() + 1); - - do + else { - _scriptNamesStore.insert((*result)[0].GetString()); + static std::string const empty; + return empty; } - while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " ScriptNames in %u ms", _scriptNamesStore.size(), GetMSTimeDiffToNow(oldMSTime)); -} - -std::unordered_set<std::string> ObjectMgr::GetAllScriptNames() const -{ - return _scriptNamesStore.GetAllScriptNames(); } -std::string const& ObjectMgr::GetScriptName(uint32 id) const +bool ObjectMgr::IsScriptDatabaseBound(uint32 id) const { - return _scriptNamesStore[id]; + auto const itr = _scriptNamesStore.find(id); + if (itr != _scriptNamesStore.end()) + { + return itr->second.IsScriptDatabaseBound; + } + else + { + return false; + } } -uint32 ObjectMgr::GetScriptId(std::string const& name) +uint32 ObjectMgr::GetScriptId(std::string const& name, bool isDatabaseBound) { - return _scriptNamesStore[name]; + return _scriptNamesStore.insert(name, isDatabaseBound); } CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint8 level, uint8 unitClass) |