Remove unnecessary reflection

This commit is contained in:
Luck 2016-09-05 16:44:59 +01:00
parent 770b7dc282
commit ba04fb320b
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
3 changed files with 18 additions and 6 deletions

View File

@ -32,6 +32,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.*;
import org.bukkit.permissions.PermissionAttachment;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
class BukkitListener extends AbstractListener implements Listener {
@ -67,13 +68,14 @@ class BukkitListener extends AbstractListener implements Listener {
BukkitUser u = (BukkitUser) user;
PermissionAttachment attachment = player.addAttachment(plugin);
Map<String, Boolean> newPermMap = new ConcurrentHashMap<>();
try {
BukkitUser.getPermissionsField().set(attachment, new ConcurrentHashMap<>());
BukkitUser.getPermissionsField().set(attachment, newPermMap);
} catch (Throwable t) {
t.printStackTrace();
}
u.setAttachment(attachment);
u.setAttachment(new BukkitUser.PermissionAttachmentHolder(attachment, newPermMap));
}
plugin.doAsync(user::refreshPermissions);

View File

@ -22,6 +22,8 @@
package me.lucko.luckperms.users;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import me.lucko.luckperms.LPBukkitPlugin;
@ -52,7 +54,7 @@ public class BukkitUser extends User {
@Getter
@Setter
private PermissionAttachment attachment = null;
private PermissionAttachmentHolder attachment = null;
BukkitUser(UUID uuid, LPBukkitPlugin plugin) {
super(uuid, plugin);
@ -83,7 +85,7 @@ public class BukkitUser extends User {
try {
// The map in the LP PermissionAttachment is a ConcurrentHashMap. We can modify it's contents async.
Map<String, Boolean> existing = (Map<String, Boolean>) getPermissionsField().get(attachment);
Map<String, Boolean> existing = attachment.getPermissions();
boolean different = false;
if (toApply.size() != existing.size()) {
@ -107,7 +109,7 @@ public class BukkitUser extends User {
Shouldn't be too taxing on the server. This only gets called when permissions have actually changed,
which is like once per user per login, assuming their permissions don't get modified. */
plugin.doSync(() -> {
attachment.getPermissible().recalculatePermissions();
attachment.getAttachment().getPermissible().recalculatePermissions();
plugin.getApiProvider().fireEventAsync(new UserPermissionRefreshEvent(new UserLink(this)));
});
@ -115,4 +117,12 @@ public class BukkitUser extends User {
e.printStackTrace();
}
}
@Getter
@EqualsAndHashCode
@AllArgsConstructor
public static class PermissionAttachmentHolder {
private final PermissionAttachment attachment;
private final Map<String, Boolean> permissions;
}
}

View File

@ -52,7 +52,7 @@ public class BukkitUserManager extends UserManager {
Player player = plugin.getServer().getPlayer(plugin.getUuidCache().getExternalUUID(u.getUuid()));
if (player != null) {
player.removeAttachment(u.getAttachment());
player.removeAttachment(u.getAttachment().getAttachment());
}
u.setAttachment(null);
}