Merge branch 'globaltargetnumberone' into 'master'

Improve support for global script targets

Closes #2316, #7830, and #2311

See merge request OpenMW/openmw!4812
This commit is contained in:
Evil Eye 2025-09-13 06:54:26 +00:00
commit 1babdba4c1
5 changed files with 17 additions and 17 deletions

View File

@ -11,7 +11,7 @@ namespace ESSImport
{ {
out.mId = ESM::RefId::stringRefId(scpt.mSCHD.mName.toString()); out.mId = ESM::RefId::stringRefId(scpt.mSCHD.mName.toString());
out.mRunning = scpt.mRunning; out.mRunning = scpt.mRunning;
out.mTargetRef = ESM::RefNum{}; // TODO: convert target reference of global script out.mTargetRef = scpt.mRefNum;
convertSCRI(scpt.mSCRI, out.mLocals); convertSCRI(scpt.mSCRI, out.mLocals);
} }

View File

@ -12,11 +12,13 @@ namespace ESSImport
mSCRI.load(esm); mSCRI.load(esm);
mRefNum = -1;
if (esm.isNextSub("RNAM")) if (esm.isNextSub("RNAM"))
{ {
mRunning = true; mRunning = true;
esm.getHT(mRefNum); ESM::FormId32 refNum;
esm.getHT(refNum);
mRefNum = ESM::RefNum::fromUint32(refNum);
mRefNum.mContentFile--;
} }
else else
mRunning = false; mRunning = false;

View File

@ -7,6 +7,7 @@
#include <components/esm/esmcommon.hpp> #include <components/esm/esmcommon.hpp>
#include <components/esm3/loadscpt.hpp> #include <components/esm3/loadscpt.hpp>
#include <components/esm3/refnum.hpp>
namespace ESM namespace ESM
{ {
@ -35,7 +36,7 @@ namespace ESSImport
SCRI mSCRI; SCRI mSCRI;
bool mRunning; bool mRunning;
int32_t mRefNum; // Targeted reference, -1: no reference ESM::RefNum mRefNum; // Targeted reference
void load(ESM::ESMReader& esm); void load(ESM::ESMReader& esm);
}; };

View File

@ -26,13 +26,13 @@ namespace
script.mRunning = false; script.mRunning = false;
if (!ptr.isEmpty()) if (!ptr.isEmpty())
{ {
if (ptr.getCellRef().hasContentFile()) if (MWBase::Environment::get().getWorld()->getPlayerPtr() == ptr)
script.mTargetId = ptr.getCellRef().getRefId();
else if (ptr.getCellRef().getRefNum().isSet())
{ {
script.mTargetId = ptr.getCellRef().getRefId(); script.mTargetId = ptr.getCellRef().getRefId();
script.mTargetRef = ptr.getCellRef().getRefNum(); script.mTargetRef = ptr.getCellRef().getRefNum();
} }
else if (MWBase::Environment::get().getWorld()->getPlayerPtr() == ptr)
script.mTargetId = ptr.getCellRef().getRefId();
} }
return script; return script;
} }
@ -60,10 +60,10 @@ namespace
MWWorld::Ptr operator()(const std::pair<ESM::RefNum, ESM::RefId>& pair) const MWWorld::Ptr operator()(const std::pair<ESM::RefNum, ESM::RefId>& pair) const
{ {
if (pair.second.empty()) if (pair.first.isSet())
return MWWorld::Ptr();
else if (pair.first.hasContentFile())
return MWBase::Environment::get().getWorldModel()->getPtr(pair.first); return MWBase::Environment::get().getWorldModel()->getPtr(pair.first);
else if (pair.second.empty())
return MWWorld::Ptr();
return MWBase::Environment::get().getWorld()->searchPtr(pair.second, false); return MWBase::Environment::get().getWorld()->searchPtr(pair.second, false);
} }
}; };
@ -256,7 +256,7 @@ namespace MWScript
try try
{ {
auto desc = std::make_shared<GlobalScriptDesc>(); auto desc = std::make_shared<GlobalScriptDesc>();
if (!script.mTargetId.empty()) if (!script.mTargetId.empty() || script.mTargetRef.isSet())
{ {
desc->mTarget = std::make_pair(script.mTargetRef, script.mTargetId); desc->mTarget = std::make_pair(script.mTargetRef, script.mTargetId);
} }

View File

@ -38,12 +38,9 @@ namespace ESM
if (mRunning) if (mRunning)
esm.writeHNT("RUN_", int32_t{ 1 }); esm.writeHNT("RUN_", int32_t{ 1 });
if (!mTargetId.empty()) esm.writeHNORefId("TARG", mTargetId);
{ if (mTargetRef.isSet())
esm.writeHNORefId("TARG", mTargetId); esm.writeFormId(mTargetRef, true, "FRMR");
if (mTargetRef.isSet())
esm.writeFormId(mTargetRef, true, "FRMR");
}
} }
} }