diff --git a/apps/openmw-mp/Script/Functions/Objects.cpp b/apps/openmw-mp/Script/Functions/Objects.cpp index 5b4f4cb68..c8aa8a652 100644 --- a/apps/openmw-mp/Script/Functions/Objects.cpp +++ b/apps/openmw-mp/Script/Functions/Objects.cpp @@ -24,16 +24,25 @@ void ObjectFunctions::ReadLastObjectList() noexcept readObjectList = mwmp::Networking::getPtr()->getLastObjectList(); } -void ObjectFunctions::InitializeObjectList(unsigned short pid) noexcept +void ObjectFunctions::ClearObjectList() noexcept +{ + writeObjectList.cell.blank(); + writeObjectList.baseObjects.clear(); +} + +void ObjectFunctions::SetObjectListPid(unsigned short pid) noexcept { Player *player; GET_PLAYER(pid, player, ); - writeObjectList.cell.blank(); - writeObjectList.baseObjects.clear(); writeObjectList.guid = player->guid; } +void ObjectFunctions::CopyLastObjectListToStore() noexcept +{ + writeObjectList = *readObjectList; +} + unsigned int ObjectFunctions::GetObjectChangesSize() noexcept { return readObjectList->baseObjectCount; @@ -315,9 +324,9 @@ void ObjectFunctions::SetContainerItemEnchantmentCharge(double enchantmentCharge tempContainerItem.enchantmentCharge = enchantmentCharge; } -void ObjectFunctions::SetReceivedContainerItemActionCount(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept +void ObjectFunctions::SetContainerItemActionCountByIndex(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept { - readObjectList->baseObjects.at(objectIndex).containerItems.at(itemIndex).actionCount = actionCount; + writeObjectList.baseObjects.at(objectIndex).containerItems.at(itemIndex).actionCount = actionCount; } void ObjectFunctions::AddObject() noexcept @@ -425,15 +434,10 @@ void ObjectFunctions::SendDoorDestination(bool broadcast) noexcept packet->Send(true); } -void ObjectFunctions::SendContainer(bool broadcast, bool useLastReadObjectList) noexcept +void ObjectFunctions::SendContainer(bool broadcast) noexcept { mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_CONTAINER); - - if (useLastReadObjectList) - packet->setObjectList(readObjectList); - else - packet->setObjectList(&writeObjectList); - + packet->setObjectList(&writeObjectList); packet->Send(false); if (broadcast) @@ -457,6 +461,12 @@ void ObjectFunctions::ReadLastEvent() noexcept ReadLastObjectList(); } +void ObjectFunctions::InitializeObjectList(unsigned short pid) noexcept +{ + ClearObjectList(); + SetObjectListPid(pid); +} + void ObjectFunctions::InitializeEvent(unsigned short pid) noexcept { InitializeObjectList(pid); diff --git a/apps/openmw-mp/Script/Functions/Objects.hpp b/apps/openmw-mp/Script/Functions/Objects.hpp index 4e5c3d6ce..47a3dffa5 100644 --- a/apps/openmw-mp/Script/Functions/Objects.hpp +++ b/apps/openmw-mp/Script/Functions/Objects.hpp @@ -3,7 +3,11 @@ #define OBJECTAPI \ {"ReadLastObjectList", ObjectFunctions::ReadLastObjectList},\ - {"InitializeObjectList", ObjectFunctions::InitializeObjectList},\ + \ + {"ClearObjectList", ObjectFunctions::ClearObjectList},\ + {"SetObjectListPid", ObjectFunctions::SetObjectListPid},\ + \ + {"CopyLastObjectListToStore", ObjectFunctions::CopyLastObjectListToStore},\ \ {"GetObjectChangesSize", ObjectFunctions::GetObjectChangesSize},\ {"GetObjectListAction", ObjectFunctions::GetObjectListAction},\ @@ -66,7 +70,7 @@ {"SetContainerItemCharge", ObjectFunctions::SetContainerItemCharge},\ {"SetContainerItemEnchantmentCharge", ObjectFunctions::SetContainerItemEnchantmentCharge},\ \ - {"SetReceivedContainerItemActionCount", ObjectFunctions::SetReceivedContainerItemActionCount},\ + {"SetContainerItemActionCountByIndex", ObjectFunctions::SetContainerItemActionCountByIndex},\ \ {"AddObject", ObjectFunctions::AddObject},\ {"AddContainerItem", ObjectFunctions::AddContainerItem},\ @@ -84,6 +88,7 @@ {"SendConsoleCommand", ObjectFunctions::SendConsoleCommand},\ \ {"ReadLastEvent", ObjectFunctions::ReadLastEvent},\ + {"InitializeObjectList", ObjectFunctions::InitializeObjectList},\ {"InitializeEvent", ObjectFunctions::InitializeEvent},\ {"GetEventAction", ObjectFunctions::GetEventAction},\ {"GetEventContainerSubAction", ObjectFunctions::GetEventContainerSubAction},\ @@ -106,12 +111,26 @@ public: /** * \brief Clear the data from the last object list sent by the server. * - * This is used to initialize the sending of new Object packets. + * \return void + */ + static void ClearObjectList() noexcept; + + /** + * \brief Set the pid attached to the ObjectList. * * \param pid The player ID to whom the object list should be attached. * \return void */ - static void InitializeObjectList(unsigned short pid) noexcept; + static void SetObjectListPid(unsigned short pid) noexcept; + + /** + * \brief Take the contents of the read-only object list last received by the + * server from a player and move its contents to the stored object list + * that can be sent by the server. + * + * \return void + */ + static void CopyLastObjectListToStore() noexcept; /** * \brief Get the number of indexes in the read object list's object changes. @@ -612,7 +631,7 @@ public: /** * \brief Set the action count of the container item at a certain itemIndex in the container - * changes of the object at a certain objectIndex in the read object list's object changes. + * changes of the object at a certain objectIndex in the object list stored on the server. * * When resending a received Container packet, this allows you to correct the amount of items * removed from a container by a player when it conflicts with what other players have already @@ -623,7 +642,7 @@ public: * \param actionCount The action count. * \return void */ - static void SetReceivedContainerItemActionCount(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept; + static void SetContainerItemActionCountByIndex(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept; /** * \brief Add a copy of the server's temporary object to the server's temporary object list. @@ -744,7 +763,7 @@ public: * * \return void */ - static void SendContainer(bool broadcast = false, bool useLastReadObjectList = false) noexcept; + static void SendContainer(bool broadcast = false) noexcept; /** * \brief Send a ConsoleCommand packet. @@ -760,6 +779,7 @@ public: // All methods below are deprecated versions of methods from above static void ReadLastEvent() noexcept; + static void InitializeObjectList(unsigned short pid) noexcept; static void InitializeEvent(unsigned short pid) noexcept; static unsigned char GetEventAction() noexcept; static unsigned char GetEventContainerSubAction() noexcept;