LeviLamina
Loading...
Searching...
No Matches
Packet.h
1#pragma once
2
3#include <memory>
4#include <string>
5
6#include "ll/api/base/Macro.h"
7#include "ll/api/network/packet/PacketRegistrar.h"
8#include "ll/api/reflection/TypeName.h"
9#include "mc/common/SubClientId.h"
10#include "mc/deps/raknet/PacketPriority.h"
11#include "mc/network/Compressibility.h"
12#include "mc/network/NetworkPeer.h"
13#include "mc/platform/Result.h"
14
15class BinaryStream;
22
23namespace ll::network {
24
25class IPacketHandler;
26class PacketRegistrar;
27
28class Packet {
29public:
30 PacketPriority mPriority;
31 NetworkPeer::Reliability mReliability;
32 SubClientId mSenderSubId;
33 Compressibility mCompressible;
34
35 [[nodiscard]] constexpr explicit Packet(
36 PacketPriority priority = PacketPriority::MediumPriority,
37 NetworkPeer::Reliability reliability = NetworkPeer::Reliability::ReliableOrdered,
38 SubClientId clientSubId = SubClientId::PrimaryClient,
39 bool compress = true
40 )
41 : mPriority(priority),
42 mReliability(reliability),
43 mSenderSubId(clientSubId),
44 mCompressible(compress ? Compressibility::Compressible : Compressibility::Incompressible) {}
45
46 virtual ~Packet() = default;
47
48 virtual void write(::BinaryStream&) const = 0;
49 [[nodiscard]] virtual ::Bedrock::Result<void> read(::ReadOnlyBinaryStream&) = 0;
50 [[nodiscard]] virtual ::std::string getName() const = 0;
51
52 [[nodiscard]] virtual PacketRuntimeId getRuntimeId() const;
53
54 LLAPI void sendToServer() const;
55 LLAPI void sendToClient(::NetworkIdentifier const& identifier, ::SubClientId clientId) const;
56 LLAPI void sendToClient(::UserEntityIdentifierComponent const*);
57 LLAPI void sendToClients(::std::vector<::NetworkIdentifierWithSubId> const&);
58 LLAPI void sendBroadcast();
59 LLAPI void sendBroadcast(::NetworkIdentifier const&, ::SubClientId);
60};
61
63public:
64 virtual ~IPacketHandler() = default;
65 virtual void
66 handle(const NetworkIdentifier& netId, NetEventCallback& callback, const ll::network::Packet& packet) const = 0;
67};
68
69template <class Derived>
70class PacketBase : public Packet {
71 static bool ensureRegistered() {
72 PacketRegistrar::getInstance().registerPacket(
73 reflection::type_unprefix_name_v<Derived>,
74 ll::hash_utils::doHash(reflection::type_unprefix_name_v<Derived>),
75 []() -> std::unique_ptr<Packet> { return std::make_unique<Derived>(); }
76 );
77 return true;
78 }
79
80protected:
81 using Packet::Packet;
82
83public:
84 [[nodiscard]] ::std::string getName() const override {
85 return ::std::string(reflection::type_unprefix_name_v<Derived>);
86 }
87 [[nodiscard]] PacketRuntimeId getRuntimeId() const override {
88 constexpr PacketRuntimeId runtimeId = ll::hash_utils::doHash(reflection::type_unprefix_name_v<Derived>);
89 return runtimeId;
90 }
91
92 inline static bool sRegistered = ensureRegistered();
93};
94
95template <class Derived, class PacketType>
97 static bool ensureRegistered() {
98 static Derived instance;
99 PacketRegistrar::getInstance().registerHandler(
100 reflection::type_unprefix_name_v<PacketType>,
101 ll::hash_utils::doHash(reflection::type_unprefix_name_v<PacketType>),
102 instance
103 );
104 return true;
105 }
106
107 inline static bool sRegistered = ensureRegistered();
108
109public:
110 void handle(const NetworkIdentifier& netId, NetEventCallback& callback, const Packet& packet) const final {
111 static_cast<const Derived*>(this)->handlePacket(netId, callback, static_cast<const PacketType&>(packet));
112 }
113};
114
115} // namespace ll::network
Definition BinaryStream.h:11
Definition IPacketHandlerDispatcher.h:12
Definition NetEventCallback.h:245
Definition NetworkIdentifier.h:10
Definition ReadOnlyBinaryStream.h:8
Definition UserEntityIdentifierComponent.h:12
Definition Packet.h:62
Definition Packet.h:70
Definition Packet.h:96
Definition PacketRegistrar.h:17
Definition Packet.h:28
Definition NetworkIdentifierWithSubId.h:10