diff --git a/apps/openmw/mwmechanics/summoning.cpp b/apps/openmw/mwmechanics/summoning.cpp index c02ac19f0..b62ef7531 100644 --- a/apps/openmw/mwmechanics/summoning.cpp +++ b/apps/openmw/mwmechanics/summoning.cpp @@ -111,8 +111,10 @@ namespace MWMechanics objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY; MWMechanics::CreatureStats *actorCreatureStats = &mActor.getClass().getCreatureStats(mActor); - float duration = actorCreatureStats->getActiveSpells().getEffectDuration(it->first, it->second); - objectList->addObjectSpawn(placed, mActor, duration); + int effectId = it->first; + std::string spellId = it->second; + float duration = actorCreatureStats->getActiveSpells().getEffectDuration(effectId, it->second); + objectList->addObjectSpawn(placed, mActor, spellId, effectId, duration); objectList->sendObjectSpawn(); } diff --git a/apps/openmw/mwmp/ObjectList.cpp b/apps/openmw/mwmp/ObjectList.cpp index 13d5d4a54..bd6e00577 100644 --- a/apps/openmw/mwmp/ObjectList.cpp +++ b/apps/openmw/mwmp/ObjectList.cpp @@ -449,8 +449,22 @@ void ObjectList::spawnObjects(MWWorld::CellStore* cellStore) } int creatureActorId = newPtr.getClass().getCreatureStats(newPtr).getActorId(); - MWMechanics::CreatureStats& masterCreatureStats = masterPtr.getClass().getCreatureStats(masterPtr); + + std::vector activeEffects; + ESM::ActiveEffect activeEffect; + activeEffect.mDuration = baseObject.summonDuration; + activeEffect.mEffectId = baseObject.summonEffectId; + activeEffects.push_back(activeEffect); + + LOG_APPEND(TimedLog::LOG_INFO, "- adding spell from ObjectList with id %s and effect %i", + baseObject.summonSpellId.c_str(), baseObject.summonEffectId); + + masterCreatureStats.getActiveSpells().addSpell(baseObject.summonSpellId, false, activeEffects, "", masterCreatureStats.getActorId()); + + LOG_APPEND(TimedLog::LOG_INFO, "- setting summoned creature actor ID for %i-%i to %i", + newPtr.getCellRef().getRefNum(), newPtr.getCellRef().getMpNum(), creatureActorId); + masterCreatureStats.setSummonedCreatureActorId(baseObject.refId, creatureActorId); } } @@ -989,7 +1003,7 @@ void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr) addObject(baseObject); } -void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, float duration) +void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, std::string spellId, int effectId, float duration) { cell = *ptr.getCell()->getCell(); @@ -998,6 +1012,8 @@ void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& mas baseObject.refNum = ptr.getCellRef().getRefNum().mIndex; baseObject.mpNum = 0; baseObject.isSummon = true; + baseObject.summonSpellId = spellId; + baseObject.summonEffectId = effectId; baseObject.summonDuration = duration; baseObject.master = MechanicsHelper::getTarget(master); diff --git a/apps/openmw/mwmp/ObjectList.hpp b/apps/openmw/mwmp/ObjectList.hpp index f9ebcd3a2..0a122cfc6 100644 --- a/apps/openmw/mwmp/ObjectList.hpp +++ b/apps/openmw/mwmp/ObjectList.hpp @@ -53,7 +53,7 @@ namespace mwmp void addObjectActivate(const MWWorld::Ptr& ptr, const MWWorld::Ptr& activatingActor); void addObjectPlace(const MWWorld::Ptr& ptr, bool droppedByPlayer = false); void addObjectSpawn(const MWWorld::Ptr& ptr); - void addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, float spawnDuration); + void addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, std::string spellId, int effectId, float duration); void addObjectDelete(const MWWorld::Ptr& ptr); void addObjectLock(const MWWorld::Ptr& ptr, int lockLevel); void addObjectTrap(const MWWorld::Ptr& ptr, const ESM::Position& pos, bool isDisarmed); diff --git a/components/openmw-mp/Base/BaseObject.hpp b/components/openmw-mp/Base/BaseObject.hpp index c1de8e627..8beb5439a 100644 --- a/components/openmw-mp/Base/BaseObject.hpp +++ b/components/openmw-mp/Base/BaseObject.hpp @@ -65,6 +65,8 @@ namespace mwmp Target activatingActor; bool isSummon; + int summonEffectId; + std::string summonSpellId; float summonDuration; Target master; diff --git a/components/openmw-mp/Packets/Object/PacketObjectSpawn.cpp b/components/openmw-mp/Packets/Object/PacketObjectSpawn.cpp index f92ca7dc7..b522913c9 100644 --- a/components/openmw-mp/Packets/Object/PacketObjectSpawn.cpp +++ b/components/openmw-mp/Packets/Object/PacketObjectSpawn.cpp @@ -13,12 +13,15 @@ void PacketObjectSpawn::Object(BaseObject &baseObject, bool send) { ObjectPacket::Object(baseObject, send); RW(baseObject.position, send); - RW(baseObject.summonDuration, send); RW(baseObject.isSummon, send); if (baseObject.isSummon) { + RW(baseObject.summonEffectId, send); + RW(baseObject.summonSpellId, send, true); + RW(baseObject.summonDuration, send); + RW(baseObject.master.isPlayer, send); if (baseObject.master.isPlayer)