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_view 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
69namespace detail {
70template <bool&>
72
73template <class Derived>
74inline bool packetRegistration = [] {
75 PacketRegistrar::getInstance().registerPacket(
76 reflection::type_unprefix_name_v<Derived>,
77 ll::hash_utils::doHash(reflection::type_unprefix_name_v<Derived>),
78 []() -> std::unique_ptr<Packet> { return std::make_unique<Derived>(); }
79 );
80 return true;
81}();
82
83template <class Derived, class PacketType>
84inline bool packetHandlerRegistration = [] {
85 static Derived instance;
86 PacketRegistrar::getInstance().registerHandler(
87 reflection::type_unprefix_name_v<PacketType>,
88 ll::hash_utils::doHash(reflection::type_unprefix_name_v<PacketType>),
89 instance
90 );
91 return true;
92}();
93} // namespace detail
94
95template <class Derived>
97: public Packet,
98 private detail::StaticRegistrationAnchor<detail::packetRegistration<Derived>> {
99 static bool ensureRegistered() {
100 return detail::packetRegistration<Derived>;
101 }
102
103protected:
104 using Packet::Packet;
105
106public:
107 [[nodiscard]] ::std::string_view getName() const override {
108 return reflection::type_unprefix_name_v<Derived>;
109 }
110 [[nodiscard]] PacketRuntimeId getRuntimeId() const override {
111 constexpr PacketRuntimeId runtimeId = ll::hash_utils::doHash(reflection::type_unprefix_name_v<Derived>);
112 return runtimeId;
113 }
114
115 inline static bool sRegistered = ensureRegistered();
116};
117
118template <class Derived, class PacketType>
120: public IPacketHandler,
121 private detail::StaticRegistrationAnchor<detail::packetHandlerRegistration<Derived, PacketType>> {
122 static bool ensureRegistered() {
123 return detail::packetHandlerRegistration<Derived, PacketType>;
124 }
125
126 inline static bool sRegistered = ensureRegistered();
127
128public:
129 void handle(const NetworkIdentifier& netId, NetEventCallback& callback, const Packet& packet) const final {
130 static_cast<const Derived*>(this)->handlePacket(netId, callback, static_cast<const PacketType&>(packet));
131 }
132};
133
134} // namespace ll::network
Definition BinaryStream.h:11
Definition IPacketHandlerDispatcher.h:12
Definition NetEventCallback.h:260
Definition NetworkIdentifier.h:10
Definition ReadOnlyBinaryStream.h:8
Definition UserEntityIdentifierComponent.h:17
Definition Packet.h:62
Definition Packet.h:98
Definition Packet.h:121
Definition PacketRegistrar.h:17
Definition Packet.h:28
Definition NetworkIdentifierWithSubId.h:10