mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-20 07:53:51 +00:00
Make AI cast self-targeted spells at the ground (bug #5695)
This commit is contained in:
parent
a98847e670
commit
84e1a29700
2 changed files with 22 additions and 19 deletions
|
@ -67,6 +67,7 @@
|
||||||
Bug #5656: Sneaking characters block hits while standing
|
Bug #5656: Sneaking characters block hits while standing
|
||||||
Bug #5661: Region sounds don't play at the right interval
|
Bug #5661: Region sounds don't play at the right interval
|
||||||
Bug #5688: Water shader broken indoors with enable indoor shadows = false
|
Bug #5688: Water shader broken indoors with enable indoor shadows = false
|
||||||
|
Bug #5695: ExplodeSpell for actors doesn't target the ground
|
||||||
Bug #5703: OpenMW-CS menu system crashing on XFCE
|
Bug #5703: OpenMW-CS menu system crashing on XFCE
|
||||||
Feature #390: 3rd person look "over the shoulder"
|
Feature #390: 3rd person look "over the shoulder"
|
||||||
Feature #2386: Distant Statics in the form of Object Paging
|
Feature #2386: Distant Statics in the form of Object Paging
|
||||||
|
|
|
@ -46,27 +46,29 @@ bool MWMechanics::AiCast::execute(const MWWorld::Ptr& actor, MWMechanics::Charac
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Vec3f targetPos = target.getRefData().getPosition().asVec3();
|
|
||||||
if (target.getClass().isActor())
|
|
||||||
{
|
|
||||||
osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(target);
|
|
||||||
targetPos.z() += halfExtents.z() * 2 * 0.75f;
|
|
||||||
}
|
|
||||||
|
|
||||||
osg::Vec3f actorPos = actor.getRefData().getPosition().asVec3();
|
|
||||||
osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(actor);
|
|
||||||
actorPos.z() += halfExtents.z() * 2 * 0.75f;
|
|
||||||
|
|
||||||
osg::Vec3f dir = targetPos - actorPos;
|
|
||||||
|
|
||||||
bool turned = smoothTurn(actor, getZAngleToDir(dir), 2, osg::DegreesToRadians(3.f));
|
|
||||||
turned &= smoothTurn(actor, getXAngleToDir(dir), 0, osg::DegreesToRadians(3.f));
|
|
||||||
|
|
||||||
if (!turned)
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
osg::Vec3f targetPos = target.getRefData().getPosition().asVec3();
|
||||||
|
// If the target of an on-target spell is an actor that is not the caster
|
||||||
|
// the target position must be adjusted so that it's not casted at the actor's feet.
|
||||||
|
if (target != actor && target.getClass().isActor())
|
||||||
|
{
|
||||||
|
osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(target);
|
||||||
|
targetPos.z() += halfExtents.z() * 2 * 0.75f;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Vec3f actorPos = actor.getRefData().getPosition().asVec3();
|
||||||
|
osg::Vec3f halfExtents = MWBase::Environment::get().getWorld()->getHalfExtents(actor);
|
||||||
|
actorPos.z() += halfExtents.z() * 2 * 0.75f;
|
||||||
|
|
||||||
|
osg::Vec3f dir = targetPos - actorPos;
|
||||||
|
|
||||||
|
bool turned = smoothTurn(actor, getZAngleToDir(dir), 2, osg::DegreesToRadians(3.f));
|
||||||
|
turned &= smoothTurn(actor, getXAngleToDir(dir), 0, osg::DegreesToRadians(3.f));
|
||||||
|
|
||||||
|
if (!turned)
|
||||||
|
return false;
|
||||||
|
|
||||||
// Check if the actor is already casting another spell
|
// Check if the actor is already casting another spell
|
||||||
bool isCasting = MWBase::Environment::get().getMechanicsManager()->isCastingSpell(actor);
|
bool isCasting = MWBase::Environment::get().getMechanicsManager()->isCastingSpell(actor);
|
||||||
if (isCasting && !mCasting)
|
if (isCasting && !mCasting)
|
||||||
|
|
Loading…
Reference in a new issue