#pragma once #include "U_Typedefs.h" #include "CNetMessage.h" #include "CTime.h" class CNetMessagesManager { public: CNetMessagesManager(); #pragma pack(push, 1) struct CPacketHeader { packetid_t ID; crc32_t Checksum; }; #pragma pack(pop) #pragma pack(push, 1) struct CReliableReport { netmsgid_t ID; std::uint16_t Type; crc32_t Checksum; }; #pragma pack(pop) struct CSentMessage { netmsgid_t ID; std::uint16_t Type; std::shared_ptr Message; crc32_t Checksum; CTimePoint WriteTime; size_t SkippedPackets = 0; size_t Resent = 0; }; struct CReceivedReliableMessage { netmsgid_t ID; crc32_t Crc; size_t Size; std::unique_ptr Message; }; struct CPacket { CTimePoint NetTime; std::vector Buffer; }; std::vector Reports; //reports from received messages std::vector ReliablesMessages; //received std::vector ResentMessages; //received std::vector> UnreliablesMessages; //received std::unordered_map SentMessages; //sent void ProcessPackets(); void ProcessMessages(); bool ProcessSinglePacket(CPacket& packet); void AddReceivedPacket(std::vector&& buf, CTimePoint _nettime); void AddMessage(std::shared_ptr msg, bool reliable = true); //to send void SendReliable(std::shared_ptr msg); void SendUnreliable(std::shared_ptr msg); bool PackSnapshot(std::vector& buf); std::vector ReceivedQueue; //received std::vector> ReliableQueue; //to send std::vector> UnreliableQueue; //to send //std::vector Reports; packetid_t PacketID = 0; netmsgid_t MsgID = 0; CTimePoint LastPack; double PackDelay = (1.0 / 33.0); //TODO not hardcoded size_t UserData = 1488; };