From d4e656ceafdbc1526fa1b9294f4afde6304e2c31 Mon Sep 17 00:00:00 2001 From: Allofich Date: Sun, 10 Jul 2016 21:22:48 +0900 Subject: [PATCH 1/9] Play trap activation sound on trapped object, not actor --- apps/openmw/mwclass/container.cpp | 2 +- apps/openmw/mwclass/door.cpp | 2 +- apps/openmw/mwworld/actiontrap.hpp | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 675287af96..da91b5a016 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -173,7 +173,7 @@ namespace MWClass else { // Activate trap - boost::shared_ptr action(new MWWorld::ActionTrap(actor, ptr.getCellRef().getTrap(), ptr)); + boost::shared_ptr action(new MWWorld::ActionTrap(ptr.getCellRef().getTrap(), ptr)); action->setSound(trapActivationSound); return action; } diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index d8a9efba58..b31a958b57 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -139,7 +139,7 @@ namespace MWClass if(!ptr.getCellRef().getTrap().empty()) { // Trap activation - boost::shared_ptr action(new MWWorld::ActionTrap(actor, ptr.getCellRef().getTrap(), ptr)); + boost::shared_ptr action(new MWWorld::ActionTrap(ptr.getCellRef().getTrap(), ptr)); action->setSound(trapActivationSound); return action; } diff --git a/apps/openmw/mwworld/actiontrap.hpp b/apps/openmw/mwworld/actiontrap.hpp index 4c2f4139f7..5ff91613f8 100644 --- a/apps/openmw/mwworld/actiontrap.hpp +++ b/apps/openmw/mwworld/actiontrap.hpp @@ -18,10 +18,9 @@ namespace MWWorld public: /// @param spellId - /// @param actor Actor that activated the trap /// @param trapSource - ActionTrap (const Ptr& actor, const std::string& spellId, const Ptr& trapSource) - : Action(false, actor), mSpellId(spellId), mTrapSource(trapSource) {} + ActionTrap (const std::string& spellId, const Ptr& trapSource) + : Action(false, trapSource), mSpellId(spellId), mTrapSource(trapSource) {} }; } From 249918612d55238472fe854f8fe15327b0392c36 Mon Sep 17 00:00:00 2001 From: Allofich Date: Sun, 10 Jul 2016 21:42:03 +0900 Subject: [PATCH 2/9] Play trap disarm sound when key used on trapped object --- apps/openmw/mwclass/container.cpp | 9 ++++++++- apps/openmw/mwclass/door.cpp | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index da91b5a016..2e5b495e4f 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -7,6 +7,7 @@ #include "../mwbase/world.hpp" #include "../mwbase/windowmanager.hpp" #include "../mwbase/mechanicsmanager.hpp" +#include "../mwbase/soundmanager.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/failedaction.hpp" @@ -159,7 +160,13 @@ namespace MWClass MWBase::Environment::get().getWindowManager ()->messageBox (keyName + " #{sKeyUsed}"); unlock(ptr); // using a key disarms the trap - ptr.getCellRef().setTrap(""); + if(!ptr.getCellRef().getTrap().empty()) + { + ptr.getCellRef().setTrap(""); + MWBase::Environment::get().getSoundManager()->playSound3D(ptr, + "Disarm Trap", 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, + MWBase::SoundManager::Play_Normal); + } } diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index b31a958b57..12130e5dff 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -131,7 +131,13 @@ namespace MWClass MWBase::Environment::get().getWindowManager()->messageBox(keyName + " #{sKeyUsed}"); unlock(ptr); //Call the function here. because that makes sense. // using a key disarms the trap - ptr.getCellRef().setTrap(""); + if(!ptr.getCellRef().getTrap().empty()) + { + ptr.getCellRef().setTrap(""); + MWBase::Environment::get().getSoundManager()->playSound3D(ptr, + "Disarm Trap", 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, + MWBase::SoundManager::Play_Normal); + } } if (!needKey || hasKey) From cabe038a976e1b19ab8ac390015c08d8ad614505 Mon Sep 17 00:00:00 2001 From: Allofich Date: Sun, 10 Jul 2016 22:08:42 +0900 Subject: [PATCH 3/9] Make lockpick and probe sounds 3d positional --- apps/openmw/mwmechanics/character.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 24f004588d..081f288d53 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1305,7 +1305,9 @@ bool CharacterController::updateWeaponState() if(!resultMessage.empty()) MWBase::Environment::get().getWindowManager()->messageBox(resultMessage); if(!resultSound.empty()) - MWBase::Environment::get().getSoundManager()->playSound(resultSound, 1.0f, 1.0f); + MWBase::Environment::get().getSoundManager()->playSound3D(target, + resultSound, 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, + MWBase::SoundManager::Play_Normal); } else if (ammunition) { From 599e6708ec9737b817163cb927af52aea4b9a967 Mon Sep 17 00:00:00 2001 From: Allofich Date: Sun, 10 Jul 2016 22:29:21 +0900 Subject: [PATCH 4/9] Allow using keys to open trapped objects of lock level 0 --- apps/openmw/mwclass/container.cpp | 15 +++++++++------ apps/openmw/mwclass/door.cpp | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 2e5b495e4f..09891652ab 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -137,7 +137,8 @@ namespace MWClass MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayerPtr(); MWWorld::InventoryStore& invStore = player.getClass().getInventoryStore(player); - bool needKey = ptr.getCellRef().getLockLevel() > 0; + bool isLocked = ptr.getCellRef().getLockLevel() > 0; + bool isTrapped = !ptr.getCellRef().getTrap().empty(); bool hasKey = false; std::string keyName; @@ -155,24 +156,26 @@ namespace MWClass } } - if (needKey && hasKey) + if ((isLocked || isTrapped) && hasKey) { MWBase::Environment::get().getWindowManager ()->messageBox (keyName + " #{sKeyUsed}"); - unlock(ptr); + if(isLocked) + unlock(ptr); // using a key disarms the trap - if(!ptr.getCellRef().getTrap().empty()) + if(isTrapped) { ptr.getCellRef().setTrap(""); MWBase::Environment::get().getSoundManager()->playSound3D(ptr, "Disarm Trap", 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, MWBase::SoundManager::Play_Normal); + isTrapped = false; } } - if (!needKey || hasKey) + if (!isLocked || hasKey) { - if(ptr.getCellRef().getTrap().empty()) + if(!isTrapped) { boost::shared_ptr action (new MWWorld::ActionOpen(ptr)); return action; diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 12130e5dff..a54b648974 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -107,7 +107,8 @@ namespace MWClass MWWorld::ContainerStore &invStore = actor.getClass().getContainerStore(actor); - bool needKey = ptr.getCellRef().getLockLevel() > 0; + bool isLocked = ptr.getCellRef().getLockLevel() > 0; + bool isTrapped = !ptr.getCellRef().getTrap().empty(); bool hasKey = false; std::string keyName; @@ -125,24 +126,26 @@ namespace MWClass } } - if (needKey && hasKey) + if ((isLocked || isTrapped) && hasKey) { if(actor == MWMechanics::getPlayer()) MWBase::Environment::get().getWindowManager()->messageBox(keyName + " #{sKeyUsed}"); - unlock(ptr); //Call the function here. because that makes sense. + if(isLocked) + unlock(ptr); //Call the function here. because that makes sense. // using a key disarms the trap - if(!ptr.getCellRef().getTrap().empty()) + if(isTrapped) { ptr.getCellRef().setTrap(""); MWBase::Environment::get().getSoundManager()->playSound3D(ptr, "Disarm Trap", 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, MWBase::SoundManager::Play_Normal); + isTrapped = false; } } - if (!needKey || hasKey) + if (!isLocked || hasKey) { - if(!ptr.getCellRef().getTrap().empty()) + if(isTrapped) { // Trap activation boost::shared_ptr action(new MWWorld::ActionTrap(ptr.getCellRef().getTrap(), ptr)); From 9375cbea4426d1200e57dca047e167d32f520999 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 9 Jul 2016 20:19:06 +0200 Subject: [PATCH 5/9] Make NIFFilePtr const --- components/nif/niffile.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/nif/niffile.hpp b/components/nif/niffile.hpp index 900c360bb8..9a2acbb9fa 100644 --- a/components/nif/niffile.hpp +++ b/components/nif/niffile.hpp @@ -48,14 +48,14 @@ class NIFFile public: /// Used if file parsing fails - void fail(const std::string &msg) + void fail(const std::string &msg) const { std::string err = " NIFFile Error: " + msg; err += "\nFile: " + filename; throw std::runtime_error(err); } /// Used when something goes wrong, but not catastrophically so - void warn(const std::string &msg) + void warn(const std::string &msg) const { std::cerr << " NIFFile Warning: " << msg < NIFFilePtr; +typedef boost::shared_ptr NIFFilePtr; From 67d3571faca5b19c4b09195290774b90b2c08b05 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 10 Jul 2016 17:09:21 +0200 Subject: [PATCH 6/9] Fix activation distance in third person mode --- apps/openmw/mwworld/worldimp.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index cb5756c930..b178e6e52c 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1722,7 +1722,8 @@ namespace MWWorld MWWorld::Ptr World::getFacedObject(float maxDistance, bool ignorePlayer) { - maxDistance += mRendering->getCameraDistance(); + const float camDist = mRendering->getCameraDistance(); + maxDistance += camDist; MWWorld::Ptr facedObject; MWRender::RenderingManager::RayResult rayToObject; @@ -1737,7 +1738,7 @@ namespace MWWorld facedObject = rayToObject.mHitObject; if (rayToObject.mHit) - mDistanceToFacedObject = rayToObject.mRatio * maxDistance; + mDistanceToFacedObject = (rayToObject.mRatio * maxDistance) - camDist; else mDistanceToFacedObject = -1; return facedObject; From 2a987b6857df96beae2c5042e752e0af45b61880 Mon Sep 17 00:00:00 2001 From: MiroslavR Date: Sun, 10 Jul 2016 19:02:28 +0200 Subject: [PATCH 7/9] Do not skip inactive keyframe controllers (Bug #1942) --- components/nifosg/nifloader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index 172d92abeb..59f7819371 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -321,8 +321,8 @@ namespace NifOsg continue; } - if (!(ctrl->flags & Nif::NiNode::ControllerFlag_Active)) - continue; + // Vanilla seems to ignore the "active" flag for NiKeyframeController, + // so we don't want to skip inactive controllers here. const Nif::NiStringExtraData *strdata = static_cast(extra.getPtr()); const Nif::NiKeyframeController *key = static_cast(ctrl.getPtr()); From c57d177f1c804104a61b229b414f41f09d5676df Mon Sep 17 00:00:00 2001 From: Allofich Date: Tue, 12 Jul 2016 04:01:54 +0900 Subject: [PATCH 8/9] Trim unneeded code --- apps/openmw/mwmechanics/aiescort.cpp | 2 -- apps/openmw/mwmechanics/aipackage.cpp | 14 ++++---------- apps/openmw/mwmechanics/aipackage.hpp | 3 --- apps/openmw/mwmechanics/aitravel.cpp | 4 ---- 4 files changed, 4 insertions(+), 19 deletions(-) diff --git a/apps/openmw/mwmechanics/aiescort.cpp b/apps/openmw/mwmechanics/aiescort.cpp index 2d7b8b9f67..f655fee855 100644 --- a/apps/openmw/mwmechanics/aiescort.cpp +++ b/apps/openmw/mwmechanics/aiescort.cpp @@ -68,7 +68,6 @@ namespace MWMechanics if (mRemainingDuration <= 0) { mRemainingDuration = mDuration; - mStarted = false; // Reset to false so this package will build path again when repeating return true; } } @@ -100,7 +99,6 @@ namespace MWMechanics if(pathTo(actor,point,duration)) //Returns true on path complete { mRemainingDuration = mDuration; - mStarted = false; // Reset to false so this package will build path again when repeating return true; } mMaxDist = 450; diff --git a/apps/openmw/mwmechanics/aipackage.cpp b/apps/openmw/mwmechanics/aipackage.cpp index dc23f922c0..34cf9b9219 100644 --- a/apps/openmw/mwmechanics/aipackage.cpp +++ b/apps/openmw/mwmechanics/aipackage.cpp @@ -51,7 +51,7 @@ bool MWMechanics::AiPackage::getRepeat() const return false; } -MWMechanics::AiPackage::AiPackage() : mTimer(0.26f), mStarted(false) { //mTimer starts at .26 to force initial pathbuild +MWMechanics::AiPackage::AiPackage() : mTimer(0.26f) { //mTimer starts at .26 to force initial pathbuild } @@ -79,14 +79,8 @@ bool MWMechanics::AiPackage::pathTo(const MWWorld::Ptr& actor, ESM::Pathgrid::Po //*********************** if(mTimer > 0.25) { - const ESM::Cell *cell = actor.getCell()->getCell(); - // If repeating an AI package (mStarted has been set to false again), build a new path if needed so package doesn't immediately end - if (!mStarted && distance(pos.pos, dest) > 10) { - mStarted = true; - mPathFinder.buildSyncedPath(pos.pos, dest, actor.getCell(), true); //Rebuild path, in case the target has moved - mPrevDest = dest; - } - else if (doesPathNeedRecalc(dest, cell)) { //Only rebuild path if it's moved + const ESM::Cell *cell = actor.getCell()->getCell(); + if (doesPathNeedRecalc(dest, cell)) { //Only rebuild path if it's moved mPathFinder.buildSyncedPath(pos.pos, dest, actor.getCell(), true); //Rebuild path, in case the target has moved mPrevDest = dest; } @@ -146,7 +140,7 @@ void MWMechanics::AiPackage::evadeObstacles(const MWWorld::Ptr& actor, float dur bool MWMechanics::AiPackage::doesPathNeedRecalc(ESM::Pathgrid::Point dest, const ESM::Cell *cell) { - return distance(mPrevDest, dest) > 10; + return mPathFinder.getPath().empty() || (distance(mPrevDest, dest) > 10); } bool MWMechanics::AiPackage::isTargetMagicallyHidden(const MWWorld::Ptr& target) diff --git a/apps/openmw/mwmechanics/aipackage.hpp b/apps/openmw/mwmechanics/aipackage.hpp index 2776297700..637d4f0662 100644 --- a/apps/openmw/mwmechanics/aipackage.hpp +++ b/apps/openmw/mwmechanics/aipackage.hpp @@ -108,9 +108,6 @@ namespace MWMechanics float mTimer; - // Set to true once package starts actually being executed - bool mStarted; - ESM::Pathgrid::Point mPrevDest; private: diff --git a/apps/openmw/mwmechanics/aitravel.cpp b/apps/openmw/mwmechanics/aitravel.cpp index 5375644be5..1585a3007f 100644 --- a/apps/openmw/mwmechanics/aitravel.cpp +++ b/apps/openmw/mwmechanics/aitravel.cpp @@ -58,13 +58,9 @@ namespace MWMechanics if (!isWithinMaxRange(osg::Vec3f(mX, mY, mZ), pos.asVec3())) return false; - if (!mStarted) - mStarted = true; - if (pathTo(actor, ESM::Pathgrid::Point(static_cast(mX), static_cast(mY), static_cast(mZ)), duration)) { actor.getClass().getMovementSettings(actor).mPosition[1] = 0; - mStarted = false; // Reset to false so this package will build path again when repeating return true; } return false; From 9c6739f1b3d501d580b9fe5d2522a314107b8b65 Mon Sep 17 00:00:00 2001 From: MiroslavR Date: Mon, 11 Jul 2016 22:40:58 +0200 Subject: [PATCH 9/9] Fix doubled particle spawn range --- components/nifosg/nifloader.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index 59f7819371..b71701f553 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -918,9 +918,9 @@ namespace NifOsg emitter->setShooter(shooter); osgParticle::BoxPlacer* placer = new osgParticle::BoxPlacer; - placer->setXRange(-partctrl->offsetRandom.x(), partctrl->offsetRandom.x()); - placer->setYRange(-partctrl->offsetRandom.y(), partctrl->offsetRandom.y()); - placer->setZRange(-partctrl->offsetRandom.z(), partctrl->offsetRandom.z()); + placer->setXRange(-partctrl->offsetRandom.x() / 2.f, partctrl->offsetRandom.x() / 2.f); + placer->setYRange(-partctrl->offsetRandom.y() / 2.f, partctrl->offsetRandom.y() / 2.f); + placer->setZRange(-partctrl->offsetRandom.z() / 2.f, partctrl->offsetRandom.z() / 2.f); emitter->setPlacer(placer); return emitter;