diff --git a/src/ll/api/event/player/PlayerConnectEvent.cpp b/src/ll/api/event/player/PlayerConnectEvent.cpp new file mode 100644 index 0000000000..88ab2a602d --- /dev/null +++ b/src/ll/api/event/player/PlayerConnectEvent.cpp @@ -0,0 +1,38 @@ +#include "ll/api/event/player/PlayerConnectEvent.h" +#include "ll/api/event/Emitter.h" +#include "ll/api/memory/Hook.h" + +#include "mc/network/ServerNetworkHandler.h" + + +namespace ll::event::player { + +LL_TYPED_INSTANCE_HOOK( + PlayerConnectEventHook, + HookPriority::Normal, + ServerNetworkHandler, + "?sendLoginMessageLocal@ServerNetworkHandler@@QEAAXAEBVNetworkIdentifier@@AEBVConnectionRequest@@AEAVServerPlayer@@" + "@Z", + void, + const NetworkIdentifier& ni, + const ConnectionRequest& cr, + const ServerPlayer& sp +) { + auto event = PlayerConnectEvent(sp); + EventBus::getInstance().publish(event); + if (event.isCancelled()) { + return; + } + origin(ni, cr, sp); +} + +class PlayerConnectEventEmitter : public Emitter { +public: + PlayerConnectEventEmitter() { PlayerConnectEventHook::hook(); } + ~PlayerConnectEventEmitter() override { PlayerConnectEventHook::unhook(); } +}; + +std::unique_ptr PlayerConnectEvent::emitterFactory(ListenerBase&) { + return std::make_unique(); +} +} // namespace ll::event::player diff --git a/src/ll/api/event/player/PlayerConnectEvent.h b/src/ll/api/event/player/PlayerConnectEvent.h new file mode 100644 index 0000000000..d93b31fe0b --- /dev/null +++ b/src/ll/api/event/player/PlayerConnectEvent.h @@ -0,0 +1,18 @@ +#pragma once + +#include "ll/api/base/Macro.h" +#include "ll/api/event/Cancellable.h" +#include "ll/api/event/Event.h" + +#include "mc/server/ServerPlayer.h" + +namespace ll::event::player { +class PlayerConnectEvent : public Cancellable { +public: + const ServerPlayer& player; + + constexpr explicit PlayerConnectEvent(const ServerPlayer& player) : player(player) {} + + LLNDAPI static std::unique_ptr emitterFactory(ListenerBase&); +}; +} // namespace ll::event::player diff --git a/src/ll/api/event/player/PlayerJoinEvent.cpp b/src/ll/api/event/player/PlayerJoinEvent.cpp new file mode 100644 index 0000000000..6f65577827 --- /dev/null +++ b/src/ll/api/event/player/PlayerJoinEvent.cpp @@ -0,0 +1,33 @@ +#include "ll/api/event/player/PlayerJoinEvent.h" +#include "ll/api/event/Emitter.h" +#include "ll/api/memory/Hook.h" + +#include "mc/server/ServerPlayer.h" + +namespace ll::event::player { + +LL_TYPED_INSTANCE_HOOK( + PlayerJoinEventHook, + HookPriority::Normal, + ServerPlayer, + &ServerPlayer::setLocalPlayerAsInitialized, + void +) { + auto event = PlayerJoinEvent(*this); + EventBus::getInstance().publish(event); + if (event.isCancelled()) { + return; + } + origin(); +} + +class PlayerJoinEventEmitter : public Emitter { +public: + PlayerJoinEventEmitter() { PlayerJoinEventHook::hook(); } + ~PlayerJoinEventEmitter() override { PlayerJoinEventHook::unhook(); } +}; + +std::unique_ptr PlayerJoinEvent::emitterFactory(ListenerBase&) { + return std::make_unique(); +} +} // namespace ll::event::player diff --git a/src/ll/api/event/player/PlayerJoinEvent.h b/src/ll/api/event/player/PlayerJoinEvent.h new file mode 100644 index 0000000000..7e460213fb --- /dev/null +++ b/src/ll/api/event/player/PlayerJoinEvent.h @@ -0,0 +1,18 @@ +#pragma once + +#include "ll/api/base/Macro.h" +#include "ll/api/event/Cancellable.h" +#include "ll/api/event/Event.h" + +#include "mc/server/ServerPlayer.h" + +namespace ll::event::player { +class PlayerJoinEvent : public Cancellable { +public: + ServerPlayer& player; + + constexpr explicit PlayerJoinEvent(ServerPlayer& player) : player(player) {} + + LLNDAPI static std::unique_ptr emitterFactory(ListenerBase&); +}; +} // namespace ll::event::player diff --git a/src/ll/api/event/player/PlayerLeaveEvent.cpp b/src/ll/api/event/player/PlayerLeaveEvent.cpp new file mode 100644 index 0000000000..35d1be0666 --- /dev/null +++ b/src/ll/api/event/player/PlayerLeaveEvent.cpp @@ -0,0 +1,24 @@ +#include "ll/api/event/player/PlayerLeaveEvent.h" +#include "ll/api/event/Emitter.h" +#include "ll/api/memory/Hook.h" + +#include "mc/server/ServerPlayer.h" + +namespace ll::event::player { + +LL_TYPED_INSTANCE_HOOK(PlayerLeaveEventHook, HookPriority::Normal, ServerPlayer, &ServerPlayer::disconnect, void) { + auto event = PlayerLeaveEvent(*this); + EventBus::getInstance().publish(event); + origin(); +} + +class PlayerLeaveEventEmitter : public Emitter { +public: + PlayerLeaveEventEmitter() { PlayerLeaveEventHook::hook(); } + ~PlayerLeaveEventEmitter() override { PlayerLeaveEventHook::unhook(); } +}; + +std::unique_ptr PlayerLeaveEvent::emitterFactory(ListenerBase&) { + return std::make_unique(); +} +} // namespace ll::event::player diff --git a/src/ll/api/event/player/PlayerLeaveEvent.h b/src/ll/api/event/player/PlayerLeaveEvent.h new file mode 100644 index 0000000000..509b665714 --- /dev/null +++ b/src/ll/api/event/player/PlayerLeaveEvent.h @@ -0,0 +1,18 @@ +#pragma once + +#include "ll/api/base/Macro.h" +#include "ll/api/event/Cancellable.h" +#include "ll/api/event/Event.h" + +#include "mc/server/ServerPlayer.h" + +namespace ll::event::player { +class PlayerLeaveEvent : public Event { +public: + ServerPlayer& player; + + constexpr explicit PlayerLeaveEvent(ServerPlayer& player) : player(player) {} + + LLNDAPI static std::unique_ptr emitterFactory(ListenerBase&); +}; +} // namespace ll::event::player diff --git a/src/ll/test/EventTest.cpp b/src/ll/test/EventTest.cpp index f1350a12f4..0f82cc0850 100644 --- a/src/ll/test/EventTest.cpp +++ b/src/ll/test/EventTest.cpp @@ -9,6 +9,9 @@ #include "mc/world/events/ServerInstanceEventCoordinator.h" #include "ll/api/event/command/ExecuteCommandEvent.h" +#include "ll/api/event/player/PlayerConnectEvent.h" +#include "ll/api/event/player/PlayerJoinEvent.h" +#include "ll/api/event/player/PlayerLeaveEvent.h" #include "mc/nbt/CompoundTag.h" #include "ll/api/base/FixedString.h" @@ -121,4 +124,13 @@ LL_AUTO_TYPED_INSTANCE_HOOK( ll::logger.debug("ExecutedCommandEvent: {}", ev.commandContext.mCommand); ll::logger.debug("result: {}", ev.result.getFullCode()); }); + bus.emplaceListener([](player::PlayerConnectEvent& ev) { + ll::logger.debug("Player connect: {}", ev.player.getRealName()); + }); + bus.emplaceListener([](player::PlayerJoinEvent& ev) { + ll::logger.debug("Player join: {}", ev.player.getRealName()); + }); + bus.emplaceListener([](player::PlayerLeaveEvent& ev) { + ll::logger.debug("Player leave: {}", ev.player.getRealName()); + }); } diff --git a/temp/event/player/PlayerConnectEvent.cpp b/temp/event/player/PlayerConnectEvent.cpp deleted file mode 100644 index 72327886dc..0000000000 --- a/temp/event/player/PlayerConnectEvent.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "ll/api/event/player/PlayerConnectEvent.h" -#include "ll/api/event/EventManager.h" -#include "ll/api/memory/Hook.h" - -#include "mc/ConnectionRequest.hpp" -#include "mc/ServerPlayer.hpp" - -#include "ll/api/event/impl/EventImpl.inl" -#include "ll/api/event/impl/EventManagerImpl.inl" -#include "ll/api/event/impl/ListenerImpl.inl" - -namespace ll::event::player { - -PlayerConnectEvent::PlayerConnectEvent(Player* player) : player(player) {} - -LL_GETTER_IMPL(PlayerConnectEvent, Player*, player, getPlayer) - -LL_AUTO_INSTANCE_HOOK( - PlayerConnectEventHook, - HookPriority::Normal, - "?sendLoginMessageLocal@ServerNetworkHandler@@QEAAXAEBVNetworkIdentifier@@" - "AEBVConnectionRequest@@AEAVServerPlayer@@@Z", - void, - NetworkIdentifier* ni, - ConnectionRequest* cr, - ServerPlayer* sp -) { - PlayerConnectEvent event((Player*)sp); - EventManager::fireEvent(event); - return origin(ni, cr, sp); -} - -} // namespace ll::event::player - -LL_EVENT_IMPL(player::PlayerConnectEvent) diff --git a/temp/event/player/PlayerConnectEvent.h b/temp/event/player/PlayerConnectEvent.h deleted file mode 100644 index 8607895c90..0000000000 --- a/temp/event/player/PlayerConnectEvent.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "ll/api/event/Event.h" -#include "ll/api/utils/AccessorMacro.h" -#include "mc/Player.hpp" - - -namespace ll::event::player { -/** - * @brief Player connect event(aka PlayerPreJoinEvent). - * @details This event is called when a player connects to the server. - */ -class PlayerConnectEvent : public Event, public Cancellable { - LL_RO_MEMBER(Player*, player, getPlayer); - - explicit PlayerConnectEvent(Player* player); - - LL_DELETE_COPY(PlayerConnectEvent); - LL_DELETE_MOVE(PlayerConnectEvent); -}; - -} // namespace ll::event::player diff --git a/temp/event/player/PlayerJoinEvent.cpp b/temp/event/player/PlayerJoinEvent.cpp deleted file mode 100644 index 878b502728..0000000000 --- a/temp/event/player/PlayerJoinEvent.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "ll/api/event/player/PlayerJoinEvent.h" -#include "ll/api/event/EventManager.h" -#include "ll/api/memory/Hook.h" - -#include "mc/ServerPlayer.hpp" - -#include "ll/api/event/impl/EventImpl.inl" -#include "ll/api/event/impl/EventManagerImpl.inl" -#include "ll/api/event/impl/ListenerImpl.inl" - -namespace ll::event::player { - -PlayerJoinEvent::PlayerJoinEvent(Player* player) : player(player) {} - -LL_GETTER_IMPL(PlayerJoinEvent, Player*, player, getPlayer) - -LL_AUTO_TYPED_INSTANCE_HOOK( - PlayerJoinEventHook, - ServerPlayer, - HookPriority::Normal, - "?setLocalPlayerAsInitialized@ServerPlayer@@QEAAXXZ", - bool, -) { - PlayerJoinEvent event(this); - EventManager::fireEvent(event); - if (event.isCancelled()) { - return false; - } - return origin(); -} - -} // namespace ll::event::player - -LL_EVENT_IMPL(player::PlayerJoinEvent) diff --git a/temp/event/player/PlayerJoinEvent.h b/temp/event/player/PlayerJoinEvent.h deleted file mode 100644 index d3f2cc7db6..0000000000 --- a/temp/event/player/PlayerJoinEvent.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "ll/api/event/Event.h" -#include "ll/api/utils/AccessorMacro.h" -#include "mc/Player.hpp" - - -namespace ll::event::player { - -/** - * @brief Player join event. - * @details This event is called when a player joins the server(the player entity spawns). - */ -class PlayerJoinEvent : public Event, public Cancellable { - LL_RO_MEMBER(Player*, player, getPlayer); - - explicit PlayerJoinEvent(Player* player); - - LL_DELETE_COPY(PlayerJoinEvent); - LL_DELETE_MOVE(PlayerJoinEvent); -}; - -} // namespace ll::event::player diff --git a/temp/event/player/PlayerLeaveEvent.cpp b/temp/event/player/PlayerLeaveEvent.cpp deleted file mode 100644 index 0f0c3a456a..0000000000 --- a/temp/event/player/PlayerLeaveEvent.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "ll/api/event/player/PlayerLeaveEvent.h" -#include "ll/api/event/EventManager.h" -#include "ll/api/memory/Hook.h" - -#include "mc/ServerPlayer.hpp" - -#include "ll/api/event/impl/EventImpl.inl" -#include "ll/api/event/impl/EventManagerImpl.inl" -#include "ll/api/event/impl/ListenerImpl.inl" - -namespace ll::event::player { - -PlayerLeaveEvent::PlayerLeaveEvent(Player* player) : player(player) {} - -LL_GETTER_IMPL(PlayerLeaveEvent, Player*, player, getPlayer) - -LL_AUTO_TYPED_INSTANCE_HOOK( - PlayerLeaveEventHook, - ServerPlayer, - HookPriority::Normal, - "?disconnect@ServerPlayer@@QEAAXXZ", - void, -) { - PlayerLeaveEvent event(this); - EventManager::fireEvent(event); - return origin(); -} - -} // namespace ll::event::player - -LL_EVENT_IMPL(player::PlayerLeaveEvent) diff --git a/temp/event/player/PlayerLeaveEvent.h b/temp/event/player/PlayerLeaveEvent.h deleted file mode 100644 index 9c25c23cbc..0000000000 --- a/temp/event/player/PlayerLeaveEvent.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "ll/api/event/Event.h" -#include "ll/api/utils/AccessorMacro.h" -#include "mc/Player.hpp" - - -namespace ll::event::player { - -/** - * @brief Player join event. - * @details This event is called when a player joins the server(the player entity spawns). - */ -class PlayerLeaveEvent : public Event { - LL_RO_MEMBER(Player*, player, getPlayer); - - explicit PlayerLeaveEvent(Player* player); - - LL_DELETE_COPY(PlayerLeaveEvent); - LL_DELETE_MOVE(PlayerLeaveEvent); -}; - -} // namespace ll::event::player