From 0a15d7740a66d1a920c6cf86dbd37b0614c6a9de Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Fri, 5 Mar 2021 22:21:53 +0100 Subject: [PATCH 1/5] Delay physics for objects created by scripts --- apps/openmw/mwclass/activator.cpp | 5 +++++ apps/openmw/mwclass/activator.hpp | 2 ++ apps/openmw/mwclass/container.cpp | 5 +++++ apps/openmw/mwclass/container.hpp | 1 + apps/openmw/mwclass/door.cpp | 9 ++++++-- apps/openmw/mwclass/door.hpp | 1 + apps/openmw/mwclass/light.cpp | 11 +++++++--- apps/openmw/mwclass/light.hpp | 1 + apps/openmw/mwclass/static.cpp | 5 +++++ apps/openmw/mwclass/static.hpp | 1 + apps/openmw/mwphysics/physicssystem.cpp | 2 ++ apps/openmw/mwscript/miscextensions.cpp | 2 ++ .../mwscript/transformationextensions.cpp | 3 +++ apps/openmw/mwworld/class.cpp | 3 +++ apps/openmw/mwworld/class.hpp | 1 + apps/openmw/mwworld/refdata.cpp | 7 ++++--- apps/openmw/mwworld/refdata.hpp | 2 ++ apps/openmw/mwworld/scene.cpp | 21 +++++++++++++++++++ 18 files changed, 74 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index 0b4d9ef836..2e8553920f 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -39,6 +39,11 @@ namespace MWClass } void Activator::insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const + { + insertObjectPhysics(ptr, model, rotation, physics, skipAnimated); + } + + void Activator::insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const { if(!model.empty()) physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_World, skipAnimated); diff --git a/apps/openmw/mwclass/activator.hpp b/apps/openmw/mwclass/activator.hpp index 7af47680b3..4dc85bd507 100644 --- a/apps/openmw/mwclass/activator.hpp +++ b/apps/openmw/mwclass/activator.hpp @@ -19,6 +19,8 @@ namespace MWClass void insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; + void insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const override; + std::string getName (const MWWorld::ConstPtr& ptr) const override; ///< \return name or ID; can return an empty string. diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index b88d756cbc..5c1ddd8bd1 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -107,6 +107,11 @@ namespace MWClass } void Container::insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const + { + insertObjectPhysics(ptr, model, rotation, physics, skipAnimated); + } + + void Container::insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const { if(!model.empty()) physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_World, skipAnimated); diff --git a/apps/openmw/mwclass/container.hpp b/apps/openmw/mwclass/container.hpp index 02ec9b1012..1cbc5a6142 100644 --- a/apps/openmw/mwclass/container.hpp +++ b/apps/openmw/mwclass/container.hpp @@ -43,6 +43,7 @@ namespace MWClass ///< Add reference into a cell for rendering void insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; + void insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; std::string getName (const MWWorld::ConstPtr& ptr) const override; ///< \return name or ID; can return an empty string. diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 1407d6a0d5..e608c27000 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -57,8 +57,7 @@ namespace MWClass void Door::insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const { - if(!model.empty()) - physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_Door, skipAnimated); + insertObjectPhysics(ptr, model, rotation, physics, skipAnimated); // Resume the door's opening/closing animation if it wasn't finished if (ptr.getRefData().getCustomData()) @@ -71,6 +70,12 @@ namespace MWClass } } + void Door::insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const + { + if(!model.empty()) + physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_Door, skipAnimated); + } + bool Door::isDoor() const { return true; diff --git a/apps/openmw/mwclass/door.hpp b/apps/openmw/mwclass/door.hpp index f80c9bb416..5882842e91 100644 --- a/apps/openmw/mwclass/door.hpp +++ b/apps/openmw/mwclass/door.hpp @@ -19,6 +19,7 @@ namespace MWClass ///< Add reference into a cell for rendering void insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; + void insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; bool isDoor() const override; diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index ca744be7bc..ad5eb4e737 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -39,9 +39,7 @@ namespace MWClass ptr.get(); assert (ref->mBase != nullptr); - // TODO: add option somewhere to enable collision for placeable objects - if (!model.empty() && (ref->mBase->mData.mFlags & ESM::Light::Carry) == 0) - physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_World, skipAnimated); + insertObjectPhysics(ptr, model, rotation, physics, skipAnimated); if (!ref->mBase->mSound.empty() && !(ref->mBase->mData.mFlags & ESM::Light::OffDefault)) MWBase::Environment::get().getSoundManager()->playSound3D(ptr, ref->mBase->mSound, 1.0, 1.0, @@ -49,6 +47,13 @@ namespace MWClass MWSound::PlayMode::Loop); } + void Light::insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const + { + // TODO: add option somewhere to enable collision for placeable objects + if (!model.empty() && (ptr.get()->mBase->mData.mFlags & ESM::Light::Carry) == 0) + physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_World, skipAnimated); + } + bool Light::useAnim() const { return true; diff --git a/apps/openmw/mwclass/light.hpp b/apps/openmw/mwclass/light.hpp index 7641722788..55fef759aa 100644 --- a/apps/openmw/mwclass/light.hpp +++ b/apps/openmw/mwclass/light.hpp @@ -15,6 +15,7 @@ namespace MWClass ///< Add reference into a cell for rendering void insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; + void insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; bool useAnim() const override; diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 323e482bf0..25029528ea 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -24,6 +24,11 @@ namespace MWClass } void Static::insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const + { + insertObjectPhysics(ptr, model, rotation, physics, skipAnimated); + } + + void Static::insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const { if(!model.empty()) physics.addObject(ptr, model, rotation, MWPhysics::CollisionType_World, skipAnimated); diff --git a/apps/openmw/mwclass/static.hpp b/apps/openmw/mwclass/static.hpp index 211b93de2a..d1991d0550 100644 --- a/apps/openmw/mwclass/static.hpp +++ b/apps/openmw/mwclass/static.hpp @@ -15,6 +15,7 @@ namespace MWClass ///< Add reference into a cell for rendering void insertObject(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; + void insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string& model, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const override; std::string getName (const MWWorld::ConstPtr& ptr) const override; ///< \return name or ID; can return an empty string. diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 034a35f38e..e5bd936abb 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -463,6 +463,8 @@ namespace MWPhysics void PhysicsSystem::addObject (const MWWorld::Ptr& ptr, const std::string& mesh, osg::Quat rotation, int collisionType, bool skipAnimated) { + if (ptr.mRef->mData.mPhysicsPostponed) + return; osg::ref_ptr shapeInstance = mShapeManager->getInstance(mesh); if (!shapeInstance || !shapeInstance->getCollisionShape()) return; diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 5538e8536f..c28f2b8951 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -168,6 +168,8 @@ namespace MWScript void execute (Interpreter::Runtime& runtime) override { MWWorld::Ptr ptr = R()(runtime); + if(!ptr.isEmpty() && !ptr.mRef->mData.isEnabled()) + ptr.mRef->mData.mPhysicsPostponed = false; MWBase::Environment::get().getWorld()->enable (ptr); } }; diff --git a/apps/openmw/mwscript/transformationextensions.cpp b/apps/openmw/mwscript/transformationextensions.cpp index dbd8e905aa..825306d650 100644 --- a/apps/openmw/mwscript/transformationextensions.cpp +++ b/apps/openmw/mwscript/transformationextensions.cpp @@ -501,6 +501,7 @@ namespace MWScript pos.rot[0] = pos.rot[1] = 0; pos.rot[2] = osg::DegreesToRadians(zRotDegrees); MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(),itemID); + ref.getPtr().mRef->mData.mPhysicsPostponed = !ref.getPtr().getClass().isActor(); ref.getPtr().getCellRef().setPosition(pos); MWWorld::Ptr placed = MWBase::Environment::get().getWorld()->placeObject(ref.getPtr(),store,pos); placed.getClass().adjustPosition(placed, true); @@ -548,6 +549,7 @@ namespace MWScript pos.rot[0] = pos.rot[1] = 0; pos.rot[2] = osg::DegreesToRadians(zRotDegrees); MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(),itemID); + ref.getPtr().mRef->mData.mPhysicsPostponed = !ref.getPtr().getClass().isActor(); ref.getPtr().getCellRef().setPosition(pos); MWWorld::Ptr placed = MWBase::Environment::get().getWorld()->placeObject(ref.getPtr(),store,pos); placed.getClass().adjustPosition(placed, true); @@ -588,6 +590,7 @@ namespace MWScript { // create item MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), itemID, 1); + ref.getPtr().mRef->mData.mPhysicsPostponed = !ref.getPtr().getClass().isActor(); MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(), actor, actor.getCell(), direction, distance); MWBase::Environment::get().getWorld()->scaleObject(ptr, actor.getCellRef().getScale()); diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index 04dfba6b97..96f03af6c3 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -35,6 +35,9 @@ namespace MWWorld } + void Class::insertObjectPhysics(const Ptr& ptr, const std::string& mesh, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated) const + {} + bool Class::apply (const MWWorld::Ptr& ptr, const std::string& id, const MWWorld::Ptr& actor) const { return false; diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index e225e0187c..7937209c6e 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -80,6 +80,7 @@ namespace MWWorld virtual void insertObjectRendering (const Ptr& ptr, const std::string& mesh, MWRender::RenderingInterface& renderingInterface) const; virtual void insertObject(const Ptr& ptr, const std::string& mesh, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const; ///< Add reference into a cell for rendering (default implementation: don't render anything). + virtual void insertObjectPhysics(const Ptr& ptr, const std::string& mesh, osg::Quat rotation, MWPhysics::PhysicsSystem& physics, bool skipAnimated = false) const; virtual std::string getName (const ConstPtr& ptr) const = 0; ///< \return name or ID; can return an empty string. diff --git a/apps/openmw/mwworld/refdata.cpp b/apps/openmw/mwworld/refdata.cpp index f6a445d619..29c669caf9 100644 --- a/apps/openmw/mwworld/refdata.cpp +++ b/apps/openmw/mwworld/refdata.cpp @@ -31,6 +31,7 @@ namespace MWWorld mChanged = refData.mChanged; mDeletedByContentFile = refData.mDeletedByContentFile; mFlags = refData.mFlags; + mPhysicsPostponed = refData.mPhysicsPostponed; mAnimationState = refData.mAnimationState; @@ -44,7 +45,7 @@ namespace MWWorld } RefData::RefData() - : mBaseNode(nullptr), mDeletedByContentFile(false), mEnabled (true), mCount (1), mCustomData (nullptr), mChanged(false), mFlags(0) + : mBaseNode(nullptr), mDeletedByContentFile(false), mEnabled (true), mCount (1), mCustomData (nullptr), mChanged(false), mFlags(0), mPhysicsPostponed(false) { for (int i=0; i<3; ++i) { @@ -57,7 +58,7 @@ namespace MWWorld : mBaseNode(nullptr), mDeletedByContentFile(false), mEnabled (true), mCount (1), mPosition (cellRef.mPos), mCustomData (nullptr), - mChanged(false), mFlags(0) // Loading from ESM/ESP files -> assume unchanged + mChanged(false), mFlags(0), mPhysicsPostponed(false) // Loading from ESM/ESP files -> assume unchanged { } @@ -68,7 +69,7 @@ namespace MWWorld mPosition (objectState.mPosition), mAnimationState(objectState.mAnimationState), mCustomData (nullptr), - mChanged(true), mFlags(objectState.mFlags) // Loading from a savegame -> assume changed + mChanged(true), mFlags(objectState.mFlags), mPhysicsPostponed(false) // Loading from a savegame -> assume changed { // "Note that the ActivationFlag_UseEnabled is saved to the reference, // which will result in permanently suppressed activation if the reference script is removed. diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index 8979c8505d..e2f77d09e0 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -58,6 +58,8 @@ namespace MWWorld public: + bool mPhysicsPostponed; + RefData(); /// @param cellRef Used to copy constant data such as position into this class where it can diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 45b0c5d9f8..d3b381d2af 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -343,7 +343,10 @@ namespace MWWorld cell->forEach(visitor); for (const auto& ptr : visitor.mObjects) + { mPhysics->remove(ptr); + ptr.mRef->mData.mPhysicsPostponed = false; + } if (cell->getCell()->isExterior()) { @@ -626,6 +629,24 @@ namespace MWWorld } return cellsPositionsToLoad; }; + + for(const auto& cell : mActiveCells) + { + cell->forEach([&](const MWWorld::Ptr& ptr) + { + if(ptr.mRef->mData.mPhysicsPostponed) + { + ptr.mRef->mData.mPhysicsPostponed = false; + if(ptr.mRef->mData.isEnabled() && ptr.mRef->mData.getCount() > 0) { + std::string model = getModel(ptr, MWBase::Environment::get().getResourceSystem()->getVFS()); + const auto rotation = makeNodeRotation(ptr, RotationOrder::direct); + ptr.getClass().insertObjectPhysics(ptr, model, rotation, *mPhysics); + } + } + return true; + }); + } + auto cellsPositionsToLoad = cellsToLoad(mActiveCells,mHalfGridSize); auto cellsPositionsToLoadInactive = cellsToLoad(mInactiveCells,mHalfGridSize+1); From 18f297a4e052b51d914e0158462021cda9602815 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Thu, 11 Mar 2021 20:37:38 +0100 Subject: [PATCH 2/5] Allow a missing implicit argument for GetDistance --- apps/openmw/mwscript/transformationextensions.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwscript/transformationextensions.cpp b/apps/openmw/mwscript/transformationextensions.cpp index 825306d650..096e78d34b 100644 --- a/apps/openmw/mwscript/transformationextensions.cpp +++ b/apps/openmw/mwscript/transformationextensions.cpp @@ -42,10 +42,19 @@ namespace MWScript void execute (Interpreter::Runtime& runtime) override { - MWWorld::Ptr from = R()(runtime); + MWWorld::Ptr from = R()(runtime, !R::implicit); std::string name = runtime.getStringLiteral (runtime[0].mInteger); runtime.pop(); + if (from.isEmpty()) + { + std::string error = "Missing implicit ref"; + runtime.getContext().report(error); + Log(Debug::Error) << error; + runtime.push(0.f); + return; + } + if (from.getContainerStore()) // is the object contained? { MWWorld::Ptr container = MWBase::Environment::get().getWorld()->findContainer(from); From d138602bd390c7c0d704cdeef7406dd2b62222cd Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 5 Jul 2021 18:41:43 +0200 Subject: [PATCH 3/5] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 705cc21bf0..cf7caabdc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Bug #3737: Scripts from The Underground 2 .esp do not play (all patched versions) Bug #3846: Strings starting with "-" fail to compile if not enclosed in quotes + Bug #3905: Great House Dagoth issues + Bug #5120: Scripted object spawning updates physics system Bug #5379: Wandering NPCs falling through cantons Bug #5453: Magic effect VFX are offset for creatures Bug #5483: AutoCalc flag is not used to calculate spells cost From 1f5b20ef7de8880a3eb9a32a2b7ca1fb3649b0c0 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 6 Jul 2021 11:43:30 +1000 Subject: [PATCH 4/5] test fix for missing refs --- apps/openmw/mwworld/cellstore.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index 051273f21d..e8d46b1574 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -610,9 +610,17 @@ namespace MWWorld ref.mRefNum.mContentFile = ESM::RefNum::RefNum_NoContentFile; // Get each reference in turn + ESM::MovedCellRef cMRef; + cMRef.mRefNum.mIndex = 0; bool deleted = false; - while(mCell->getNextRef(esm[index], ref, deleted)) + while(mCell->getNextRef(esm[index], ref, deleted, /*ignoreMoves*/true, &cMRef)) { + if (cMRef.mRefNum.mIndex) + { + cMRef.mRefNum.mIndex = 0; + continue; // ignore refs that are moved + } + // Don't load reference if it was moved to a different cell. ESM::MovedCellRefTracker::const_iterator iter = std::find(mCell->mMovedRefs.begin(), mCell->mMovedRefs.end(), ref.mRefNum); From a47ebf5c9eb517453ec1fa6b436c0ec328dfc245 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 6 Jul 2021 14:57:58 +1000 Subject: [PATCH 5/5] For consistency with TES CS, force DELE record writes to be 4 bytes (currently writes 1 byte). --- CHANGELOG.md | 1 + components/esm/cellref.cpp | 2 +- components/esm/debugprofile.cpp | 2 +- components/esm/filter.cpp | 2 +- components/esm/loadacti.cpp | 2 +- components/esm/loadalch.cpp | 2 +- components/esm/loadappa.cpp | 2 +- components/esm/loadarmo.cpp | 2 +- components/esm/loadbody.cpp | 2 +- components/esm/loadbook.cpp | 2 +- components/esm/loadbsgn.cpp | 2 +- components/esm/loadcell.cpp | 2 +- components/esm/loadclas.cpp | 2 +- components/esm/loadclot.cpp | 2 +- components/esm/loadcont.cpp | 2 +- components/esm/loadcrea.cpp | 2 +- components/esm/loaddial.cpp | 2 +- components/esm/loaddoor.cpp | 2 +- components/esm/loadench.cpp | 2 +- components/esm/loadfact.cpp | 2 +- components/esm/loadinfo.cpp | 2 +- components/esm/loadingr.cpp | 2 +- components/esm/loadland.cpp | 2 +- components/esm/loadlevlist.cpp | 2 +- components/esm/loadligh.cpp | 2 +- components/esm/loadlock.cpp | 2 +- components/esm/loadltex.cpp | 2 +- components/esm/loadmisc.cpp | 2 +- components/esm/loadnpc.cpp | 2 +- components/esm/loadpgrd.cpp | 2 +- components/esm/loadprob.cpp | 2 +- components/esm/loadrace.cpp | 2 +- components/esm/loadregn.cpp | 2 +- components/esm/loadrepa.cpp | 2 +- components/esm/loadscpt.cpp | 2 +- components/esm/loadsndg.cpp | 2 +- components/esm/loadsoun.cpp | 2 +- components/esm/loadspel.cpp | 2 +- components/esm/loadsscr.cpp | 2 +- components/esm/loadstat.cpp | 2 +- components/esm/loadweap.cpp | 2 +- 41 files changed, 41 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 705cc21bf0..b711a20b68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Bug #6129: Player avatar not displayed correctly for large window sizes when GUI scaling active Bug #6131: Item selection in the avatar window not working correctly for large window sizes Bug #6133: Cannot reliably sneak or steal in the sight of the NPCs siding with player + Editor: For consistency with TES CS make DELE records 4 bytes long 0.47.0 ------ diff --git a/components/esm/cellref.cpp b/components/esm/cellref.cpp index 20edf00a8b..733547216b 100644 --- a/components/esm/cellref.cpp +++ b/components/esm/cellref.cpp @@ -145,7 +145,7 @@ void ESM::CellRef::save (ESMWriter &esm, bool wideRefNum, bool inInventory, bool esm.writeHNCString("NAME", mRefID); if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/debugprofile.cpp b/components/esm/debugprofile.cpp index 17249d8a3b..1dcf661fc9 100644 --- a/components/esm/debugprofile.cpp +++ b/components/esm/debugprofile.cpp @@ -44,7 +44,7 @@ void ESM::DebugProfile::save (ESMWriter& esm, bool isDeleted) const if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/filter.cpp b/components/esm/filter.cpp index 4f0519f80b..5bae1ed03e 100644 --- a/components/esm/filter.cpp +++ b/components/esm/filter.cpp @@ -42,7 +42,7 @@ void ESM::Filter::save (ESMWriter& esm, bool isDeleted) const if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadacti.cpp b/components/esm/loadacti.cpp index ba35535b8f..57c55d6760 100644 --- a/components/esm/loadacti.cpp +++ b/components/esm/loadacti.cpp @@ -50,7 +50,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadalch.cpp b/components/esm/loadalch.cpp index 85c24dc2d1..ba904f5037 100644 --- a/components/esm/loadalch.cpp +++ b/components/esm/loadalch.cpp @@ -65,7 +65,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadappa.cpp b/components/esm/loadappa.cpp index 1bd1f93798..b448e778cf 100644 --- a/components/esm/loadappa.cpp +++ b/components/esm/loadappa.cpp @@ -61,7 +61,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadarmo.cpp b/components/esm/loadarmo.cpp index 6743702539..9e2eca9a2c 100644 --- a/components/esm/loadarmo.cpp +++ b/components/esm/loadarmo.cpp @@ -99,7 +99,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadbody.cpp b/components/esm/loadbody.cpp index 3e5895c2c6..4ddefc92c7 100644 --- a/components/esm/loadbody.cpp +++ b/components/esm/loadbody.cpp @@ -55,7 +55,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadbook.cpp b/components/esm/loadbook.cpp index ee3c0c4af5..c6d1d618de 100644 --- a/components/esm/loadbook.cpp +++ b/components/esm/loadbook.cpp @@ -66,7 +66,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadbsgn.cpp b/components/esm/loadbsgn.cpp index e3b2f76a3a..1f679af39a 100644 --- a/components/esm/loadbsgn.cpp +++ b/components/esm/loadbsgn.cpp @@ -56,7 +56,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } esm.writeHNOCString("FNAM", mName); diff --git a/components/esm/loadcell.cpp b/components/esm/loadcell.cpp index bf70aad96f..0356cc646b 100644 --- a/components/esm/loadcell.cpp +++ b/components/esm/loadcell.cpp @@ -167,7 +167,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadclas.cpp b/components/esm/loadclas.cpp index 1e18bc0540..b76fc57067 100644 --- a/components/esm/loadclas.cpp +++ b/components/esm/loadclas.cpp @@ -86,7 +86,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadclot.cpp b/components/esm/loadclot.cpp index 12f0d495d5..9546eec2dd 100644 --- a/components/esm/loadclot.cpp +++ b/components/esm/loadclot.cpp @@ -69,7 +69,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadcont.cpp b/components/esm/loadcont.cpp index 107aea7cf6..077fc2145a 100644 --- a/components/esm/loadcont.cpp +++ b/components/esm/loadcont.cpp @@ -95,7 +95,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadcrea.cpp b/components/esm/loadcrea.cpp index 52138e2232..ecb080f75e 100644 --- a/components/esm/loadcrea.cpp +++ b/components/esm/loadcrea.cpp @@ -115,7 +115,7 @@ namespace ESM { if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loaddial.cpp b/components/esm/loaddial.cpp index d7e0a6ee17..59fb13484b 100644 --- a/components/esm/loaddial.cpp +++ b/components/esm/loaddial.cpp @@ -61,7 +61,7 @@ namespace ESM esm.writeHNCString("NAME", mId); if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); } else { diff --git a/components/esm/loaddoor.cpp b/components/esm/loaddoor.cpp index 523d8a1efc..d99418add2 100644 --- a/components/esm/loaddoor.cpp +++ b/components/esm/loaddoor.cpp @@ -57,7 +57,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadench.cpp b/components/esm/loadench.cpp index 8c4dd8c644..3c1a2f1eda 100644 --- a/components/esm/loadench.cpp +++ b/components/esm/loadench.cpp @@ -53,7 +53,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadfact.cpp b/components/esm/loadfact.cpp index ff2fbf66d1..bd0962721b 100644 --- a/components/esm/loadfact.cpp +++ b/components/esm/loadfact.cpp @@ -90,7 +90,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadinfo.cpp b/components/esm/loadinfo.cpp index 38bb163e61..15921249f4 100644 --- a/components/esm/loadinfo.cpp +++ b/components/esm/loadinfo.cpp @@ -100,7 +100,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadingr.cpp b/components/esm/loadingr.cpp index a18e321ff7..a19a9d5dd9 100644 --- a/components/esm/loadingr.cpp +++ b/components/esm/loadingr.cpp @@ -84,7 +84,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index d23452d76e..1fac79082d 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -123,7 +123,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadlevlist.cpp b/components/esm/loadlevlist.cpp index 0aed15aa94..26751b8925 100644 --- a/components/esm/loadlevlist.cpp +++ b/components/esm/loadlevlist.cpp @@ -80,7 +80,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadligh.cpp b/components/esm/loadligh.cpp index 2a6dac14b0..2e3f711eb7 100644 --- a/components/esm/loadligh.cpp +++ b/components/esm/loadligh.cpp @@ -63,7 +63,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadlock.cpp b/components/esm/loadlock.cpp index b14353ec5a..6f02909b98 100644 --- a/components/esm/loadlock.cpp +++ b/components/esm/loadlock.cpp @@ -61,7 +61,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadltex.cpp b/components/esm/loadltex.cpp index 3e150f9c0c..6bdc40e5fc 100644 --- a/components/esm/loadltex.cpp +++ b/components/esm/loadltex.cpp @@ -53,7 +53,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); } } diff --git a/components/esm/loadmisc.cpp b/components/esm/loadmisc.cpp index 3ba6626505..90fcd618e8 100644 --- a/components/esm/loadmisc.cpp +++ b/components/esm/loadmisc.cpp @@ -61,7 +61,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadnpc.cpp b/components/esm/loadnpc.cpp index 2bb0811ac9..34d806072d 100644 --- a/components/esm/loadnpc.cpp +++ b/components/esm/loadnpc.cpp @@ -135,7 +135,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadpgrd.cpp b/components/esm/loadpgrd.cpp index 9abeba2605..7bf60ca5fc 100644 --- a/components/esm/loadpgrd.cpp +++ b/components/esm/loadpgrd.cpp @@ -156,7 +156,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadprob.cpp b/components/esm/loadprob.cpp index 6307df3298..ceb19a77b6 100644 --- a/components/esm/loadprob.cpp +++ b/components/esm/loadprob.cpp @@ -61,7 +61,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadrace.cpp b/components/esm/loadrace.cpp index fbdf22fb6d..ce3cc95bf8 100644 --- a/components/esm/loadrace.cpp +++ b/components/esm/loadrace.cpp @@ -68,7 +68,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadregn.cpp b/components/esm/loadregn.cpp index ada33dc3f8..91ea92e305 100644 --- a/components/esm/loadregn.cpp +++ b/components/esm/loadregn.cpp @@ -89,7 +89,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadrepa.cpp b/components/esm/loadrepa.cpp index c04691c12f..c86227a045 100644 --- a/components/esm/loadrepa.cpp +++ b/components/esm/loadrepa.cpp @@ -61,7 +61,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadscpt.cpp b/components/esm/loadscpt.cpp index 1ad90dbc31..19602fef62 100644 --- a/components/esm/loadscpt.cpp +++ b/components/esm/loadscpt.cpp @@ -155,7 +155,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadsndg.cpp b/components/esm/loadsndg.cpp index 9bd806641b..c6ea930a20 100644 --- a/components/esm/loadsndg.cpp +++ b/components/esm/loadsndg.cpp @@ -54,7 +54,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadsoun.cpp b/components/esm/loadsoun.cpp index 3b3dc1eacd..ccb5f6fdce 100644 --- a/components/esm/loadsoun.cpp +++ b/components/esm/loadsoun.cpp @@ -52,7 +52,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadspel.cpp b/components/esm/loadspel.cpp index 947e6c9ec8..34e146501c 100644 --- a/components/esm/loadspel.cpp +++ b/components/esm/loadspel.cpp @@ -59,7 +59,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; } diff --git a/components/esm/loadsscr.cpp b/components/esm/loadsscr.cpp index f8854493b9..f436c32a1c 100644 --- a/components/esm/loadsscr.cpp +++ b/components/esm/loadsscr.cpp @@ -47,7 +47,7 @@ namespace ESM esm.writeHNCString("NAME", mId); if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); } else { diff --git a/components/esm/loadstat.cpp b/components/esm/loadstat.cpp index 6c9de22bd1..14bac10f95 100644 --- a/components/esm/loadstat.cpp +++ b/components/esm/loadstat.cpp @@ -43,7 +43,7 @@ namespace ESM esm.writeHNCString("NAME", mId); if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); } else { diff --git a/components/esm/loadweap.cpp b/components/esm/loadweap.cpp index 4a77ff6a00..b57359e29d 100644 --- a/components/esm/loadweap.cpp +++ b/components/esm/loadweap.cpp @@ -62,7 +62,7 @@ namespace ESM if (isDeleted) { - esm.writeHNCString("DELE", ""); + esm.writeHNString("DELE", "", 3); return; }