Check cached bukkit player is the same as the current player online (#1732)

* Check cached bukkit player is the same as the current player online
 - If plugins do silly things like teleport, deop (anything that requires a perm-recheck) (anything that ultimately requires a BukkitPlayer at some point) then the retention of metadata by the server (as it's stored based on a string value indescriminate of player a player relogging) means that a BukkitPlayer caching an old player object will be kept, cached and retrieved by FAWE. Adding a simple memory-based equality check when the player rejoins, and then "invaliding" (redoing) the cache if the players are not equal, fixes this.
 - Fixes #1730

* Address comments

* Add comment explaining reference equality check to code
This commit is contained in:
Jordan 2022-05-10 09:10:59 +01:00 committed by GitHub
parent ec97fca440
commit d7543884a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 1 deletions

View File

@ -86,7 +86,15 @@ public class WorldEditListener implements Listener {
return;
}
Player player = plugin.wrapPlayer(event.getPlayer());
BukkitPlayer player = plugin.wrapPlayer(event.getPlayer());
//If plugins do silly things like teleport, deop (anything that requires a perm-recheck) (anything that ultimately
// requires a BukkitPlayer at some point) then the retention of metadata by the server (as it's stored based on a
// string value indescriminate of player a player relogging) means that a BukkitPlayer caching an old player object
// will be kept, cached and retrieved by FAWE. Adding a simple memory-based equality check when the player rejoins,
// and then "invaliding" (redoing) the cache if the players are not equal, fixes this.
if (player.getPlayer() != event.getPlayer()) {
player = plugin.reCachePlayer(event.getPlayer());
}
LocalSession session;
if ((session = WorldEdit.getInstance().getSessionManager().getIfPresent(player)) != null) {
session.loadDefaults(player, true);

View File

@ -573,6 +573,14 @@ public class WorldEditPlugin extends JavaPlugin {
}
return (BukkitPlayer) meta.get(0).value();
}
BukkitPlayer reCachePlayer(Player player) {
synchronized (player) {
BukkitPlayer wePlayer = new BukkitPlayer(this, player);
player.setMetadata("WE", new FixedMetadataValue(this, wePlayer));
return wePlayer;
}
}
//FAWE end
public Actor wrapCommandSender(CommandSender sender) {