1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-01-06 16:10:54 +00:00

Allow non-actor spell projectiles to fire underwater (#8303)

This commit is contained in:
Alexei Kotov 2025-03-04 00:42:56 +03:00
parent be13b1d085
commit 612411e492

View file

@ -274,8 +274,8 @@ namespace MWWorld
pos.z() += mPhysics->getRenderingHalfExtents(caster).z() * 2 * Constants::TorsoHeight;
}
if (MWBase::Environment::get().getWorld()->isUnderwater(
caster.getCell(), pos)) // Underwater casting not possible
// Actors can't cast target spells underwater
if (caster.getClass().isActor() && MWBase::Environment::get().getWorld()->isUnderwater(caster.getCell(), pos))
return;
osg::Quat orient;
@ -564,15 +564,19 @@ namespace MWWorld
for (const auto& sound : magicBoltState.mSounds)
sound->setPosition(pos);
if (projectile->isActive())
const Ptr caster = magicBoltState.getCaster();
const MWBase::World& world = *MWBase::Environment::get().getWorld();
const bool active = projectile->isActive();
if (active && !world.isUnderwater(caster.getCell(), pos))
continue;
const auto target = projectile->getTarget();
const auto caster = magicBoltState.getCaster();
const Ptr target = !active ? projectile->getTarget() : Ptr();
assert(target != caster);
MWMechanics::CastSpell cast(caster, target);
cast.mHitPosition = Misc::Convert::toOsg(projectile->getHitPosition());
cast.mHitPosition = !active ? Misc::Convert::toOsg(projectile->getHitPosition()) : pos;
cast.mId = magicBoltState.mSpellId;
cast.mSourceName = magicBoltState.mSourceName;
cast.mItem = magicBoltState.mItem;