From 49fa35a516d00f23a29fad302e8a4b6dfcc4b53b Mon Sep 17 00:00:00 2001 From: David Cernat Date: Sun, 9 Jun 2019 00:58:34 +0300 Subject: [PATCH] [Client] Use ObjectActivate packets when picking up items from inventory --- apps/openmw/mwgui/hud.cpp | 21 ++++++++++++++++++++- apps/openmw/mwgui/inventorywindow.cpp | 15 --------------- apps/openmw/mwmp/ObjectList.cpp | 14 +++++++++++++- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/apps/openmw/mwgui/hud.cpp b/apps/openmw/mwgui/hud.cpp index de1c2f326..35d96f051 100644 --- a/apps/openmw/mwgui/hud.cpp +++ b/apps/openmw/mwgui/hud.cpp @@ -306,7 +306,26 @@ namespace MWGui { // pick up object if (!object.isEmpty()) - MWBase::Environment::get().getWindowManager()->getInventoryWindow()->pickUpObject(object); + /* + Start of tes3mp change (major) + + Disable unilateral picking up of objects on this client + + Instead, send an ID_OBJECT_ACTIVATE packet every time an item is made to pick up + an item here, and expect the server's reply to our packet to cause the actual + picking up of items + */ + //MWBase::Environment::get().getWindowManager()->getInventoryWindow()->pickUpObject(object); + { + mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList(); + objectList->reset(); + objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY; + objectList->addObjectActivate(object, MWMechanics::getPlayer()); + objectList->sendObjectActivate(); + } + /* + End of tes3mp change (major) + */ } } } diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index 7aea5860d..710d8ee7a 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -718,21 +718,6 @@ namespace MWGui // can't use ActionTake here because we need an MWWorld::Ptr to the newly inserted object MWWorld::Ptr newObject = *player.getClass().getContainerStore (player).add (object, object.getRefData().getCount(), player); - /* - Start of tes3mp addition - - Send an ID_OBJECT_DELETE packet every time an item from the world is picked up - by the player through the inventory HUD - */ - mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList(); - objectList->reset(); - objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY; - objectList->addObjectDelete(object); - objectList->sendObjectDelete(); - /* - End of tes3mp addition - */ - // remove from world MWBase::Environment::get().getWorld()->deleteObject (object); diff --git a/apps/openmw/mwmp/ObjectList.cpp b/apps/openmw/mwmp/ObjectList.cpp index 85e706e62..960976f90 100644 --- a/apps/openmw/mwmp/ObjectList.cpp +++ b/apps/openmw/mwmp/ObjectList.cpp @@ -17,6 +17,8 @@ #include "../mwbase/windowmanager.hpp" #include "../mwgui/container.hpp" +#include "../mwgui/inventorywindow.hpp" +#include "../mwgui/windowmanagerimp.hpp" #include "../mwmechanics/aifollow.hpp" #include "../mwmechanics/spellcasting.hpp" @@ -321,7 +323,17 @@ void ObjectList::activateObjects(MWWorld::CellStore* cellStore) if (activatingActorPtr) { - MWBase::Environment::get().getWorld()->activate(ptrFound, activatingActorPtr); + // Is an item that can be picked up being activated by the local player with their inventory open? + if (activatingActorPtr == MWBase::Environment::get().getWorld()->getPlayerPtr() && + (MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_Container || + MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_Inventory)) + { + MWBase::Environment::get().getWindowManager()->getInventoryWindow()->pickUpObject(ptrFound); + } + else + { + MWBase::Environment::get().getWorld()->activate(ptrFound, activatingActorPtr); + } } } }