Fix(client): Recompile scripts when receiving a new script record

pull/656/head
Dave Corley 8 months ago
parent 8dcd759c62
commit 4a66fa018a

@ -2,6 +2,7 @@
#include "../mwworld/cellstore.hpp"
#include "../mwworld/worldimp.hpp"
#include "../mwscript/scriptmanagerimp.hpp"
#include "RecordHelper.hpp"
#include "Main.hpp"
@ -1323,13 +1324,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<ESM::Script>(record.baseId))
{
else if (doesRecordIdExist<ESM::Script>(record.baseId)) {
const ESM::Script *baseData = world->getStore().get<ESM::Script>().search(record.baseId);
ESM::Script finalData = *baseData;
finalData.mId = recordData.mId;
@ -1338,9 +1340,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;
}

@ -80,6 +80,18 @@ namespace MWScript
{
std::vector<Interpreter::Type_Code> 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;

Loading…
Cancel
Save