From 7a7e3900998f7a7e0b87c87952791e903e4536f9 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sun, 16 Dec 2018 16:03:17 +0300 Subject: [PATCH] Make unsuccessful magic teleportation attempts detectable (bug #3765) --- CHANGELOG.md | 1 + apps/openmw/mwmechanics/spellcasting.cpp | 55 ++++++++++++------------ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c3eba7e5..7f063fbc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Bug #2987: Editor: some chance and AI data fields can overflow Bug #3623: Fix HiDPI on Windows Bug #3733: Normal maps are inverted on mirrored UVs + Bug #3765: DisableTeleporting makes Mark/Recall/Intervention effects undetectable Bug #4329: Removed birthsign abilities are restored after reloading the save Bug #4383: Bow model obscures crosshair when arrow is drawn Bug #4411: Reloading a saved game while falling prevents damage in some cases diff --git a/apps/openmw/mwmechanics/spellcasting.cpp b/apps/openmw/mwmechanics/spellcasting.cpp index 9f272e1f3..1e7f3fc64 100644 --- a/apps/openmw/mwmechanics/spellcasting.cpp +++ b/apps/openmw/mwmechanics/spellcasting.cpp @@ -295,17 +295,6 @@ namespace MWMechanics return true; // must still apply to get visual effect and have target regard it as attack } break; - case ESM::MagicEffect::AlmsiviIntervention: - case ESM::MagicEffect::DivineIntervention: - case ESM::MagicEffect::Mark: - case ESM::MagicEffect::Recall: - if (!MWBase::Environment::get().getWorld()->isTeleportingEnabled()) - { - if (castByPlayer) - MWBase::Environment::get().getWindowManager()->messageBox("#{sTeleportDisabled}"); - return false; - } - break; case ESM::MagicEffect::WaterWalking: if (target.getClass().isPureWaterCreature(target) && MWBase::Environment::get().getWorld()->isSwimming(target)) return false; @@ -747,21 +736,19 @@ namespace MWMechanics else if (target.getClass().isActor() && target == getPlayer()) { MWRender::Animation* anim = MWBase::Environment::get().getWorld()->getAnimation(mCaster); + bool teleportingEnabled = MWBase::Environment::get().getWorld()->isTeleportingEnabled(); - if (effectId == ESM::MagicEffect::DivineIntervention) - { - MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "divinemarker"); - anim->removeEffect(ESM::MagicEffect::DivineIntervention); - const ESM::Static* fx = MWBase::Environment::get().getWorld()->getStore().get() - .search("VFX_Summon_end"); - if (fx) - anim->addEffect("meshes\\" + fx->mModel, -1); - return true; - } - else if (effectId == ESM::MagicEffect::AlmsiviIntervention) + if (effectId == ESM::MagicEffect::DivineIntervention || effectId == ESM::MagicEffect::AlmsiviIntervention) { - MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "templemarker"); - anim->removeEffect(ESM::MagicEffect::AlmsiviIntervention); + if (!teleportingEnabled) + { + if (caster == getPlayer()) + MWBase::Environment::get().getWindowManager()->messageBox("#{sTeleportDisabled}"); + return true; + } + std::string marker = (effectId == ESM::MagicEffect::DivineIntervention) ? "divinemarker" : "templemarker"; + MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, marker); + anim->removeEffect(effectId); const ESM::Static* fx = MWBase::Environment::get().getWorld()->getStore().get() .search("VFX_Summon_end"); if (fx) @@ -770,12 +757,26 @@ namespace MWMechanics } else if (effectId == ESM::MagicEffect::Mark) { - MWBase::Environment::get().getWorld()->getPlayer().markPosition( - target.getCell(), target.getRefData().getPosition()); + if (teleportingEnabled) + { + MWBase::Environment::get().getWorld()->getPlayer().markPosition( + target.getCell(), target.getRefData().getPosition()); + } + else if (caster == getPlayer()) + { + MWBase::Environment::get().getWindowManager()->messageBox("#{sTeleportDisabled}"); + } return true; } else if (effectId == ESM::MagicEffect::Recall) { + if (!teleportingEnabled) + { + if (caster == getPlayer()) + MWBase::Environment::get().getWindowManager()->messageBox("#{sTeleportDisabled}"); + return true; + } + MWWorld::CellStore* markedCell = nullptr; ESM::Position markedPosition; @@ -785,7 +786,7 @@ namespace MWMechanics MWWorld::ActionTeleport action(markedCell->isExterior() ? "" : markedCell->getCell()->mName, markedPosition, false); action.execute(target); - anim->removeEffect(ESM::MagicEffect::Recall); + anim->removeEffect(effectId); } return true; }