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
This commit is contained in:
Naios authored and Aokromes committed 2016-08-10 08:52:30 +02:00
1 parent a75d2b01fb
commit 785c17381c
3 files changed
+29 -14

No files matched your search

+11
View File
@@ -5282,7 +5282,10 @@ void ObjectMgr::ValidateSpellScripts()
spellScript->_Register(); spellScript->_Register();
if (!spellScript->_Validate(spellEntry)) if (!spellScript->_Validate(spellEntry))
{
itr->second.second = false; itr->second.second = false;
continue;
}
} }
if (auraScript) if (auraScript)
@@ -5291,9 +5294,17 @@ void ObjectMgr::ValidateSpellScripts()
auraScript->_Register(); auraScript->_Register();
if (!auraScript->_Validate(spellEntry)) if (!auraScript->_Validate(spellEntry))
{
itr->second.second = false; itr->second.second = false;
continue;
}
} }
// Enable the script when all checks passed
itr->second.second = true;
} }
else
itr->second.second = false;
} }
} }
+1 -1
View File
@@ -368,7 +368,7 @@ struct ScriptInfo
typedef std::multimap<uint32, ScriptInfo> ScriptMap; 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 /*disabled*/>> SpellScriptsContainer; typedef std::multimap<uint32 /*spell id*/, std::pair<uint32 /*script id*/, bool /*enabled*/>> SpellScriptsContainer;
typedef std::pair<SpellScriptsContainer::iterator, SpellScriptsContainer::iterator> SpellScriptsBounds; typedef std::pair<SpellScriptsContainer::iterator, SpellScriptsContainer::iterator> SpellScriptsBounds;
TC_GAME_API extern ScriptMapMap sSpellScripts; TC_GAME_API extern ScriptMapMap sSpellScripts;
TC_GAME_API extern ScriptMapMap sEventScripts; TC_GAME_API extern ScriptMapMap sEventScripts;
+17 -13
View File
@@ -296,7 +296,7 @@ public:
virtual void BeforeReleaseContext(std::string const& /*context*/) { } virtual void BeforeReleaseContext(std::string const& /*context*/) { }
/// Called before SwapContext /// Called before SwapContext
virtual void BeforeSwapContext() { } virtual void BeforeSwapContext(bool /*initialize*/) { }
/// Called before Unload /// Called before Unload
virtual void BeforeUnload() { } virtual void BeforeUnload() { }
@@ -482,8 +482,12 @@ public:
ids_removed_.insert(ids_to_remove.begin(), ids_to_remove.end()); 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 // Add the recently added scripts to the deleted scripts to replace
// default AI's with recently added core scripts. // default AI's with recently added core scripts.
ids_removed_.insert(static_cast<Base*>(this)->GetRecentlyAddedScriptIDs().begin(), 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(); sOutdoorPvPMgr->InitOutdoorPvP();
swapped = false; swapped = false;
@@ -599,7 +604,7 @@ public:
swapped = true; swapped = true;
} }
void BeforeSwapContext() final override void BeforeSwapContext(bool initialize) override
{ {
swapped = false; swapped = false;
} }
@@ -629,7 +634,7 @@ public:
swapped = true; swapped = true;
} }
void BeforeSwapContext() final override void BeforeSwapContext(bool initialize) override
{ {
if (swapped) if (swapped)
{ {
@@ -683,8 +688,7 @@ public:
void SwapContext(bool initialize) final override void SwapContext(bool initialize) final override
{ {
if (!initialize) this->BeforeSwapContext(initialize);
this->BeforeSwapContext();
_recently_added_ids.clear(); _recently_added_ids.clear();
} }
@@ -813,7 +817,7 @@ public:
ChatHandler::invalidateCommandTable(); ChatHandler::invalidateCommandTable();
} }
void BeforeSwapContext() final override void BeforeSwapContext(bool /*initialize*/) override
{ {
ChatHandler::invalidateCommandTable(); ChatHandler::invalidateCommandTable();
} }
@@ -846,9 +850,9 @@ public:
_scripts.erase(context); _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 void RemoveUsedScriptsFromContainer(std::unordered_set<std::string>& scripts) final override
@@ -1159,10 +1163,10 @@ void CreateSpellOrAuraScripts(uint32 spellId, std::list<T*>& scriptVector, F&& e
for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr) for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
{ {
// When the script is disabled continue with the next one // When the script is disabled continue with the next one
if (itr->second.second) if (!itr->second.second)
continue; continue;
SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::Instance()->GetScriptById(itr->second.first); SpellScriptLoader* tmpscript = sScriptMgr->GetSpellScriptLoader(itr->second.first);
if (!tmpscript) if (!tmpscript)
continue; continue;