diff --git a/apps/openmw-mp/processors/object/ProcessorObjectMiscellaneous.hpp b/apps/openmw-mp/processors/object/ProcessorObjectMiscellaneous.hpp index 029c7d0a8..6645161b7 100644 --- a/apps/openmw-mp/processors/object/ProcessorObjectMiscellaneous.hpp +++ b/apps/openmw-mp/processors/object/ProcessorObjectMiscellaneous.hpp @@ -12,6 +12,14 @@ namespace mwmp { BPP_INIT(ID_OBJECT_MISCELLANEOUS) } + + void Do(ObjectPacket& packet, Player& player, BaseObjectList& objectList) override + { + LOG_MESSAGE_SIMPLE(TimedLog::LOG_INFO, "Received %s from %s", strPacketID.c_str(), player.npc.mName.c_str()); + + packet.Send(false); + packet.Send(true); + } }; } diff --git a/apps/openmw/mwgui/tradewindow.cpp b/apps/openmw/mwgui/tradewindow.cpp index 1e2bc86d4..ad2278f29 100644 --- a/apps/openmw/mwgui/tradewindow.cpp +++ b/apps/openmw/mwgui/tradewindow.cpp @@ -396,8 +396,23 @@ namespace MWGui if (mCurrentBalance != 0) { addOrRemoveGold(mCurrentBalance, player); - mPtr.getClass().getCreatureStats(mPtr).setGoldPool( - mPtr.getClass().getCreatureStats(mPtr).getGoldPool() - mCurrentBalance ); + + /* + Start of tes3mp change (major) + + Don't unilaterally change the merchant's gold pool on our client and instead let the server do it + */ + //mPtr.getClass().getCreatureStats(mPtr).setGoldPool( + // mPtr.getClass().getCreatureStats(mPtr).getGoldPool() - mCurrentBalance); + + mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList(); + objectList->reset(); + objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY; + objectList->addObjectMiscellaneous(mPtr, mPtr.getClass().getCreatureStats(mPtr).getGoldPool() - mCurrentBalance); + objectList->sendObjectMiscellaneous(); + /* + End of tes3mp change (major) + */ } eventTradeDone(); diff --git a/apps/openmw/mwmp/ObjectList.cpp b/apps/openmw/mwmp/ObjectList.cpp index fd28c0627..67071b89a 100644 --- a/apps/openmw/mwmp/ObjectList.cpp +++ b/apps/openmw/mwmp/ObjectList.cpp @@ -813,6 +813,33 @@ void ObjectList::playObjectSounds(MWWorld::CellStore* cellStore) } } +void ObjectList::setGoldPoolsForObjects(MWWorld::CellStore* cellStore) +{ + for (const auto& baseObject : baseObjects) + { + LOG_APPEND(TimedLog::LOG_VERBOSE, "- cellRef: %s %i-%i", baseObject.refId.c_str(), baseObject.refNum, baseObject.mpNum); + + MWWorld::Ptr ptrFound = cellStore->searchExact(baseObject.refNum, baseObject.mpNum); + + if (ptrFound) + { + LOG_APPEND(TimedLog::LOG_VERBOSE, "-- Found %s %i-%i", ptrFound.getCellRef().getRefId().c_str(), + ptrFound.getCellRef().getRefNum(), ptrFound.getCellRef().getMpNum()); + + if (ptrFound.getClass().isActor()) + { + LOG_APPEND(TimedLog::LOG_VERBOSE, "-- Setting gold pool to %u", baseObject.goldPool); + ptrFound.getClass().getCreatureStats(ptrFound).setGoldPool(baseObject.goldPool); + } + else + { + LOG_MESSAGE_SIMPLE(TimedLog::LOG_WARN, "Failed to set gold pool on %s %i-%i because it is not an actor!", + ptrFound.getCellRef().getRefId().c_str(), ptrFound.getCellRef().getRefNum(), ptrFound.getCellRef().getMpNum()); + } + } + } +} + void ObjectList::activateDoors(MWWorld::CellStore* cellStore) { for (const auto &baseObject : baseObjects) @@ -1166,6 +1193,15 @@ void ObjectList::addObjectLock(const MWWorld::Ptr& ptr, int lockLevel) addBaseObject(baseObject); } +void ObjectList::addObjectMiscellaneous(const MWWorld::Ptr& ptr, unsigned int goldPool) +{ + cell = *ptr.getCell()->getCell(); + + mwmp::BaseObject baseObject = getBaseObjectFromPtr(ptr); + baseObject.goldPool = goldPool; + addBaseObject(baseObject); +} + void ObjectList::addObjectTrap(const MWWorld::Ptr& ptr, const ESM::Position& pos, bool isDisarmed) { cell = *ptr.getCell()->getCell(); @@ -1322,6 +1358,12 @@ void ObjectList::sendObjectLock() mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_LOCK)->Send(); } +void ObjectList::sendObjectMiscellaneous() +{ + mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_MISCELLANEOUS)->setObjectList(this); + mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_MISCELLANEOUS)->Send(); +} + void ObjectList::sendObjectRestock() { mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_RESTOCK)->setObjectList(this); diff --git a/apps/openmw/mwmp/ObjectList.hpp b/apps/openmw/mwmp/ObjectList.hpp index 1b3b9d80a..eab2eed74 100644 --- a/apps/openmw/mwmp/ObjectList.hpp +++ b/apps/openmw/mwmp/ObjectList.hpp @@ -38,6 +38,7 @@ namespace mwmp void rotateObjects(MWWorld::CellStore* cellStore); void animateObjects(MWWorld::CellStore* cellStore); void playObjectSounds(MWWorld::CellStore* cellStore); + void setGoldPoolsForObjects(MWWorld::CellStore* cellStore); void activateDoors(MWWorld::CellStore* cellStore); void setDoorDestinations(MWWorld::CellStore* cellStore); void runConsoleCommands(MWWorld::CellStore* cellStore); @@ -59,6 +60,7 @@ namespace mwmp void addObjectSpawn(const MWWorld::Ptr& ptr); void addObjectSpawn(const MWWorld::Ptr& ptr, const MWWorld::Ptr& master, std::string spellId, int effectId, float duration); void addObjectLock(const MWWorld::Ptr& ptr, int lockLevel); + void addObjectMiscellaneous(const MWWorld::Ptr& ptr, unsigned int goldPool); void addObjectTrap(const MWWorld::Ptr& ptr, const ESM::Position& pos, bool isDisarmed); void addObjectScale(const MWWorld::Ptr& ptr, float scale); void addObjectSound(const MWWorld::Ptr& ptr, std::string soundId, float volume, float pitch); @@ -78,6 +80,7 @@ namespace mwmp void sendObjectSpawn(); void sendObjectDelete(); void sendObjectLock(); + void sendObjectMiscellaneous(); void sendObjectRestock(); void sendObjectTrap(); void sendObjectScale(); diff --git a/apps/openmw/mwmp/processors/object/ProcessorObjectMiscellaneous.hpp b/apps/openmw/mwmp/processors/object/ProcessorObjectMiscellaneous.hpp index 3b5458a31..ff0ac3865 100644 --- a/apps/openmw/mwmp/processors/object/ProcessorObjectMiscellaneous.hpp +++ b/apps/openmw/mwmp/processors/object/ProcessorObjectMiscellaneous.hpp @@ -1,11 +1,11 @@ #ifndef OPENMW_PROCESSOROBJECTMISCELLANEOUS_HPP #define OPENMW_PROCESSOROBJECTMISCELLANEOUS_HPP -#include "../ObjectProcessor.hpp" +#include "BaseObjectProcessor.hpp" namespace mwmp { - class ProcessorObjectMiscellaneous final: public ObjectProcessor + class ProcessorObjectMiscellaneous final: public BaseObjectProcessor { public: ProcessorObjectMiscellaneous() @@ -16,6 +16,10 @@ namespace mwmp virtual void Do(ObjectPacket &packet, ObjectList &objectList) { LOG_MESSAGE_SIMPLE(TimedLog::LOG_VERBOSE, "Received %s", strPacketID.c_str()); + + BaseObjectProcessor::Do(packet, objectList); + + objectList.setGoldPoolsForObjects(ptrCellStore); } }; } diff --git a/components/openmw-mp/Base/BaseObject.hpp b/components/openmw-mp/Base/BaseObject.hpp index 7d8a8982a..89c498c89 100644 --- a/components/openmw-mp/Base/BaseObject.hpp +++ b/components/openmw-mp/Base/BaseObject.hpp @@ -45,6 +45,8 @@ namespace mwmp float volume; float pitch; + unsigned int goldPool; + int doorState; bool teleportState; ESM::Cell destinationCell; diff --git a/components/openmw-mp/Packets/Object/PacketObjectMiscellaneous.cpp b/components/openmw-mp/Packets/Object/PacketObjectMiscellaneous.cpp index 37757e8f4..80c97cc90 100644 --- a/components/openmw-mp/Packets/Object/PacketObjectMiscellaneous.cpp +++ b/components/openmw-mp/Packets/Object/PacketObjectMiscellaneous.cpp @@ -6,9 +6,11 @@ using namespace mwmp; PacketObjectMiscellaneous::PacketObjectMiscellaneous(RakNet::RakPeerInterface *peer) : ObjectPacket(peer) { packetID = ID_OBJECT_MISCELLANEOUS; + hasCellData = true; } void PacketObjectMiscellaneous::Object(BaseObject &baseObject, bool send) { - + ObjectPacket::Object(baseObject, send); + RW(baseObject.goldPool, send); }