mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-07-12 14:21:43 +00:00
Merge pull request #25 from DreamWeave-MP/flip-the-script
Fix(client): Recompile scripts when receiving a new script record
This commit is contained in:
commit
54954fbaf2
2 changed files with 25 additions and 11 deletions
14
apps/openmw/mwmp/RecordHelper.cpp
Normal file → Executable file
14
apps/openmw/mwmp/RecordHelper.cpp
Normal file → Executable file
|
@ -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;
|
||||
}
|
||||
|
|
22
apps/openmw/mwscript/scriptmanagerimp.cpp
Normal file → Executable file
22
apps/openmw/mwscript/scriptmanagerimp.cpp
Normal file → Executable file
|
@ -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…
Reference in a new issue