mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-09-24 04:11:50 -04:00
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:
commit
1babdba4c1
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user