aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaios <naios-dev@live.de>2016-04-12 15:42:16 +0200
committerNaios <naios-dev@live.de>2016-04-12 15:42:16 +0200
commit410cf0dd05e2765cf7806a9165f976a2bcc199d2 (patch)
tree2b73822b6accd8a91eacc19036d749504c784120
parent131ef5f2d682763e301102047f2f0118c88ac42d (diff)
Core/Scripting: Fix loading of spell/aurascripts
* Broken since 9cc97f226d * There is still a crash when using lazy unloading which I will fix in a later commit (this commit should fix at least the static build and normal usage of the dynamic build). * Closes #16948
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp11
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp30
3 files changed, 29 insertions, 14 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 3513b5d97b8..3efeb1ca273 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -5222,7 +5222,10 @@ void ObjectMgr::ValidateSpellScripts()
spellScript->_Register();
if (!spellScript->_Validate(spellEntry))
+ {
itr->second.second = false;
+ continue;
+ }
}
if (auraScript)
@@ -5231,9 +5234,17 @@ void ObjectMgr::ValidateSpellScripts()
auraScript->_Register();
if (!auraScript->_Validate(spellEntry))
+ {
itr->second.second = false;
+ continue;
+ }
}
+
+ // Enable the script when all checks passed
+ itr->second.second = true;
}
+ else
+ itr->second.second = false;
}
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index b59aa5a8d98..576a8d2ccac 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -370,7 +370,7 @@ struct ScriptInfo
typedef std::multimap<uint32, ScriptInfo> ScriptMap;
typedef std::map<uint32, ScriptMap > ScriptMapMap;
-typedef std::multimap<uint32 /*spell id*/, std::pair<uint32 /*script id*/, bool /*disabled*/>> SpellScriptsContainer;
+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;
TC_GAME_API extern ScriptMapMap sEventScripts;
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 99dc7a54735..63c4b69f3e9 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -296,7 +296,7 @@ public:
virtual void BeforeReleaseContext(std::string const& /*context*/) { }
/// Called before SwapContext
- virtual void BeforeSwapContext() { }
+ virtual void BeforeSwapContext(bool /*initialize*/) { }
/// Called before Unload
virtual void BeforeUnload() { }
@@ -482,8 +482,12 @@ public:
ids_removed_.insert(ids_to_remove.begin(), ids_to_remove.end());
}
- void BeforeSwapContext() final override
+ void BeforeSwapContext(bool initialize) override
{
+ // Never swap creature or gameobject scripts when initializing
+ if (initialize)
+ return;
+
// Add the recently added scripts to the deleted scripts to replace
// default AI's with recently added core scripts.
ids_removed_.insert(static_cast<Base*>(this)->GetRecentlyAddedScriptIDs().begin(),
@@ -566,9 +570,10 @@ public:
}
}
- void BeforeSwapContext() final override
+ void BeforeSwapContext(bool initialize) override
{
- if (swapped)
+ // Never swap outdoor pvp scripts when initializing
+ if ((!initialize) && swapped)
{
sOutdoorPvPMgr->InitOutdoorPvP();
swapped = false;
@@ -599,7 +604,7 @@ public:
swapped = true;
}
- void BeforeSwapContext() final override
+ void BeforeSwapContext(bool initialize) override
{
swapped = false;
}
@@ -629,7 +634,7 @@ public:
swapped = true;
}
- void BeforeSwapContext() final override
+ void BeforeSwapContext(bool initialize) override
{
if (swapped)
{
@@ -683,8 +688,7 @@ public:
void SwapContext(bool initialize) final override
{
- if (!initialize)
- this->BeforeSwapContext();
+ this->BeforeSwapContext(initialize);
_recently_added_ids.clear();
}
@@ -813,7 +817,7 @@ public:
ChatHandler::invalidateCommandTable();
}
- void BeforeSwapContext() final override
+ void BeforeSwapContext(bool /*initialize*/) override
{
ChatHandler::invalidateCommandTable();
}
@@ -846,9 +850,9 @@ public:
_scripts.erase(context);
}
- void SwapContext(bool) final override
+ void SwapContext(bool initialize) final override
{
- this->BeforeSwapContext();
+ this->BeforeSwapContext(initialize);
}
void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
@@ -1158,10 +1162,10 @@ void CreateSpellOrAuraScripts(uint32 spellId, std::list<T*>& scriptVector, F&& e
for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
{
// When the script is disabled continue with the next one
- if (itr->second.second)
+ if (!itr->second.second)
continue;
- SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::Instance()->GetScriptById(itr->second.first);
+ SpellScriptLoader* tmpscript = sScriptMgr->GetSpellScriptLoader(itr->second.first);
if (!tmpscript)
continue;