diff --git a/src/main/java/com/bekvon/bukkit/residence/Residence.java b/src/main/java/com/bekvon/bukkit/residence/Residence.java index 2d41c69..d762026 100644 --- a/src/main/java/com/bekvon/bukkit/residence/Residence.java +++ b/src/main/java/com/bekvon/bukkit/residence/Residence.java @@ -19,6 +19,7 @@ import pw.yumc.Residence.chat.ChatManager; import pw.yumc.Residence.economy.EconomyInterface; import pw.yumc.Residence.economy.TransactionManager; import pw.yumc.Residence.economy.rent.RentManager; +import pw.yumc.Residence.gui.FlagUtil; import pw.yumc.Residence.itemlist.WorldItemManager; import pw.yumc.Residence.manager.ConfigManager; import pw.yumc.Residence.manager.EntityManager; @@ -29,10 +30,6 @@ import pw.yumc.Residence.text.help.HelpEntry; public class Residence { static ResidenceMain instance; - public Residence(final ResidenceMain instance) { - Residence.instance = instance; - } - public static ChatManager getChatManager() { return instance.getChatManager(); } @@ -57,6 +54,10 @@ public class Residence { return instance.getEntityManager(); } + public static FlagUtil getFlagUtilManager() { + return instance.getFlagUtilManager(); + } + public static HelpEntry getHelppages() { return instance.getHelppages(); } @@ -140,4 +141,8 @@ public class Residence { public static boolean isUseWorldEdit() { return instance.isUseWorldEdit(); } + + public Residence(final ResidenceMain instance) { + Residence.instance = instance; + } } diff --git a/src/main/java/com/bekvon/bukkit/residence/permissions/PermissionManager.java b/src/main/java/com/bekvon/bukkit/residence/permissions/PermissionManager.java index f2d9f11..ba8ed40 100644 --- a/src/main/java/com/bekvon/bukkit/residence/permissions/PermissionManager.java +++ b/src/main/java/com/bekvon/bukkit/residence/permissions/PermissionManager.java @@ -1,156 +1,160 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ - -package com.bekvon.bukkit.residence.permissions; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; - -import org.bukkit.Server; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import com.bekvon.bukkit.residence.protection.FlagPermissions; - -import pw.yumc.Residence.ResidenceMain; -import pw.yumc.Residence.vaultinterface.ResidenceVaultAdapter; - -/** - * - * @author Administrator - */ -public class PermissionManager { - protected static PermissionsInterface perms; - protected FlagPermissions globalFlagPerms; - protected Map groups; - protected Map playersGroup; - ResidenceMain plugin; - - public PermissionManager(final ResidenceMain plugin) { - try { - this.plugin = plugin; - groups = Collections.synchronizedMap(new HashMap()); - playersGroup = Collections.synchronizedMap(new HashMap()); - globalFlagPerms = new FlagPermissions(); - this.readConfig(plugin.getConfig()); - final boolean enable = plugin.getConfig().getBoolean("Global.EnablePermissions", true); - if (enable) { - this.checkPermissions(); - } - } catch (final Exception ex) { - plugin.getLogger().log(Level.SEVERE, "权限管理载入失败,请报告以下错误给作者,谢谢!", ex); - } - } - - public PermissionGroup getGroup(final Player player) { - return groups.get(this.getGroupNameByPlayer(player)); - } - - public PermissionGroup getGroup(final String player, final String world) { - return groups.get(this.getGroupNameByPlayer(player, world)); - } - - public PermissionGroup getGroupByName(String group) { - group = group.toLowerCase(); - if (!groups.containsKey(group)) { - return groups.get(plugin.getConfigManager().getDefaultGroup()); - } - return groups.get(group); - } - - public String getGroupNameByPlayer(final Player player) { - return this.getGroupNameByPlayer(player.getName(), player.getWorld().getName()); - } - - public String getGroupNameByPlayer(String player, final String world) { - player = player.toLowerCase(); - if (playersGroup.containsKey(player)) { - String group = playersGroup.get(player); - if (group != null) { - group = group.toLowerCase(); - if (group != null && groups.containsKey(group)) { - return group; - } - } - } - final String group = this.getPermissionsGroup(player, world); - if (group == null || !groups.containsKey(group)) { - return plugin.getConfigManager().getDefaultGroup().toLowerCase(); - } - return group; - } - - public String getPermissionsGroup(final Player player) { - return this.getPermissionsGroup(player.getName(), player.getWorld().getName()); - } - - public String getPermissionsGroup(final String player, final String world) { - if (perms == null) { - return plugin.getConfigManager().getDefaultGroup(); - } - return perms.getPlayerGroup(player, world); - } - - public PermissionsInterface getPermissionsPlugin() { - return perms; - } - - public boolean hasGroup(String group) { - group = group.toLowerCase(); - return groups.containsKey(group); - } - - public boolean isResidenceAdmin(final Player player) { - return (player.hasPermission("residence.admin") || (player.isOp() && plugin.getConfigManager().getOpsAreAdmins())); - } - - private void checkPermissions() { - final Server server = plugin.getServer(); - final Plugin p = server.getPluginManager().getPlugin("Vault"); - if (p != null) { - final ResidenceVaultAdapter vault = new ResidenceVaultAdapter(server); - if (vault.permissionsOK()) { - perms = vault; - plugin.getLogger().info("发现 Vault 使用权限系统: " + vault.getPermissionsName()); - return; - } - plugin.getLogger().info("发现 Vault, 但是 Vault 未找到权限系统..."); - } - } - - private void readConfig(final FileConfiguration config) { - final String defaultGroup = plugin.getConfigManager().getDefaultGroup(); - globalFlagPerms = FlagPermissions.parseFromConfigNode("FlagPermission", config.getConfigurationSection("Global")); - final ConfigurationSection nodes = config.getConfigurationSection("Groups"); - if (nodes != null) { - final Set entrys = nodes.getKeys(false); - for (final String key : entrys) { - try { - groups.put(key.toLowerCase(), new PermissionGroup(key.toLowerCase(), nodes.getConfigurationSection(key), globalFlagPerms)); - final List mirrors = nodes.getConfigurationSection(key).getStringList("Mirror"); - for (final String group : mirrors) { - groups.put(group.toLowerCase(), new PermissionGroup(key.toLowerCase(), nodes.getConfigurationSection(key), globalFlagPerms)); - } - } catch (final Exception ex) { - plugin.getLogger().info("错误 从配置文件读取:" + key + " 抛出异常:" + ex); - } - } - } - if (!groups.containsKey(defaultGroup)) { - groups.put(defaultGroup, new PermissionGroup(defaultGroup)); - } - final Set keys = config.getConfigurationSection("GroupAssignments").getKeys(false); - if (keys != null) { - for (final String key : keys) { - playersGroup.put(key.toLowerCase(), config.getString("GroupAssignments." + key, defaultGroup).toLowerCase()); - } - } - } -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ + +package com.bekvon.bukkit.residence.permissions; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; + +import org.bukkit.Server; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import com.bekvon.bukkit.residence.protection.FlagPermissions; + +import pw.yumc.Residence.ResidenceMain; +import pw.yumc.Residence.vaultinterface.ResidenceVaultAdapter; + +/** + * + * @author Administrator + */ +public class PermissionManager { + protected static PermissionsInterface perms; + protected FlagPermissions globalFlagPerms; + protected Map groups; + protected Map playersGroup; + ResidenceMain plugin; + + public PermissionManager(final ResidenceMain plugin) { + try { + this.plugin = plugin; + groups = Collections.synchronizedMap(new HashMap()); + playersGroup = Collections.synchronizedMap(new HashMap()); + globalFlagPerms = new FlagPermissions(); + this.readConfig(plugin.getConfig()); + final boolean enable = plugin.getConfig().getBoolean("Global.EnablePermissions", true); + if (enable) { + this.checkPermissions(); + } + } catch (final Exception ex) { + plugin.getLogger().log(Level.SEVERE, "权限管理载入失败,请报告以下错误给作者,谢谢!", ex); + } + } + + public FlagPermissions getAllFlags() { + return globalFlagPerms; + } + + public PermissionGroup getGroup(final Player player) { + return groups.get(this.getGroupNameByPlayer(player)); + } + + public PermissionGroup getGroup(final String player, final String world) { + return groups.get(this.getGroupNameByPlayer(player, world)); + } + + public PermissionGroup getGroupByName(String group) { + group = group.toLowerCase(); + if (!groups.containsKey(group)) { + return groups.get(plugin.getConfigManager().getDefaultGroup()); + } + return groups.get(group); + } + + public String getGroupNameByPlayer(final Player player) { + return this.getGroupNameByPlayer(player.getName(), player.getWorld().getName()); + } + + public String getGroupNameByPlayer(String player, final String world) { + player = player.toLowerCase(); + if (playersGroup.containsKey(player)) { + String group = playersGroup.get(player); + if (group != null) { + group = group.toLowerCase(); + if (group != null && groups.containsKey(group)) { + return group; + } + } + } + final String group = this.getPermissionsGroup(player, world); + if (group == null || !groups.containsKey(group)) { + return plugin.getConfigManager().getDefaultGroup().toLowerCase(); + } + return group; + } + + public String getPermissionsGroup(final Player player) { + return this.getPermissionsGroup(player.getName(), player.getWorld().getName()); + } + + public String getPermissionsGroup(final String player, final String world) { + if (perms == null) { + return plugin.getConfigManager().getDefaultGroup(); + } + return perms.getPlayerGroup(player, world); + } + + public PermissionsInterface getPermissionsPlugin() { + return perms; + } + + public boolean hasGroup(String group) { + group = group.toLowerCase(); + return groups.containsKey(group); + } + + public boolean isResidenceAdmin(final Player player) { + return (player.hasPermission("residence.admin") || (player.isOp() && plugin.getConfigManager().getOpsAreAdmins())); + } + + private void checkPermissions() { + final Server server = plugin.getServer(); + final Plugin p = server.getPluginManager().getPlugin("Vault"); + if (p != null) { + final ResidenceVaultAdapter vault = new ResidenceVaultAdapter(server); + if (vault.permissionsOK()) { + perms = vault; + plugin.getLogger().info("发现 Vault 使用权限系统: " + vault.getPermissionsName()); + return; + } + plugin.getLogger().info("发现 Vault, 但是 Vault 未找到权限系统..."); + } + } + + private void readConfig(final FileConfiguration config) { + final String defaultGroup = plugin.getConfigManager().getDefaultGroup(); + globalFlagPerms = FlagPermissions.parseFromConfigNode("FlagPermission", config.getConfigurationSection("Global")); + final ConfigurationSection nodes = config.getConfigurationSection("Groups"); + if (nodes != null) { + final Set entrys = nodes.getKeys(false); + for (final String key : entrys) { + try { + groups.put(key.toLowerCase(), new PermissionGroup(key.toLowerCase(), nodes.getConfigurationSection(key), globalFlagPerms)); + final List mirrors = nodes.getConfigurationSection(key).getStringList("Mirror"); + for (final String group : mirrors) { + groups.put(group.toLowerCase(), new PermissionGroup(key.toLowerCase(), nodes.getConfigurationSection(key), globalFlagPerms)); + } + } catch (final Exception ex) { + plugin.getLogger().info("错误 从配置文件读取:" + key + " 抛出异常:" + ex); + } + } + } + if (!groups.containsKey(defaultGroup)) { + groups.put(defaultGroup, new PermissionGroup(defaultGroup)); + } + final Set keys = config.getConfigurationSection("GroupAssignments").getKeys(false); + if (keys != null) { + for (final String key : keys) { + playersGroup.put(key.toLowerCase(), config.getString("GroupAssignments." + key, defaultGroup).toLowerCase()); + } + } + } +} diff --git a/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java b/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java index a05ca9a..9b3461d 100644 --- a/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java +++ b/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java @@ -1,656 +1,660 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.bekvon.bukkit.residence.protection; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; - -import pw.yumc.Residence.ResidenceMain; - -/** - * - * @author Administrator - */ -public class FlagPermissions { - - protected static ResidenceMain plugin; - - protected static ArrayList validAreaFlags = new ArrayList(); - protected static HashMap> validFlagGroups = new HashMap>(); - protected static ArrayList validFlags = new ArrayList(); - protected static ArrayList validPlayerFlags = new ArrayList(); - final static Map matUseFlagList = new EnumMap(Material.class); - protected Map cuboidFlags; - protected Map> groupFlags; - protected FlagPermissions parent; - protected Map> playerFlags; - - public static void addFlag(String flag) { - flag = flag.toLowerCase(); - if (!validFlags.contains(flag)) { - validFlags.add(flag); - } - if (validFlagGroups.containsKey(flag)) { - validFlagGroups.remove(flag); - } - } - - public static void addFlagToFlagGroup(final String group, final String flag) { - if (!FlagPermissions.validFlags.contains(group) && !FlagPermissions.validAreaFlags.contains(group) && !FlagPermissions.validPlayerFlags.contains(group)) { - if (!validFlagGroups.containsKey(group)) { - validFlagGroups.put(group, new ArrayList()); - } - final ArrayList flags = validFlagGroups.get(group); - flags.add(flag); - } - } - - public static void addMaterialToUseFlag(final Material mat, final String flag) { - matUseFlagList.put(mat, flag); - } - - public static void addPlayerOrGroupOnlyFlag(String flag) { - flag = flag.toLowerCase(); - if (!validPlayerFlags.contains(flag)) { - validPlayerFlags.add(flag); - } - if (validFlagGroups.containsKey(flag)) { - validFlagGroups.remove(flag); - } - } - - public static void addResidenceOnlyFlag(String flag) { - flag = flag.toLowerCase(); - if (!validAreaFlags.contains(flag)) { - validAreaFlags.add(flag); - } - if (validFlagGroups.containsKey(flag)) { - validFlagGroups.remove(flag); - } - } - - public static boolean flagGroupExists(final String group) { - return validFlagGroups.containsKey(group); - } - - public static EnumMap getMaterialUseFlagList() { - return (EnumMap) matUseFlagList; - } - - public static void init(final ResidenceMain resmain) { - plugin = resmain; - } - - public static void initValidFlags() { - validAreaFlags.clear(); - validPlayerFlags.clear(); - validFlags.clear(); - validFlagGroups.clear(); - addFlag("egg"); - addFlag("note"); - addFlag("pressure"); - addFlag("cake"); - addFlag("lever"); - addFlag("door"); - addFlag("button"); - addFlag("table"); - addFlag("brew"); - addFlag("bed"); - addFlag("commandblock"); - addFlag("anvil"); - addFlag("flowerpot"); - addFlag("enchant"); - addFlag("diode"); - addFlag("use"); - addFlag("move"); - addFlag("build"); - addFlag("tp"); - addFlag("ignite"); - addFlag("container"); - addFlag("subzone"); - addFlag("destroy"); - addFlag("place"); - addFlag("bucket"); - addFlag("bank"); - addFlag("beacon"); - - /* New flags */ - addFlag("trade"); - - addResidenceOnlyFlag("trample"); - addResidenceOnlyFlag("pvp"); - addResidenceOnlyFlag("fireball"); - addResidenceOnlyFlag("explode"); - addResidenceOnlyFlag("damage"); - addResidenceOnlyFlag("monsters"); - addResidenceOnlyFlag("firespread"); - addResidenceOnlyFlag("burn"); - addResidenceOnlyFlag("tnt"); - addResidenceOnlyFlag("creeper"); - addResidenceOnlyFlag("wither"); - addResidenceOnlyFlag("flow"); - addResidenceOnlyFlag("healing"); - addResidenceOnlyFlag("animals"); - addResidenceOnlyFlag("lavaflow"); - addResidenceOnlyFlag("waterflow"); - addResidenceOnlyFlag("physics"); - addResidenceOnlyFlag("piston"); - addResidenceOnlyFlag("spread"); - addResidenceOnlyFlag("hidden"); - addResidenceOnlyFlag("witherdamage"); - - addPlayerOrGroupOnlyFlag("admin"); - - addFlagToFlagGroup("redstone", "note"); - addFlagToFlagGroup("redstone", "pressure"); - addFlagToFlagGroup("redstone", "lever"); - addFlagToFlagGroup("redstone", "button"); - addFlagToFlagGroup("redstone", "diode"); - addFlagToFlagGroup("craft", "brew"); - addFlagToFlagGroup("craft", "table"); - addFlagToFlagGroup("craft", "enchant"); - addFlagToFlagGroup("trusted", "use"); - addFlagToFlagGroup("trusted", "tp"); - addFlagToFlagGroup("trusted", "build"); - addFlagToFlagGroup("trusted", "container"); - addFlagToFlagGroup("trusted", "bucket"); - addFlagToFlagGroup("trusted", "move"); - addFlagToFlagGroup("fire", "ignite"); - addFlagToFlagGroup("fire", "firespread"); - - addMaterialToUseFlag(Material.DIODE, "diode"); - addMaterialToUseFlag(Material.DIODE_BLOCK_OFF, "diode"); - addMaterialToUseFlag(Material.DIODE_BLOCK_ON, "diode"); - addMaterialToUseFlag(Material.WORKBENCH, "table"); - addMaterialToUseFlag(Material.WOODEN_DOOR, "door"); - - if (plugin.isGt1_8()) { - /* 1.8 Doors */ - addMaterialToUseFlag(Material.SPRUCE_DOOR, "door"); - addMaterialToUseFlag(Material.BIRCH_DOOR, "door"); - addMaterialToUseFlag(Material.JUNGLE_DOOR, "door"); - addMaterialToUseFlag(Material.ACACIA_DOOR, "door"); - addMaterialToUseFlag(Material.DARK_OAK_DOOR, "door"); - - /* 1.8 Fence Gates */ - addMaterialToUseFlag(Material.SPRUCE_FENCE_GATE, "door"); - addMaterialToUseFlag(Material.BIRCH_FENCE_GATE, "door"); - addMaterialToUseFlag(Material.JUNGLE_FENCE_GATE, "door"); - addMaterialToUseFlag(Material.ACACIA_FENCE_GATE, "door"); - addMaterialToUseFlag(Material.DARK_OAK_FENCE_GATE, "door"); - } - - addMaterialToUseFlag(Material.FENCE_GATE, "door"); - addMaterialToUseFlag(Material.NETHER_FENCE, "door"); - addMaterialToUseFlag(Material.TRAP_DOOR, "door"); - addMaterialToUseFlag(Material.ENCHANTMENT_TABLE, "enchant"); - addMaterialToUseFlag(Material.STONE_BUTTON, "button"); - addMaterialToUseFlag(Material.LEVER, "lever"); - addMaterialToUseFlag(Material.BED_BLOCK, "bed"); - addMaterialToUseFlag(Material.BREWING_STAND, "brew"); - addMaterialToUseFlag(Material.CAKE, "cake"); - addMaterialToUseFlag(Material.NOTE_BLOCK, "note"); - addMaterialToUseFlag(Material.DRAGON_EGG, "egg"); - addMaterialToUseFlag(Material.COMMAND, "commandblock"); - addMaterialToUseFlag(Material.WOOD_BUTTON, "button"); - addMaterialToUseFlag(Material.ANVIL, "anvil"); - addMaterialToUseFlag(Material.FLOWER_POT, "flowerpot"); - addMaterialToUseFlag(Material.BEACON, "beacon"); - addMaterialToUseFlag(Material.JUKEBOX, "container"); - addMaterialToUseFlag(Material.CHEST, "container"); - addMaterialToUseFlag(Material.TRAPPED_CHEST, "container"); - addMaterialToUseFlag(Material.HOPPER, "container"); - addMaterialToUseFlag(Material.DROPPER, "container"); - addMaterialToUseFlag(Material.FURNACE, "container"); - addMaterialToUseFlag(Material.BURNING_FURNACE, "container"); - addMaterialToUseFlag(Material.DISPENSER, "container"); - addMaterialToUseFlag(Material.CAKE_BLOCK, "cake"); - } - - public static FlagPermissions load(final Map root) throws Exception { - final FlagPermissions newperms = new FlagPermissions(); - return FlagPermissions.load(root, newperms); - } - - public static FlagPermissions parseFromConfigNode(final String name, final ConfigurationSection node) { - final FlagPermissions list = new FlagPermissions(); - final Set keys = node.getConfigurationSection(name).getKeys(false); - if (keys != null) { - for (String key : keys) { - final boolean state = node.getBoolean(name + "." + key, false); - key = key.toLowerCase(); - if (state) { - list.setFlag(key, FlagState.TRUE); - } else { - list.setFlag(key, FlagState.FALSE); - } - } - } - return list; - } - - public static void removeFlagFromFlagGroup(final String group, final String flag) { - if (validFlagGroups.containsKey(group)) { - final ArrayList flags = validFlagGroups.get(group); - flags.remove(flag); - if (flags.isEmpty()) { - validFlagGroups.remove(group); - } - } - } - - public static void removeMaterialFromUseFlag(final Material mat) { - matUseFlagList.remove(mat); - } - - public static FlagState stringToFlagState(final String flagstate) { - if (flagstate.equalsIgnoreCase("true") || flagstate.equalsIgnoreCase("t")) { - return FlagState.TRUE; - } else if (flagstate.equalsIgnoreCase("false") || flagstate.equalsIgnoreCase("f")) { - return FlagState.FALSE; - } else if (flagstate.equalsIgnoreCase("remove") || flagstate.equalsIgnoreCase("r")) { - return FlagState.NEITHER; - } else { - return FlagState.INVALID; - } - } - - @SuppressWarnings("unchecked") - protected static FlagPermissions load(final Map root, final FlagPermissions newperms) throws Exception { - if (root.containsKey("LastKnownPlayerNames")) { - final Map uuids = (Map) root.get("LastKnownPlayerNames"); - final Iterator>> mpi = ((Map>) root.get("PlayerFlags")).entrySet().iterator(); - final Map> newperm = new LinkedHashMap<>(); - while (mpi.hasNext()) { - final Entry> pmap = mpi.next(); - newperm.put(uuids.get(pmap.getKey()), pmap.getValue()); - mpi.remove(); - } - newperms.playerFlags = newperm; - } else { - newperms.playerFlags = (Map>) root.get("PlayerFlags"); - } - newperms.groupFlags = (Map>) root.get("GroupFlags"); - newperms.cuboidFlags = (Map) root.get("AreaFlags"); - if (newperms.playerFlags == null) { - throw new IllegalArgumentException("错误的PlayerFlags数据..."); - } - if (newperms.groupFlags == null) { - throw new IllegalArgumentException("错误的GroupFlags数据..."); - } - if (newperms.cuboidFlags == null) { - throw new IllegalArgumentException("错误的CuboidFlags数据..."); - } - return newperms; - } - - public FlagPermissions() { - cuboidFlags = Collections.synchronizedMap(new HashMap()); - playerFlags = Collections.synchronizedMap(new HashMap>()); - groupFlags = Collections.synchronizedMap(new HashMap>()); - } - - public boolean checkValidFlag(final String flag, final boolean globalflag) { - if (validFlags.contains(flag)) { - return true; - } - if (globalflag) { - if (validAreaFlags.contains(flag)) { - return true; - } - } else if (validPlayerFlags.contains(flag)) { - return true; - } - return false; - } - - public void clearFlags() { - groupFlags.clear(); - playerFlags.clear(); - cuboidFlags.clear(); - } - - public void clearPlayersFlags(final String user) { - if (playerFlags.containsKey(user)) { - playerFlags.remove(user); - } - } - - public void copyUserPermissions(String fromUser, String toUser) { - fromUser = fromUser.toLowerCase(); - toUser = toUser.toLowerCase(); - final Map get = playerFlags.get(fromUser); - if (get != null) { - Map targ = playerFlags.get(toUser); - if (targ == null) { - targ = new HashMap(); - playerFlags.put(toUser, targ); - } - for (final Entry entry : get.entrySet()) { - targ.put(entry.getKey(), entry.getValue()); - } - } - } - - public FlagPermissions getParent() { - return parent; - } - - public boolean groupHas(final String group, final String flag, final boolean def) { - return this.groupCheck(group, flag, this.has(flag, def)); - } - - public boolean has(final String flag, final boolean def) { - if (cuboidFlags.containsKey(flag)) { - return cuboidFlags.get(flag); - } - if (parent != null) { - return parent.has(flag, def); - } - return def; - } - - public boolean inheritanceIsGroupSet(String group, final String flag) { - group = group.toLowerCase(); - final Map flags = groupFlags.get(group); - if (flags == null) { - return parent == null ? false : parent.inheritanceIsGroupSet(group, flag); - } - return flags.containsKey(flag) ? true : parent == null ? false : parent.inheritanceIsGroupSet(group, flag); - } - - public boolean inheritanceIsPlayerSet(String player, final String flag) { - player = player.toLowerCase(); - final Map flags = playerFlags.get(player); - if (flags == null) { - return parent == null ? false : parent.inheritanceIsPlayerSet(player, flag); - } - return flags.containsKey(flag) ? true : parent == null ? false : parent.inheritanceIsPlayerSet(player, flag); - } - - public boolean inheritanceIsSet(final String flag) { - return cuboidFlags.containsKey(flag) ? true : parent == null ? false : parent.inheritanceIsSet(flag); - } - - public boolean isGroupSet(String group, final String flag) { - group = group.toLowerCase(); - final Map flags = groupFlags.get(group); - if (flags == null) { - return false; - } - return flags.containsKey(flag); - } - - public boolean isPlayerSet(String player, final String flag) { - player = player.toLowerCase(); - final Map flags = playerFlags.get(player); - if (flags == null) { - return false; - } - return flags.containsKey(flag); - } - - public boolean isSet(final String flag) { - return cuboidFlags.containsKey(flag); - } - - public String listFlags() { - final StringBuilder sbuild = new StringBuilder(); - final Set> set = cuboidFlags.entrySet(); - synchronized (cuboidFlags) { - final Iterator> it = set.iterator(); - while (it.hasNext()) { - final Entry next = it.next(); - if (next.getValue()) { - sbuild.append("+").append(next.getKey()); - if (it.hasNext()) { - sbuild.append(" "); - } - } else { - sbuild.append("-").append(next.getKey()); - if (it.hasNext()) { - sbuild.append(" "); - } - } - } - } - if (sbuild.length() == 0) { - sbuild.append("none"); - } - return sbuild.toString(); - } - - public String listGroupFlags() { - final StringBuilder sbuild = new StringBuilder(); - final Set set = groupFlags.keySet(); - synchronized (groupFlags) { - final Iterator it = set.iterator(); - while (it.hasNext()) { - final String next = it.next(); - final String perms = listGroupFlags(next); - if (!perms.equals("none")) { - sbuild.append(next).append("[" + ChatColor.DARK_AQUA).append(perms).append(ChatColor.RED + "] "); - } - } - } - return sbuild.toString(); - } - - public String listGroupFlags(String group) { - group = group.toLowerCase(); - if (groupFlags.containsKey(group)) { - final StringBuilder sbuild = new StringBuilder(); - final Map get = groupFlags.get(group); - final Set> set = get.entrySet(); - synchronized (get) { - final Iterator> it = set.iterator(); - while (it.hasNext()) { - final Entry next = it.next(); - if (next.getValue()) { - sbuild.append("+").append(next.getKey()); - if (it.hasNext()) { - sbuild.append(" "); - } - } else { - sbuild.append("-").append(next.getKey()); - if (it.hasNext()) { - sbuild.append(" "); - } - } - } - } - if (sbuild.length() == 0) { - groupFlags.remove(group); - sbuild.append("none"); - } - return sbuild.toString(); - } - return "none"; - } - - public String listOtherPlayersFlags(String player) { - player = player.toLowerCase(); - final StringBuilder sbuild = new StringBuilder(); - final Set set = playerFlags.keySet(); - synchronized (playerFlags) { - final Iterator it = set.iterator(); - while (it.hasNext()) { - final String next = it.next(); - if (!next.equals(player)) { - final String perms = listPlayerFlags(next); - if (!perms.equals("none")) { - sbuild.append(next).append("[" + ChatColor.DARK_AQUA).append(perms).append(ChatColor.RED + "] "); - } - } - } - } - return sbuild.toString(); - } - - public String listPlayerFlags(String player) { - player = player.toLowerCase(); - if (playerFlags.containsKey(player)) { - final StringBuilder sbuild = new StringBuilder(); - final Map get = playerFlags.get(player); - final Set> set = get.entrySet(); - synchronized (get) { - final Iterator> it = set.iterator(); - while (it.hasNext()) { - final Entry next = it.next(); - if (next.getValue()) { - sbuild.append("+").append(next.getKey()); - if (it.hasNext()) { - sbuild.append(" "); - } - } else { - sbuild.append("-").append(next.getKey()); - if (it.hasNext()) { - sbuild.append(" "); - } - } - } - } - if (sbuild.length() == 0) { - playerFlags.remove(player); - sbuild.append("none"); - } - return sbuild.toString(); - } - return "none"; - } - - public boolean playerHas(final String player, final String world, final String flag, final boolean def) { - final String group = plugin.getPermissionManager().getGroupNameByPlayer(player, world); - return this.playerCheck(player, flag, this.groupCheck(group, flag, this.has(flag, def))); - } - - public void printFlags(final Player player) { - player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Flags") + ":" + ChatColor.BLUE + " " + listFlags()); - player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Your.Flags") + ":" + ChatColor.GREEN + " " + listPlayerFlags(player.getName())); - player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Group.Flags") + ":" + ChatColor.RED + " " + listGroupFlags()); - player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Others.Flags") + ":" + ChatColor.RED + " " + listOtherPlayersFlags(player.getName())); - } - - public void removeAllGroupFlags(final String group) { - groupFlags.remove(group); - } - - public void removeAllPlayerFlags(final String player) { - playerFlags.remove(player); - } - - public Map save() { - final Map root = new LinkedHashMap(); - root.put("PlayerFlags", playerFlags); - root.put("GroupFlags", groupFlags); - root.put("AreaFlags", cuboidFlags); - return root; - } - - public boolean setFlag(final String flag, final FlagState state) { - if (state == FlagState.FALSE) { - cuboidFlags.put(flag, false); - } else if (state == FlagState.TRUE) { - cuboidFlags.put(flag, true); - } else if (state == FlagState.NEITHER) { - if (cuboidFlags.containsKey(flag)) { - cuboidFlags.remove(flag); - } - } - return true; - } - - public boolean setGroupFlag(String group, final String flag, final FlagState state) { - group = group.toLowerCase(); - if (!groupFlags.containsKey(group)) { - groupFlags.put(group, Collections.synchronizedMap(new HashMap())); - } - final Map map = groupFlags.get(group); - if (state == FlagState.FALSE) { - map.put(flag, false); - } else if (state == FlagState.TRUE) { - map.put(flag, true); - } else if (state == FlagState.NEITHER) { - if (map.containsKey(flag)) { - map.remove(flag); - } - } - if (map.isEmpty()) { - groupFlags.remove(group); - } - return true; - } - - public void setParent(final FlagPermissions p) { - parent = p; - } - - public boolean setPlayerFlag(String player, final String flag, final FlagState state) { - player = player.toLowerCase(); - if (!playerFlags.containsKey(player)) { - playerFlags.put(player, Collections.synchronizedMap(new HashMap())); - } - final Map map = playerFlags.get(player); - if (state == FlagState.FALSE) { - map.put(flag, false); - } else if (state == FlagState.TRUE) { - map.put(flag, true); - } else if (state == FlagState.NEITHER) { - if (map.containsKey(flag)) { - map.remove(flag); - } - } - if (map.isEmpty()) { - playerFlags.remove(player); - } - return true; - } - - private boolean groupCheck(final String group, final String flag, final boolean def) { - if (groupFlags.containsKey(group)) { - final Map gmap = groupFlags.get(group); - if (gmap.containsKey(flag)) { - return gmap.get(flag); - } - } - if (parent != null) { - return parent.groupCheck(group, flag, def); - } - return def; - } - - private boolean playerCheck(String player, final String flag, final boolean def) { - player = player.toLowerCase(); - if (playerFlags.containsKey(player)) { - final Map pmap = playerFlags.get(player); - if (pmap.containsKey(flag)) { - return pmap.get(flag); - } - } - if (parent != null) { - return parent.playerCheck(player, flag, def); - } - return def; - } - - public static enum FlagState { - FALSE, - INVALID, - NEITHER, - TRUE - } -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.bekvon.bukkit.residence.protection; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; + +import pw.yumc.Residence.ResidenceMain; + +/** + * + * @author Administrator + */ +public class FlagPermissions { + + protected static ResidenceMain plugin; + + protected static ArrayList validAreaFlags = new ArrayList(); + protected static HashMap> validFlagGroups = new HashMap>(); + protected static ArrayList validFlags = new ArrayList(); + protected static ArrayList validPlayerFlags = new ArrayList(); + final static Map matUseFlagList = new EnumMap(Material.class); + protected Map cuboidFlags; + protected Map> groupFlags; + protected FlagPermissions parent; + protected Map> playerFlags; + + public static void addFlag(String flag) { + flag = flag.toLowerCase(); + if (!validFlags.contains(flag)) { + validFlags.add(flag); + } + if (validFlagGroups.containsKey(flag)) { + validFlagGroups.remove(flag); + } + } + + public static void addFlagToFlagGroup(final String group, final String flag) { + if (!FlagPermissions.validFlags.contains(group) && !FlagPermissions.validAreaFlags.contains(group) && !FlagPermissions.validPlayerFlags.contains(group)) { + if (!validFlagGroups.containsKey(group)) { + validFlagGroups.put(group, new ArrayList()); + } + final ArrayList flags = validFlagGroups.get(group); + flags.add(flag); + } + } + + public static void addMaterialToUseFlag(final Material mat, final String flag) { + matUseFlagList.put(mat, flag); + } + + public static void addPlayerOrGroupOnlyFlag(String flag) { + flag = flag.toLowerCase(); + if (!validPlayerFlags.contains(flag)) { + validPlayerFlags.add(flag); + } + if (validFlagGroups.containsKey(flag)) { + validFlagGroups.remove(flag); + } + } + + public static void addResidenceOnlyFlag(String flag) { + flag = flag.toLowerCase(); + if (!validAreaFlags.contains(flag)) { + validAreaFlags.add(flag); + } + if (validFlagGroups.containsKey(flag)) { + validFlagGroups.remove(flag); + } + } + + public static boolean flagGroupExists(final String group) { + return validFlagGroups.containsKey(group); + } + + public static EnumMap getMaterialUseFlagList() { + return (EnumMap) matUseFlagList; + } + + public static void init(final ResidenceMain resmain) { + plugin = resmain; + } + + public static void initValidFlags() { + validAreaFlags.clear(); + validPlayerFlags.clear(); + validFlags.clear(); + validFlagGroups.clear(); + addFlag("egg"); + addFlag("note"); + addFlag("pressure"); + addFlag("cake"); + addFlag("lever"); + addFlag("door"); + addFlag("button"); + addFlag("table"); + addFlag("brew"); + addFlag("bed"); + addFlag("commandblock"); + addFlag("anvil"); + addFlag("flowerpot"); + addFlag("enchant"); + addFlag("diode"); + addFlag("use"); + addFlag("move"); + addFlag("build"); + addFlag("tp"); + addFlag("ignite"); + addFlag("container"); + addFlag("subzone"); + addFlag("destroy"); + addFlag("place"); + addFlag("bucket"); + addFlag("bank"); + addFlag("beacon"); + + /* New flags */ + addFlag("trade"); + + addResidenceOnlyFlag("trample"); + addResidenceOnlyFlag("pvp"); + addResidenceOnlyFlag("fireball"); + addResidenceOnlyFlag("explode"); + addResidenceOnlyFlag("damage"); + addResidenceOnlyFlag("monsters"); + addResidenceOnlyFlag("firespread"); + addResidenceOnlyFlag("burn"); + addResidenceOnlyFlag("tnt"); + addResidenceOnlyFlag("creeper"); + addResidenceOnlyFlag("wither"); + addResidenceOnlyFlag("flow"); + addResidenceOnlyFlag("healing"); + addResidenceOnlyFlag("animals"); + addResidenceOnlyFlag("lavaflow"); + addResidenceOnlyFlag("waterflow"); + addResidenceOnlyFlag("physics"); + addResidenceOnlyFlag("piston"); + addResidenceOnlyFlag("spread"); + addResidenceOnlyFlag("hidden"); + addResidenceOnlyFlag("witherdamage"); + + addPlayerOrGroupOnlyFlag("admin"); + + addFlagToFlagGroup("redstone", "note"); + addFlagToFlagGroup("redstone", "pressure"); + addFlagToFlagGroup("redstone", "lever"); + addFlagToFlagGroup("redstone", "button"); + addFlagToFlagGroup("redstone", "diode"); + addFlagToFlagGroup("craft", "brew"); + addFlagToFlagGroup("craft", "table"); + addFlagToFlagGroup("craft", "enchant"); + addFlagToFlagGroup("trusted", "use"); + addFlagToFlagGroup("trusted", "tp"); + addFlagToFlagGroup("trusted", "build"); + addFlagToFlagGroup("trusted", "container"); + addFlagToFlagGroup("trusted", "bucket"); + addFlagToFlagGroup("trusted", "move"); + addFlagToFlagGroup("fire", "ignite"); + addFlagToFlagGroup("fire", "firespread"); + + addMaterialToUseFlag(Material.DIODE, "diode"); + addMaterialToUseFlag(Material.DIODE_BLOCK_OFF, "diode"); + addMaterialToUseFlag(Material.DIODE_BLOCK_ON, "diode"); + addMaterialToUseFlag(Material.WORKBENCH, "table"); + addMaterialToUseFlag(Material.WOODEN_DOOR, "door"); + + if (plugin.isGt1_8()) { + /* 1.8 Doors */ + addMaterialToUseFlag(Material.SPRUCE_DOOR, "door"); + addMaterialToUseFlag(Material.BIRCH_DOOR, "door"); + addMaterialToUseFlag(Material.JUNGLE_DOOR, "door"); + addMaterialToUseFlag(Material.ACACIA_DOOR, "door"); + addMaterialToUseFlag(Material.DARK_OAK_DOOR, "door"); + + /* 1.8 Fence Gates */ + addMaterialToUseFlag(Material.SPRUCE_FENCE_GATE, "door"); + addMaterialToUseFlag(Material.BIRCH_FENCE_GATE, "door"); + addMaterialToUseFlag(Material.JUNGLE_FENCE_GATE, "door"); + addMaterialToUseFlag(Material.ACACIA_FENCE_GATE, "door"); + addMaterialToUseFlag(Material.DARK_OAK_FENCE_GATE, "door"); + } + + addMaterialToUseFlag(Material.FENCE_GATE, "door"); + addMaterialToUseFlag(Material.NETHER_FENCE, "door"); + addMaterialToUseFlag(Material.TRAP_DOOR, "door"); + addMaterialToUseFlag(Material.ENCHANTMENT_TABLE, "enchant"); + addMaterialToUseFlag(Material.STONE_BUTTON, "button"); + addMaterialToUseFlag(Material.LEVER, "lever"); + addMaterialToUseFlag(Material.BED_BLOCK, "bed"); + addMaterialToUseFlag(Material.BREWING_STAND, "brew"); + addMaterialToUseFlag(Material.CAKE, "cake"); + addMaterialToUseFlag(Material.NOTE_BLOCK, "note"); + addMaterialToUseFlag(Material.DRAGON_EGG, "egg"); + addMaterialToUseFlag(Material.COMMAND, "commandblock"); + addMaterialToUseFlag(Material.WOOD_BUTTON, "button"); + addMaterialToUseFlag(Material.ANVIL, "anvil"); + addMaterialToUseFlag(Material.FLOWER_POT, "flowerpot"); + addMaterialToUseFlag(Material.BEACON, "beacon"); + addMaterialToUseFlag(Material.JUKEBOX, "container"); + addMaterialToUseFlag(Material.CHEST, "container"); + addMaterialToUseFlag(Material.TRAPPED_CHEST, "container"); + addMaterialToUseFlag(Material.HOPPER, "container"); + addMaterialToUseFlag(Material.DROPPER, "container"); + addMaterialToUseFlag(Material.FURNACE, "container"); + addMaterialToUseFlag(Material.BURNING_FURNACE, "container"); + addMaterialToUseFlag(Material.DISPENSER, "container"); + addMaterialToUseFlag(Material.CAKE_BLOCK, "cake"); + } + + public static FlagPermissions load(final Map root) throws Exception { + final FlagPermissions newperms = new FlagPermissions(); + return FlagPermissions.load(root, newperms); + } + + public static FlagPermissions parseFromConfigNode(final String name, final ConfigurationSection node) { + final FlagPermissions list = new FlagPermissions(); + final Set keys = node.getConfigurationSection(name).getKeys(false); + if (keys != null) { + for (String key : keys) { + final boolean state = node.getBoolean(name + "." + key, false); + key = key.toLowerCase(); + if (state) { + list.setFlag(key, FlagState.TRUE); + } else { + list.setFlag(key, FlagState.FALSE); + } + } + } + return list; + } + + public static void removeFlagFromFlagGroup(final String group, final String flag) { + if (validFlagGroups.containsKey(group)) { + final ArrayList flags = validFlagGroups.get(group); + flags.remove(flag); + if (flags.isEmpty()) { + validFlagGroups.remove(group); + } + } + } + + public static void removeMaterialFromUseFlag(final Material mat) { + matUseFlagList.remove(mat); + } + + public static FlagState stringToFlagState(final String flagstate) { + if (flagstate.equalsIgnoreCase("true") || flagstate.equalsIgnoreCase("t")) { + return FlagState.TRUE; + } else if (flagstate.equalsIgnoreCase("false") || flagstate.equalsIgnoreCase("f")) { + return FlagState.FALSE; + } else if (flagstate.equalsIgnoreCase("remove") || flagstate.equalsIgnoreCase("r")) { + return FlagState.NEITHER; + } else { + return FlagState.INVALID; + } + } + + @SuppressWarnings("unchecked") + protected static FlagPermissions load(final Map root, final FlagPermissions newperms) throws Exception { + if (root.containsKey("LastKnownPlayerNames")) { + final Map uuids = (Map) root.get("LastKnownPlayerNames"); + final Iterator>> mpi = ((Map>) root.get("PlayerFlags")).entrySet().iterator(); + final Map> newperm = new LinkedHashMap<>(); + while (mpi.hasNext()) { + final Entry> pmap = mpi.next(); + newperm.put(uuids.get(pmap.getKey()), pmap.getValue()); + mpi.remove(); + } + newperms.playerFlags = newperm; + } else { + newperms.playerFlags = (Map>) root.get("PlayerFlags"); + } + newperms.groupFlags = (Map>) root.get("GroupFlags"); + newperms.cuboidFlags = (Map) root.get("AreaFlags"); + if (newperms.playerFlags == null) { + throw new IllegalArgumentException("错误的PlayerFlags数据..."); + } + if (newperms.groupFlags == null) { + throw new IllegalArgumentException("错误的GroupFlags数据..."); + } + if (newperms.cuboidFlags == null) { + throw new IllegalArgumentException("错误的CuboidFlags数据..."); + } + return newperms; + } + + public FlagPermissions() { + cuboidFlags = Collections.synchronizedMap(new HashMap()); + playerFlags = Collections.synchronizedMap(new HashMap>()); + groupFlags = Collections.synchronizedMap(new HashMap>()); + } + + public boolean checkValidFlag(final String flag, final boolean globalflag) { + if (validFlags.contains(flag)) { + return true; + } + if (globalflag) { + if (validAreaFlags.contains(flag)) { + return true; + } + } else if (validPlayerFlags.contains(flag)) { + return true; + } + return false; + } + + public void clearFlags() { + groupFlags.clear(); + playerFlags.clear(); + cuboidFlags.clear(); + } + + public void clearPlayersFlags(final String user) { + if (playerFlags.containsKey(user)) { + playerFlags.remove(user); + } + } + + public void copyUserPermissions(String fromUser, String toUser) { + fromUser = fromUser.toLowerCase(); + toUser = toUser.toLowerCase(); + final Map get = playerFlags.get(fromUser); + if (get != null) { + Map targ = playerFlags.get(toUser); + if (targ == null) { + targ = new HashMap(); + playerFlags.put(toUser, targ); + } + for (final Entry entry : get.entrySet()) { + targ.put(entry.getKey(), entry.getValue()); + } + } + } + + public Map getFlags() { + return cuboidFlags; + } + + public FlagPermissions getParent() { + return parent; + } + + public boolean groupHas(final String group, final String flag, final boolean def) { + return this.groupCheck(group, flag, this.has(flag, def)); + } + + public boolean has(final String flag, final boolean def) { + if (cuboidFlags.containsKey(flag)) { + return cuboidFlags.get(flag); + } + if (parent != null) { + return parent.has(flag, def); + } + return def; + } + + public boolean inheritanceIsGroupSet(String group, final String flag) { + group = group.toLowerCase(); + final Map flags = groupFlags.get(group); + if (flags == null) { + return parent == null ? false : parent.inheritanceIsGroupSet(group, flag); + } + return flags.containsKey(flag) ? true : parent == null ? false : parent.inheritanceIsGroupSet(group, flag); + } + + public boolean inheritanceIsPlayerSet(String player, final String flag) { + player = player.toLowerCase(); + final Map flags = playerFlags.get(player); + if (flags == null) { + return parent == null ? false : parent.inheritanceIsPlayerSet(player, flag); + } + return flags.containsKey(flag) ? true : parent == null ? false : parent.inheritanceIsPlayerSet(player, flag); + } + + public boolean inheritanceIsSet(final String flag) { + return cuboidFlags.containsKey(flag) ? true : parent == null ? false : parent.inheritanceIsSet(flag); + } + + public boolean isGroupSet(String group, final String flag) { + group = group.toLowerCase(); + final Map flags = groupFlags.get(group); + if (flags == null) { + return false; + } + return flags.containsKey(flag); + } + + public boolean isPlayerSet(String player, final String flag) { + player = player.toLowerCase(); + final Map flags = playerFlags.get(player); + if (flags == null) { + return false; + } + return flags.containsKey(flag); + } + + public boolean isSet(final String flag) { + return cuboidFlags.containsKey(flag); + } + + public String listFlags() { + final StringBuilder sbuild = new StringBuilder(); + final Set> set = cuboidFlags.entrySet(); + synchronized (cuboidFlags) { + final Iterator> it = set.iterator(); + while (it.hasNext()) { + final Entry next = it.next(); + if (next.getValue()) { + sbuild.append("+").append(next.getKey()); + if (it.hasNext()) { + sbuild.append(" "); + } + } else { + sbuild.append("-").append(next.getKey()); + if (it.hasNext()) { + sbuild.append(" "); + } + } + } + } + if (sbuild.length() == 0) { + sbuild.append("none"); + } + return sbuild.toString(); + } + + public String listGroupFlags() { + final StringBuilder sbuild = new StringBuilder(); + final Set set = groupFlags.keySet(); + synchronized (groupFlags) { + final Iterator it = set.iterator(); + while (it.hasNext()) { + final String next = it.next(); + final String perms = listGroupFlags(next); + if (!perms.equals("none")) { + sbuild.append(next).append("[" + ChatColor.DARK_AQUA).append(perms).append(ChatColor.RED + "] "); + } + } + } + return sbuild.toString(); + } + + public String listGroupFlags(String group) { + group = group.toLowerCase(); + if (groupFlags.containsKey(group)) { + final StringBuilder sbuild = new StringBuilder(); + final Map get = groupFlags.get(group); + final Set> set = get.entrySet(); + synchronized (get) { + final Iterator> it = set.iterator(); + while (it.hasNext()) { + final Entry next = it.next(); + if (next.getValue()) { + sbuild.append("+").append(next.getKey()); + if (it.hasNext()) { + sbuild.append(" "); + } + } else { + sbuild.append("-").append(next.getKey()); + if (it.hasNext()) { + sbuild.append(" "); + } + } + } + } + if (sbuild.length() == 0) { + groupFlags.remove(group); + sbuild.append("none"); + } + return sbuild.toString(); + } + return "none"; + } + + public String listOtherPlayersFlags(String player) { + player = player.toLowerCase(); + final StringBuilder sbuild = new StringBuilder(); + final Set set = playerFlags.keySet(); + synchronized (playerFlags) { + final Iterator it = set.iterator(); + while (it.hasNext()) { + final String next = it.next(); + if (!next.equals(player)) { + final String perms = listPlayerFlags(next); + if (!perms.equals("none")) { + sbuild.append(next).append("[" + ChatColor.DARK_AQUA).append(perms).append(ChatColor.RED + "] "); + } + } + } + } + return sbuild.toString(); + } + + public String listPlayerFlags(String player) { + player = player.toLowerCase(); + if (playerFlags.containsKey(player)) { + final StringBuilder sbuild = new StringBuilder(); + final Map get = playerFlags.get(player); + final Set> set = get.entrySet(); + synchronized (get) { + final Iterator> it = set.iterator(); + while (it.hasNext()) { + final Entry next = it.next(); + if (next.getValue()) { + sbuild.append("+").append(next.getKey()); + if (it.hasNext()) { + sbuild.append(" "); + } + } else { + sbuild.append("-").append(next.getKey()); + if (it.hasNext()) { + sbuild.append(" "); + } + } + } + } + if (sbuild.length() == 0) { + playerFlags.remove(player); + sbuild.append("none"); + } + return sbuild.toString(); + } + return "none"; + } + + public boolean playerHas(final String player, final String world, final String flag, final boolean def) { + final String group = plugin.getPermissionManager().getGroupNameByPlayer(player, world); + return this.playerCheck(player, flag, this.groupCheck(group, flag, this.has(flag, def))); + } + + public void printFlags(final Player player) { + player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Flags") + ":" + ChatColor.BLUE + " " + listFlags()); + player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Your.Flags") + ":" + ChatColor.GREEN + " " + listPlayerFlags(player.getName())); + player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Group.Flags") + ":" + ChatColor.RED + " " + listGroupFlags()); + player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("Others.Flags") + ":" + ChatColor.RED + " " + listOtherPlayersFlags(player.getName())); + } + + public void removeAllGroupFlags(final String group) { + groupFlags.remove(group); + } + + public void removeAllPlayerFlags(final String player) { + playerFlags.remove(player); + } + + public Map save() { + final Map root = new LinkedHashMap(); + root.put("PlayerFlags", playerFlags); + root.put("GroupFlags", groupFlags); + root.put("AreaFlags", cuboidFlags); + return root; + } + + public boolean setFlag(final String flag, final FlagState state) { + if (state == FlagState.FALSE) { + cuboidFlags.put(flag, false); + } else if (state == FlagState.TRUE) { + cuboidFlags.put(flag, true); + } else if (state == FlagState.NEITHER) { + if (cuboidFlags.containsKey(flag)) { + cuboidFlags.remove(flag); + } + } + return true; + } + + public boolean setGroupFlag(String group, final String flag, final FlagState state) { + group = group.toLowerCase(); + if (!groupFlags.containsKey(group)) { + groupFlags.put(group, Collections.synchronizedMap(new HashMap())); + } + final Map map = groupFlags.get(group); + if (state == FlagState.FALSE) { + map.put(flag, false); + } else if (state == FlagState.TRUE) { + map.put(flag, true); + } else if (state == FlagState.NEITHER) { + if (map.containsKey(flag)) { + map.remove(flag); + } + } + if (map.isEmpty()) { + groupFlags.remove(group); + } + return true; + } + + public void setParent(final FlagPermissions p) { + parent = p; + } + + public boolean setPlayerFlag(String player, final String flag, final FlagState state) { + player = player.toLowerCase(); + if (!playerFlags.containsKey(player)) { + playerFlags.put(player, Collections.synchronizedMap(new HashMap())); + } + final Map map = playerFlags.get(player); + if (state == FlagState.FALSE) { + map.put(flag, false); + } else if (state == FlagState.TRUE) { + map.put(flag, true); + } else if (state == FlagState.NEITHER) { + if (map.containsKey(flag)) { + map.remove(flag); + } + } + if (map.isEmpty()) { + playerFlags.remove(player); + } + return true; + } + + private boolean groupCheck(final String group, final String flag, final boolean def) { + if (groupFlags.containsKey(group)) { + final Map gmap = groupFlags.get(group); + if (gmap.containsKey(flag)) { + return gmap.get(flag); + } + } + if (parent != null) { + return parent.groupCheck(group, flag, def); + } + return def; + } + + private boolean playerCheck(String player, final String flag, final boolean def) { + player = player.toLowerCase(); + if (playerFlags.containsKey(player)) { + final Map pmap = playerFlags.get(player); + if (pmap.containsKey(flag)) { + return pmap.get(flag); + } + } + if (parent != null) { + return parent.playerCheck(player, flag, def); + } + return def; + } + + public static enum FlagState { + FALSE, + INVALID, + NEITHER, + TRUE + } +} diff --git a/src/main/java/com/bekvon/bukkit/residence/protection/ResidencePermissions.java b/src/main/java/com/bekvon/bukkit/residence/protection/ResidencePermissions.java index dc1e510..a966485 100644 --- a/src/main/java/com/bekvon/bukkit/residence/protection/ResidencePermissions.java +++ b/src/main/java/com/bekvon/bukkit/residence/protection/ResidencePermissions.java @@ -1,489 +1,524 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ - -package com.bekvon.bukkit.residence.protection; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.plugin.PluginManager; - -import com.bekvon.bukkit.residence.event.ResidenceFlagChangeEvent; -import com.bekvon.bukkit.residence.event.ResidenceFlagCheckEvent; -import com.bekvon.bukkit.residence.event.ResidenceFlagEvent.FlagType; -import com.bekvon.bukkit.residence.permissions.PermissionGroup; -import com.bekvon.bukkit.residence.permissions.PermissionManager; -import com.bekvon.bukkit.residence.event.ResidenceOwnerChangeEvent; - -import pw.yumc.Residence.ResidenceMain; - -/** - * - * @author Administrator - */ -public class ResidencePermissions extends FlagPermissions { - - protected String owner; - protected PluginManager pm; - protected ClaimedResidence residence; - protected String world; - ResidenceMain plugin; - - public static ResidencePermissions load(final ResidenceMain plugin, final ClaimedResidence res, final Map root) throws Exception { - final ResidencePermissions newperms = new ResidencePermissions(plugin, res); - newperms.owner = (String) root.get("Owner"); - if (root.containsKey("OwnerLastKnownName")) { - newperms.owner = (String) root.get("OwnerLastKnownName"); - plugin.getLogger().info("自动转换 UUID " + root.get("OwnerUUID") + " => " + newperms.owner); - } - if (newperms.owner == null) { - plugin.getLogger().warning("发现未知所有者的领地,转换为Server Land..."); - newperms.owner = "Server Land"; - } - newperms.world = (String) root.get("World"); - FlagPermissions.load(root, newperms); - if (newperms.owner == null) { - throw new IllegalArgumentException("错误的Owner数据..."); - } - if (newperms.world == null) { - throw new IllegalArgumentException("错误的World数据..."); - } - newperms.fixNames(); - return newperms; - } - - public ResidencePermissions(final ResidenceMain plugin, final ClaimedResidence res) { - this.plugin = plugin; - this.pm = plugin.getServer().getPluginManager(); - residence = res; - } - - public ResidencePermissions(final ResidenceMain plugin, final ClaimedResidence res, final String creator, final String inworld) { - this(plugin, res); - owner = creator; - world = inworld; - } - - public void applyDefaultFlags() { - final PermissionManager gm = plugin.getPermissionManager(); - final PermissionGroup group = gm.getGroup(owner, world); - final Set> dflags = group.getDefaultResidenceFlags(); - final Set> dcflags = group.getDefaultCreatorFlags(); - final Set>> dgflags = group.getDefaultGroupFlags(); - this.applyGlobalDefaults(); - for (final Entry next : dflags) { - if (this.checkValidFlag(next.getKey(), true)) { - if (next.getValue()) { - this.setFlag(next.getKey(), FlagState.TRUE); - } else { - this.setFlag(next.getKey(), FlagState.FALSE); - } - } - } - for (final Entry next : dcflags) { - if (this.checkValidFlag(next.getKey(), false)) { - if (next.getValue()) { - this.setPlayerFlag(owner, next.getKey(), FlagState.TRUE); - } else { - this.setPlayerFlag(owner, next.getKey(), FlagState.FALSE); - } - } - } - for (final Entry> entry : dgflags) { - final Map value = entry.getValue(); - for (final Entry flag : value.entrySet()) { - if (flag.getValue()) { - this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.TRUE); - } else { - this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.FALSE); - } - } - } - } - - public void applyDefaultFlags(final Player player, final boolean resadmin) { - if (this.hasResidencePermission(player, true) || resadmin) { - this.applyDefaultFlags(); - player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("FlagsDefault")); - } else { - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("NoPermission")); - } - } - - public void applyGlobalDefaults() { - this.clearFlags(); - final FlagPermissions gRD = plugin.getConfigManager().getGlobalResidenceDefaultFlags(); - final FlagPermissions gCD = plugin.getConfigManager().getGlobalCreatorDefaultFlags(); - final Map gGD = plugin.getConfigManager().getGlobalGroupDefaultFlags(); - for (final Entry entry : gRD.cuboidFlags.entrySet()) { - if (entry.getValue()) { - this.setFlag(entry.getKey(), FlagState.TRUE); - } else { - this.setFlag(entry.getKey(), FlagState.FALSE); - } - } - for (final Entry entry : gCD.cuboidFlags.entrySet()) { - if (entry.getValue()) { - this.setPlayerFlag(owner, entry.getKey(), FlagState.TRUE); - } else { - this.setPlayerFlag(owner, entry.getKey(), FlagState.FALSE); - } - } - for (final Entry entry : gGD.entrySet()) { - for (final Entry flag : entry.getValue().cuboidFlags.entrySet()) { - if (flag.getValue()) { - this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.TRUE); - } else { - this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.FALSE); - } - } - } - } - - public void applyTemplate(final Player player, final FlagPermissions list, boolean resadmin) { - if (player != null) { - if (!player.getName().equals(owner) && !resadmin) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission")); - return; - } - } else { - resadmin = true; - } - final PermissionGroup group = plugin.getPermissionManager().getGroup(owner, world); - for (final Entry flag : list.cuboidFlags.entrySet()) { - if (group.hasFlagAccess(flag.getKey()) || resadmin) { - this.cuboidFlags.put(flag.getKey(), flag.getValue()); - } else if (player != null) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagSetDeny", ChatColor.YELLOW + flag.getKey() + ChatColor.RED)); - } - } - for (final Entry> plists : list.playerFlags.entrySet()) { - for (final Entry flag : plists.getValue().entrySet()) { - if (group.hasFlagAccess(flag.getKey()) || resadmin) { - if (!this.playerFlags.containsKey(plists.getKey())) { - this.playerFlags.put(plists.getKey(), Collections.synchronizedMap(new HashMap())); - } - this.playerFlags.get(plists.getKey()).put(flag.getKey(), flag.getValue()); - } else if (player != null) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagSetDeny", ChatColor.YELLOW + flag.getKey() + ChatColor.RED)); - } - } - } - for (final Entry> glists : list.groupFlags.entrySet()) { - for (final Entry flag : glists.getValue().entrySet()) { - if (group.hasFlagAccess(flag.getKey()) || resadmin) { - if (!this.groupFlags.containsKey(glists.getKey())) { - this.groupFlags.put(glists.getKey(), Collections.synchronizedMap(new HashMap())); - } - this.groupFlags.get(glists.getKey()).put(flag.getKey(), flag.getValue()); - } else if (player != null) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagSetDeny", ChatColor.YELLOW + flag.getKey() + ChatColor.RED)); - } - } - } - if (player != null) { - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("PermissionsApply")); - } - } - - public void fixNames() { - final ArrayList fixNames = new ArrayList(); - final Iterator>> it = playerFlags.entrySet().iterator(); - while (it.hasNext()) { - final String name = it.next().getKey(); - if (!name.equals(name.toLowerCase())) { - fixNames.add(name); - } - } - for (final String name : fixNames) { - final Map get = playerFlags.get(name); - playerFlags.remove(name); - playerFlags.put(name.toLowerCase(), get); - } - } - - public String getOwner() { - return owner; - } - - public String getWorld() { - return world; - } - - @Override - public boolean groupHas(final String group, final String flag, final boolean def) { - final ResidenceFlagCheckEvent fc = new ResidenceFlagCheckEvent(residence, flag, FlagType.GROUP, group, def); - pm.callEvent(fc); - if (fc.isOverriden()) { - return fc.getOverrideValue(); - } - return super.groupHas(group, flag, def); - } - - @Override - public boolean has(final String flag, final boolean def) { - final ResidenceFlagCheckEvent fc = new ResidenceFlagCheckEvent(residence, flag, FlagType.RESIDENCE, null, def); - pm.callEvent(fc); - if (fc.isOverriden()) { - return fc.getOverrideValue(); - } - return super.has(flag, def); - } - - public boolean hasApplicableFlag(final String player, final String flag) { - return super.inheritanceIsPlayerSet(player, flag) || super.inheritanceIsGroupSet(plugin.getPermissionManager().getGroupNameByPlayer(player, world), flag) || super.inheritanceIsSet(flag); - } - - public boolean hasResidencePermission(final Player player, final boolean requireOwner) { - if (plugin.getConfigManager().enabledRentSystem()) { - final String resname = residence.getName(); - if (plugin.getRentManager().isRented(resname)) { - if (requireOwner) { - return false; - } - final String renter = plugin.getRentManager().getRentingPlayer(resname); - if (player.getName().equalsIgnoreCase(renter)) { - return true; - } - return (playerHas(player.getName(), "admin", false)); - } - } - if (requireOwner) { - return (owner.equalsIgnoreCase(player.getName())); - } - return (playerHas(player.getName(), "admin", false) || owner.equalsIgnoreCase(player.getName())); - } - - public boolean playerHas(final String player, final String flag, final boolean def) { - return this.playerHas(player, world, flag, def); - } - - @Override - public boolean playerHas(final String player, final String world, final String flag, final boolean def) { - final ResidenceFlagCheckEvent fc = new ResidenceFlagCheckEvent(residence, flag, FlagType.PLAYER, player, def); - pm.callEvent(fc); - if (fc.isOverriden()) { - return fc.getOverrideValue(); - } - return super.playerHas(player, world, flag, def); - } - - public boolean removeAllGroupFlags(final Player player, final String group, final boolean resadmin) { - if (this.hasResidencePermission(player, false) || resadmin) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, "ALL", ResidenceFlagChangeEvent.FlagType.GROUP, FlagState.NEITHER, null); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - super.removeAllGroupFlags(group); - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); - return true; - } - return false; - } - - public boolean removeAllPlayerFlags(final Player player, final String targetPlayer, final boolean resadmin) { - if (this.hasResidencePermission(player, false) || resadmin) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, "ALL", ResidenceFlagChangeEvent.FlagType.RESIDENCE, FlagState.NEITHER, null); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - super.removeAllPlayerFlags(targetPlayer); - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); - return true; - } - return false; - } - - @Override - public Map save() { - final Map root = super.save(); - root.put("Owner", owner); - root.put("World", world); - return root; - } - - public boolean setFlag(final Player player, final String flag, final String flagstate, final boolean resadmin) { - if (validFlagGroups.containsKey(flag)) { - return this.setFlagGroup(player, flag, flagstate, resadmin); - } - final FlagState state = FlagPermissions.stringToFlagState(flagstate); - if (checkCanSetFlag(player, flag, state, true, resadmin)) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, flag, ResidenceFlagChangeEvent.FlagType.RESIDENCE, state, null); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - if (super.setFlag(flag, state)) { - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); - return true; - } - } - return false; - } - - @Override - public boolean setFlag(final String flag, final FlagState state) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, null, flag, ResidenceFlagChangeEvent.FlagType.RESIDENCE, state, null); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - return super.setFlag(flag, state); - } - - public boolean setFlagGroup(final Player player, final String flaggroup, final String state, final boolean resadmin) { - if (ResidencePermissions.validFlagGroups.containsKey(flaggroup)) { - final ArrayList flags = ResidencePermissions.validFlagGroups.get(flaggroup); - boolean changed = false; - for (final String flag : flags) { - if (this.setFlag(player, flag, state, resadmin)) { - changed = true; - } - } - return changed; - } - return false; - } - - public boolean setFlagGroupOnGroup(final Player player, final String flaggroup, final String group, final String state, final boolean resadmin) { - if (ResidencePermissions.validFlagGroups.containsKey(flaggroup)) { - final ArrayList flags = ResidencePermissions.validFlagGroups.get(flaggroup); - boolean changed = false; - for (final String flag : flags) { - if (this.setGroupFlag(player, group, flag, state, resadmin)) { - changed = true; - } - } - return changed; - } - return false; - } - - public boolean setFlagGroupOnPlayer(final Player player, final String target, final String flaggroup, final String state, final boolean resadmin) { - if (ResidencePermissions.validFlagGroups.containsKey(flaggroup)) { - final ArrayList flags = ResidencePermissions.validFlagGroups.get(flaggroup); - boolean changed = false; - for (final String flag : flags) { - if (this.setPlayerFlag(player, target, flag, state, resadmin)) { - changed = true; - } - } - return changed; - } - return false; - } - - public boolean setGroupFlag(final Player player, String group, final String flag, final String flagstate, final boolean resadmin) { - group = group.toLowerCase(); - if (validFlagGroups.containsKey(flag)) { - return this.setFlagGroupOnGroup(player, flag, group, flagstate, resadmin); - } - final FlagState state = FlagPermissions.stringToFlagState(flagstate); - if (checkCanSetFlag(player, flag, state, false, resadmin)) { - if (plugin.getPermissionManager().hasGroup(group)) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, flag, ResidenceFlagChangeEvent.FlagType.GROUP, state, group); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - if (super.setGroupFlag(group, flag, state)) { - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); - return true; - } - } else { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("InvalidGroup")); - return false; - } - } - return false; - } - - @Override - public boolean setGroupFlag(final String group, final String flag, final FlagState state) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, null, flag, ResidenceFlagChangeEvent.FlagType.GROUP, state, group); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - return super.setGroupFlag(group, flag, state); - } - - public void setOwner(final String newOwner, final boolean resetFlags) { - final ResidenceOwnerChangeEvent ownerchange = new ResidenceOwnerChangeEvent(residence, newOwner); - pm.callEvent(ownerchange); - owner = newOwner; - if (resetFlags) { - this.applyDefaultFlags(); - } - } - - public boolean setPlayerFlag(final Player player, final String targetPlayer, final String flag, final String flagstate, final boolean resadmin) { - if (!plugin.validName(targetPlayer)) { - player.sendMessage(ChatColor.DARK_RED + "非法操作!"); - return false; - } - if (validFlagGroups.containsKey(flag)) { - return this.setFlagGroupOnPlayer(player, targetPlayer, flag, flagstate, resadmin); - } - final FlagState state = FlagPermissions.stringToFlagState(flagstate); - if (checkCanSetFlag(player, flag, state, false, resadmin)) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, flag, ResidenceFlagChangeEvent.FlagType.PLAYER, state, targetPlayer); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - if (super.setPlayerFlag(targetPlayer, flag, state)) { - player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); - return true; - } - } - return false; - } - - @Override - public boolean setPlayerFlag(final String player, final String flag, final FlagState state) { - final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, null, flag, ResidenceFlagChangeEvent.FlagType.PLAYER, state, player); - pm.callEvent(fc); - if (fc.isCancelled()) { - return false; - } - return super.setPlayerFlag(player, flag, state); - } - - private boolean checkCanSetFlag(final Player player, final String flag, final FlagState state, final boolean globalflag, final boolean resadmin) { - if (!checkValidFlag(flag, globalflag)) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("InvalidFlag")); - return false; - } - if (state == FlagState.INVALID) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("InvalidFlagState")); - return false; - } - if (!resadmin) { - if (!this.hasResidencePermission(player, false)) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission")); - return false; - } - if (!hasFlagAccess(owner, flag)) { - player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("OwnerNoPermission")); - return false; - } - } - return true; - } - - private boolean hasFlagAccess(final String player, final String flag) { - final PermissionGroup group = plugin.getPermissionManager().getGroup(player, world); - return group.hasFlagAccess(flag); - } -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ + +package com.bekvon.bukkit.residence.protection; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginManager; + +import com.bekvon.bukkit.residence.Residence; +import com.bekvon.bukkit.residence.event.ResidenceFlagChangeEvent; +import com.bekvon.bukkit.residence.event.ResidenceFlagCheckEvent; +import com.bekvon.bukkit.residence.event.ResidenceFlagEvent.FlagType; +import com.bekvon.bukkit.residence.event.ResidenceOwnerChangeEvent; +import com.bekvon.bukkit.residence.permissions.PermissionGroup; +import com.bekvon.bukkit.residence.permissions.PermissionManager; + +import pw.yumc.Residence.ResidenceMain; + +/** + * + * @author Administrator + */ +public class ResidencePermissions extends FlagPermissions { + + protected String owner; + protected PluginManager pm; + protected ClaimedResidence residence; + protected String world; + ResidenceMain plugin; + + public static ResidencePermissions load(final ResidenceMain plugin, final ClaimedResidence res, final Map root) throws Exception { + final ResidencePermissions newperms = new ResidencePermissions(plugin, res); + newperms.owner = (String) root.get("Owner"); + if (root.containsKey("OwnerLastKnownName")) { + newperms.owner = (String) root.get("OwnerLastKnownName"); + plugin.getLogger().info("自动转换 UUID " + root.get("OwnerUUID") + " => " + newperms.owner); + } + if (newperms.owner == null) { + plugin.getLogger().warning("发现未知所有者的领地,转换为Server Land..."); + newperms.owner = "Server Land"; + } + newperms.world = (String) root.get("World"); + FlagPermissions.load(root, newperms); + if (newperms.owner == null) { + throw new IllegalArgumentException("错误的Owner数据..."); + } + if (newperms.world == null) { + throw new IllegalArgumentException("错误的World数据..."); + } + newperms.fixNames(); + return newperms; + } + + public ResidencePermissions(final ResidenceMain plugin, final ClaimedResidence res) { + this.plugin = plugin; + this.pm = plugin.getServer().getPluginManager(); + residence = res; + } + + public ResidencePermissions(final ResidenceMain plugin, final ClaimedResidence res, final String creator, final String inworld) { + this(plugin, res); + owner = creator; + world = inworld; + } + + public void applyDefaultFlags() { + final PermissionManager gm = plugin.getPermissionManager(); + final PermissionGroup group = gm.getGroup(owner, world); + final Set> dflags = group.getDefaultResidenceFlags(); + final Set> dcflags = group.getDefaultCreatorFlags(); + final Set>> dgflags = group.getDefaultGroupFlags(); + this.applyGlobalDefaults(); + for (final Entry next : dflags) { + if (this.checkValidFlag(next.getKey(), true)) { + if (next.getValue()) { + this.setFlag(next.getKey(), FlagState.TRUE); + } else { + this.setFlag(next.getKey(), FlagState.FALSE); + } + } + } + for (final Entry next : dcflags) { + if (this.checkValidFlag(next.getKey(), false)) { + if (next.getValue()) { + this.setPlayerFlag(owner, next.getKey(), FlagState.TRUE); + } else { + this.setPlayerFlag(owner, next.getKey(), FlagState.FALSE); + } + } + } + for (final Entry> entry : dgflags) { + final Map value = entry.getValue(); + for (final Entry flag : value.entrySet()) { + if (flag.getValue()) { + this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.TRUE); + } else { + this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.FALSE); + } + } + } + } + + public void applyDefaultFlags(final Player player, final boolean resadmin) { + if (this.hasResidencePermission(player, true) || resadmin) { + this.applyDefaultFlags(); + player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("FlagsDefault")); + } else { + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("NoPermission")); + } + } + + public void applyGlobalDefaults() { + this.clearFlags(); + final FlagPermissions gRD = plugin.getConfigManager().getGlobalResidenceDefaultFlags(); + final FlagPermissions gCD = plugin.getConfigManager().getGlobalCreatorDefaultFlags(); + final Map gGD = plugin.getConfigManager().getGlobalGroupDefaultFlags(); + for (final Entry entry : gRD.cuboidFlags.entrySet()) { + if (entry.getValue()) { + this.setFlag(entry.getKey(), FlagState.TRUE); + } else { + this.setFlag(entry.getKey(), FlagState.FALSE); + } + } + for (final Entry entry : gCD.cuboidFlags.entrySet()) { + if (entry.getValue()) { + this.setPlayerFlag(owner, entry.getKey(), FlagState.TRUE); + } else { + this.setPlayerFlag(owner, entry.getKey(), FlagState.FALSE); + } + } + for (final Entry entry : gGD.entrySet()) { + for (final Entry flag : entry.getValue().cuboidFlags.entrySet()) { + if (flag.getValue()) { + this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.TRUE); + } else { + this.setGroupFlag(entry.getKey(), flag.getKey(), FlagState.FALSE); + } + } + } + } + + public void applyTemplate(final Player player, final FlagPermissions list, boolean resadmin) { + if (player != null) { + if (!player.getName().equals(owner) && !resadmin) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission")); + return; + } + } else { + resadmin = true; + } + final PermissionGroup group = plugin.getPermissionManager().getGroup(owner, world); + for (final Entry flag : list.cuboidFlags.entrySet()) { + if (group.hasFlagAccess(flag.getKey()) || resadmin) { + this.cuboidFlags.put(flag.getKey(), flag.getValue()); + } else if (player != null) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagSetDeny", ChatColor.YELLOW + flag.getKey() + ChatColor.RED)); + } + } + for (final Entry> plists : list.playerFlags.entrySet()) { + for (final Entry flag : plists.getValue().entrySet()) { + if (group.hasFlagAccess(flag.getKey()) || resadmin) { + if (!this.playerFlags.containsKey(plists.getKey())) { + this.playerFlags.put(plists.getKey(), Collections.synchronizedMap(new HashMap())); + } + this.playerFlags.get(plists.getKey()).put(flag.getKey(), flag.getValue()); + } else if (player != null) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagSetDeny", ChatColor.YELLOW + flag.getKey() + ChatColor.RED)); + } + } + } + for (final Entry> glists : list.groupFlags.entrySet()) { + for (final Entry flag : glists.getValue().entrySet()) { + if (group.hasFlagAccess(flag.getKey()) || resadmin) { + if (!this.groupFlags.containsKey(glists.getKey())) { + this.groupFlags.put(glists.getKey(), Collections.synchronizedMap(new HashMap())); + } + this.groupFlags.get(glists.getKey()).put(flag.getKey(), flag.getValue()); + } else if (player != null) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagSetDeny", ChatColor.YELLOW + flag.getKey() + ChatColor.RED)); + } + } + } + if (player != null) { + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("PermissionsApply")); + } + } + + public void fixNames() { + final ArrayList fixNames = new ArrayList(); + final Iterator>> it = playerFlags.entrySet().iterator(); + while (it.hasNext()) { + final String name = it.next().getKey(); + if (!name.equals(name.toLowerCase())) { + fixNames.add(name); + } + } + for (final String name : fixNames) { + final Map get = playerFlags.get(name); + playerFlags.remove(name); + playerFlags.put(name.toLowerCase(), get); + } + } + + public String getOwner() { + return owner; + } + + public Map getPlayerFlags(final String player) { + return getPlayerFlags(player, false); + } + + public ArrayList getposibleFlags() { + return validFlags; + } + + public List getPosibleFlags(final boolean residence, final boolean resadmin) { + final List flags = new ArrayList<>(); + for (final Entry one : Residence.getPermissionManager().getAllFlags().getFlags().entrySet()) + if ((one.getValue().booleanValue()) || (resadmin)) { + if ((residence) || (getposibleFlags().contains(one.getKey()))) { + flags.add(one.getKey()); + } + } + return flags; + } + + public String getWorld() { + return world; + } + + @Override + public boolean groupHas(final String group, final String flag, final boolean def) { + final ResidenceFlagCheckEvent fc = new ResidenceFlagCheckEvent(residence, flag, FlagType.GROUP, group, def); + pm.callEvent(fc); + if (fc.isOverriden()) { + return fc.getOverrideValue(); + } + return super.groupHas(group, flag, def); + } + + @Override + public boolean has(final String flag, final boolean def) { + final ResidenceFlagCheckEvent fc = new ResidenceFlagCheckEvent(residence, flag, FlagType.RESIDENCE, null, def); + pm.callEvent(fc); + if (fc.isOverriden()) { + return fc.getOverrideValue(); + } + return super.has(flag, def); + } + + public boolean hasApplicableFlag(final String player, final String flag) { + return super.inheritanceIsPlayerSet(player, flag) || super.inheritanceIsGroupSet(plugin.getPermissionManager().getGroupNameByPlayer(player, world), flag) || super.inheritanceIsSet(flag); + } + + public boolean hasResidencePermission(final Player player, final boolean requireOwner) { + if (plugin.getConfigManager().enabledRentSystem()) { + final String resname = residence.getName(); + if (plugin.getRentManager().isRented(resname)) { + if (requireOwner) { + return false; + } + final String renter = plugin.getRentManager().getRentingPlayer(resname); + if (player.getName().equalsIgnoreCase(renter)) { + return true; + } + return (playerHas(player.getName(), "admin", false)); + } + } + if (requireOwner) { + return (owner.equalsIgnoreCase(player.getName())); + } + return (playerHas(player.getName(), "admin", false) || owner.equalsIgnoreCase(player.getName())); + } + + public boolean playerHas(final String player, final String flag, final boolean def) { + return this.playerHas(player, world, flag, def); + } + + @Override + public boolean playerHas(final String player, final String world, final String flag, final boolean def) { + final ResidenceFlagCheckEvent fc = new ResidenceFlagCheckEvent(residence, flag, FlagType.PLAYER, player, def); + pm.callEvent(fc); + if (fc.isOverriden()) { + return fc.getOverrideValue(); + } + return super.playerHas(player, world, flag, def); + } + + public boolean removeAllGroupFlags(final Player player, final String group, final boolean resadmin) { + if (this.hasResidencePermission(player, false) || resadmin) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, "ALL", ResidenceFlagChangeEvent.FlagType.GROUP, FlagState.NEITHER, null); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + super.removeAllGroupFlags(group); + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); + return true; + } + return false; + } + + public boolean removeAllPlayerFlags(final Player player, final String targetPlayer, final boolean resadmin) { + if (this.hasResidencePermission(player, false) || resadmin) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, "ALL", ResidenceFlagChangeEvent.FlagType.RESIDENCE, FlagState.NEITHER, null); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + super.removeAllPlayerFlags(targetPlayer); + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); + return true; + } + return false; + } + + @Override + public Map save() { + final Map root = super.save(); + root.put("Owner", owner); + root.put("World", world); + return root; + } + + public boolean setFlag(final Player player, final String flag, final String flagstate, final boolean resadmin) { + if (validFlagGroups.containsKey(flag)) { + return this.setFlagGroup(player, flag, flagstate, resadmin); + } + final FlagState state = FlagPermissions.stringToFlagState(flagstate); + if (checkCanSetFlag(player, flag, state, true, resadmin)) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, flag, ResidenceFlagChangeEvent.FlagType.RESIDENCE, state, null); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + if (super.setFlag(flag, state)) { + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); + return true; + } + } + return false; + } + + @Override + public boolean setFlag(final String flag, final FlagState state) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, null, flag, ResidenceFlagChangeEvent.FlagType.RESIDENCE, state, null); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + return super.setFlag(flag, state); + } + + public boolean setFlagGroup(final Player player, final String flaggroup, final String state, final boolean resadmin) { + if (ResidencePermissions.validFlagGroups.containsKey(flaggroup)) { + final ArrayList flags = ResidencePermissions.validFlagGroups.get(flaggroup); + boolean changed = false; + for (final String flag : flags) { + if (this.setFlag(player, flag, state, resadmin)) { + changed = true; + } + } + return changed; + } + return false; + } + + public boolean setFlagGroupOnGroup(final Player player, final String flaggroup, final String group, final String state, final boolean resadmin) { + if (ResidencePermissions.validFlagGroups.containsKey(flaggroup)) { + final ArrayList flags = ResidencePermissions.validFlagGroups.get(flaggroup); + boolean changed = false; + for (final String flag : flags) { + if (this.setGroupFlag(player, group, flag, state, resadmin)) { + changed = true; + } + } + return changed; + } + return false; + } + + public boolean setFlagGroupOnPlayer(final Player player, final String target, final String flaggroup, final String state, final boolean resadmin) { + if (ResidencePermissions.validFlagGroups.containsKey(flaggroup)) { + final ArrayList flags = ResidencePermissions.validFlagGroups.get(flaggroup); + boolean changed = false; + for (final String flag : flags) { + if (this.setPlayerFlag(player, target, flag, state, resadmin)) { + changed = true; + } + } + return changed; + } + return false; + } + + public boolean setGroupFlag(final Player player, String group, final String flag, final String flagstate, final boolean resadmin) { + group = group.toLowerCase(); + if (validFlagGroups.containsKey(flag)) { + return this.setFlagGroupOnGroup(player, flag, group, flagstate, resadmin); + } + final FlagState state = FlagPermissions.stringToFlagState(flagstate); + if (checkCanSetFlag(player, flag, state, false, resadmin)) { + if (plugin.getPermissionManager().hasGroup(group)) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, flag, ResidenceFlagChangeEvent.FlagType.GROUP, state, group); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + if (super.setGroupFlag(group, flag, state)) { + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); + return true; + } + } else { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("InvalidGroup")); + return false; + } + } + return false; + } + + @Override + public boolean setGroupFlag(final String group, final String flag, final FlagState state) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, null, flag, ResidenceFlagChangeEvent.FlagType.GROUP, state, group); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + return super.setGroupFlag(group, flag, state); + } + + public void setOwner(final String newOwner, final boolean resetFlags) { + final ResidenceOwnerChangeEvent ownerchange = new ResidenceOwnerChangeEvent(residence, newOwner); + pm.callEvent(ownerchange); + owner = newOwner; + if (resetFlags) { + this.applyDefaultFlags(); + } + } + + public boolean setPlayerFlag(final Player player, final String targetPlayer, final String flag, final String flagstate, final boolean resadmin) { + if (!plugin.validName(targetPlayer)) { + player.sendMessage(ChatColor.DARK_RED + "非法操作!"); + return false; + } + if (validFlagGroups.containsKey(flag)) { + return this.setFlagGroupOnPlayer(player, targetPlayer, flag, flagstate, resadmin); + } + final FlagState state = FlagPermissions.stringToFlagState(flagstate); + if (checkCanSetFlag(player, flag, state, false, resadmin)) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, player, flag, ResidenceFlagChangeEvent.FlagType.PLAYER, state, targetPlayer); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + if (super.setPlayerFlag(targetPlayer, flag, state)) { + player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("FlagSet")); + return true; + } + } + return false; + } + + @Override + public boolean setPlayerFlag(final String player, final String flag, final FlagState state) { + final ResidenceFlagChangeEvent fc = new ResidenceFlagChangeEvent(residence, null, flag, ResidenceFlagChangeEvent.FlagType.PLAYER, state, player); + pm.callEvent(fc); + if (fc.isCancelled()) { + return false; + } + return super.setPlayerFlag(player, flag, state); + } + + private boolean checkCanSetFlag(final Player player, final String flag, final FlagState state, final boolean globalflag, final boolean resadmin) { + if (!checkValidFlag(flag, globalflag)) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("InvalidFlag")); + return false; + } + if (state == FlagState.INVALID) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("InvalidFlagState")); + return false; + } + if (!resadmin) { + if (!this.hasResidencePermission(player, false)) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission")); + return false; + } + if (!hasFlagAccess(owner, flag)) { + player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("OwnerNoPermission")); + return false; + } + } + return true; + } + + private boolean hasFlagAccess(final String player, final String flag) { + final PermissionGroup group = plugin.getPermissionManager().getGroup(player, world); + return group.hasFlagAccess(flag); + } + + protected Map getPlayerFlags(final String player, final boolean allowCreate) { + Map flags = null; + for (final Entry> one : this.playerFlags.entrySet()) + if (one.getKey().equalsIgnoreCase(player)) { + flags = one.getValue(); + break; + } + if ((flags == null) && (allowCreate)) { + flags = Collections.synchronizedMap(new HashMap()); + this.playerFlags.put(player, flags); + } + return flags; + } +} diff --git a/src/main/java/pw/yumc/Residence/ResidenceMain.java b/src/main/java/pw/yumc/Residence/ResidenceMain.java index 1e3d5a6..62ae9d7 100644 --- a/src/main/java/pw/yumc/Residence/ResidenceMain.java +++ b/src/main/java/pw/yumc/Residence/ResidenceMain.java @@ -57,6 +57,7 @@ import pw.yumc.Residence.economy.EconomyInterface; import pw.yumc.Residence.economy.EssentialsEcoAdapter; import pw.yumc.Residence.economy.TransactionManager; import pw.yumc.Residence.economy.rent.RentManager; +import pw.yumc.Residence.gui.FlagUtil; import pw.yumc.Residence.itemlist.WorldItemManager; import pw.yumc.Residence.listeners.ResidenceBlockListener; import pw.yumc.Residence.listeners.ResidenceEntityListener; @@ -121,6 +122,7 @@ public class ResidenceMain extends JavaPlugin { protected TransactionManager tmanager; protected boolean useWorldEdit; protected WorldFlagManager wmanager; + protected FlagUtil fmanager; public static ResidenceMain getInstance() { return instance; @@ -173,6 +175,10 @@ public class ResidenceMain extends JavaPlugin { return entitymanager; } + public FlagUtil getFlagUtilManager() { + return fmanager; + } + public HelpEntry getHelppages() { return helppages; } @@ -393,6 +399,9 @@ public class ResidenceMain extends JavaPlugin { } } } + fmanager = new FlagUtil(this); + getFlagUtilManager().load(); + gmanager = new PermissionManager(this); gmanager = new PermissionManager(this); imanager = new WorldItemManager(this.getConfig()); wmanager = new WorldFlagManager(this); @@ -570,7 +579,7 @@ public class ResidenceMain extends JavaPlugin { @Override public void saveConfig() { config.save(); - } + }; public synchronized void saveYml() throws IOException { final File saveFolder = new File(dataFolder, "Save"); @@ -677,7 +686,7 @@ public class ResidenceMain extends JavaPlugin { if (cmanager.showIntervalMessages()) { this.getLogger().info(" - 保存插件数据..."); } - }; + } public void setLanguage(final Language language) { this.language = language; diff --git a/src/main/java/pw/yumc/Residence/commandsub/CommandPset.java b/src/main/java/pw/yumc/Residence/commandsub/CommandPset.java index a67e1bd..fd6b638 100644 --- a/src/main/java/pw/yumc/Residence/commandsub/CommandPset.java +++ b/src/main/java/pw/yumc/Residence/commandsub/CommandPset.java @@ -11,6 +11,7 @@ import com.bekvon.bukkit.residence.protection.ResidenceManager; import cn.citycraft.PluginHelper.commands.BaseCommand; import pw.yumc.Residence.ResidenceMain; +import pw.yumc.Residence.gui.FlagUtil; import pw.yumc.Residence.text.Language; public class CommandPset extends BaseCommand { @@ -30,15 +31,20 @@ public class CommandPset extends BaseCommand { final boolean resadmin = (command != null); final ResidenceManager rmanager = plugin.getResidenceManager(); final Language language = plugin.getLanguage(); - - if (args.length == 2 && args[1].equalsIgnoreCase("removeall")) { + if (args.length == 1) { + final ClaimedResidence area = rmanager.getByLoc(player.getLocation()); + if (area != null) { + FlagUtil.open(area, player, args[0], resadmin); + } else { + player.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); + } + } else if (args.length == 2 && args[1].equalsIgnoreCase("removeall")) { final ClaimedResidence area = rmanager.getByLoc(player.getLocation()); if (area != null) { area.getPermissions().removeAllPlayerFlags(player, args[1], resadmin); } else { player.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); } - return; } else if (args.length == 3 && args[2].equalsIgnoreCase("removeall")) { final ClaimedResidence area = rmanager.getByName(args[0]); if (area != null) { @@ -46,7 +52,6 @@ public class CommandPset extends BaseCommand { } else { player.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); } - return; } else if (args.length == 3) { final ClaimedResidence area = rmanager.getByLoc(player.getLocation()); if (area != null) { @@ -54,7 +59,6 @@ public class CommandPset extends BaseCommand { } else { player.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); } - return; } else if (args.length == 4) { final ClaimedResidence area = rmanager.getByName(args[0]); if (area != null) { @@ -62,8 +66,6 @@ public class CommandPset extends BaseCommand { } else { player.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); } - return; } } - } diff --git a/src/main/java/pw/yumc/Residence/commandsub/CommandSet.java b/src/main/java/pw/yumc/Residence/commandsub/CommandSet.java index 747d8f3..eb9aaa2 100644 --- a/src/main/java/pw/yumc/Residence/commandsub/CommandSet.java +++ b/src/main/java/pw/yumc/Residence/commandsub/CommandSet.java @@ -11,6 +11,7 @@ import com.bekvon.bukkit.residence.protection.ResidenceManager; import cn.citycraft.PluginHelper.commands.BaseCommand; import pw.yumc.Residence.ResidenceMain; +import pw.yumc.Residence.gui.FlagUtil; import pw.yumc.Residence.text.Language; public class CommandSet extends BaseCommand { @@ -30,8 +31,14 @@ public class CommandSet extends BaseCommand { final boolean resadmin = (command != null); final ResidenceManager rmanager = plugin.getResidenceManager(); final Language language = plugin.getLanguage(); - - if (args.length == 2) { + if (args.length == 0 || args.length == 1) { + final ClaimedResidence area = args.length == 0 ? rmanager.getByLoc(player.getLocation()) : rmanager.getByName(args[0]); + if (area != null) { + FlagUtil.open(area, player, null, resadmin); + } else { + player.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); + } + } else if (args.length == 2) { final String res = rmanager.getNameByLoc(player.getLocation()); if (res != null) { rmanager.getByName(res).getPermissions().setFlag(player, args[0], args[1], resadmin); diff --git a/src/main/java/pw/yumc/Residence/gui/FlagData.java b/src/main/java/pw/yumc/Residence/gui/FlagData.java new file mode 100644 index 0000000..c380488 --- /dev/null +++ b/src/main/java/pw/yumc/Residence/gui/FlagData.java @@ -0,0 +1,25 @@ +package pw.yumc.Residence.gui; + +import java.util.HashMap; + +import org.bukkit.inventory.ItemStack; + +public class FlagData { + private final HashMap items = new HashMap<>(); + + public void addFlagButton(final String flag, final ItemStack item) { + this.items.put(flag, item); + } + + public boolean contains(final String flag) { + return this.items.containsKey(flag); + } + + public ItemStack getItem(final String flag) { + return this.items.get(flag); + } + + public void removeFlagButton(final String flag, final ItemStack item) { + this.items.remove(flag); + } +} diff --git a/src/main/java/pw/yumc/Residence/gui/FlagUtil.java b/src/main/java/pw/yumc/Residence/gui/FlagUtil.java new file mode 100644 index 0000000..e95efbd --- /dev/null +++ b/src/main/java/pw/yumc/Residence/gui/FlagUtil.java @@ -0,0 +1,89 @@ +package pw.yumc.Residence.gui; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import com.bekvon.bukkit.residence.protection.ClaimedResidence; + +import cn.citycraft.PluginHelper.config.FileConfig; +import pw.yumc.Residence.ResidenceMain; +import pw.yumc.Residence.listeners.ResidenceGUIListener; + +public class FlagUtil { + public static FileConfig conf; + final static LinkedHashMap> description = new LinkedHashMap<>(); + private final FlagData flagData = new FlagData(); + private final ResidenceMain plugin; + protected ItemStack guitrue, guifalse, guiremove; + + public static FileConfig getConfig() { + return conf; + } + + public static void open(final ClaimedResidence area, final Player player, final String target, final boolean resadmin) { + final SetFlag flag = new SetFlag(area, player, resadmin); + if (StringUtils.isEmpty(target)) { + flag.recalculateResidence(area); + } else { + flag.setTargePlayer(target); + flag.recalculatePlayer(area); + } + ResidenceGUIListener.GUI.put(player.getName(), flag); + player.openInventory(flag.getInventory()); + player.sendMessage("§a已打开领地 " + area.getName() + " 的管理界面!"); + } + + public FlagUtil(final ResidenceMain plugin) { + this.plugin = plugin; + conf = new FileConfig(plugin, "gui.yml"); + guitrue = new ItemStack(conf.getInt("GUI.setFtue.id", 1), 1, (short) conf.getInt("GUI.setFtue.data", 0)); + guifalse = new ItemStack(conf.getInt("GUI.setFalse.id", 1), 1, (short) conf.getInt("GUI.setFalse.data", 0)); + guiremove = new ItemStack(conf.getInt("GUI.setRemove.id", 1), 1, (short) conf.getInt("GUI.setRemove.data", 0)); + } + + public FlagData getFlagData() { + return this.flagData; + } + + public ItemStack getGuiFalse() { + return guifalse; + } + + public ItemStack getGuiRemove() { + return guiremove; + } + + public ItemStack getGuiTrue() { + return guitrue; + } + + public void load() { + final Set allFlags = plugin.getConfig().getConfigurationSection("Global.FlagPermission").getKeys(false); + for (final String oneFlag : allFlags) { + if (conf.contains("FlagGUI." + oneFlag)) { + if (conf.contains("FlagGUI." + oneFlag + ".id")) { + if (conf.contains("FlagGUI." + oneFlag + ".data")) { + final int id = conf.getInt("FlagGUI." + oneFlag + ".id"); + final int data = conf.getInt("FlagGUI." + oneFlag + ".data"); + Material Mat = Material.getMaterial(id); + if (Mat == null) { + Mat = Material.STONE; + } + final ItemStack item = new ItemStack(Mat, 1, (short) data); + this.flagData.addFlagButton(oneFlag.toLowerCase(), item); + } + } + if (conf.contains("FlagGUI." + oneFlag + ".des")) { + description.put(oneFlag, conf.getStringList("FlagGUI." + oneFlag + ".des")); + } + } + } + } + +} diff --git a/src/main/java/pw/yumc/Residence/gui/SetFlag.java b/src/main/java/pw/yumc/Residence/gui/SetFlag.java new file mode 100644 index 0000000..76d6699 --- /dev/null +++ b/src/main/java/pw/yumc/Residence/gui/SetFlag.java @@ -0,0 +1,330 @@ +package pw.yumc.Residence.gui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import com.bekvon.bukkit.residence.Residence; +import com.bekvon.bukkit.residence.protection.ClaimedResidence; + +public class SetFlag { + private final ClaimedResidence residence; + private final Player player; + private String targetPlayer = null; + private Inventory inventory; + private final LinkedHashMap permMap = new LinkedHashMap<>(); + private boolean admin = false; + private int page = 1; + private int pageCount = 1; + final ItemStack prev, next; + + public SetFlag(final ClaimedResidence residence, final Player player, final boolean admin) { + this.residence = residence; + this.player = player; + this.admin = admin; + prev = new ItemStack(Material.ARROW); + final ItemMeta pmeta = prev.getItemMeta(); + pmeta.setDisplayName(FlagUtil.getConfig().getMessage("GUI.PrevInfoPage")); + prev.setItemMeta(pmeta); + next = new ItemStack(Material.ARROW); + final ItemMeta nmeta = next.getItemMeta(); + nmeta.setDisplayName(FlagUtil.getConfig().getMessage("GUI.NextInfoPage")); + next.setItemMeta(nmeta); + } + + public List getFlagLore(final Entry one) { + final List lore = new ArrayList<>(); + if (FlagUtil.description.containsKey(one.getKey())) { + lore.addAll(FlagUtil.description.get(one.getKey())); + } + switch (one.getValue().intValue()) { + case 0: + lore.add(ChatColor.GOLD + "权限状态: " + ChatColor.RED + "关闭"); + break; + case 1: + lore.add(ChatColor.GOLD + "权限状态: " + ChatColor.GREEN + "开启"); + break; + case 2: + lore.add(ChatColor.GOLD + "权限状态: " + ChatColor.DARK_RED + "未配置"); + } + lore.addAll(FlagUtil.getConfig().getMessageList("GUI.Actions")); + return lore; + } + + public Inventory getInventory() { + return this.inventory; + } + + public Player getPlayer() { + return this.player; + } + + public ClaimedResidence getResidence() { + return this.residence; + } + + public ItemStack getStatuItem(final Entry one) { + switch (one.getValue().intValue()) { + case 0: + return Residence.getFlagUtilManager().getGuiFalse(); + case 1: + return Residence.getFlagUtilManager().getGuiTrue(); + case 2: + default: + return Residence.getFlagUtilManager().getGuiRemove(); + } + } + + public boolean isAdmin() { + return this.admin; + } + + public void recalculateInv(final Player player) { + if (this.targetPlayer == null) { + recalculateResidence(residence); + } else { + recalculatePlayer(residence); + } + if (player.getOpenInventory() != null) { + player.getOpenInventory().getTopInventory().setContents(this.inventory.getContents()); + } + } + + public void recalculatePlayer(final ClaimedResidence res) { + Map globalFlags = Residence.getPermissionManager().getAllFlags().getFlags(); + final List flags = res.getPermissions().getPosibleFlags(false, this.admin); + final Map resFlags = new HashMap<>(); + for (final Entry one : res.getPermissions().getFlags().entrySet()) { + if (flags.contains(one.getKey())) { + resFlags.put(one.getKey(), one.getValue()); + } + } + Map pFlags = null; + if (this.targetPlayer != null) { + final ArrayList PosibleResPFlags = res.getPermissions().getposibleFlags(); + final Map temp = new HashMap<>(); + for (final String one : PosibleResPFlags) { + if (globalFlags.containsKey(one)) { + temp.put(one, globalFlags.get(one)); + } + } + globalFlags = temp; + pFlags = res.getPermissions().getPlayerFlags(this.targetPlayer); + if (pFlags != null) { + for (final Entry one : pFlags.entrySet()) { + resFlags.put(one.getKey(), one.getValue()); + } + } + } + final LinkedHashMap TempPermMap = new LinkedHashMap<>(); + for (final Entry one : globalFlags.entrySet()) { + if (flags.contains(one.getKey())) { + if (resFlags.containsKey(one.getKey())) { + TempPermMap.put(one.getKey(), resFlags.get(one.getKey()) ? 1 : 0); + } else { + TempPermMap.put(one.getKey(), Integer.valueOf(2)); + } + } + } + String title = ""; + title = String.format(FlagUtil.getConfig().getMessage("GUI.Pset.Title"), this.targetPlayer, res.getName()); + if (title.length() > 32) { + title = title.substring(0, Math.min(title.length(), 32)); + } + final Inventory GuiInv = Bukkit.createInventory(null, 54, title); + final FlagData flagData = Residence.getFlagUtilManager().getFlagData(); + this.pageCount = ((int) Math.ceil(TempPermMap.size() / 45.0D)); + final int start = this.page * 45 - 45; + final int end = this.page * 45; + int count = -1; + this.permMap.clear(); + for (final Entry one : TempPermMap.entrySet()) { + count++; + if (count >= end) { + break; + } + if (count >= start) { + this.permMap.put(one.getKey(), one.getValue()); + } + } + int i = 0; + for (final Entry one : this.permMap.entrySet()) { + ItemStack MiscInfo = getStatuItem(one); + if (flagData.contains(one.getKey())) { + MiscInfo = flagData.getItem(one.getKey()); + } + if (one.getValue().intValue() == 1) { + final ItemMeta im = MiscInfo.getItemMeta(); + im.addEnchant(Enchantment.LUCK, 1, true); + MiscInfo.setItemMeta(im); + } else { + MiscInfo.removeEnchantment(Enchantment.LUCK); + } + final ItemMeta MiscInfoMeta = MiscInfo.getItemMeta(); + MiscInfoMeta.setDisplayName(ChatColor.GREEN + one.getKey()); + MiscInfoMeta.setLore(getFlagLore(one)); + MiscInfo.setItemMeta(MiscInfoMeta); + GuiInv.setItem(i, MiscInfo); + i++; + if (i > 53) { + break; + } + } + setPageItem(GuiInv); + } + + public void recalculateResidence(final ClaimedResidence res) { + final List flags = res.getPermissions().getPosibleFlags(true, this.admin); + final Map globalFlags = Residence.getPermissionManager().getAllFlags().getFlags(); + final Map resFlags = new HashMap<>(); + final LinkedHashMap TempPermMap = new LinkedHashMap<>(); + for (final Entry one : res.getPermissions().getFlags().entrySet()) { + if (flags.contains(one.getKey())) { + resFlags.put(one.getKey(), one.getValue()); + } + } + for (final Entry one : globalFlags.entrySet()) { + if (flags.contains(one.getKey())) { + if (resFlags.containsKey(one.getKey())) { + TempPermMap.put(one.getKey(), resFlags.get(one.getKey()) ? 1 : 0); + } else { + TempPermMap.put(one.getKey(), 2); + } + } + } + String title = ""; + title = String.format(FlagUtil.getConfig().getMessage("GUI.Set.Title"), res.getName()); + if (title.length() > 32) { + title = title.substring(0, Math.min(title.length(), 32)); + } + final Inventory GuiInv = Bukkit.createInventory(null, 54, title); + final FlagData flagData = Residence.getFlagUtilManager().getFlagData(); + this.pageCount = ((int) Math.ceil(TempPermMap.size() / 45.0D)); + final int start = this.page * 45 - 45; + final int end = this.page * 45; + int count = -1; + this.permMap.clear(); + for (final Entry one : TempPermMap.entrySet()) { + count++; + if (count >= end) { + break; + } + if (count >= start) { + this.permMap.put(one.getKey(), one.getValue()); + } + } + int i = 0; + for (final Entry one : this.permMap.entrySet()) { + ItemStack MiscInfo = getStatuItem(one); + if (flagData.contains(one.getKey())) { + MiscInfo = flagData.getItem(one.getKey()); + } + if (one.getValue().intValue() == 1) { + final ItemMeta im = MiscInfo.getItemMeta(); + im.addEnchant(Enchantment.LUCK, 1, true); + MiscInfo.setItemMeta(im); + } else { + MiscInfo.removeEnchantment(Enchantment.LUCK); + } + final ItemMeta MiscInfoMeta = MiscInfo.getItemMeta(); + MiscInfoMeta.setDisplayName(ChatColor.GREEN + one.getKey()); + MiscInfoMeta.setLore(getFlagLore(one)); + MiscInfo.setItemMeta(MiscInfoMeta); + GuiInv.setItem(i, MiscInfo); + i++; + if (i > 53) { + break; + } + } + setPageItem(GuiInv); + } + + public void setAdmin(final boolean state) { + this.admin = state; + } + + public void setPageItem(final Inventory GuiInv) { + if (this.page > 1) { + GuiInv.setItem(45, prev); + } + if (this.page < this.pageCount) { + GuiInv.setItem(53, next); + } + this.inventory = GuiInv; + } + + public void setTargePlayer(final String player) { + this.targetPlayer = player; + } + + public void toggleFlag(final InventoryClickEvent event) { + final Player p = (Player) event.getWhoClicked(); + final int slot = event.getSlot(); + final ClickType click = event.getClick(); + final InventoryAction action = event.getAction(); + final ItemStack item = this.inventory.getItem(slot); + if (item == null) { + return; + } + if (slot == 53) { + if (this.page < this.pageCount) { + this.page += 1; + } + recalculateInv(p); + return; + } + if (slot == 45) { + if (this.page > 1) { + this.page -= 1; + } + recalculateInv(p); + return; + } + String command = "true"; + if ((click.isLeftClick()) && (action != InventoryAction.MOVE_TO_OTHER_INVENTORY)) { + command = "true"; + } else if ((click.isRightClick()) && (action != InventoryAction.MOVE_TO_OTHER_INVENTORY)) { + command = "false"; + } else if ((click.isLeftClick()) && (action == InventoryAction.MOVE_TO_OTHER_INVENTORY)) { + command = "remove"; + } else if ((click.isRightClick()) && (action == InventoryAction.MOVE_TO_OTHER_INVENTORY)) { + return; + } + String flag = ""; + int i = 0; + for (final Entry one : this.permMap.entrySet()) { + flag = one.getKey(); + if (i == slot) { + if (this.targetPlayer == null) { + if (this.admin) { + Bukkit.dispatchCommand(this.player, "resadmin set " + this.residence.getName() + " " + flag + " " + command); + } else { + Bukkit.dispatchCommand(this.player, "res set " + this.residence.getName() + " " + flag + " " + command); + } + } else if (this.admin) { + Bukkit.dispatchCommand(this.player, "resadmin pset " + this.residence.getName() + " " + this.targetPlayer + " " + flag + " " + command); + } else { + Bukkit.dispatchCommand(this.player, "res pset " + this.residence.getName() + " " + this.targetPlayer + " " + flag + " " + command); + } + recalculateInv(p); + return; + } + i++; + } + } +} diff --git a/src/main/java/pw/yumc/Residence/listeners/ResidenceGUIListener.java b/src/main/java/pw/yumc/Residence/listeners/ResidenceGUIListener.java new file mode 100644 index 0000000..8cb7cff --- /dev/null +++ b/src/main/java/pw/yumc/Residence/listeners/ResidenceGUIListener.java @@ -0,0 +1,39 @@ +package pw.yumc.Residence.listeners; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; + +import pw.yumc.Residence.gui.SetFlag; + +public class ResidenceGUIListener implements Listener { + public static Map GUI = new HashMap<>(); + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onFlagGuiClick(final InventoryClickEvent event) { + final String player = event.getWhoClicked().getName(); + if (GUI.size() == 0 || !GUI.containsKey(player)) { + return; + } + event.setCancelled(true); + final int slot = event.getRawSlot(); + if ((slot > 53) || (slot < 0)) { + return; + } + final SetFlag setFlag = GUI.get(player); + setFlag.toggleFlag(event); + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onFlagGuiClose(final InventoryCloseEvent event) { + final String player = event.getPlayer().getName(); + if (GUI.size() != 0 & GUI.containsKey(player)) { + GUI.remove(player); + } + } +} diff --git a/src/main/resources/gui.yml b/src/main/resources/gui.yml new file mode 100644 index 0000000..22ae901 --- /dev/null +++ b/src/main/resources/gui.yml @@ -0,0 +1,278 @@ +# 图形化界面的按钮显示 +GUI: + setTrue: + id: 35 + data: 13 + setFalse: + id: 35 + data: 14 + setRemove: + id: 35 + data: 8 + PrevInfoPage: '&2<<< &e前一页 &2|' + NextInfoPage: '&2| &e后一页 &2>>>' + Set: + Title: '&3%s 领地权限' + Pset: + Title: '&3%s 的 %s 领地权限' + Actions: + - '&b左键 &a开启权限' + - '&b右键 &c关闭权限' + - '&bShift + 左键 &4移除权限' +# Flag标记图形 +FlagGUI: + animalkilling: + des: + - '动物击杀' + id: 365 + data: 0 + animals: + des: + - '动物生成' + id: 383 + data: 90 + bed: + des: + - '暂无描述' + id: 355 + data: 0 + brew: + des: + - '暂无描述' + id: 379 + data: 0 + bucket: + des: + - '暂无描述' + id: 325 + data: 0 + build: + des: + - '暂无描述' + id: 45 + data: 0 + burn: + des: + - '暂无描述' + id: 50 + data: 0 + button: + des: + - '暂无描述' + id: 143 + data: 0 + cake: + des: + - '暂无描述' + id: 354 + data: 0 + canimals: + des: + - '暂无描述' + id: 383 + data: 91 + chat: + des: + - '暂无描述' + id: 386 + data: 0 + cmonsters: + des: + - '暂无描述' + id: 383 + data: 50 + command: + des: + - '暂无描述' + id: 137 + data: 0 + container: + des: + - '暂无描述' + id: 342 + data: 0 + creeper: + des: + - '暂无描述' + id: 383 + data: 50 + destroy: + des: + - '暂无描述' + id: 121 + data: 0 + diode: + des: + - '暂无描述' + id: 356 + data: 0 + door: + des: + - '暂无描述' + id: 324 + data: 0 + enchant: + des: + - '暂无描述' + id: 116 + data: 0 + explode: + des: + - '暂无描述' + id: 407 + data: 0 + fireball: + des: + - '暂无描述' + id: 385 + data: 0 + firespread: + des: + - '暂无描述' + id: 377 + data: 0 + flow: + des: + - '暂无描述' + id: 111 + data: 0 + healing: + des: + - '暂无描述' + id: 373 + data: 0 + ignite: + des: + - '暂无描述' + id: 259 + data: 0 + lavaflow: + des: + - '暂无描述' + id: 327 + data: 0 + leash: + des: + - '暂无描述' + id: 420 + data: 0 + lever: + des: + - '暂无描述' + id: 69 + data: 0 + mobkilling: + des: + - '暂无描述' + id: 367 + data: 0 + monsters: + des: + - '暂无描述' + id: 52 + data: 0 + move: + des: + - '暂无描述' + id: 301 + data: 0 + nanimals: + des: + - '暂无描述' + id: 383 + data: 92 + nmonsters: + des: + - '暂无描述' + id: 383 + data: 51 + nofly: + des: + - '暂无描述' + id: 171 + data: 1 + nomobs: + des: + - '暂无描述' + id: 166 + data: 0 + note: + des: + - '暂无描述' + id: 25 + data: 0 + piston: + des: + - '暂无描述' + id: 33 + data: 0 + place: + des: + - '暂无描述' + id: 169 + data: 0 + pvp: + des: + - '暂无描述' + id: 268 + data: 0 + sanimals: + des: + - '暂无描述' + id: 383 + data: 101 + shear: + des: + - '暂无描述' + id: 359 + data: 0 + smonsters: + des: + - '暂无描述' + id: 383 + data: 54 + subzone: + des: + - '暂无描述' + id: 160 + data: 7 + table: + des: + - '暂无描述' + id: 58 + data: 0 + tnt: + des: + - '暂无描述' + id: 46 + data: 0 + tp: + des: + - '暂无描述' + id: 120 + data: 0 + trade: + des: + - '暂无描述' + id: 388 + data: 0 + trample: + des: + - '暂无描述' + id: 3 + data: 0 + use: + des: + - '暂无描述' + id: 70 + data: 0 + vehicledestroy: + des: + - '暂无描述' + id: 328 + data: 0 + waterflow: + des: + - '暂无描述' + id: 326 + data: 0 \ No newline at end of file