aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp149
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)