Skip to content

Commit

Permalink
refactor: update the implementation of data packet events
Browse files Browse the repository at this point in the history
  • Loading branch information
wu-vincent committed Mar 1, 2025
1 parent 008a528 commit e126a2c
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 66 deletions.
1 change: 1 addition & 0 deletions src/bedrock/forward.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class EndstoneActor;
class EndstoneLevel;
class EndstonePlayer;
class EndstoneServer;
class EndstoneServerNetworkEventHandler;
} // namespace core
} // namespace endstone

Expand Down
2 changes: 1 addition & 1 deletion src/bedrock/network/network_system.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class NetworkSystem : public RakNetConnector::ConnectionCallbacks,
std::unique_ptr<LocalConnector> local_connector_;

private:
friend class ServerNetworkHandler;
friend class endstone::core::EndstoneServerNetworkEventHandler;

std::unique_ptr<RemoteConnector> remote_connector_;
std::unique_ptr<ServerLocator> server_locator_;
Expand Down
5 changes: 0 additions & 5 deletions src/bedrock/network/server_network_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,6 @@ class ServerNetworkHandler : public Bedrock::Threading::EnableQueueForMainThread
NetworkServerConfig);

~ServerNetworkHandler() override = 0;
ENDSTONE_HOOK IncomingPacketFilterResult allowIncomingPacketId(const NetworkIdentifierWithSubId &sender,
MinecraftPacketIds packet_id,
std::size_t packet_size) override;
ENDSTONE_HOOK OutgoingPacketFilterResult allowOutgoingPacket(const std::vector<NetworkIdentifierWithSubId> &ids,
const Packet &packet) override;

ENDSTONE_HOOK void disconnectClient(NetworkIdentifier const &, SubClientId, Connection::DisconnectFailReason,
std::string const &, std::optional<std::string>, bool);
Expand Down
5 changes: 5 additions & 0 deletions src/bedrock/server/server_instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ Minecraft *ServerInstance::getMinecraft()
return minecraft_.get();
}

ServerNetworkSystem &ServerInstance::getNetwork()
{
return *network_;
}

PacketSender &ServerInstance::getPacketSender()
{
return *packet_sender_;
Expand Down
1 change: 1 addition & 0 deletions src/bedrock/server/server_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class ServerInstance : public Bedrock::EnableNonOwnerReferences,
};

Minecraft *getMinecraft();
ServerNetworkSystem &getNetwork();
PacketSender &getPacketSender();

private:
Expand Down
4 changes: 0 additions & 4 deletions src/bedrock/symbol_generator/symbols.toml
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,6 @@ version = "1.21.60"
# ServerInstance
"?_resetServerScriptManager@ServerInstance@@AEAAXXZ" = 22404720
# ServerNetworkHandler
"?allowIncomingPacketId@ServerNetworkHandler@@UEAA?AW4IncomingPacketFilterResult@@AEBUNetworkIdentifierWithSubId@@W4MinecraftPacketIds@@_K@Z" = 18701200
"?allowOutgoingPacket@ServerNetworkHandler@@UEAA?AW4OutgoingPacketFilterResult@@AEBV?$vector@UNetworkIdentifierWithSubId@@V?$allocator@UNetworkIdentifierWithSubId@@@std@@@std@@AEBVPacket@@@Z" = 18700256
"?disconnectClient@ServerNetworkHandler@@QEAAXAEBVNetworkIdentifier@@W4SubClientId@@W4DisconnectFailReason@Connection@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$optional@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@7@_N@Z" = 18662704
"?trytLoadPlayer@ServerNetworkHandler@@QEAA_NAEAVServerPlayer@@AEBVConnectionRequest@@@Z" = 18734400
"?updateServerAnnouncement@ServerNetworkHandler@@QEAAXXZ" = 18786960
Expand Down Expand Up @@ -163,8 +161,6 @@ version = "1.21.60"
# ServerInstance
"_ZN14ServerInstance25_resetServerScriptManagerEv" = 97226000
# ServerNetworkHandler
"_ZN20ServerNetworkHandler21allowIncomingPacketIdERK26NetworkIdentifierWithSubId18MinecraftPacketIdsm" = 94644288
"_ZN20ServerNetworkHandler19allowOutgoingPacketERKNSt3__16vectorI26NetworkIdentifierWithSubIdNS0_9allocatorIS2_EEEERK6Packet" = 94643472
"_ZN20ServerNetworkHandler16disconnectClientERK17NetworkIdentifier11SubClientIdN10Connection20DisconnectFailReasonERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS6_8optionalISC_EEb" = 94609392
"_ZN20ServerNetworkHandler14trytLoadPlayerER12ServerPlayerRK17ConnectionRequest" = 94689776
"_ZN20ServerNetworkHandler24updateServerAnnouncementEv" = 94642160
Expand Down
46 changes: 40 additions & 6 deletions src/endstone/core/event/handlers/server_network_event_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@

#include "endstone/core/event/handlers/server_network_event_handler.h"

#include <variant>

#include "endstone/core/server.h"
#include "endstone/event/player/player_chat_event.h"
#include "endstone/event/server/data_packet_receive_event.h"
#include "endstone/event/server/data_packet_send_event.h"

namespace endstone::core {

Expand All @@ -31,10 +31,8 @@ GameplayHandlerResult<CoordinatorResult> EndstoneServerNetworkEventHandler::hand
{
auto visitor = [&](auto &&arg) -> GameplayHandlerResult<CoordinatorResult> {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, Details::ValueOrRef<ChatEvent>>) {
if (!handleEvent(arg.value())) {
return {HandlerResult::BypassListeners, CoordinatorResult::Cancel};
}
if (!handleEvent(arg.value())) {
return {HandlerResult::BypassListeners, CoordinatorResult::Cancel};
}
return handle_->handleEvent(event);
};
Expand Down Expand Up @@ -62,4 +60,40 @@ bool EndstoneServerNetworkEventHandler::handleEvent(ChatEvent &event)
return true;
}

bool EndstoneServerNetworkEventHandler::handleEvent(IncomingPacketEvent &event)
{
const auto &server = entt::locator<EndstoneServer>::value();
if (auto *player = WeakEntityRef(event.sender).tryUnwrap<::Player>(); player) {
const auto &network = server.getServer().getNetwork();
// TODO(refactor): add Player::handleDataPacket and call the event there
DataPacketReceiveEvent e{player->getEndstoneActor<EndstonePlayer>(), network.receive_buffer_};
server.getPluginManager().callEvent(e);
if (e.isCancelled()) {
return false;
}

if (event.packet_id == MinecraftPacketIds::SetLocalPlayerAsInit) {
static_cast<::ServerPlayer *>(player)->setLocalPlayerAsInitialized();
}
}

return true;
}

bool EndstoneServerNetworkEventHandler::handleEvent(OutgoingPacketEvent &event)
{
const auto &server = entt::locator<EndstoneServer>::value();
for (const auto &target : event.recipients) {
if (auto *player = WeakEntityRef(target).tryUnwrap<::Player>(); player) {
const auto &network = server.getServer().getNetwork();
DataPacketSendEvent e{player->getEndstoneActor<EndstonePlayer>(), network.send_stream_.getView()};
server.getPluginManager().callEvent(e);
if (e.isCancelled()) {
return false;
}
}
}
return true;
}

} // namespace endstone::core
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ class EndstoneServerNetworkEventHandler final : public ServerNetworkEventHandler

private:
bool handleEvent(ChatEvent &event);
bool handleEvent(IncomingPacketEvent &event);
bool handleEvent(OutgoingPacketEvent &event);

std::unique_ptr<ServerNetworkEventHandler> handle_;
};
Expand Down
50 changes: 0 additions & 50 deletions src/endstone/runtime/bedrock_hooks/server_network_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,59 +21,9 @@
#include "endstone/core/server.h"
#include "endstone/event/player/player_kick_event.h"
#include "endstone/event/player/player_login_event.h"
#include "endstone/event/server/data_packet_receive_event.h"
#include "endstone/event/server/data_packet_send_event.h"
#include "endstone/runtime/hook.h"

IncomingPacketFilterResult ServerNetworkHandler::allowIncomingPacketId(const NetworkIdentifierWithSubId &sender,
MinecraftPacketIds packet_id,
std::size_t packet_size)
{
const auto result =
ENDSTONE_HOOK_CALL_ORIGINAL(&NetEventCallback::allowIncomingPacketId, this, sender, packet_id, packet_size);
if (result != IncomingPacketFilterResult::Allowed) {
return result;
}

const auto &server = entt::locator<endstone::core::EndstoneServer>::value();
if (auto *player = _getServerPlayer(sender.id, sender.sub_client_id); player) {
endstone::DataPacketReceiveEvent e{player->getEndstoneActor<endstone::core::EndstonePlayer>(),
network_.receive_buffer_};
server.getPluginManager().callEvent(e);
if (e.isCancelled()) {
return IncomingPacketFilterResult::RejectedSilently;
}

if (packet_id == MinecraftPacketIds::SetLocalPlayerAsInit) {
player->setLocalPlayerAsInitialized();
}
}

return IncomingPacketFilterResult::Allowed;
}

OutgoingPacketFilterResult ServerNetworkHandler::allowOutgoingPacket(const std::vector<NetworkIdentifierWithSubId> &ids,
const Packet &packet)
{
const auto result = ENDSTONE_HOOK_CALL_ORIGINAL(&NetEventCallback::allowOutgoingPacket, this, ids, packet);
if (result != OutgoingPacketFilterResult::Allowed) {
return result;
}

const auto &server = entt::locator<endstone::core::EndstoneServer>::value();
for (const auto &target : ids) {
if (auto *player = _getServerPlayer(target.id, target.sub_client_id); player) {
endstone::DataPacketSendEvent e{player->getEndstoneActor<endstone::core::EndstonePlayer>(),
network_.send_stream_.getView()};
server.getPluginManager().callEvent(e);
if (e.isCancelled()) {
return OutgoingPacketFilterResult::Reject;
}
}
}

return OutgoingPacketFilterResult::Allowed;
}

void ServerNetworkHandler::disconnectClient(const NetworkIdentifier &network_id, SubClientId sub_client_id,
Connection::DisconnectFailReason reason, const std::string &message,
Expand Down

0 comments on commit e126a2c

Please sign in to comment.