openmw-tes3coop/apps/openmw/mwworld/actiontrap.cpp

43 lines
1.5 KiB
C++
Raw Normal View History

#include "actiontrap.hpp"
#include "../mwmechanics/spellcasting.hpp"
2016-07-04 05:39:44 +00:00
#include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
namespace MWWorld
{
2016-07-04 10:09:12 +00:00
// actor activated object without telekinesis, so trap will hit
void ActionTrap::executeImp(const Ptr &actor)
{
2015-06-01 19:41:13 +00:00
osg::Vec3f actorPosition(actor.getRefData().getPosition().asVec3());
2016-07-04 10:09:12 +00:00
MWMechanics::CastSpell cast(mTrapSource, actor);
cast.mHitPosition = actorPosition;
cast.cast(mSpellId);
mTrapSource.getCellRef().setTrap("");
}
// actor activated object with telekinesis, so trap may or may not hit
void ActionTrap::executeImp(const Ptr &actor, float distance)
{
2015-06-01 19:41:13 +00:00
osg::Vec3f trapPosition(mTrapSource.getRefData().getPosition().asVec3());
float activationDistance = MWBase::Environment::get().getWorld()->getMaxActivationDistance();
2016-07-04 05:39:44 +00:00
// Note: can't just detonate the trap at the trapped object's location and use the blast
// radius, because for most trap spells this is 1 foot, much less than the activation distance.
2016-07-04 10:09:12 +00:00
// Using activation distance as the trap range.
2016-07-04 05:39:44 +00:00
2016-07-04 10:09:12 +00:00
if (distance < activationDistance) // actor activated object within range of trap
executeImp(actor);
else // actor activated object outside range of trap
{
MWMechanics::CastSpell cast(mTrapSource, mTrapSource);
cast.mHitPosition = trapPosition;
cast.cast(mSpellId);
2016-07-04 10:09:12 +00:00
mTrapSource.getCellRef().setTrap("");
}
}
}