PaperMC / Waterfall

BungeeCord fork that aims to improve performance and stability.
https://papermc.io
MIT License
741 stars 302 forks source link

player.sendMessage() throws exception after calling player.disconnect() #847

Open Packsolite opened 8 months ago

Packsolite commented 8 months ago

Problem

The following exception was thrown when calling the ProxiedPlayer#sendMessage() method: https://pastebin.com/m7FeSwAM

Reason

It seems like after disconnecting a player using the ProxiedPlayer#disconnect() method, an invalid or broken reference to the player can still be obtained via the api using ProxyServer#getPlayers(). Using the sendMessage() function on such a reference results in an error.

How to reproduce

So as a basic example you want a custom kick command implemented as a plugin: After disconnecting the player, you may want to send a message to other staff members.

The code could look something like this:

player.disconnect(text);
for (ProxiedPlayer staff: server.getPlayers()) {
    staff.sendMessage(player.getName() + " was kicked by " + sender.getName());
}

In this specific example sure i can move the disconnect after the staff broadcast, however in other situations that might not be as easy and the api should be safe in that regard.