[General] Add and implement new Worldstate packet type
parent
e8b22a2e5e
commit
43a944ddaf
@ -0,0 +1,40 @@
|
||||
#include "WorldstateProcessor.hpp"
|
||||
#include "Networking.hpp"
|
||||
|
||||
using namespace mwmp;
|
||||
|
||||
template<class T>
|
||||
typename BasePacketProcessor<T>::processors_t BasePacketProcessor<T>::processors;
|
||||
|
||||
void WorldstateProcessor::Do(WorldstatePacket &packet, Player &player, BaseWorldstate &worldstate)
|
||||
{
|
||||
packet.Send(true);
|
||||
}
|
||||
|
||||
bool WorldstateProcessor::Process(RakNet::Packet &packet, BaseWorldstate &worldstate) noexcept
|
||||
{
|
||||
worldstate.guid = packet.guid;
|
||||
|
||||
for (auto &processor : processors)
|
||||
{
|
||||
if (processor.first == packet.data[0])
|
||||
{
|
||||
Player *player = Players::getPlayer(packet.guid);
|
||||
WorldstatePacket *myPacket = Networking::get().getWorldstatePacketController()->GetPacket(packet.data[0]);
|
||||
|
||||
myPacket->setWorldstate(&worldstate);
|
||||
worldstate.isValid = true;
|
||||
|
||||
if (!processor.second->avoidReading)
|
||||
myPacket->Read();
|
||||
|
||||
if (worldstate.isValid)
|
||||
processor.second->Do(*myPacket, *player, worldstate);
|
||||
else
|
||||
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
#ifndef OPENMW_BASEWORLDSTATEPROCESSOR_HPP
|
||||
#define OPENMW_BASEWORLDSTATEPROCESSOR_HPP
|
||||
|
||||
#include <components/openmw-mp/Base/BasePacketProcessor.hpp>
|
||||
#include <components/openmw-mp/Packets/BasePacket.hpp>
|
||||
#include <components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp>
|
||||
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||
#include "Player.hpp"
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
class WorldstateProcessor : public BasePacketProcessor<WorldstateProcessor>
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void Do(WorldstatePacket &packet, Player &player, BaseWorldstate &worldstate);
|
||||
|
||||
static bool Process(RakNet::Packet &packet, BaseWorldstate &worldstate) noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //OPENMW_BASEWORLDSTATEPROCESSOR_HPP
|
@ -0,0 +1,40 @@
|
||||
#include "../Networking.hpp"
|
||||
#include "WorldstateProcessor.hpp"
|
||||
#include "../Main.hpp"
|
||||
|
||||
using namespace mwmp;
|
||||
|
||||
template<class T>
|
||||
typename BasePacketProcessor<T>::processors_t BasePacketProcessor<T>::processors;
|
||||
|
||||
bool WorldstateProcessor::Process(RakNet::Packet &packet, BaseWorldstate &worldstate)
|
||||
{
|
||||
RakNet::BitStream bsIn(&packet.data[1], packet.length, false);
|
||||
bsIn.Read(guid);
|
||||
worldstate.guid = guid;
|
||||
|
||||
WorldstatePacket *myPacket = Main::get().getNetworking()->getWorldstatePacket(packet.data[0]);
|
||||
myPacket->SetReadStream(&bsIn);
|
||||
|
||||
for (auto &processor : processors)
|
||||
{
|
||||
if (processor.first == packet.data[0])
|
||||
{
|
||||
myGuid = Main::get().getLocalPlayer()->guid;
|
||||
request = packet.length == myPacket->headerSize();
|
||||
|
||||
worldstate.isValid = true;
|
||||
|
||||
if (!request && !processor.second->avoidReading)
|
||||
myPacket->Read();
|
||||
|
||||
if (worldstate.isValid)
|
||||
processor.second->Do(*myPacket, worldstate);
|
||||
else
|
||||
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
#ifndef OPENMW_WORLDSTATEPROCESSOR_HPP
|
||||
#define OPENMW_WORLDSTATEPROCESSOR_HPP
|
||||
|
||||
#include <components/openmw-mp/Log.hpp>
|
||||
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||
#include <components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp>
|
||||
#include "BaseClientPacketProcessor.hpp"
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
class WorldstateProcessor : public BasePacketProcessor<WorldstateProcessor>, public BaseClientPacketProcessor
|
||||
{
|
||||
public:
|
||||
virtual void Do(WorldstatePacket &packet, BaseWorldstate &worldstate) = 0;
|
||||
|
||||
static bool Process(RakNet::Packet &packet, BaseWorldstate &worldstate);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif //OPENMW_WORLDSTATEPROCESSOR_HPP
|
@ -0,0 +1,26 @@
|
||||
#ifndef OPENMW_BASEWORLDSTATE_HPP
|
||||
#define OPENMW_BASEWORLDSTATE_HPP
|
||||
|
||||
#include <components/openmw-mp/Base/BaseStructs.hpp>
|
||||
|
||||
#include <RakNetTypes.h>
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
|
||||
class BaseWorldstate
|
||||
{
|
||||
public:
|
||||
|
||||
BaseWorldstate()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
RakNet::RakNetGUID guid;
|
||||
|
||||
bool isValid;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //OPENMW_BASEWORLDSTATE_HPP
|
@ -0,0 +1,36 @@
|
||||
#include "WorldstatePacketController.hpp"
|
||||
|
||||
template <typename T>
|
||||
inline void AddPacket(mwmp::WorldstatePacketController::packets_t *packets, RakNet::RakPeerInterface *peer)
|
||||
{
|
||||
T *packet = new T(peer);
|
||||
typedef mwmp::WorldstatePacketController::packets_t::value_type value_t;
|
||||
packets->insert(value_t(packet->GetPacketID(), value_t::second_type(packet)));
|
||||
}
|
||||
|
||||
mwmp::WorldstatePacketController::WorldstatePacketController(RakNet::RakPeerInterface *peer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
mwmp::WorldstatePacket *mwmp::WorldstatePacketController::GetPacket(RakNet::MessageID id)
|
||||
{
|
||||
return packets[(unsigned char)id].get();
|
||||
}
|
||||
|
||||
void mwmp::WorldstatePacketController::SetStream(RakNet::BitStream *inStream, RakNet::BitStream *outStream)
|
||||
{
|
||||
for(const auto &packet : packets)
|
||||
packet.second->SetStreams(inStream, outStream);
|
||||
}
|
||||
|
||||
bool mwmp::WorldstatePacketController::ContainsPacket(RakNet::MessageID id)
|
||||
{
|
||||
for(const auto &packet : packets)
|
||||
{
|
||||
if (packet.first == id)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
#ifndef OPENMW_WORLDSTATEPACKETCONTROLLER_HPP
|
||||
#define OPENMW_WORLDSTATEPACKETCONTROLLER_HPP
|
||||
|
||||
|
||||
#include <RakPeerInterface.h>
|
||||
#include "../Packets/Worldstate/WorldstatePacket.hpp"
|
||||
#include <unordered_map>
|
||||
#include <memory>
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
class WorldstatePacketController
|
||||
{
|
||||
public:
|
||||
WorldstatePacketController(RakNet::RakPeerInterface *peer);
|
||||
WorldstatePacket *GetPacket(RakNet::MessageID id);
|
||||
void SetStream(RakNet::BitStream *inStream, RakNet::BitStream *outStream);
|
||||
|
||||
bool ContainsPacket(RakNet::MessageID id);
|
||||
|
||||
typedef std::unordered_map<unsigned char, std::unique_ptr<WorldstatePacket> > packets_t;
|
||||
private:
|
||||
packets_t packets;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //OPENMW_WORLDSTATEPACKETCONTROLLER_HPP
|
@ -0,0 +1,31 @@
|
||||
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||
#include <PacketPriority.h>
|
||||
#include <RakPeer.h>
|
||||
#include "WorldstatePacket.hpp"
|
||||
|
||||
using namespace mwmp;
|
||||
|
||||
WorldstatePacket::WorldstatePacket(RakNet::RakPeerInterface *peer) : BasePacket(peer)
|
||||
{
|
||||
packetID = 0;
|
||||
priority = HIGH_PRIORITY;
|
||||
reliability = RELIABLE_ORDERED;
|
||||
orderChannel = CHANNEL_WORLDSTATE;
|
||||
this->peer = peer;
|
||||
}
|
||||
|
||||
WorldstatePacket::~WorldstatePacket()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void WorldstatePacket::setWorldstate(BaseWorldstate *worldstate)
|
||||
{
|
||||
this->worldstate = worldstate;
|
||||
guid = worldstate->guid;
|
||||
}
|
||||
|
||||
BaseWorldstate *WorldstatePacket::getWorldstate()
|
||||
{
|
||||
return worldstate;
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
#ifndef OPENMW_WORLDSTATEPACKET_HPP
|
||||
#define OPENMW_WORLDSTATEPACKET_HPP
|
||||
|
||||
#include <string>
|
||||
#include <RakNetTypes.h>
|
||||
#include <BitStream.h>
|
||||
#include <PacketPriority.h>
|
||||
#include <components/openmw-mp/Base/BaseWorldstate.hpp>
|
||||
|
||||
#include <components/openmw-mp/Packets/BasePacket.hpp>
|
||||
|
||||
namespace mwmp
|
||||
{
|
||||
class WorldstatePacket : public BasePacket
|
||||
{
|
||||
public:
|
||||
WorldstatePacket(RakNet::RakPeerInterface *peer);
|
||||
|
||||
~WorldstatePacket();
|
||||
|
||||
void setWorldstate(BaseWorldstate *worldstate);
|
||||
BaseWorldstate *getWorldstate();
|
||||
|
||||
protected:
|
||||
BaseWorldstate *worldstate;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif //OPENMW_WORLDSTATEPACKET_HPP
|
Loading…
Reference in New Issue