1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-12-13 00:53:07 +00:00

[General] Implement ObjectRestock packet

Restocking object containers via trading now requires the server to send back an ObjectRestock packet before it can happen.

The unused packet ID ID_SCRIPT_GLOBAL_FLOAT has been replaced with ID_OBJECT_RESTOCK.
This commit is contained in:
David Cernat 2020-01-23 12:50:34 +02:00
parent 59a38164ea
commit 975797c09b
18 changed files with 198 additions and 15 deletions

View file

@ -118,12 +118,12 @@ set(PROCESSORS_OBJECT
processors/object/ProcessorObjectActivate.hpp processors/object/ProcessorObjectAnimPlay.hpp processors/object/ProcessorObjectActivate.hpp processors/object/ProcessorObjectAnimPlay.hpp
processors/object/ProcessorObjectDelete.hpp processors/object/ProcessorObjectHit.hpp processors/object/ProcessorObjectDelete.hpp processors/object/ProcessorObjectHit.hpp
processors/object/ProcessorObjectLock.hpp processors/object/ProcessorObjectMove.hpp processors/object/ProcessorObjectLock.hpp processors/object/ProcessorObjectMove.hpp
processors/object/ProcessorObjectPlace.hpp processors/object/ProcessorObjectRotate.hpp processors/object/ProcessorObjectPlace.hpp processors/object/ProcessorObjectRestock.hpp
processors/object/ProcessorObjectScale.hpp processors/object/ProcessorObjectSpawn.hpp processors/object/ProcessorObjectRotate.hpp processors/object/ProcessorObjectScale.hpp
processors/object/ProcessorObjectState.hpp processors/object/ProcessorObjectTrap.hpp processors/object/ProcessorObjectSpawn.hpp processors/object/ProcessorObjectState.hpp
processors/object/ProcessorScriptLocalShort.hpp processors/object/ProcessorScriptLocalFloat.hpp processors/object/ProcessorObjectTrap.hpp processors/object/ProcessorScriptLocalShort.hpp
processors/object/ProcessorScriptMemberShort.hpp processors/object/ProcessorScriptMemberFloat.hpp processors/object/ProcessorScriptLocalFloat.hpp processors/object/ProcessorScriptMemberShort.hpp
processors/object/ProcessorVideoPlay.hpp processors/object/ProcessorScriptMemberFloat.hpp processors/object/ProcessorVideoPlay.hpp
) )
source_group(tes3mp-server\\processors\\object FILES ${PROCESSORS_OBJECT}) source_group(tes3mp-server\\processors\\object FILES ${PROCESSORS_OBJECT})

View file

@ -666,6 +666,17 @@ void ObjectFunctions::SendObjectLock(bool sendToOtherPlayers, bool skipAttachedP
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectRestock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_RESTOCK);
packet->setObjectList(&writeObjectList);
if (!skipAttachedPlayer)
packet->Send(false);
if (sendToOtherPlayers)
packet->Send(true);
}
void ObjectFunctions::SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept void ObjectFunctions::SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_TRAP); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_TRAP);

View file

@ -137,6 +137,7 @@
{"SendObjectSpawn", ObjectFunctions::SendObjectSpawn},\ {"SendObjectSpawn", ObjectFunctions::SendObjectSpawn},\
{"SendObjectDelete", ObjectFunctions::SendObjectDelete},\ {"SendObjectDelete", ObjectFunctions::SendObjectDelete},\
{"SendObjectLock", ObjectFunctions::SendObjectLock},\ {"SendObjectLock", ObjectFunctions::SendObjectLock},\
{"SendObjectRestock", ObjectFunctions::SendObjectRestock},\
{"SendObjectTrap", ObjectFunctions::SendObjectTrap},\ {"SendObjectTrap", ObjectFunctions::SendObjectTrap},\
{"SendObjectScale", ObjectFunctions::SendObjectScale},\ {"SendObjectScale", ObjectFunctions::SendObjectScale},\
{"SendObjectState", ObjectFunctions::SendObjectState},\ {"SendObjectState", ObjectFunctions::SendObjectState},\
@ -1167,6 +1168,17 @@ public:
*/ */
static void SendObjectLock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; static void SendObjectLock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/**
* \brief Send an ObjectRestock packet.
*
* \param sendToOtherPlayers Whether this packet should be sent to players other than the
* player attached to the packet (false by default).
* \param skipAttachedPlayer Whether the packet should skip being sent to the player attached
* to the packet (false by default).
* \return void
*/
static void SendObjectRestock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectTrap packet. * \brief Send an ObjectTrap packet.
* *

View file

@ -195,6 +195,7 @@ public:
{"OnObjectSpawn", Callback<unsigned short, const char*>()}, {"OnObjectSpawn", Callback<unsigned short, const char*>()},
{"OnObjectDelete", Callback<unsigned short, const char*>()}, {"OnObjectDelete", Callback<unsigned short, const char*>()},
{"OnObjectLock", Callback<unsigned short, const char*>()}, {"OnObjectLock", Callback<unsigned short, const char*>()},
{"OnObjectRestock", Callback<unsigned short, const char*>()},
{"OnObjectScale", Callback<unsigned short, const char*>()}, {"OnObjectScale", Callback<unsigned short, const char*>()},
{"OnObjectTrap", Callback<unsigned short, const char*>()}, {"OnObjectTrap", Callback<unsigned short, const char*>()},
{"OnVideoPlay", Callback<unsigned short, const char*>()}, {"OnVideoPlay", Callback<unsigned short, const char*>()},

View file

@ -65,6 +65,7 @@
#include "object/ProcessorObjectPlace.hpp" #include "object/ProcessorObjectPlace.hpp"
#include "object/ProcessorObjectLock.hpp" #include "object/ProcessorObjectLock.hpp"
#include "object/ProcessorObjectMove.hpp" #include "object/ProcessorObjectMove.hpp"
#include "object/ProcessorObjectRestock.hpp"
#include "object/ProcessorObjectRotate.hpp" #include "object/ProcessorObjectRotate.hpp"
#include "object/ProcessorObjectScale.hpp" #include "object/ProcessorObjectScale.hpp"
#include "object/ProcessorObjectSpawn.hpp" #include "object/ProcessorObjectSpawn.hpp"
@ -147,6 +148,7 @@ void ProcessorInitializer()
ObjectProcessor::AddProcessor(new ProcessorObjectLock()); ObjectProcessor::AddProcessor(new ProcessorObjectLock());
ObjectProcessor::AddProcessor(new ProcessorObjectMove()); ObjectProcessor::AddProcessor(new ProcessorObjectMove());
ObjectProcessor::AddProcessor(new ProcessorObjectPlace()); ObjectProcessor::AddProcessor(new ProcessorObjectPlace());
ObjectProcessor::AddProcessor(new ProcessorObjectRestock());
ObjectProcessor::AddProcessor(new ProcessorObjectRotate()); ObjectProcessor::AddProcessor(new ProcessorObjectRotate());
ObjectProcessor::AddProcessor(new ProcessorObjectScale()); ObjectProcessor::AddProcessor(new ProcessorObjectScale());
ObjectProcessor::AddProcessor(new ProcessorObjectSpawn()); ObjectProcessor::AddProcessor(new ProcessorObjectSpawn());

View file

@ -0,0 +1,25 @@
#ifndef OPENMW_PROCESSOROBJECTRESTOCK_HPP
#define OPENMW_PROCESSOROBJECTRESTOCK_HPP
#include "../ObjectProcessor.hpp"
namespace mwmp
{
class ProcessorObjectRestock : public ObjectProcessor
{
public:
ProcessorObjectRestock()
{
BPP_INIT(ID_OBJECT_RESTOCK)
}
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());
Script::Call<Script::CallbackIdentity("OnObjectRestock")>(player.getId(), objectList.cell.getDescription().c_str());
}
};
}
#endif //OPENMW_PROCESSOROBJECTRESTOCK_HPP

View file

@ -131,9 +131,9 @@ add_openmw_dir (mwmp/processors/object BaseObjectProcessor
ProcessorVideoPlay ProcessorVideoPlay
ProcessorObjectActivate ProcessorObjectAnimPlay ProcessorObjectAttach ProcessorObjectCollision ProcessorObjectDelete ProcessorObjectActivate ProcessorObjectAnimPlay ProcessorObjectAttach ProcessorObjectCollision ProcessorObjectDelete
ProcessorObjectHit ProcessorObjectLock ProcessorObjectMove ProcessorObjectPlace ProcessorObjectRotate ProcessorObjectHit ProcessorObjectLock ProcessorObjectMove ProcessorObjectPlace ProcessorObjectRestock
ProcessorObjectScale ProcessorObjectSpawn ProcessorObjectState ProcessorObjectTrap ProcessorScriptLocalShort ProcessorObjectRotate ProcessorObjectScale ProcessorObjectSpawn ProcessorObjectState ProcessorObjectTrap
ProcessorScriptLocalFloat ProcessorScriptMemberShort ProcessorScriptMemberFloat ProcessorScriptLocalShort ProcessorScriptLocalFloat ProcessorScriptMemberShort ProcessorScriptMemberFloat
) )
add_openmw_dir (mwmp/processors/worldstate ProcessorCellReset ProcessorClientScriptGlobal ProcessorClientScriptSettings add_openmw_dir (mwmp/processors/worldstate ProcessorCellReset ProcessorClientScriptGlobal ProcessorClientScriptSettings

View file

@ -7,6 +7,18 @@
#include <components/widgets/numericeditbox.hpp> #include <components/widgets/numericeditbox.hpp>
/*
Start of tes3mp addition
Include additional headers for multiplayer purposes
*/
#include "../mwmp/Main.hpp"
#include "../mwmp/Networking.hpp"
#include "../mwmp/ObjectList.hpp"
/*
End of tes3mp addition
*/
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
@ -99,14 +111,44 @@ namespace MWGui
void TradeWindow::restock() void TradeWindow::restock()
{ {
// Restock items on the actor inventory // Restock items on the actor inventory
mPtr.getClass().restock(mPtr); /*
Start of tes3mp change (major)
Don't restock here and instead send an ID_OBJECT_RESTOCK packet to the
server requesting permission for a restock
*/
//mPtr.getClass().restock(mPtr);
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
objectList->reset();
objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY;
objectList->addObjectGeneric(mPtr);
objectList->sendObjectRestock();
/*
End of tes3mp change (major)
*/
// Also restock any containers owned by this merchant, which are also available to buy in the trade window // Also restock any containers owned by this merchant, which are also available to buy in the trade window
std::vector<MWWorld::Ptr> itemSources; std::vector<MWWorld::Ptr> itemSources;
MWBase::Environment::get().getWorld()->getContainersOwnedBy(mPtr, itemSources); MWBase::Environment::get().getWorld()->getContainersOwnedBy(mPtr, itemSources);
for (MWWorld::Ptr& source : itemSources) for (MWWorld::Ptr& source : itemSources)
{ {
source.getClass().restock(source); /*
Start of tes3mp change (major)
Don't restock here and instead send an ID_OBJECT_RESTOCK packet to the
server requesting permission for a restock
*/
//source.getClass().restock(source);
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
objectList->reset();
objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY;
objectList->addObjectGeneric(source);
objectList->sendObjectRestock();
/*
End of tes3mp change (major)
*/
} }
} }

View file

@ -672,6 +672,33 @@ void ObjectList::moveObjects(MWWorld::CellStore* cellStore)
} }
} }
void ObjectList::restockObjects(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());
ptrFound.getClass().restock(ptrFound);
reset();
packetOrigin = mwmp::PACKET_ORIGIN::CLIENT_GAMEPLAY;
cell = *ptrFound.getCell()->getCell();
action = mwmp::BaseObjectList::SET;
containerSubAction = mwmp::BaseObjectList::RESTOCK_RESULT;
mwmp::BaseObject baseObject = getBaseObject(ptrFound);
addEntireContainer(ptrFound);
sendContainer();
}
}
}
void ObjectList::rotateObjects(MWWorld::CellStore* cellStore) void ObjectList::rotateObjects(MWWorld::CellStore* cellStore)
{ {
for (const auto &baseObject : baseObjects) for (const auto &baseObject : baseObjects)
@ -1292,6 +1319,12 @@ void ObjectList::sendObjectLock()
mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_LOCK)->Send(); mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_LOCK)->Send();
} }
void ObjectList::sendObjectRestock()
{
mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_RESTOCK)->setObjectList(this);
mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_RESTOCK)->Send();
}
void ObjectList::sendObjectTrap() void ObjectList::sendObjectTrap()
{ {
mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_TRAP)->setObjectList(this); mwmp::Main::get().getNetworking()->getObjectPacket(ID_OBJECT_TRAP)->setObjectList(this);

View file

@ -34,6 +34,7 @@ namespace mwmp
void scaleObjects(MWWorld::CellStore* cellStore); void scaleObjects(MWWorld::CellStore* cellStore);
void setObjectStates(MWWorld::CellStore* cellStore); void setObjectStates(MWWorld::CellStore* cellStore);
void moveObjects(MWWorld::CellStore* cellStore); void moveObjects(MWWorld::CellStore* cellStore);
void restockObjects(MWWorld::CellStore* cellStore);
void rotateObjects(MWWorld::CellStore* cellStore); void rotateObjects(MWWorld::CellStore* cellStore);
void animateObjects(MWWorld::CellStore* cellStore); void animateObjects(MWWorld::CellStore* cellStore);
void activateDoors(MWWorld::CellStore* cellStore); void activateDoors(MWWorld::CellStore* cellStore);
@ -79,6 +80,7 @@ namespace mwmp
void sendObjectSpawn(); void sendObjectSpawn();
void sendObjectDelete(); void sendObjectDelete();
void sendObjectLock(); void sendObjectLock();
void sendObjectRestock();
void sendObjectTrap(); void sendObjectTrap();
void sendObjectScale(); void sendObjectScale();
void sendObjectState(); void sendObjectState();

View file

@ -61,6 +61,7 @@
#include "object/ProcessorObjectLock.hpp" #include "object/ProcessorObjectLock.hpp"
#include "object/ProcessorObjectMove.hpp" #include "object/ProcessorObjectMove.hpp"
#include "object/ProcessorObjectPlace.hpp" #include "object/ProcessorObjectPlace.hpp"
#include "object/ProcessorObjectRestock.hpp"
#include "object/ProcessorObjectRotate.hpp" #include "object/ProcessorObjectRotate.hpp"
#include "object/ProcessorObjectScale.hpp" #include "object/ProcessorObjectScale.hpp"
#include "object/ProcessorObjectSpawn.hpp" #include "object/ProcessorObjectSpawn.hpp"
@ -163,6 +164,7 @@ void ProcessorInitializer()
ObjectProcessor::AddProcessor(new ProcessorObjectLock()); ObjectProcessor::AddProcessor(new ProcessorObjectLock());
ObjectProcessor::AddProcessor(new ProcessorObjectMove()); ObjectProcessor::AddProcessor(new ProcessorObjectMove());
ObjectProcessor::AddProcessor(new ProcessorObjectPlace()); ObjectProcessor::AddProcessor(new ProcessorObjectPlace());
ObjectProcessor::AddProcessor(new ProcessorObjectRestock());
ObjectProcessor::AddProcessor(new ProcessorObjectRotate()); ObjectProcessor::AddProcessor(new ProcessorObjectRotate());
ObjectProcessor::AddProcessor(new ProcessorObjectScale()); ObjectProcessor::AddProcessor(new ProcessorObjectScale());
ObjectProcessor::AddProcessor(new ProcessorObjectSpawn()); ObjectProcessor::AddProcessor(new ProcessorObjectSpawn());

View file

@ -0,0 +1,25 @@
#ifndef OPENMW_PROCESSOROBJECTRESTOCK_HPP
#define OPENMW_PROCESSOROBJECTRESTOCK_HPP
#include "BaseObjectProcessor.hpp"
namespace mwmp
{
class ProcessorObjectRestock final: public BaseObjectProcessor
{
public:
ProcessorObjectRestock()
{
BPP_INIT(ID_OBJECT_RESTOCK)
}
virtual void Do(ObjectPacket &packet, ObjectList &objectList)
{
BaseObjectProcessor::Do(packet, objectList);
objectList.restockObjects(ptrCellStore);
}
};
}
#endif //OPENMW_PROCESSOROBJECTRESTOCK_HPP

View file

@ -206,8 +206,9 @@ add_component_dir (openmw-mp/Packets/Object
PacketConsoleCommand PacketContainer PacketObjectActivate PacketObjectAnimPlay PacketObjectAttach PacketConsoleCommand PacketContainer PacketObjectActivate PacketObjectAnimPlay PacketObjectAttach
PacketObjectCollision PacketObjectDelete PacketObjectHit PacketObjectLock PacketObjectMove PacketObjectPlace PacketObjectCollision PacketObjectDelete PacketObjectHit PacketObjectLock PacketObjectMove PacketObjectPlace
PacketObjectRotate PacketObjectScale PacketObjectSpawn PacketObjectState PacketObjectTrap PacketMusicPlay PacketObjectRestock PacketObjectRotate PacketObjectScale PacketObjectSpawn PacketObjectState PacketObjectTrap
PacketVideoPlay PacketScriptLocalShort PacketScriptLocalFloat PacketScriptMemberShort PacketScriptMemberFloat PacketMusicPlay PacketVideoPlay PacketScriptLocalShort PacketScriptLocalFloat PacketScriptMemberShort
PacketScriptMemberFloat
) )
add_component_dir (openmw-mp/Packets/Worldstate add_component_dir (openmw-mp/Packets/Worldstate

View file

@ -110,7 +110,7 @@ namespace mwmp
DROP = 2, DROP = 2,
TAKE_ALL = 3, TAKE_ALL = 3,
REPLY_TO_REQUEST = 4, REPLY_TO_REQUEST = 4,
RESTOCK = 5 RESTOCK_RESULT = 5
}; };
RakNet::RakNetGUID guid; RakNet::RakNetGUID guid;

View file

@ -7,6 +7,7 @@
#include "../Packets/Object/PacketObjectLock.hpp" #include "../Packets/Object/PacketObjectLock.hpp"
#include "../Packets/Object/PacketObjectMove.hpp" #include "../Packets/Object/PacketObjectMove.hpp"
#include "../Packets/Object/PacketObjectPlace.hpp" #include "../Packets/Object/PacketObjectPlace.hpp"
#include "../Packets/Object/PacketObjectRestock.hpp"
#include "../Packets/Object/PacketObjectRotate.hpp" #include "../Packets/Object/PacketObjectRotate.hpp"
#include "../Packets/Object/PacketObjectScale.hpp" #include "../Packets/Object/PacketObjectScale.hpp"
#include "../Packets/Object/PacketObjectSpawn.hpp" #include "../Packets/Object/PacketObjectSpawn.hpp"
@ -46,6 +47,7 @@ mwmp::ObjectPacketController::ObjectPacketController(RakNet::RakPeerInterface *p
AddPacket<PacketObjectLock>(&packets, peer); AddPacket<PacketObjectLock>(&packets, peer);
AddPacket<PacketObjectMove>(&packets, peer); AddPacket<PacketObjectMove>(&packets, peer);
AddPacket<PacketObjectPlace>(&packets, peer); AddPacket<PacketObjectPlace>(&packets, peer);
AddPacket<PacketObjectRestock>(&packets, peer);
AddPacket<PacketObjectRotate>(&packets, peer); AddPacket<PacketObjectRotate>(&packets, peer);
AddPacket<PacketObjectScale>(&packets, peer); AddPacket<PacketObjectScale>(&packets, peer);
AddPacket<PacketObjectSpawn>(&packets, peer); AddPacket<PacketObjectSpawn>(&packets, peer);

View file

@ -94,7 +94,7 @@ enum GameMessages
ID_SCRIPT_MEMBER_SHORT, ID_SCRIPT_MEMBER_SHORT,
ID_SCRIPT_MEMBER_FLOAT, ID_SCRIPT_MEMBER_FLOAT,
ID_CLIENT_SCRIPT_GLOBAL, ID_CLIENT_SCRIPT_GLOBAL,
ID_SCRIPT_GLOBAL_FLOAT, ID_OBJECT_RESTOCK,
ID_GAME_SETTINGS, ID_GAME_SETTINGS,
ID_GAME_PREINIT, ID_GAME_PREINIT,

View file

@ -0,0 +1,10 @@
#include <components/openmw-mp/NetworkMessages.hpp>
#include "PacketObjectRestock.hpp"
using namespace mwmp;
PacketObjectRestock::PacketObjectRestock(RakNet::RakPeerInterface *peer) : ObjectPacket(peer)
{
packetID = ID_OBJECT_RESTOCK;
hasCellData = true;
}

View file

@ -0,0 +1,15 @@
#ifndef OPENMW_PACKETOBJECTRESTOCK_HPP
#define OPENMW_PACKETOBJECTRESTOCK_HPP
#include <components/openmw-mp/Packets/Object/ObjectPacket.hpp>
namespace mwmp
{
class PacketObjectRestock : public ObjectPacket
{
public:
PacketObjectRestock(RakNet::RakPeerInterface *peer);
};
}
#endif //OPENMW_PACKETOBJECTRESTOCK_HPP