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 Player;
16class Actor;
17class BlockPos;
18class BinaryStream;
25struct DimensionType;
26
27namespace ll::network {
28
29class IPacketHandler;
30class PacketRegistrar;
31
32class Packet {
33public:
34 PacketPriority mPriority;
35 NetworkPeer::Reliability mReliability;
36 SubClientId mSenderSubId;
37 Compressibility mCompressible;
38
39 [[nodiscard]] constexpr explicit Packet(
40 PacketPriority priority = PacketPriority::MediumPriority,
41 NetworkPeer::Reliability reliability = NetworkPeer::Reliability::ReliableOrdered,
42 SubClientId clientSubId = SubClientId::PrimaryClient,
43 bool compress = true
44 )
45 : mPriority(priority),
46 mReliability(reliability),
47 mSenderSubId(clientSubId),
48 mCompressible(compress ? Compressibility::Compressible : Compressibility::Incompressible) {}
49
50 virtual ~Packet() = default;
51
52 virtual void write(::BinaryStream&) const = 0;
53 [[nodiscard]] virtual ::Bedrock::Result<void> read(::ReadOnlyBinaryStream&) = 0;
54 [[nodiscard]] virtual ::std::string_view getName() const = 0;
55
56 [[nodiscard]] LLNDAPI virtual PacketRuntimeId getRuntimeId() const;
57
58 LLAPI void sendTo(Player const& player) const;
59 LLAPI void sendTo(BlockPos const& pos, DimensionType dimId, optional_ref<Player const> except = std::nullopt) const;
60 LLAPI void sendTo(Actor const& actor, optional_ref<Player const> except = std::nullopt) const;
61
62 LLAPI void sendToClient(NetworkIdentifier const& identifier, ::SubClientId clientId) const;
63 LLAPI void sendToClient(NetworkIdentifierWithSubId const& identifierWithSubId) const;
64
65 LLAPI void sendToClients() const;
66 LLAPI void sendToClients(NetworkIdentifier const& exceptId, ::SubClientId exceptSubid) const;
67
68 LLAPI void sendToServer() const;
69};
70
72public:
73 virtual ~IPacketHandler() = default;
74 virtual void
75 handle(NetworkIdentifier const& netId, NetEventCallback& callback, ll::network::Packet const& packet) const = 0;
76};
77
78namespace detail {
79template <bool&>
81
82template <class Derived>
83inline bool packetRegistration = [] {
84 PacketRegistrar::getInstance().registerPacket(
85 reflection::type_unprefix_name_v<Derived>,
86 ll::hash_utils::doHash(reflection::type_unprefix_name_v<Derived>),
87 []() -> std::unique_ptr<Packet> { return std::make_unique<Derived>(); }
88 );
89 return true;
90}();
91
92template <class Derived, class PacketType>
93inline bool packetHandlerRegistration = [] {
94 static Derived instance;
95 PacketRegistrar::getInstance().registerHandler(
96 reflection::type_unprefix_name_v<PacketType>,
97 ll::hash_utils::doHash(reflection::type_unprefix_name_v<PacketType>),
98 instance
99 );
100 return true;
101}();
102} // namespace detail
103
104template <class Derived>
105class PacketBase : public Packet, private detail::StaticRegistrationAnchor<detail::packetRegistration<Derived>> {
106 static bool ensureRegistered() { return detail::packetRegistration<Derived>; }
107
108protected:
109 using Packet::Packet;
110
111public:
112 [[nodiscard]] ::std::string_view getName() const override { return reflection::type_unprefix_name_v<Derived>; }
113 [[nodiscard]] PacketRuntimeId getRuntimeId() const override {
114 constexpr PacketRuntimeId runtimeId = ll::hash_utils::doHash(reflection::type_unprefix_name_v<Derived>);
115 return runtimeId;
116 }
117
118 inline static bool sRegistered = ensureRegistered();
119};
120
121template <class Derived, class PacketType>
123: public IPacketHandler,
124 private detail::StaticRegistrationAnchor<detail::packetHandlerRegistration<Derived, PacketType>> {
125 static bool ensureRegistered() { return detail::packetHandlerRegistration<Derived, PacketType>; }
126
127 inline static bool sRegistered = ensureRegistered();
128
129public:
130 void handle(NetworkIdentifier const& netId, NetEventCallback& callback, Packet const& packet) const final {
131 static_cast<Derived const*>(this)->handlePacket(netId, callback, static_cast<PacketType const&>(packet));
132 }
133};
134
135} // namespace ll::network
Definition Actor.h:113
Definition BinaryStream.h:10
Definition BlockPos.h:17
Definition IPacketHandlerDispatcher.h:12
Definition NetEventCallback.h:265
Definition NetworkIdentifier.h:10
Definition Player.h:129
Definition ReadOnlyBinaryStream.h:8
Definition UserEntityIdentifierComponent.h:17
Definition Packet.h:71
Definition Packet.h:105
Definition Packet.h:124
Definition PacketRegistrar.h:17
Definition Packet.h:32
Definition optional_ref.h:10
Definition DimensionType.h:5
Definition NetworkIdentifierWithSubId.h:10