diff --git a/apps/openmw/mwmp/RecordHelper.cpp b/apps/openmw/mwmp/RecordHelper.cpp old mode 100644 new mode 100755 index f07bdb865..bb6de845e --- a/apps/openmw/mwmp/RecordHelper.cpp +++ b/apps/openmw/mwmp/RecordHelper.cpp @@ -2,6 +2,7 @@ #include "../mwworld/cellstore.hpp" #include "../mwworld/worldimp.hpp" +#include "../mwscript/scriptmanagerimp.hpp" #include "RecordHelper.hpp" #include "Main.hpp" @@ -1358,13 +1359,14 @@ void RecordHelper::overrideRecord(const mwmp::ScriptRecord& record) } MWBase::World *world = MWBase::Environment::get().getWorld(); + MWBase::ScriptManager *scriptMan = MWBase::Environment::get().getScriptManager(); - if (record.baseId.empty()) - { + if (record.baseId.empty()) { world->getModifiableStore().overrideRecord(recordData); + scriptMan->compile(recordData.mId); } - else if (doesRecordIdExist(record.baseId)) - { + else if (doesRecordIdExist(record.baseId)) { + const ESM::Script *baseData = world->getStore().get().search(record.baseId); ESM::Script finalData = *baseData; finalData.mId = recordData.mId; @@ -1373,9 +1375,9 @@ void RecordHelper::overrideRecord(const mwmp::ScriptRecord& record) finalData.mScriptText = recordData.mScriptText; world->getModifiableStore().overrideRecord(finalData); + scriptMan->compile(recordData.mId); } - else - { + else { LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); return; } diff --git a/apps/openmw/mwscript/scriptmanagerimp.cpp b/apps/openmw/mwscript/scriptmanagerimp.cpp old mode 100644 new mode 100755 index e1652b311..736861ce1 --- a/apps/openmw/mwscript/scriptmanagerimp.cpp +++ b/apps/openmw/mwscript/scriptmanagerimp.cpp @@ -44,7 +44,7 @@ namespace MWScript mParser.reset(); mErrorHandler.reset(); - if (const ESM::Script *script = mStore.get().find (name)) + if (const ESM::Script *script = mStore.get().find(name)) { mErrorHandler.setContext(name); @@ -80,6 +80,18 @@ namespace MWScript { std::vector code; mParser.getCode(code); + + + /* + * Dreamweave addition: + * Properly recompile scripts if an existing one has already been sent. + * C++20 allows a better way to do this, but alas, .contains is not available + */ + ScriptCollection::iterator iter = mScripts.find(name); + + if (iter != mScripts.end()) + mScripts.erase(name); + mScripts.emplace(name, CompiledScript(code, mParser.getLocals())); return true; @@ -92,7 +104,7 @@ namespace MWScript bool ScriptManager::run (const std::string& name, Interpreter::Context& interpreterContext) { // compile script - ScriptCollection::iterator iter = mScripts.find (name); + ScriptCollection::iterator iter = mScripts.find(name); if (iter==mScripts.end()) { @@ -104,7 +116,7 @@ namespace MWScript return false; } - iter = mScripts.find (name); + iter = mScripts.find(name); assert (iter!=mScripts.end()); } @@ -169,14 +181,14 @@ namespace MWScript std::string name2 = Misc::StringUtils::lowerCase (name); { - ScriptCollection::iterator iter = mScripts.find (name2); + ScriptCollection::iterator iter = mScripts.find(name2); if (iter!=mScripts.end()) return iter->second.mLocals; } { - std::map::iterator iter = mOtherLocals.find (name2); + std::map::iterator iter = mOtherLocals.find(name2); if (iter!=mOtherLocals.end()) return iter->second;