mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 23:53:52 +00:00
Apply spell absorption once per effect (Fixes #2942)
This commit is contained in:
parent
bc1f7499ab
commit
34f48d63f3
1 changed files with 20 additions and 20 deletions
|
@ -365,26 +365,6 @@ namespace MWMechanics
|
||||||
|
|
||||||
bool castByPlayer = (!caster.isEmpty() && caster == getPlayer());
|
bool castByPlayer = (!caster.isEmpty() && caster == getPlayer());
|
||||||
|
|
||||||
// Try absorbing if it's a spell
|
|
||||||
// NOTE: Vanilla does this once per effect source instead of adding the % from all sources together, not sure
|
|
||||||
// if that is worth replicating.
|
|
||||||
bool absorbed = false;
|
|
||||||
if (spell && caster != target && target.getClass().isActor())
|
|
||||||
{
|
|
||||||
float absorb = target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::SpellAbsorption).getMagnitude();
|
|
||||||
absorbed = (Misc::Rng::roll0to99() < absorb);
|
|
||||||
if (absorbed)
|
|
||||||
{
|
|
||||||
const ESM::Static* absorbStatic = MWBase::Environment::get().getWorld()->getStore().get<ESM::Static>().find ("VFX_Absorb");
|
|
||||||
MWBase::Environment::get().getWorld()->getAnimation(target)->addEffect(
|
|
||||||
"meshes\\" + absorbStatic->mModel, ESM::MagicEffect::SpellAbsorption, false, "");
|
|
||||||
// Magicka is increased by cost of spell
|
|
||||||
DynamicStat<float> magicka = target.getClass().getCreatureStats(target).getMagicka();
|
|
||||||
magicka.setCurrent(magicka.getCurrent() + spell->mData.mCost);
|
|
||||||
target.getClass().getCreatureStats(target).setMagicka(magicka);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (std::vector<ESM::ENAMstruct>::const_iterator effectIt (effects.mList.begin());
|
for (std::vector<ESM::ENAMstruct>::const_iterator effectIt (effects.mList.begin());
|
||||||
effectIt!=effects.mList.end(); ++effectIt)
|
effectIt!=effects.mList.end(); ++effectIt)
|
||||||
{
|
{
|
||||||
|
@ -404,6 +384,26 @@ namespace MWMechanics
|
||||||
&& target.getClass().isActor())
|
&& target.getClass().isActor())
|
||||||
MWBase::Environment::get().getWindowManager()->setEnemy(target);
|
MWBase::Environment::get().getWindowManager()->setEnemy(target);
|
||||||
|
|
||||||
|
// Try absorbing if it's a spell
|
||||||
|
// NOTE: Vanilla does this once per spell absorption effect source instead of adding the % from all sources together, not sure
|
||||||
|
// if that is worth replicating.
|
||||||
|
bool absorbed = false;
|
||||||
|
if (spell && caster != target && target.getClass().isActor())
|
||||||
|
{
|
||||||
|
float absorb = target.getClass().getCreatureStats(target).getMagicEffects().get(ESM::MagicEffect::SpellAbsorption).getMagnitude();
|
||||||
|
absorbed = (Misc::Rng::roll0to99() < absorb);
|
||||||
|
if (absorbed)
|
||||||
|
{
|
||||||
|
const ESM::Static* absorbStatic = MWBase::Environment::get().getWorld()->getStore().get<ESM::Static>().find ("VFX_Absorb");
|
||||||
|
MWBase::Environment::get().getWorld()->getAnimation(target)->addEffect(
|
||||||
|
"meshes\\" + absorbStatic->mModel, ESM::MagicEffect::SpellAbsorption, false, "");
|
||||||
|
// Magicka is increased by cost of spell
|
||||||
|
DynamicStat<float> magicka = target.getClass().getCreatureStats(target).getMagicka();
|
||||||
|
magicka.setCurrent(magicka.getCurrent() + spell->mData.mCost);
|
||||||
|
target.getClass().getCreatureStats(target).setMagicka(magicka);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float magnitudeMult = 1;
|
float magnitudeMult = 1;
|
||||||
if (magicEffect->mData.mFlags & ESM::MagicEffect::Harmful && target.getClass().isActor())
|
if (magicEffect->mData.mFlags & ESM::MagicEffect::Harmful && target.getClass().isActor())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue