mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-27 05:10:26 +00:00
Fix cell grid and owner subrecord loading for FO4
This commit is contained in:
parent
ae828064a4
commit
3b3545fa58
3 changed files with 52 additions and 14 deletions
|
@ -58,8 +58,23 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
|
||||||
reader.get(mScale);
|
reader.get(mScale);
|
||||||
break;
|
break;
|
||||||
case ESM4::SUB_XOWN:
|
case ESM4::SUB_XOWN:
|
||||||
|
{
|
||||||
|
if (subHdr.dataSize == 4 || subHdr.dataSize == 12)
|
||||||
|
{
|
||||||
reader.getFormId(mOwner);
|
reader.getFormId(mOwner);
|
||||||
|
if (subHdr.dataSize == 12)
|
||||||
|
{
|
||||||
|
std::uint32_t dummy;
|
||||||
|
reader.get(dummy); // Unknown
|
||||||
|
reader.get(dummy); // Flags
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reader.skipSubRecordData();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ESM4::SUB_XESP:
|
case ESM4::SUB_XESP:
|
||||||
reader.getFormId(mEsp.parent);
|
reader.getFormId(mEsp.parent);
|
||||||
reader.get(mEsp.flags);
|
reader.get(mEsp.flags);
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include <components/debug/debuglog.hpp>
|
||||||
|
|
||||||
#include "grouptype.hpp"
|
#include "grouptype.hpp"
|
||||||
#include "reader.hpp"
|
#include "reader.hpp"
|
||||||
// #include "writer.hpp"
|
// #include "writer.hpp"
|
||||||
|
@ -71,7 +73,6 @@ void ESM4::Cell::load(ESM4::Reader& reader)
|
||||||
// (may be easier to update the context before saving?)
|
// (may be easier to update the context before saving?)
|
||||||
reader.setCurrCell(formId); // save for LAND (and other children) to access later
|
reader.setCurrCell(formId); // save for LAND (and other children) to access later
|
||||||
std::uint32_t esmVer = reader.esmVersion();
|
std::uint32_t esmVer = reader.esmVersion();
|
||||||
bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
|
|
||||||
bool isSkyrim = (esmVer == ESM::VER_170 || esmVer == ESM::VER_094);
|
bool isSkyrim = (esmVer == ESM::VER_170 || esmVer == ESM::VER_094);
|
||||||
|
|
||||||
while (reader.getSubRecordHeader())
|
while (reader.getSubRecordHeader())
|
||||||
|
@ -106,16 +107,8 @@ void ESM4::Cell::load(ESM4::Reader& reader)
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
reader.get(mX);
|
reader.get(mX);
|
||||||
reader.get(mY);
|
reader.get(mY);
|
||||||
#if 0
|
|
||||||
std::string padding;
|
|
||||||
padding.insert(0, reader.stackSize()*2, ' ');
|
|
||||||
std::cout << padding << "CELL group " << ESM4::printLabel(reader.grp().label, reader.grp().type) << std::endl;
|
|
||||||
std::cout << padding << "CELL formId " << std::hex << reader.hdr().record.id << std::endl;
|
|
||||||
std::cout << padding << "CELL X " << std::dec << mX << ", Y " << mY << std::endl;
|
|
||||||
#endif
|
|
||||||
if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
|
|
||||||
if (subHdr.dataSize == 12)
|
if (subHdr.dataSize == 12)
|
||||||
reader.get(flags); // not in Obvlivion, nor FO3/FONV
|
reader.get(flags);
|
||||||
|
|
||||||
// Remember cell grid for later (loading LAND, NAVM which should be CELL temporary children)
|
// Remember cell grid for later (loading LAND, NAVM which should be CELL temporary children)
|
||||||
// Note that grids only apply for external cells. For interior cells use the cell's formid.
|
// Note that grids only apply for external cells. For interior cells use the cell's formid.
|
||||||
|
@ -155,8 +148,23 @@ void ESM4::Cell::load(ESM4::Reader& reader)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESM4::SUB_XOWN:
|
case ESM4::SUB_XOWN:
|
||||||
|
{
|
||||||
|
if (subHdr.dataSize == 4 || subHdr.dataSize == 12)
|
||||||
|
{
|
||||||
reader.getFormId(mOwner);
|
reader.getFormId(mOwner);
|
||||||
|
if (subHdr.dataSize == 12)
|
||||||
|
{
|
||||||
|
std::uint32_t dummy;
|
||||||
|
reader.get(dummy); // Unknown
|
||||||
|
reader.get(dummy); // Flags
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reader.skipSubRecordData();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ESM4::SUB_XGLB:
|
case ESM4::SUB_XGLB:
|
||||||
reader.getFormId(mGlobal);
|
reader.getFormId(mGlobal);
|
||||||
break; // Oblivion only?
|
break; // Oblivion only?
|
||||||
|
|
|
@ -66,8 +66,23 @@ void ESM4::Reference::load(ESM4::Reader& reader)
|
||||||
reader.get(mScale);
|
reader.get(mScale);
|
||||||
break;
|
break;
|
||||||
case ESM4::SUB_XOWN:
|
case ESM4::SUB_XOWN:
|
||||||
|
{
|
||||||
|
if (subHdr.dataSize == 4 || subHdr.dataSize == 12)
|
||||||
|
{
|
||||||
reader.getFormId(mOwner);
|
reader.getFormId(mOwner);
|
||||||
|
if (subHdr.dataSize == 12)
|
||||||
|
{
|
||||||
|
std::uint32_t dummy;
|
||||||
|
reader.get(dummy); // Unknown
|
||||||
|
reader.get(dummy); // Flags
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reader.skipSubRecordData();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ESM4::SUB_XGLB:
|
case ESM4::SUB_XGLB:
|
||||||
reader.getFormId(mGlobal);
|
reader.getFormId(mGlobal);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue