Skip to content

Commit

Permalink
feat: improve player kick messaging and handling
Browse files Browse the repository at this point in the history
  • Loading branch information
wu-vincent committed Sep 12, 2024
1 parent b16893d commit 2ae1c53
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 8 deletions.
4 changes: 2 additions & 2 deletions src/endstone_core/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,8 +293,8 @@ void EndstonePlayer::kick(std::string message) const
{
auto *component = getHandle().tryGetComponent<UserEntityIdentifierComponent>();
server_.getServerNetworkHandler().disconnectClient(component->network_id, component->sub_client_id,
Connection::DisconnectFailReason::NoReason, message,
std::nullopt, message.empty());
Connection::DisconnectFailReason::Kicked, message, std::nullopt,
false);
}

void EndstonePlayer::giveExp(int amount)
Expand Down
18 changes: 12 additions & 6 deletions src/endstone_runtime/bedrock/network/server_network_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <entt/entt.hpp>
#include <magic_enum/magic_enum.hpp>

#include "bedrock/locale/i18n.h"
#include "endstone/detail/hook.h"
#include "endstone/detail/server.h"
#include "endstone/event/player/player_chat_event.h"
Expand All @@ -32,23 +33,28 @@ void ServerNetworkHandler::disconnectClient(const NetworkIdentifier &network_id,
Connection::DisconnectFailReason reason, const std::string &message,
std::optional<std::string> filtered_message, bool skip_message)
{
std::string msg = message;
const auto &server = entt::locator<EndstoneServer>::value();
auto *endstone_player = server.getPlayer(network_id, sub_client_id);
if (!endstone_player) {
throw std::runtime_error("Unable to find server player by network id and sub client id.");
return;
}

endstone::PlayerKickEvent e{*endstone_player, msg};
auto kick_message = getI18n().get(message, nullptr);
endstone::PlayerKickEvent e{*endstone_player, kick_message};
server.getPluginManager().callEvent(e);

if (e.isCancelled()) {
return;
}
msg = e.getReason();

ENDSTONE_HOOK_CALL_ORIGINAL(&ServerNetworkHandler::disconnectClient, this, network_id, sub_client_id, reason, msg,
std::move(filtered_message), skip_message);
if (e.getReason() != kick_message) {
kick_message = e.getReason();
}
else {
kick_message = message;
}
ENDSTONE_HOOK_CALL_ORIGINAL(&ServerNetworkHandler::disconnectClient, this, network_id, sub_client_id, reason,
kick_message, std::move(filtered_message), skip_message);
}

void ServerNetworkHandler::updateServerAnnouncement()
Expand Down

0 comments on commit 2ae1c53

Please sign in to comment.