From 94dc6f422a21392fd941884629317abe118a8e89 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Thu, 6 Aug 2020 16:25:12 +0200 Subject: [PATCH] [Client] Use temporary holding interior when changing current cell record --- apps/openmw/mwmp/Main.cpp | 2 ++ apps/openmw/mwmp/RecordHelper.cpp | 28 ++++++++++++++++++++-------- apps/openmw/mwmp/RecordHelper.hpp | 5 +++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwmp/Main.cpp b/apps/openmw/mwmp/Main.cpp index 6614ac279..552485e2f 100644 --- a/apps/openmw/mwmp/Main.cpp +++ b/apps/openmw/mwmp/Main.cpp @@ -45,6 +45,7 @@ #include "GUIController.hpp" #include "CellController.hpp" #include "MechanicsHelper.hpp" +#include "RecordHelper.hpp" using namespace mwmp; using namespace std; @@ -162,6 +163,7 @@ void Main::postInit() const MWBase::Environment &environment = MWBase::Environment::get(); environment.getStateManager()->newGame(true); MWBase::Environment::get().getMechanicsManager()->toggleAI(); + RecordHelper::createPlaceholderInteriorCell(); } bool Main::isInitialized() diff --git a/apps/openmw/mwmp/RecordHelper.cpp b/apps/openmw/mwmp/RecordHelper.cpp index 6b6f2b648..b86161bf1 100644 --- a/apps/openmw/mwmp/RecordHelper.cpp +++ b/apps/openmw/mwmp/RecordHelper.cpp @@ -363,16 +363,11 @@ void RecordHelper::overrideRecord(const mwmp::CellRecord& record) if (isCurrentCell) { - // As a temporary solution, move the player to exterior 0, 0, but - // fix this once it's possible to override exteriors cells as well ESM::Position tempPos; - tempPos.pos[0] = 0; - tempPos.pos[1] = 0; - tempPos.pos[2] = 0; - ESM::Position playerPos = playerPtr.getRefData().getPosition(); - world->changeToExteriorCell(tempPos, true, true); + // Move the player to a temporary holding cell + world->changeToInteriorCell(getPlaceholderInteriorCellName(), tempPos, true, true); world->changeToInteriorCell(recordData.mName, playerPos, true, true); } } @@ -1462,7 +1457,8 @@ void RecordHelper::overrideRecord(const mwmp::WeaponRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::SoundRecord& record) { +void RecordHelper::overrideRecord(const mwmp::SoundRecord& record) +{ const ESM::Sound& recordData = record.data; if (recordData.mId.empty()) @@ -1507,3 +1503,19 @@ void RecordHelper::overrideRecord(const mwmp::SoundRecord& record) { if (isExistingId) world->updatePtrsWithRefId(recordData.mId); } + +void RecordHelper::createPlaceholderInteriorCell() +{ + MWBase::World* world = MWBase::Environment::get().getWorld(); + + ESM::Cell placeholderInterior; + placeholderInterior.mData.mFlags |= ESM::Cell::Flags::Interior; + placeholderInterior.mName = placeholderInteriorCellName; + + world->getModifiableStore().insert(placeholderInterior); +} + +const std::string RecordHelper::getPlaceholderInteriorCellName() +{ + return placeholderInteriorCellName; +} diff --git a/apps/openmw/mwmp/RecordHelper.hpp b/apps/openmw/mwmp/RecordHelper.hpp index b6ca21e38..77f6f38af 100644 --- a/apps/openmw/mwmp/RecordHelper.hpp +++ b/apps/openmw/mwmp/RecordHelper.hpp @@ -55,6 +55,11 @@ namespace RecordHelper return world->getStore().get().search(id); } + + void createPlaceholderInteriorCell(); + const std::string getPlaceholderInteriorCellName(); + + const std::string placeholderInteriorCellName = "$Transitional Void"; }