[General] Send summon duration to server in ObjectSpawn packets

0.6.3
David Cernat 7 years ago
parent 9102df7fde
commit 958b220835

@ -113,6 +113,11 @@ int ObjectFunctions::GetObjectLockLevel(unsigned int i) noexcept
return readObjectList->baseObjects.at(i).lockLevel; return readObjectList->baseObjects.at(i).lockLevel;
} }
double ObjectFunctions::GetObjectSummonDuration(unsigned int i) noexcept
{
return readObjectList->baseObjects.at(i).summonDuration;
}
double ObjectFunctions::GetObjectPosX(unsigned int i) noexcept double ObjectFunctions::GetObjectPosX(unsigned int i) noexcept
{ {
return readObjectList->baseObjects.at(i).position.pos[0]; return readObjectList->baseObjects.at(i).position.pos[0];
@ -248,6 +253,11 @@ void ObjectFunctions::SetObjectLockLevel(int lockLevel) noexcept
tempObject.lockLevel = lockLevel; tempObject.lockLevel = lockLevel;
} }
void ObjectFunctions::SetObjectSummonDuration(float summonDuration) noexcept
{
tempObject.summonDuration = summonDuration;
}
void ObjectFunctions::SetObjectDisarmState(bool disarmState) noexcept void ObjectFunctions::SetObjectDisarmState(bool disarmState) noexcept
{ {
tempObject.isDisarmed = disarmState; tempObject.isDisarmed = disarmState;

@ -24,6 +24,7 @@
{"GetObjectState", ObjectFunctions::GetObjectState},\ {"GetObjectState", ObjectFunctions::GetObjectState},\
{"GetObjectDoorState", ObjectFunctions::GetObjectDoorState},\ {"GetObjectDoorState", ObjectFunctions::GetObjectDoorState},\
{"GetObjectLockLevel", ObjectFunctions::GetObjectLockLevel},\ {"GetObjectLockLevel", ObjectFunctions::GetObjectLockLevel},\
{"GetObjectSummonDuration", ObjectFunctions::GetObjectSummonDuration},\
{"GetObjectPosX", ObjectFunctions::GetObjectPosX},\ {"GetObjectPosX", ObjectFunctions::GetObjectPosX},\
{"GetObjectPosY", ObjectFunctions::GetObjectPosY},\ {"GetObjectPosY", ObjectFunctions::GetObjectPosY},\
{"GetObjectPosZ", ObjectFunctions::GetObjectPosZ},\ {"GetObjectPosZ", ObjectFunctions::GetObjectPosZ},\
@ -55,6 +56,7 @@
{"SetObjectState", ObjectFunctions::SetObjectState},\ {"SetObjectState", ObjectFunctions::SetObjectState},\
{"SetObjectLockLevel", ObjectFunctions::SetObjectLockLevel},\ {"SetObjectLockLevel", ObjectFunctions::SetObjectLockLevel},\
{"SetObjectDisarmState", ObjectFunctions::SetObjectDisarmState},\ {"SetObjectDisarmState", ObjectFunctions::SetObjectDisarmState},\
{"SetObjectSummonDuration", ObjectFunctions::SetObjectSummonDuration},\
{"SetObjectMasterState", ObjectFunctions::SetObjectMasterState},\ {"SetObjectMasterState", ObjectFunctions::SetObjectMasterState},\
{"SetObjectPosition", ObjectFunctions::SetObjectPosition},\ {"SetObjectPosition", ObjectFunctions::SetObjectPosition},\
{"SetObjectRotation", ObjectFunctions::SetObjectRotation},\ {"SetObjectRotation", ObjectFunctions::SetObjectRotation},\
@ -250,6 +252,17 @@ public:
*/ */
static int GetObjectLockLevel(unsigned int i) noexcept; static int GetObjectLockLevel(unsigned int i) noexcept;
/**
* \brief Get the summon duration of the object at a certain index in the read object list's object
* changes.
*
* Note: Returns -1 if indefinite.
*
* \param i The index of the object.
* \return The summon duration.
*/
static double GetObjectSummonDuration(unsigned int i) noexcept;
/** /**
* \brief Get the X position of the object at a certain index in the read object list's object * \brief Get the X position of the object at a certain index in the read object list's object
* changes. * changes.
@ -509,6 +522,14 @@ public:
*/ */
static void SetObjectLockLevel(int lockLevel) noexcept; static void SetObjectLockLevel(int lockLevel) noexcept;
/**
* \brief Set the summon duration of the temporary object stored on the server.
*
* \param summonDuration The summon duration.
* \return void
*/
static void SetObjectSummonDuration(float summonDuration) noexcept;
/** /**
* \brief Set the disarm state of the temporary object stored on the server. * \brief Set the disarm state of the temporary object stored on the server.
* *

@ -319,6 +319,26 @@ namespace MWMechanics
End of tes3mp addition End of tes3mp addition
*/ */
/*
Start of tes3mp addition
Make it easy to get an effect's duration
*/
float ActiveSpells::getEffectDuration(short effectId)
{
for (TContainer::iterator it = mSpells.begin(); it != mSpells.end(); ++it)
{
for (std::vector<ActiveEffect>::iterator effectIt = it->second.mEffects.begin();
effectIt != it->second.mEffects.end();)
{
return effectIt->mDuration;
}
}
}
/*
End of tes3mp addition
*/
void ActiveSpells::clear() void ActiveSpells::clear()
{ {
mSpells.clear(); mSpells.clear();

@ -104,6 +104,16 @@ namespace MWMechanics
End of tes3mp addition End of tes3mp addition
*/ */
/*
Start of tes3mp addition
Make it easy to get an effect's duration
*/
float getEffectDuration(short effectId);
/*
End of tes3mp addition
*/
/// Remove all spells /// Remove all spells
void clear(); void clear();

@ -8,6 +8,7 @@
Include additional headers for multiplayer purposes Include additional headers for multiplayer purposes
*/ */
#include <components/openmw-mp/Log.hpp> #include <components/openmw-mp/Log.hpp>
#include "../mwmechanics/creaturestats.hpp"
#include "../mwmp/Main.hpp" #include "../mwmp/Main.hpp"
#include "../mwmp/Networking.hpp" #include "../mwmp/Networking.hpp"
#include "../mwmp/CellController.hpp" #include "../mwmp/CellController.hpp"
@ -107,7 +108,10 @@ namespace MWMechanics
{ {
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList(); mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
objectList->reset(); objectList->reset();
objectList->addObjectSpawn(placed, mActor);
MWMechanics::CreatureStats *actorCreatureStats = &mActor.getClass().getCreatureStats(mActor);
objectList->addObjectSpawn(placed, mActor, actorCreatureStats->getActiveSpells().getEffectDuration(it->first));
objectList->sendObjectSpawn(); objectList->sendObjectSpawn();
} }

@ -839,6 +839,7 @@ void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr)
baseObject.refId = ptr.getCellRef().getRefId(); baseObject.refId = ptr.getCellRef().getRefId();
baseObject.refNumIndex = ptr.getCellRef().getRefNum().mIndex; baseObject.refNumIndex = ptr.getCellRef().getRefNum().mIndex;
baseObject.mpNum = 0; baseObject.mpNum = 0;
baseObject.summonDuration = -1;
baseObject.hasMaster = false; baseObject.hasMaster = false;
// Make sure we send the RefData position instead of the CellRef one, because that's what // Make sure we send the RefData position instead of the CellRef one, because that's what
@ -848,7 +849,7 @@ void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr)
addObject(baseObject); addObject(baseObject);
} }
void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master) void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, float duration)
{ {
cell = *ptr.getCell()->getCell(); cell = *ptr.getCell()->getCell();
@ -856,6 +857,7 @@ void ObjectList::addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& mas
baseObject.refId = ptr.getCellRef().getRefId(); baseObject.refId = ptr.getCellRef().getRefId();
baseObject.refNumIndex = ptr.getCellRef().getRefNum().mIndex; baseObject.refNumIndex = ptr.getCellRef().getRefNum().mIndex;
baseObject.mpNum = 0; baseObject.mpNum = 0;
baseObject.summonDuration = duration;
baseObject.hasMaster = true; baseObject.hasMaster = true;

@ -51,7 +51,7 @@ namespace mwmp
void addObjectPlace(const MWWorld::Ptr& ptr, bool droppedByPlayer = false); void addObjectPlace(const MWWorld::Ptr& ptr, bool droppedByPlayer = false);
void addObjectSpawn(const MWWorld::Ptr& ptr); void addObjectSpawn(const MWWorld::Ptr& ptr);
void addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master); void addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, float spawnDuration);
void addObjectDelete(const MWWorld::Ptr& ptr); void addObjectDelete(const MWWorld::Ptr& ptr);
void addObjectLock(const MWWorld::Ptr& ptr, int lockLevel); void addObjectLock(const MWWorld::Ptr& ptr, int lockLevel);
void addObjectTrap(const MWWorld::Ptr& ptr, const ESM::Position& pos, bool isDisarmed); void addObjectTrap(const MWWorld::Ptr& ptr, const ESM::Position& pos, bool isDisarmed);

@ -57,6 +57,7 @@ namespace mwmp
bool isDisarmed; bool isDisarmed;
bool droppedByPlayer; bool droppedByPlayer;
float summonDuration;
Target master; Target master;
bool hasMaster; bool hasMaster;

@ -13,6 +13,7 @@ void PacketObjectSpawn::Object(BaseObject &baseObject, bool send)
{ {
ObjectPacket::Object(baseObject, send); ObjectPacket::Object(baseObject, send);
RW(baseObject.position, send); RW(baseObject.position, send);
RW(baseObject.summonDuration, send);
RW(baseObject.hasMaster, send); RW(baseObject.hasMaster, send);

Loading…
Cancel
Save