diff --git a/bukkit/src/main/java/com/griefdefender/claim/GDClaim.java b/bukkit/src/main/java/com/griefdefender/claim/GDClaim.java index 723c2c9..414e798 100644 --- a/bukkit/src/main/java/com/griefdefender/claim/GDClaim.java +++ b/bukkit/src/main/java/com/griefdefender/claim/GDClaim.java @@ -126,6 +126,7 @@ public class GDClaim implements Claim { // Permission Context private final Context context; private final Context overrideClaimContext; + private final Context worldContext; private UUID id = null; private UUID ownerUniqueId; @@ -167,6 +168,7 @@ public GDClaim(World world, Vector3i point1, Vector3i point2, ClaimType type, UU this.type = type; this.id = UUID.randomUUID(); this.context = new Context("gd_claim", this.id.toString()); + this.worldContext = new Context("world", world.getName().toLowerCase()); this.overrideClaimContext = new Context("gd_claim_override", this.id.toString()); this.cuboid = cuboid; this.parent = parent; @@ -198,6 +200,7 @@ public GDClaim(World world, Vector3i lesserBoundaryCorner, Vector3i greaterBound this.type = type; this.cuboid = cuboid; this.context = new Context("gd_claim", this.id.toString()); + this.worldContext = new Context("world", world.getName().toLowerCase()); this.hashCode = this.id.hashCode(); this.worldClaimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(this.world.getUID()); if (this.type == ClaimTypes.WILDERNESS) { @@ -3019,6 +3022,10 @@ public Context getOverrideClaimContext() { return this.overrideClaimContext; } + public Context getWorldContext() { + return this.worldContext; + } + @Override public Map getSchematics() { return this.schematics; diff --git a/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java b/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java index 9f5c22a..d57b72a 100644 --- a/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java +++ b/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java @@ -382,7 +382,9 @@ protected void showFlagPermissions(GDPermissionUser src, GDClaim claim, MenuType defaultContexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT); overrideContexts.add(ClaimContexts.WILDERNESS_OVERRIDE_CONTEXT); } + defaultContexts.add(claim.getWorldContext()); defaultContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); + overrideContexts.add(claim.getWorldContext()); overrideContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); overrideContexts.add(claim.getOverrideClaimContext()); @@ -622,6 +624,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD filteredContexts.addAll(flagData.getContexts()); Set newContexts = new HashSet<>(filteredContexts); newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); + newContexts.add(claim.getWorldContext()); newContexts.add(claim.getOverrideTypeContext()); newContexts.add(claim.getOverrideClaimContext()); Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); @@ -632,6 +635,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD // Check claim newContexts = new HashSet<>(filteredContexts); + newContexts.add(claim.getWorldContext()); newContexts.add(claim.getContext()); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); if (result != Tristate.UNDEFINED) { @@ -641,6 +645,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD // Check default newContexts = new HashSet<>(filteredContexts); + newContexts.add(claim.getWorldContext()); newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); newContexts.add(claim.getDefaultTypeContext()); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); diff --git a/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java b/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java index b9066b6..5b4640e 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java +++ b/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java @@ -213,6 +213,7 @@ public Tristate getFinalPermission(Event event, Location location, Set } contexts.addAll(sourceContexts); contexts.addAll(targetContexts); + contexts.add(((GDClaim) claim).getWorldContext()); this.eventContexts = contexts; this.eventPlayerData = playerData; @@ -374,6 +375,7 @@ private Tristate getFlagOverride(Claim claim, GDPermissionHolder permissionHolde player = permissionHolder instanceof GDPermissionUser ? ((GDPermissionUser) permissionHolder).getOnlinePlayer() : null; } + contexts.add(((GDClaim) claim).getWorldContext()); contexts.add(claim.getOverrideClaimContext()); contexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); contexts.addAll(this.eventContexts); diff --git a/bukkit/src/main/java/com/griefdefender/provider/LuckPermsProvider.java b/bukkit/src/main/java/com/griefdefender/provider/LuckPermsProvider.java index d2c4f7b..4777f42 100644 --- a/bukkit/src/main/java/com/griefdefender/provider/LuckPermsProvider.java +++ b/bukkit/src/main/java/com/griefdefender/provider/LuckPermsProvider.java @@ -358,29 +358,24 @@ public Map, Map> getPermanentPermissions(GDPermiss final ImmutableCollection nodes = permissionHolder.getNodes().values(); Map, Map> permanentPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map permissionEntry = permanentPermissionMap.get(contexts); if (permissionEntry == null) { permissionEntry = new HashMap<>(); @@ -402,29 +397,24 @@ public Map, Map> getTransientPermissions(GDPermiss final Set nodes = permissionHolder.getTransientPermissions(); Map, Map> transientPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map permissionEntry = transientPermissionMap.get(contexts); if (permissionEntry == null) { permissionEntry = new HashMap<>(); @@ -445,28 +435,23 @@ public Map, Map> getPermanentOptions(GDPermissionHo final ImmutableCollection nodes = permissionHolder.getNodes().values(); Map, Map> permanentPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (!node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map metaEntry = permanentPermissionMap.get(contexts); if (metaEntry == null) { metaEntry = new HashMap<>(); @@ -487,28 +472,23 @@ public Map, Map> getTransientOptions(GDPermissionHo final Set nodes = permissionHolder.getTransientPermissions(); Map, Map> permanentPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (!node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map metaEntry = permanentPermissionMap.get(contexts); if (metaEntry == null) { metaEntry = new HashMap<>(); diff --git a/sponge/src/main/java/com/griefdefender/claim/GDClaim.java b/sponge/src/main/java/com/griefdefender/claim/GDClaim.java index 0982268..9db78f4 100644 --- a/sponge/src/main/java/com/griefdefender/claim/GDClaim.java +++ b/sponge/src/main/java/com/griefdefender/claim/GDClaim.java @@ -133,6 +133,7 @@ public class GDClaim implements Claim { // Permission Context private final Context context; private final Context overrideClaimContext; + private final Context worldContext; private final org.spongepowered.api.service.context.Context spongeContext; private final org.spongepowered.api.service.context.Context spongeOverrideClaimContext; @@ -176,6 +177,7 @@ public GDClaim(World world, Vector3i point1, Vector3i point2, ClaimType type, UU this.type = type; this.id = UUID.randomUUID(); this.context = new Context("gd_claim", this.id.toString()); + this.worldContext = new Context(world.getContext().getKey(), world.getContext().getValue().toLowerCase()); this.overrideClaimContext = new Context("gd_claim_override", this.id.toString()); this.spongeContext = SpongeUtil.getSpongeContext(this.context); this.spongeOverrideClaimContext = SpongeUtil.getSpongeContext(this.overrideClaimContext); @@ -209,6 +211,7 @@ public GDClaim(World world, Vector3i lesserBoundaryCorner, Vector3i greaterBound this.type = type; this.cuboid = cuboid; this.context = new Context("gd_claim", this.id.toString()); + this.worldContext = new Context(world.getContext().getKey(), world.getContext().getValue().toLowerCase()); this.spongeContext = SpongeUtil.getSpongeContext(this.context); this.spongeOverrideClaimContext = SpongeUtil.getSpongeContext(this.overrideClaimContext); this.hashCode = this.id.hashCode(); @@ -3069,6 +3072,10 @@ public Context getOverrideClaimContext() { return this.overrideClaimContext; } + public Context getWorldContext() { + return this.worldContext; + } + public org.spongepowered.api.service.context.Context getSpongeOverrideTypeContext() { if (this.isAdminClaim()) { return SpongeContexts.ADMIN_OVERRIDE_CONTEXT; diff --git a/sponge/src/main/java/com/griefdefender/command/ClaimFlagBase.java b/sponge/src/main/java/com/griefdefender/command/ClaimFlagBase.java index affaefa..b0fb342 100644 --- a/sponge/src/main/java/com/griefdefender/command/ClaimFlagBase.java +++ b/sponge/src/main/java/com/griefdefender/command/ClaimFlagBase.java @@ -382,7 +382,9 @@ protected void showFlagPermissions(GDPermissionUser src, GDClaim claim, MenuType defaultContexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT); overrideContexts.add(ClaimContexts.WILDERNESS_OVERRIDE_CONTEXT); } + defaultContexts.add(claim.getWorldContext()); defaultContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); + overrideContexts.add(claim.getWorldContext()); overrideContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); overrideContexts.add(claim.getOverrideClaimContext()); @@ -622,6 +624,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD filteredContexts.addAll(flagData.getContexts()); Set newContexts = new HashSet<>(filteredContexts); newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); + newContexts.add(claim.getWorldContext()); newContexts.add(claim.getOverrideTypeContext()); newContexts.add(claim.getOverrideClaimContext()); Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); @@ -632,6 +635,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD // Check claim newContexts = new HashSet<>(filteredContexts); + newContexts.add(claim.getWorldContext()); newContexts.add(claim.getContext()); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); if (result != Tristate.UNDEFINED) { @@ -641,6 +645,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD // Check default newContexts = new HashSet<>(filteredContexts); + newContexts.add(claim.getWorldContext()); newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); newContexts.add(claim.getDefaultTypeContext()); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); diff --git a/sponge/src/main/java/com/griefdefender/listener/EntityEventHandler.java b/sponge/src/main/java/com/griefdefender/listener/EntityEventHandler.java index 0a62ab1..c4372fb 100644 --- a/sponge/src/main/java/com/griefdefender/listener/EntityEventHandler.java +++ b/sponge/src/main/java/com/griefdefender/listener/EntityEventHandler.java @@ -350,6 +350,10 @@ public boolean test(Entity entity) { if (GriefDefenderPlugin.isTargetIdBlacklisted(Flags.ENTITY_CHUNK_SPAWN.getName(), entity, world.getProperties())) { return true; } + // Always allow item frames in chunks to spawn + if (entity instanceof ItemFrame) { + return true; + } permission = GDPermissions.ENTITY_CHUNK_SPAWN; } diff --git a/sponge/src/main/java/com/griefdefender/permission/GDPermissionManager.java b/sponge/src/main/java/com/griefdefender/permission/GDPermissionManager.java index b5bce58..257c3b7 100644 --- a/sponge/src/main/java/com/griefdefender/permission/GDPermissionManager.java +++ b/sponge/src/main/java/com/griefdefender/permission/GDPermissionManager.java @@ -272,6 +272,7 @@ public Tristate getFinalPermission(Event event, Location location, Set, Map> getPermanentPermissions(GDPermiss final ImmutableCollection nodes = permissionHolder.getNodes().values(); Map, Map> permanentPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map permissionEntry = permanentPermissionMap.get(contexts); if (permissionEntry == null) { permissionEntry = new HashMap<>(); @@ -397,29 +392,24 @@ public Map, Map> getTransientPermissions(GDPermiss final Set nodes = permissionHolder.getTransientPermissions(); Map, Map> transientPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map permissionEntry = transientPermissionMap.get(contexts); if (permissionEntry == null) { permissionEntry = new HashMap<>(); @@ -440,28 +430,23 @@ public Map, Map> getPermanentOptions(GDPermissionHo final ImmutableCollection nodes = permissionHolder.getNodes().values(); Map, Map> permanentPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (!node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map metaEntry = permanentPermissionMap.get(contexts); if (metaEntry == null) { metaEntry = new HashMap<>(); @@ -482,28 +467,23 @@ public Map, Map> getTransientOptions(GDPermissionHo final Set nodes = permissionHolder.getTransientPermissions(); Map, Map> permanentPermissionMap = new TreeMap, Map>(CONTEXT_COMPARATOR); - Map> contextMap = new HashMap<>(); for (Node node : nodes) { if (!node.isMeta()) { continue; } String serverName = node.getServer().orElse(null); + final String worldName = node.getWorld().orElse(null); if (serverName != null && serverName.equalsIgnoreCase("global")) { serverName = null; } - Set contexts = null; - if (contextMap.get(node.getContexts()) == null) { - contexts = getGPContexts(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } - contextMap.put(node.getContexts(), contexts); - } else { - contexts = contextMap.get(node.getContexts()); - if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { - contexts.add(new Context("server", serverName)); - } + Set contexts = getGPContexts(node.getContexts()); + if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { + contexts.add(new Context("server", serverName)); } + if (worldName != null) { + contexts.add(new Context("world", worldName.toLowerCase())); + } + Map metaEntry = permanentPermissionMap.get(contexts); if (metaEntry == null) { metaEntry = new HashMap<>();