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;
|
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;
|
LocalSession session;
|
||||||
if ((session = WorldEdit.getInstance().getSessionManager().getIfPresent(player)) != null) {
|
if ((session = WorldEdit.getInstance().getSessionManager().getIfPresent(player)) != null) {
|
||||||
session.loadDefaults(player, true);
|
session.loadDefaults(player, true);
|
||||||
|
@ -573,6 +573,14 @@ public class WorldEditPlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
return (BukkitPlayer) meta.get(0).value();
|
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
|
//FAWE end
|
||||||
|
|
||||||
public Actor wrapCommandSender(CommandSender sender) {
|
public Actor wrapCommandSender(CommandSender sender) {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren