Merge pull request #25 from DreamWeave-MP/flip-the-script

Fix(client): Recompile scripts when receiving a new script record
pull/656/head
Dave Corley 7 months ago committed by GitHub
commit 54954fbaf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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<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;
@ -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;
}

@ -44,7 +44,7 @@ namespace MWScript
mParser.reset();
mErrorHandler.reset();
if (const ESM::Script *script = mStore.get<ESM::Script>().find (name))
if (const ESM::Script *script = mStore.get<ESM::Script>().find(name))
{
mErrorHandler.setContext(name);
@ -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;
@ -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<std::string, Compiler::Locals>::iterator iter = mOtherLocals.find (name2);
std::map<std::string, Compiler::Locals>::iterator iter = mOtherLocals.find(name2);
if (iter!=mOtherLocals.end())
return iter->second;

Loading…
Cancel
Save