Don't teleport followers when using teleportation spells

c++11
scrawl 10 years ago
parent d27b92e9f1
commit d1b6289cad

@ -147,7 +147,7 @@ namespace MWClass
if (ptr.getCellRef().getTeleport())
{
boost::shared_ptr<MWWorld::Action> action(new MWWorld::ActionTeleport (ptr.getCellRef().getDestCell(), ptr.getCellRef().getDoorDest()));
boost::shared_ptr<MWWorld::Action> action(new MWWorld::ActionTeleport (ptr.getCellRef().getDestCell(), ptr.getCellRef().getDoorDest(), true));
action->setSound(openSound);

@ -183,7 +183,7 @@ namespace MWGui
MWBase::Environment::get().getDialogueManager()->goodbyeSelected();
// Teleports any followers, too.
MWWorld::ActionTeleport action(interior ? cellname : "", pos);
MWWorld::ActionTeleport action(interior ? cellname : "", pos, true);
action.execute(player);
MWBase::Environment::get().getWindowManager()->fadeScreenOut(0);

@ -679,7 +679,7 @@ namespace MWMechanics
if (markedCell)
{
MWWorld::ActionTeleport action(markedCell->isExterior() ? "" : markedCell->getCell()->mName,
markedPosition);
markedPosition, false);
action.execute(target);
}
}

@ -25,23 +25,26 @@ namespace
namespace MWWorld
{
ActionTeleport::ActionTeleport (const std::string& cellName,
const ESM::Position& position)
: Action (true), mCellName (cellName), mPosition (position)
const ESM::Position& position, bool teleportFollowers)
: Action (true), mCellName (cellName), mPosition (position), mTeleportFollowers(teleportFollowers)
{
}
void ActionTeleport::executeImp (const Ptr& actor)
{
//find any NPC that is following the actor and teleport him too
std::set<MWWorld::Ptr> followers;
getFollowers(actor, followers);
for(std::set<MWWorld::Ptr>::iterator it = followers.begin();it != followers.end();++it)
if (mTeleportFollowers)
{
MWWorld::Ptr follower = *it;
if (Ogre::Vector3(follower.getRefData().getPosition().pos).squaredDistance(
Ogre::Vector3( actor.getRefData().getPosition().pos))
<= 800*800)
teleport(*it);
//find any NPC that is following the actor and teleport him too
std::set<MWWorld::Ptr> followers;
getFollowers(actor, followers);
for(std::set<MWWorld::Ptr>::iterator it = followers.begin();it != followers.end();++it)
{
MWWorld::Ptr follower = *it;
if (Ogre::Vector3(follower.getRefData().getPosition().pos).squaredDistance(
Ogre::Vector3( actor.getRefData().getPosition().pos))
<= 800*800)
teleport(*it);
}
}
teleport(actor);

@ -13,6 +13,7 @@ namespace MWWorld
{
std::string mCellName;
ESM::Position mPosition;
bool mTeleportFollowers;
/// Teleports this actor and also teleports anyone following that actor.
virtual void executeImp (const Ptr& actor);
@ -22,8 +23,9 @@ namespace MWWorld
public:
ActionTeleport (const std::string& cellName, const ESM::Position& position);
ActionTeleport (const std::string& cellName, const ESM::Position& position, bool teleportFollowers);
///< If cellName is empty, an exterior cell is assumed.
/// @param teleportFollowers Whether to teleport any following actors of the target actor as well.
};
}

@ -2921,7 +2921,7 @@ namespace MWWorld
if ( !closestMarker.mCell->isExterior() )
cellName = closestMarker.mCell->getCell()->mName;
MWWorld::ActionTeleport action(cellName, closestMarker.getRefData().getPosition());
MWWorld::ActionTeleport action(cellName, closestMarker.getRefData().getPosition(), false);
action.execute(ptr);
}

Loading…
Cancel
Save