geforkt von Mirrors/FastAsyncWorldEdit
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
Dieser Commit ist enthalten in:
Ursprung
ec97fca440
Commit
d7543884a5
@ -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);
|
||||
|
@ -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) {
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren