diff --git a/apps/openmw/mwbase/mechanicsmanager.hpp b/apps/openmw/mwbase/mechanicsmanager.hpp index ab4cc7ab0..6759714d2 100644 --- a/apps/openmw/mwbase/mechanicsmanager.hpp +++ b/apps/openmw/mwbase/mechanicsmanager.hpp @@ -239,6 +239,16 @@ namespace MWBase virtual bool isReadyToBlock (const MWWorld::Ptr& ptr) const = 0; virtual bool isAttackingOrSpell(const MWWorld::Ptr &ptr) const = 0; + /* + Start of tes3mp addition + + Make it possible to set the attackingOrSpell state from elsewhere in the code + */ + virtual void setAttackingOrSpell(const MWWorld::Ptr &ptr, bool state) const = 0; + /* + End of tes3mp addition + */ + virtual void castSpell(const MWWorld::Ptr& ptr, const std::string spellId, bool manualSpell) = 0; virtual void processChangedSettings (const std::set< std::pair >& settings) = 0; diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 2f9242e1b..b8a512c32 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1756,33 +1756,6 @@ namespace MWMechanics End of tes3mp change (minor) */ - /* - Start of tes3mp addition - - If this actor is a DedicatedPlayer or DedicatedActor, update their mAttackingOrSpell - */ - mwmp::Attack *dedicatedAttack = MechanicsHelper::getDedicatedAttack(iter->first); - - if (dedicatedAttack) - { - bool attackingOrSpellState = false; - - if (dedicatedAttack->pressed) - attackingOrSpellState = true; - else - { - mwmp::Cast *dedicatedCast = MechanicsHelper::getDedicatedCast(iter->first); - - if (dedicatedCast->pressed) - attackingOrSpellState = true; - } - - iter->second->getCharacterController()->setAttackingOrSpell(attackingOrSpellState); - } - /* - End of tes3mp addition - */ - /* Start of tes3mp change (major) @@ -2617,6 +2590,24 @@ namespace MWMechanics return ctrl->isAttackingOrSpell(); } + /* + Start of tes3mp addition + + Make it possible to set the attackingOrSpell state from elsewhere in the code + */ + void Actors::setAttackingOrSpell(const MWWorld::Ptr& ptr, bool state) const + { + PtrActorMap::const_iterator it = mActors.find(ptr); + if (it == mActors.end()) + return; + CharacterController* ctrl = it->second->getCharacterController(); + + ctrl->setAttackingOrSpell(state); + } + /* + End of tes3mp addition + */ + void Actors::fastForwardAi() { if (!MWBase::Environment::get().getMechanicsManager()->isAIActive()) diff --git a/apps/openmw/mwmechanics/actors.hpp b/apps/openmw/mwmechanics/actors.hpp index 10fbbb0c8..84fc8d8dc 100644 --- a/apps/openmw/mwmechanics/actors.hpp +++ b/apps/openmw/mwmechanics/actors.hpp @@ -204,6 +204,16 @@ namespace MWMechanics bool isReadyToBlock(const MWWorld::Ptr& ptr) const; bool isAttackingOrSpell(const MWWorld::Ptr& ptr) const; + /* + Start of tes3mp addition + + Make it possible to set the attackingOrSpell state from elsewhere in the code + */ + void setAttackingOrSpell(const MWWorld::Ptr& ptr, bool state) const; + /* + End of tes3mp addition + */ + private: void updateVisibility (const MWWorld::Ptr& ptr, CharacterController* ctrl); diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index a16fb7ea2..ed005c97d 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1928,6 +1928,19 @@ namespace MWMechanics return mActors.isAttackingOrSpell(ptr); } + /* + Start of tes3mp addition + + Make it possible to set the attackingOrSpell state from elsewhere in the code + */ + void MechanicsManager::setAttackingOrSpell(const MWWorld::Ptr &ptr, bool state) const + { + return mActors.setAttackingOrSpell(ptr, state); + } + /* + End of tes3mp addition + */ + void MechanicsManager::setWerewolf(const MWWorld::Ptr& actor, bool werewolf) { MWMechanics::NpcStats& npcStats = actor.getClass().getNpcStats(actor); diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 88c6c3c19..263314556 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -213,6 +213,16 @@ namespace MWMechanics /// Is \a ptr casting spell or using weapon now? virtual bool isAttackingOrSpell(const MWWorld::Ptr &ptr) const override; + /* + Start of tes3mp addition + + Make it possible to set the attackingOrSpell state from elsewhere in the code + */ + virtual void setAttackingOrSpell(const MWWorld::Ptr &ptr, bool state) const override; + /* + End of tes3mp addition + */ + virtual void castSpell(const MWWorld::Ptr& ptr, const std::string spellId, bool manualSpell=false) override; void processChangedSettings(const Settings::CategorySettingVector& settings) override; diff --git a/apps/openmw/mwmp/MechanicsHelper.cpp b/apps/openmw/mwmp/MechanicsHelper.cpp index c0080938d..0b2cffaf8 100644 --- a/apps/openmw/mwmp/MechanicsHelper.cpp +++ b/apps/openmw/mwmp/MechanicsHelper.cpp @@ -3,6 +3,7 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/world.hpp" #include "../mwmechanics/creaturestats.hpp" @@ -288,7 +289,8 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker) LOG_APPEND(TimedLog::LOG_VERBOSE, "- animation: %s", attack.attackAnimation.c_str()); } - MWMechanics::CreatureStats &attackerStats = attacker.getClass().getCreatureStats(attacker); + MWBase::Environment::get().getMechanicsManager()->setAttackingOrSpell(attacker, attack.pressed); + MWWorld::Ptr victim; if (attack.target.isPlayer) @@ -434,7 +436,9 @@ void MechanicsHelper::processCast(Cast cast, const MWWorld::Ptr& caster) LOG_APPEND(TimedLog::LOG_VERBOSE, "- success: %s", cast.success ? "true" : "false"); } + MWBase::Environment::get().getMechanicsManager()->setAttackingOrSpell(caster, cast.pressed); MWMechanics::CreatureStats &casterStats = caster.getClass().getCreatureStats(caster); + MWWorld::Ptr victim; if (cast.target.isPlayer)