Rework per-class permissions handling.
This removes the map of attachments in ArenaImpl and makes the permissions "replacement" happen via the Bukkit API's PermissionAttachmentInfo. Bukkit already keeps track of which attachments we've added to a player, so removing them is just a matter of looping through and finding those. This reduces the coupling between the Arena interface and UpgradeWave (which is the only interface that used the methods removed from the Arena interface).
This commit is contained in:
@@ -48,6 +48,7 @@ import org.bukkit.inventory.InventoryView;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.permissions.PermissionAttachment;
|
import org.bukkit.permissions.PermissionAttachment;
|
||||||
|
import org.bukkit.permissions.PermissionAttachmentInfo;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
@@ -60,7 +61,6 @@ import java.util.HashSet;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.PriorityBlockingQueue;
|
import java.util.concurrent.PriorityBlockingQueue;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@@ -102,7 +102,6 @@ public class ArenaImpl implements Arena
|
|||||||
// Classes stuff
|
// Classes stuff
|
||||||
private ArenaClass defaultClass;
|
private ArenaClass defaultClass;
|
||||||
private Map<String,ArenaClass> classes;
|
private Map<String,ArenaClass> classes;
|
||||||
private Map<Player,PermissionAttachment> attachments;
|
|
||||||
|
|
||||||
// Blocks and pets
|
// Blocks and pets
|
||||||
private PriorityBlockingQueue<Repairable> repairQueue;
|
private PriorityBlockingQueue<Repairable> repairQueue;
|
||||||
@@ -173,7 +172,6 @@ public class ArenaImpl implements Arena
|
|||||||
|
|
||||||
// Classes, items and permissions
|
// Classes, items and permissions
|
||||||
this.classes = plugin.getArenaMaster().getClasses();
|
this.classes = plugin.getArenaMaster().getClasses();
|
||||||
this.attachments = new HashMap<>();
|
|
||||||
this.limitManager = new ClassLimitManager(this, classes, makeSection(section, "class-limits"));
|
this.limitManager = new ClassLimitManager(this, classes, makeSection(section, "class-limits"));
|
||||||
|
|
||||||
String defaultClassName = settings.getString("default-class", null);
|
String defaultClassName = settings.getString("default-class", null);
|
||||||
@@ -521,7 +519,7 @@ public class ArenaImpl implements Arena
|
|||||||
p.teleport(region.getArenaWarp());
|
p.teleport(region.getArenaWarp());
|
||||||
movingPlayers.remove(p);
|
movingPlayers.remove(p);
|
||||||
|
|
||||||
assignClassPermissions(p);
|
addClassPermissions(p);
|
||||||
arenaPlayerMap.get(p).resetStats();
|
arenaPlayerMap.get(p).resetStats();
|
||||||
|
|
||||||
Thing price = arenaPlayerMap.get(p).getArenaClass().getPrice();
|
Thing price = arenaPlayerMap.get(p).getArenaClass().getPrice();
|
||||||
@@ -772,7 +770,7 @@ public class ArenaImpl implements Arena
|
|||||||
clearInv(p);
|
clearInv(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeClassPermissions(p);
|
removePermissionAttachments(p);
|
||||||
removePotionEffects(p);
|
removePotionEffects(p);
|
||||||
|
|
||||||
boolean refund = inLobby(p);
|
boolean refund = inLobby(p);
|
||||||
@@ -872,7 +870,7 @@ public class ArenaImpl implements Arena
|
|||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void revivePlayer(Player p) {
|
public void revivePlayer(Player p) {
|
||||||
removeClassPermissions(p);
|
removePermissionAttachments(p);
|
||||||
removePotionEffects(p);
|
removePotionEffects(p);
|
||||||
|
|
||||||
discardPlayer(p);
|
discardPlayer(p);
|
||||||
@@ -1168,9 +1166,7 @@ public class ArenaImpl implements Arena
|
|||||||
removePotionEffects(p);
|
removePotionEffects(p);
|
||||||
arenaPlayer.setArenaClass(arenaClass);
|
arenaPlayer.setArenaClass(arenaClass);
|
||||||
arenaClass.grantItems(p);
|
arenaClass.grantItems(p);
|
||||||
|
arenaClass.grantLobbyPermissions(plugin, p);
|
||||||
PermissionAttachment pa = arenaClass.grantLobbyPermissions(plugin, p);
|
|
||||||
replacePermissions(p, pa);
|
|
||||||
|
|
||||||
autoReady(p);
|
autoReady(p);
|
||||||
}
|
}
|
||||||
@@ -1185,6 +1181,7 @@ public class ArenaImpl implements Arena
|
|||||||
}
|
}
|
||||||
|
|
||||||
InventoryManager.clearInventory(p);
|
InventoryManager.clearInventory(p);
|
||||||
|
removePermissionAttachments(p);
|
||||||
removePotionEffects(p);
|
removePotionEffects(p);
|
||||||
arenaPlayer.setArenaClass(arenaClass);
|
arenaPlayer.setArenaClass(arenaClass);
|
||||||
|
|
||||||
@@ -1243,24 +1240,11 @@ public class ArenaImpl implements Arena
|
|||||||
inv.setBoots(boots);
|
inv.setBoots(boots);
|
||||||
inv.setItemInOffHand(offhand);
|
inv.setItemInOffHand(offhand);
|
||||||
|
|
||||||
PermissionAttachment pa = arenaClass.grantLobbyPermissions(plugin, p);
|
arenaClass.grantLobbyPermissions(plugin, p);
|
||||||
replacePermissions(p, pa);
|
|
||||||
|
|
||||||
autoReady(p);
|
autoReady(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void replacePermissions(Player p, PermissionAttachment rep) {
|
|
||||||
PermissionAttachment old = attachments.get(p);
|
|
||||||
if (old != null) {
|
|
||||||
old.remove();
|
|
||||||
p.recalculatePermissions();
|
|
||||||
}
|
|
||||||
if (rep != null) {
|
|
||||||
attachments.put(p, rep);
|
|
||||||
p.recalculatePermissions();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void autoReady(Player p) {
|
private void autoReady(Player p) {
|
||||||
if (settings.getBoolean("auto-ready", false)) {
|
if (settings.getBoolean("auto-ready", false)) {
|
||||||
if (autoStartTimer.getRemaining() <= 0) {
|
if (autoStartTimer.getRemaining() <= 0) {
|
||||||
@@ -1296,43 +1280,25 @@ public class ArenaImpl implements Arena
|
|||||||
messenger.tell(p, Msg.LOBBY_CLASS_PICKED, this.classes.get(className).getConfigName());
|
messenger.tell(p, Msg.LOBBY_CLASS_PICKED, this.classes.get(className).getConfigName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void addClassPermissions(Player player) {
|
||||||
public void assignClassPermissions(Player p)
|
ArenaPlayer arenaPlayer = arenaPlayerMap.get(player);
|
||||||
{
|
if (arenaPlayer == null) {
|
||||||
PermissionAttachment pa = arenaPlayerMap.get(p).getArenaClass().grantPermissions(plugin, p);
|
return;
|
||||||
replacePermissions(p, pa);
|
}
|
||||||
|
ArenaClass arenaClass = arenaPlayer.getArenaClass();
|
||||||
|
if (arenaClass == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
removePermissionAttachments(player);
|
||||||
|
arenaClass.grantPermissions(plugin, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void removePermissionAttachments(Player player) {
|
||||||
public void removeClassPermissions(Player p)
|
player.getEffectivePermissions().stream()
|
||||||
{
|
.filter(info -> info.getAttachment() != null)
|
||||||
PermissionAttachment pa = attachments.remove(p);
|
.filter(info -> info.getAttachment().getPlugin().equals(plugin))
|
||||||
if (pa == null) return;
|
.map(PermissionAttachmentInfo::getAttachment)
|
||||||
|
.forEach(PermissionAttachment::remove);
|
||||||
try {
|
|
||||||
p.removeAttachment(pa);
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
for (Entry<String,Boolean> entry : pa.getPermissions().entrySet()) {
|
|
||||||
String perm = entry.getKey() + ":" + entry.getValue();
|
|
||||||
String name = p.getName();
|
|
||||||
|
|
||||||
plugin.getLogger().warning("[PERM01] Failed to remove permission attachment '" + perm + "' from player '" + name
|
|
||||||
+ "'.\nThis should not be a big issue, but please verify that the player doesn't have any permissions they shouldn't have.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.recalculatePermissions();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addPermission(Player p, String perm, boolean value) {
|
|
||||||
PermissionAttachment pa = attachments.get(p);
|
|
||||||
if (pa == null) {
|
|
||||||
pa = p.addAttachment(plugin);
|
|
||||||
attachments.put(p, pa);
|
|
||||||
}
|
|
||||||
pa.setPermission(perm, value);
|
|
||||||
p.recalculatePermissions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removePotionEffects(Player p) {
|
private void removePotionEffects(Player p) {
|
||||||
|
|||||||
@@ -191,13 +191,7 @@ public interface Arena
|
|||||||
void addRandomPlayer(Player p);
|
void addRandomPlayer(Player p);
|
||||||
|
|
||||||
void assignRandomClass(Player p);
|
void assignRandomClass(Player p);
|
||||||
|
|
||||||
void assignClassPermissions(Player p);
|
|
||||||
|
|
||||||
void removeClassPermissions(Player p);
|
|
||||||
|
|
||||||
void addPermission(Player p, String perm, boolean value);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*////////////////////////////////////////////////////////////////////
|
/*////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.garbagemule.MobArena.waves.Wave;
|
|||||||
import com.garbagemule.MobArena.waves.enums.WaveType;
|
import com.garbagemule.MobArena.waves.enums.WaveType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.permissions.PermissionAttachment;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -182,7 +183,8 @@ public class UpgradeWave extends AbstractWave
|
|||||||
public void upgrade(Arena arena, Player p) {
|
public void upgrade(Arena arena, Player p) {
|
||||||
if (perm == null) return;
|
if (perm == null) return;
|
||||||
|
|
||||||
arena.addPermission(p, perm, value);
|
PermissionAttachment attachment = p.addAttachment(arena.getPlugin());
|
||||||
|
attachment.setPermission(perm, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user