From 3e582199fb52f5245b3ea71563cb28cecb98b294 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Sat, 16 Oct 2021 01:35:30 +0200 Subject: [PATCH] [Client] Add createSpellGfx() method to MechanicsHelper Use it to create spell GFX when adding active spells to dedicated players and actors. --- apps/openmw/mwmp/DedicatedActor.cpp | 2 ++ apps/openmw/mwmp/DedicatedPlayer.cpp | 2 ++ apps/openmw/mwmp/MechanicsHelper.cpp | 24 ++++++++++++++++++++++++ apps/openmw/mwmp/MechanicsHelper.hpp | 2 ++ 4 files changed, 30 insertions(+) diff --git a/apps/openmw/mwmp/DedicatedActor.cpp b/apps/openmw/mwmp/DedicatedActor.cpp index c9c068cb6..b3445bfc6 100644 --- a/apps/openmw/mwmp/DedicatedActor.cpp +++ b/apps/openmw/mwmp/DedicatedActor.cpp @@ -368,6 +368,8 @@ void DedicatedActor::addSpellsActive() MWWorld::TimeStamp timestamp = MWWorld::TimeStamp(activeSpell.timestampHour, activeSpell.timestampDay); int casterActorId = MechanicsHelper::getActorId(activeSpell.caster); + MechanicsHelper::createSpellGfx(getPtr(), activeSpell.params.mEffects); + // Don't do a check for a spell's existence, because active effects from potions need to be applied here too activeSpells.addSpell(activeSpell.id, activeSpell.isStackingSpell, activeSpell.params.mEffects, activeSpell.params.mDisplayName, casterActorId, timestamp, false); } diff --git a/apps/openmw/mwmp/DedicatedPlayer.cpp b/apps/openmw/mwmp/DedicatedPlayer.cpp index 897e2c49b..9ae06e9be 100644 --- a/apps/openmw/mwmp/DedicatedPlayer.cpp +++ b/apps/openmw/mwmp/DedicatedPlayer.cpp @@ -507,6 +507,8 @@ void DedicatedPlayer::addSpellsActive() MWWorld::TimeStamp timestamp = MWWorld::TimeStamp(activeSpell.timestampHour, activeSpell.timestampDay); int casterActorId = MechanicsHelper::getActorId(activeSpell.caster); + MechanicsHelper::createSpellGfx(getPtr(), activeSpell.params.mEffects); + // Don't do a check for a spell's existence, because active effects from potions need to be applied here too activeSpells.addSpell(activeSpell.id, activeSpell.isStackingSpell, activeSpell.params.mEffects, activeSpell.params.mDisplayName, casterActorId, timestamp, false); } diff --git a/apps/openmw/mwmp/MechanicsHelper.cpp b/apps/openmw/mwmp/MechanicsHelper.cpp index ecfe073e5..d3b44088a 100644 --- a/apps/openmw/mwmp/MechanicsHelper.cpp +++ b/apps/openmw/mwmp/MechanicsHelper.cpp @@ -13,6 +13,8 @@ #include "../mwmechanics/spellcasting.hpp" #include "../mwmechanics/spellutil.hpp" +#include "../mwrender/animation.hpp" + #include "../mwworld/class.hpp" #include "../mwworld/inventorystore.hpp" @@ -562,6 +564,28 @@ void MechanicsHelper::processCast(Cast cast, const MWWorld::Ptr& caster) } } +void MechanicsHelper::createSpellGfx(const MWWorld::Ptr& targetPtr, const std::vector& mEffects) +{ + for (auto&& effect : mEffects) + { + const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get().find(effect.mEffectId); + + const ESM::Static* castStatic; + if (!magicEffect->mHit.empty()) + castStatic = MWBase::Environment::get().getWorld()->getStore().get().find(magicEffect->mHit); + else + castStatic = MWBase::Environment::get().getWorld()->getStore().get().find("VFX_DefaultHit"); + + bool loop = (magicEffect->mData.mFlags & ESM::MagicEffect::ContinuousVfx) != 0; + // Note: in case of non actor, a free effect should be fine as well + MWRender::Animation* anim = MWBase::Environment::get().getWorld()->getAnimation(targetPtr); + if (anim && !castStatic->mModel.empty()) + { + anim->addEffect("meshes\\" + castStatic->mModel, magicEffect->mIndex, loop, "", magicEffect->mParticle); + } + } +} + bool MechanicsHelper::isStackingSpell(const std::string& id) { return !MWBase::Environment::get().getWorld()->getStore().get().search(id); diff --git a/apps/openmw/mwmp/MechanicsHelper.hpp b/apps/openmw/mwmp/MechanicsHelper.hpp index ca7cf3861..00c17a727 100644 --- a/apps/openmw/mwmp/MechanicsHelper.hpp +++ b/apps/openmw/mwmp/MechanicsHelper.hpp @@ -46,6 +46,8 @@ namespace MechanicsHelper void processAttack(mwmp::Attack attack, const MWWorld::Ptr& attacker); void processCast(mwmp::Cast cast, const MWWorld::Ptr& caster); + void createSpellGfx(const MWWorld::Ptr& targetPtr, const std::vector& mEffects); + bool isStackingSpell(const std::string& id); bool doesEffectListContainEffect(const ESM::EffectList& effectList, short effectId, short attributeId = -1, short skillId = -1); void unequipItemsByEffect(const MWWorld::Ptr& ptr, short enchantmentType, short effectId, short attributeId = -1, short skillId = -1);