]> git.localhorst.tv Git - blank.git/blob - ConnectionHandler.hpp
be01d10add35ab3b597c4cec5c5efa5d8d17f4c5
[blank.git] / ConnectionHandler.hpp
1 #ifndef BLANK_NET_CONNECTIONHANDLER_HPP_
2 #define BLANK_NET_CONNECTIONHANDLER_HPP_
3
4 #include "Packet.hpp"
5
6 #include <SDL_net.h>
7
8
9 namespace blank {
10
11 class ConnectionHandler {
12
13 public:
14         ConnectionHandler();
15
16         /// packet loss as factor
17         float PacketLoss() const noexcept { return packet_loss; }
18         /// smooth average round trip time in milliseconds
19         float RoundTripTime() const noexcept { return rtt; }
20
21         void PacketSent(std::uint16_t);
22         void PacketLost(std::uint16_t);
23         void PacketReceived(std::uint16_t);
24
25         void Handle(const UDPpacket &);
26
27         virtual void OnTimeout() { }
28
29 private:
30         void UpdatePacketLoss() noexcept;
31         void UpdateRTT(std::uint16_t) noexcept;
32         bool SamplePacket(std::uint16_t) const noexcept;
33         int HeadDiff(std::uint16_t) const noexcept;
34
35         // called as soon as the remote end ack'd given packet
36         virtual void OnPacketReceived(std::uint16_t) { }
37         // called if the remote end probably didn't get given packet
38         virtual void OnPacketLost(std::uint16_t) { }
39
40         virtual void On(const Packet::Ping &) { }
41         virtual void On(const Packet::Login &) { }
42         virtual void On(const Packet::Join &) { }
43         virtual void On(const Packet::Part &) { }
44         virtual void On(const Packet::PlayerUpdate &) { }
45         virtual void On(const Packet::SpawnEntity &) { }
46         virtual void On(const Packet::DespawnEntity &) { }
47         virtual void On(const Packet::EntityUpdate &) { }
48         virtual void On(const Packet::PlayerCorrection &) { }
49         virtual void On(const Packet::ChunkBegin &) { }
50         virtual void On(const Packet::ChunkData &) { }
51         virtual void On(const Packet::BlockUpdate &) { }
52         virtual void On(const Packet::Message &) { }
53
54 private:
55         unsigned int packets_lost;
56         unsigned int packets_received;
57         float packet_loss;
58
59         Uint32 stamps[16];
60         std::size_t stamp_cursor;
61         std::uint16_t stamp_last;
62         float rtt;
63
64 };
65
66 }
67
68 #endif