diff --git a/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java b/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java index a79f661..882fd78 100644 --- a/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java +++ b/bukkit/src/main/java/com/griefdefender/command/ClaimFlagBase.java @@ -56,6 +56,7 @@ import com.griefdefender.permission.GDPermissionUser; import com.griefdefender.permission.GDPermissions; import com.griefdefender.permission.flag.CustomFlagData; +import com.griefdefender.permission.flag.GDActiveFlagData; import com.griefdefender.permission.flag.GDCustomFlagDefinition; import com.griefdefender.permission.ui.ClaimClickData; import com.griefdefender.permission.ui.FlagData; @@ -160,8 +161,20 @@ public void execute(Player player, String[] args) throws InvalidCommandArgument if (claim != null) { if (flag == null && value == null && player.hasPermission(GDPermissions.COMMAND_LIST_CLAIM_FLAGS)) { - final String defaultTab = GriefDefenderPlugin.getGlobalConfig().getConfig().customFlags.getGroups().keySet().stream().findFirst().orElse(null); - showCustomFlags(src, claim, defaultTab); + String defaultGroup = ""; + for (Entry groupEntry : GriefDefenderPlugin.getGlobalConfig().getConfig().customFlags.getGroups().entrySet()) { + final String permission = groupEntry.getValue().isAdminGroup() ? GDPermissions.FLAG_CUSTOM_ADMIN_BASE : GDPermissions.FLAG_CUSTOM_USER_BASE; + if (!player.hasPermission(permission + "." + groupEntry.getKey()) && !src.getInternalPlayerData().canIgnoreClaim(claim)) { + continue; + } + defaultGroup = groupEntry.getKey(); + break; + } + if (!defaultGroup.isEmpty()) { + showCustomFlags(src, claim, defaultGroup); + } else { + TextAdapter.sendComponent(player, MessageCache.getInstance().PERMISSION_FLAG_USE); + } return; } else if (flag != null && value != null) { GDCauseStackManager.getInstance().pushCause(player); @@ -497,13 +510,63 @@ private void addFilteredContexts(Map filteredContextMap, Set contexts) { boolean customContext = UIHelper.containsCustomContext(contexts); @@ -515,42 +578,84 @@ private Component getFlagText(Flag flag, Set contexts) { } private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GDCustomFlagDefinition customFlag, String flagGroup) { - Component hoverEventText = TextComponent.empty(); + boolean hasHover = false; + TextComponent.Builder hoverBuilder = TextComponent.builder(); final Player player = src.getOnlinePlayer(); boolean hasEditPermission = true; Component denyReason = claim.allowEdit(player); if (denyReason != null) { - hoverEventText = denyReason; + hoverBuilder.append(denyReason).append("\n"); hasEditPermission = false; + hasHover = true; } final boolean isAdminGroup = GriefDefenderPlugin.getGlobalConfig().getConfig().customFlags.getGroups().get(flagGroup).isAdminGroup(); final String permission = isAdminGroup ? GDPermissions.FLAG_CUSTOM_ADMIN_BASE : GDPermissions.FLAG_CUSTOM_USER_BASE; // check flag perm if (!player.hasPermission(permission + "." + flagGroup + "." + customFlag.getDisplayName())) { - hoverEventText = MessageCache.getInstance().PERMISSION_FLAG_USE; + hoverBuilder.append(MessageCache.getInstance().PERMISSION_FLAG_USE).append("\n"); hasEditPermission = false; + hasHover = true; } - Map dataResults = new HashMap<>(); + List dataResults = new ArrayList<>(); + boolean hasGDContext = false; + Set definitionContexts = new HashSet<>(customFlag.getDefinitionContexts()); + for (Context context : customFlag.getDefinitionContexts()) { + if (context.getKey().contains("gd_claim")) { + hasGDContext = true; + break; + } + } + if (!hasGDContext) { + definitionContexts.add(claim.getContext()); + } for (CustomFlagData flagData : customFlag.getFlagData()) { - Set newContexts = new HashSet<>(flagData.getContexts()); - boolean hasGDContext = false; - for (Context context : newContexts) { + final Set filteredContexts = new HashSet<>(); + for (Context context : definitionContexts) { if (context.getKey().contains("gd_claim")) { - hasGDContext = true; - break; + continue; } + + filteredContexts.add(context); } - if (!hasGDContext) { - newContexts.add(claim.getContext()); + + // Check override + filteredContexts.addAll(flagData.getContexts()); + Set newContexts = new HashSet<>(filteredContexts); + newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); + newContexts.add(claim.getOverrideTypeContext()); + newContexts.add(claim.getOverrideClaimContext()); + Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); + if (result != Tristate.UNDEFINED) { + dataResults.add(new GDActiveFlagData(flagData, result, GDActiveFlagData.Type.OVERRIDE)); + continue; } - Tristate result = PermissionUtil.getInstance().getPermissionValue(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts); - dataResults.put(flagData, result); + + // Check claim + newContexts = new HashSet<>(filteredContexts); + newContexts.add(claim.getContext()); + result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); + if (result != Tristate.UNDEFINED) { + dataResults.add(new GDActiveFlagData(flagData, result, GDActiveFlagData.Type.CLAIM)); + continue; + } + + // Check default + newContexts = new HashSet<>(filteredContexts); + newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); + newContexts.add(claim.getDefaultTypeContext()); + result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); + if (result != Tristate.UNDEFINED) { + dataResults.add(new GDActiveFlagData(flagData, result, GDActiveFlagData.Type.DEFAULT)); + continue; + } + dataResults.add(new GDActiveFlagData(flagData, result, GDActiveFlagData.Type.UNDEFINED)); } boolean properResult = true; Tristate lastResult = null; - for (Tristate result : dataResults.values()) { + for (GDActiveFlagData activeFlagData : dataResults) { + final Tristate result = activeFlagData.getValue(); if (lastResult == null) { lastResult = result; } else if (lastResult != result) { @@ -561,12 +666,15 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD TextComponent.Builder valueBuilder = TextComponent.builder(); if (!properResult) { - TextComponent.Builder hoverBuilder = TextComponent.builder(); - for (Map.Entry entry : dataResults.entrySet()) { - hoverBuilder.append(entry.getKey().getCustomPermission() + " (" + entry.getValue() + ")\n"); + if (hasEditPermission) { + hoverBuilder.append("Active Data : \n"); + for (GDActiveFlagData activeFlagData : dataResults) { + hoverBuilder.append(activeFlagData.getComponent()) + .append("\n"); + } + hasHover = true; } - valueBuilder.append("partial") - .hoverEvent(HoverEvent.showText(hoverBuilder.build())); + valueBuilder.append("partial"); lastResult = null; } else { TextColor valueColor = TextColor.GRAY; @@ -575,8 +683,43 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD } else if (lastResult == Tristate.FALSE) { valueColor = TextColor.RED; } - valueBuilder - .append(String.valueOf(lastResult).toLowerCase(), valueColor); + valueBuilder.append(String.valueOf(lastResult).toLowerCase(), valueColor); + } + + if (hasEditPermission) { + if (lastResult == null || lastResult == Tristate.UNDEFINED) { + hoverBuilder.append(MessageCache.getInstance().FLAG_UI_CLICK_ALLOW); + } else if (lastResult == Tristate.TRUE) { + hoverBuilder.append(MessageCache.getInstance().FLAG_UI_CLICK_DENY); + } else { + hoverBuilder.append(MessageCache.getInstance().FLAG_UI_CLICK_REMOVE); + } + + if (!customFlag.getDefinitionContexts().isEmpty()) { + hoverBuilder.append("\nContexts: "); + } + + for (Context context : customFlag.getDefinitionContexts()) { + hoverBuilder.append("\n"); + final String key = context.getKey(); + final String value = context.getValue(); + TextColor keyColor = TextColor.AQUA; + if (key.contains("default")) { + keyColor = TextColor.LIGHT_PURPLE; + } else if (key.contains("override")) { + keyColor = TextColor.RED; + } else if (key.contains("server")) { + keyColor = TextColor.GRAY; + } + hoverBuilder.append(key, keyColor) + .append("=", TextColor.WHITE) + .append(value.replace("minecraft:", ""), TextColor.GRAY); + } + hasHover = true; + } + + if (hasHover) { + valueBuilder.hoverEvent(HoverEvent.showText(hoverBuilder.build())); } TextComponent.Builder textBuilder = null; if (hasEditPermission) { @@ -587,7 +730,6 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD } else { textBuilder = TextComponent.builder() .append(valueBuilder - .hoverEvent(HoverEvent.showText(hoverEventText)) .build()); } @@ -728,32 +870,37 @@ private Consumer createCustomFlagConsumer(GDPermissionUser src, G final Player player = src.getOnlinePlayer(); return consumer -> { GDCauseStackManager.getInstance().pushCause(player); + boolean hasGDContext = false; + Set definitionContexts = new HashSet<>(customFlag.getDefinitionContexts()); + for (Context context : customFlag.getDefinitionContexts()) { + if (context.getKey().contains("gd_claim")) { + hasGDContext = true; + break; + } + } + if (!hasGDContext) { + definitionContexts.add(claim.getContext()); + } for (CustomFlagData flagData : customFlag.getFlagData()) { - final Set contexts = flagData.getContexts(); + final Set newContexts = new HashSet<>(definitionContexts); + newContexts.addAll(flagData.getContexts()); Tristate newValue = Tristate.UNDEFINED; if (currentValue == null || currentValue == Tristate.UNDEFINED) { - newValue = Tristate.FALSE; - } else if (currentValue == Tristate.FALSE) { newValue = Tristate.TRUE; + } else if (currentValue == Tristate.TRUE) { + newValue = Tristate.FALSE; } else { newValue = Tristate.UNDEFINED; } PermissionResult result = null; for (Flag flag : customFlag.getFlags()) { - GDFlagPermissionEvent.Set event = new GDFlagPermissionEvent.Set(this.subject, flagData.getFlag(), newValue, contexts); + GDFlagPermissionEvent.Set event = new GDFlagPermissionEvent.Set(this.subject, flagData.getFlag(), newValue, newContexts); GriefDefender.getEventManager().post(event); if (event.cancelled()) { return; } - - final Set newContexts = new HashSet<>(); - for (Context context : flagData.getContexts()) { - if (!context.getKey().contains("gd_claim")) { - newContexts.add(context); - } - } - newContexts.add(claim.getContext()); + result = GriefDefenderPlugin.getInstance().getPermissionProvider().setPermissionValue(GriefDefenderPlugin.DEFAULT_HOLDER, flag, newValue, newContexts); } } diff --git a/bukkit/src/main/java/com/griefdefender/command/ClaimOptionBase.java b/bukkit/src/main/java/com/griefdefender/command/ClaimOptionBase.java index 71ac083..3a8ceea 100644 --- a/bukkit/src/main/java/com/griefdefender/command/ClaimOptionBase.java +++ b/bukkit/src/main/java/com/griefdefender/command/ClaimOptionBase.java @@ -156,11 +156,9 @@ public void execute(Player player, String[] args) throws InvalidCommandArgument GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().PERMISSION_GLOBAL_OPTION); return; } - } else { - if (!player.hasPermission(GDPermissions.USER_CLAIM_OPTIONS +"." + option.getPermission().toLowerCase())) { - GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().PERMISSION_PLAYER_OPTION); - return; - } + } else if (!player.hasPermission(GDPermissions.USER_CLAIM_OPTIONS +"." + option.getPermission().toLowerCase())) { + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().PERMISSION_PLAYER_OPTION); + return; } } @@ -361,8 +359,10 @@ protected void showOptionPermissions(GDPermissionUser src, GDClaim claim, MenuTy this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue()); } if (displayType != MenuType.DEFAULT) { - if (contextSet.contains(claim.getContext())) { - this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue()); + if (claim.isTown() || isAdmin) { + if (contextSet.contains(claim.getContext())) { + this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue()); + } } if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT)) { this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue()); @@ -393,13 +393,13 @@ protected void showOptionPermissions(GDPermissionUser src, GDClaim claim, MenuTy for (Entry mapEntry : filteredContextMap.entrySet()) { final OptionData optionData = mapEntry.getValue(); final Option option = optionData.option; + if (option.getName().contains("tax") && !GriefDefenderPlugin.getGlobalConfig().getConfig().claim.bankTaxSystem) { + continue; + } for (OptionContextHolder optionHolder : optionData.optionContextMap.values()) { if (displayType != MenuType.CLAIM && optionHolder.getType() != displayType) { continue; } - if (option.getName().contains("tax") && !GriefDefenderPlugin.getGlobalConfig().getConfig().claim.bankTaxSystem) { - continue; - } final Set contexts = optionHolder.getAllContexts(); Component optionText = getClickableOptionComponent(src, claim, option, optionHolder, contexts, displayType); diff --git a/bukkit/src/main/java/com/griefdefender/command/CommandClaimInfo.java b/bukkit/src/main/java/com/griefdefender/command/CommandClaimInfo.java index a095f58..c469625 100644 --- a/bukkit/src/main/java/com/griefdefender/command/CommandClaimInfo.java +++ b/bukkit/src/main/java/com/griefdefender/command/CommandClaimInfo.java @@ -180,25 +180,25 @@ public void execute(CommandSender src, String[] args) { claim = claim.getTown().get(); } - final GDClaim gpClaim = (GDClaim) claim; + final GDClaim gdClaim = (GDClaim) claim; final GDPermissionUser owner = PermissionHolderCache.getInstance().getOrCreateUser(claim.getOwnerUniqueId()); final UUID ownerUniqueId = claim.getOwnerUniqueId(); if (!isAdmin) { - isAdmin = playerData.canIgnoreClaim(gpClaim); + isAdmin = playerData.canIgnoreClaim(gdClaim); } // if not owner of claim, validate perms if (!isAdmin && !player.getUniqueId().equals(claim.getOwnerUniqueId())) { - if (!gpClaim.getInternalClaimData().getContainers().contains(player.getUniqueId()) - && !gpClaim.getInternalClaimData().getBuilders().contains(player.getUniqueId()) - && !gpClaim.getInternalClaimData().getManagers().contains(player.getUniqueId()) + if (!gdClaim.getInternalClaimData().getContainers().contains(player.getUniqueId()) + && !gdClaim.getInternalClaimData().getBuilders().contains(player.getUniqueId()) + && !gdClaim.getInternalClaimData().getManagers().contains(player.getUniqueId()) && !player.hasPermission(GDPermissions.COMMAND_CLAIM_INFO_OTHERS)) { TextAdapter.sendComponent(player, MessageCache.getInstance().CLAIM_NOT_YOURS); return; } } - final Component allowEdit = gpClaim.allowEdit(player); + final Component allowEdit = gdClaim.allowEdit(player); List textList = new ArrayList<>(); Component name = claim.getName().orElse(null); @@ -213,15 +213,16 @@ public void execute(CommandSender src, String[] args) { String containerGroups = ""; String managerGroups = ""; - final int minClaimLevel = gpClaim.getOwnerMinClaimLevel(); - double claimY = gpClaim.getOwnerPlayerData() == null ? 65.0D : (minClaimLevel > 65.0D ? minClaimLevel : 65); - if (gpClaim.isCuboid()) { - claimY = gpClaim.lesserBoundaryCorner.getY(); + final int minClaimLevel = gdClaim.getOwnerMinClaimLevel(); + double claimY = gdClaim.getOwnerPlayerData() == null ? 65.0D : (minClaimLevel > 65.0D ? minClaimLevel : 65); + if (gdClaim.isCuboid()) { + claimY = gdClaim.lesserBoundaryCorner.getY(); } - Location southWest = new Location(gpClaim.getWorld(), gpClaim.lesserBoundaryCorner.getX(), claimY, gpClaim.greaterBoundaryCorner.getZ()); - Location northWest = new Location(gpClaim.getWorld(), gpClaim.lesserBoundaryCorner.getX(), claimY, gpClaim.lesserBoundaryCorner.getZ()); - Location southEast = new Location(gpClaim.getWorld(), gpClaim.greaterBoundaryCorner.getX(), claimY, gpClaim.greaterBoundaryCorner.getZ()); - Location northEast = new Location(gpClaim.getWorld(), gpClaim.greaterBoundaryCorner.getX(), claimY, gpClaim.lesserBoundaryCorner.getZ()); + + Location southWest = new Location(gdClaim.getWorld(), gdClaim.lesserBoundaryCorner.getX(), claimY, gdClaim.greaterBoundaryCorner.getZ()); + Location northWest = new Location(gdClaim.getWorld(), gdClaim.lesserBoundaryCorner.getX(), claimY, gdClaim.lesserBoundaryCorner.getZ()); + Location southEast = new Location(gdClaim.getWorld(), gdClaim.greaterBoundaryCorner.getX(), claimY, gdClaim.greaterBoundaryCorner.getZ()); + Location northEast = new Location(gdClaim.getWorld(), gdClaim.greaterBoundaryCorner.getX(), claimY, gdClaim.lesserBoundaryCorner.getZ()); // String southWestCorner = Date created = null; Date lastActive = null; @@ -268,7 +269,7 @@ public void execute(CommandSender src, String[] args) { Component worldName = TextComponent.builder() .append(MessageCache.getInstance().LABEL_WORLD.color(TextColor.YELLOW)) .append(" : ") - .append(gpClaim.getWorld().getName(), TextColor.GRAY).build(); + .append(gdClaim.getWorld().getName(), TextColor.GRAY).build(); if (!claim.isWilderness() && !claim.isAdminClaim()) { claimName = TextComponent.builder() .append(claimName) @@ -278,10 +279,10 @@ public void execute(CommandSender src, String[] args) { .append(claimCost).build(); } // users - final List accessorList = gpClaim.getUserTrustList(TrustTypes.ACCESSOR, true); - final List builderList = gpClaim.getUserTrustList(TrustTypes.BUILDER, true); - final List containerList = gpClaim.getUserTrustList(TrustTypes.CONTAINER, true); - final List managerList = gpClaim.getUserTrustList(TrustTypes.MANAGER, true); + final List accessorList = gdClaim.getUserTrustList(TrustTypes.ACCESSOR, true); + final List builderList = gdClaim.getUserTrustList(TrustTypes.BUILDER, true); + final List containerList = gdClaim.getUserTrustList(TrustTypes.CONTAINER, true); + final List managerList = gdClaim.getUserTrustList(TrustTypes.MANAGER, true); for (UUID uuid : accessorList) { final GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(uuid); final String userName = user.getFriendlyName(); @@ -312,16 +313,16 @@ public void execute(CommandSender src, String[] args) { } // groups - for (String group : gpClaim.getGroupTrustList(TrustTypes.ACCESSOR, true)) { + for (String group : gdClaim.getGroupTrustList(TrustTypes.ACCESSOR, true)) { accessorGroups += group + " "; } - for (String group : gpClaim.getGroupTrustList(TrustTypes.BUILDER, true)) { + for (String group : gdClaim.getGroupTrustList(TrustTypes.BUILDER, true)) { builderGroups += group + " "; } - for (String group : gpClaim.getGroupTrustList(TrustTypes.CONTAINER, true)) { + for (String group : gdClaim.getGroupTrustList(TrustTypes.CONTAINER, true)) { containerGroups += group + " "; } - for (String group : gpClaim.getGroupTrustList(TrustTypes.MANAGER, true)) { + for (String group : gdClaim.getGroupTrustList(TrustTypes.MANAGER, true)) { managerGroups += group + " "; } @@ -347,7 +348,7 @@ public void execute(CommandSender src, String[] args) { if (isAdmin) { Component adminSettings = TextComponent.builder() .append(MessageCache.getInstance().CLAIMINFO_UI_ADMIN_SETTINGS).decoration(TextDecoration.ITALIC, true).color(TextColor.RED) - .clickEvent(ClickEvent.runCommand(GDCallbackHolder.getInstance().createCallbackRunCommand(createSettingsConsumer(src, claim, generateAdminSettings(src, gpClaim), ClaimTypes.ADMIN)))) + .clickEvent(ClickEvent.runCommand(GDCallbackHolder.getInstance().createCallbackRunCommand(createSettingsConsumer(src, claim, generateAdminSettings(src, gdClaim), ClaimTypes.ADMIN)))) .hoverEvent(HoverEvent.showText(MessageCache.getInstance().CLAIMINFO_UI_CLICK_ADMIN)) .build(); textList.add(adminSettings); @@ -356,11 +357,11 @@ public void execute(CommandSender src, String[] args) { Component bankInfo = null; Component forSaleText = null; if (GriefDefenderPlugin.getInstance().getVaultProvider() != null) { - if (GriefDefenderPlugin.getActiveConfig(gpClaim.getWorld().getUID()).getConfig().claim.bankTaxSystem) { + if (GriefDefenderPlugin.getActiveConfig(gdClaim.getWorld().getUID()).getConfig().claim.bankTaxSystem) { bankInfo = TextComponent.builder() .append(MessageCache.getInstance().CLAIMINFO_UI_BANK_INFO.color(TextColor.GOLD).decoration(TextDecoration.ITALIC, true)) .hoverEvent(HoverEvent.showText(MessageCache.getInstance().CLAIMINFO_UI_BANK_INFO)) - .clickEvent(ClickEvent.runCommand(GDCallbackHolder.getInstance().createCallbackRunCommand(Consumer -> { CommandHelper.displayClaimBankInfo(src, gpClaim, gpClaim.isTown() ? true : false, true); }))) + .clickEvent(ClickEvent.runCommand(GDCallbackHolder.getInstance().createCallbackRunCommand(Consumer -> { CommandHelper.displayClaimBankInfo(src, gdClaim, gdClaim.isTown() ? true : false, true); }))) .build(); } forSaleText = TextComponent.builder() @@ -398,7 +399,7 @@ public void execute(CommandSender src, String[] args) { final Component whiteCloseBracket = TextComponent.of("]"); Component defaultTypeText = TextComponent.builder() .append(whiteOpenBracket) - .append(gpClaim.getFriendlyNameType(true)) + .append(gdClaim.getFriendlyNameType(true)) .append(whiteCloseBracket).build(); if (allowEdit != null && !isAdmin) { adminShowText = allowEdit; @@ -546,11 +547,11 @@ public void execute(CommandSender src, String[] args) { Component claimRaid = TextComponent.builder() .append("Raid", TextColor.YELLOW) .append(" : ") - .append(getClickableInfoText(src, claim, RAID_OVERRIDE, GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), owner, Options.RAID, gpClaim) == true ? TextComponent.of("ON", TextColor.GREEN) : TextComponent.of("OFF", TextColor.RED))).build(); + .append(getClickableInfoText(src, claim, RAID_OVERRIDE, GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), owner, Options.RAID, gdClaim) == true ? TextComponent.of("ON", TextColor.GREEN) : TextComponent.of("OFF", TextColor.RED))).build(); Component claimSpawn = null; if (claim.getData().getSpawnPos().isPresent()) { Vector3i spawnPos = claim.getData().getSpawnPos().get(); - Location spawnLoc = new Location(gpClaim.getWorld(), spawnPos.getX(), spawnPos.getY(), spawnPos.getZ()); + Location spawnLoc = new Location(gdClaim.getWorld(), spawnPos.getX(), spawnPos.getY(), spawnPos.getZ()); claimSpawn = TextComponent.builder() .append(MessageCache.getInstance().LABEL_SPAWN.color(TextColor.GREEN)) .append(" : ") @@ -578,7 +579,7 @@ public void execute(CommandSender src, String[] args) { ImmutableMap.of("direction", TextComponent.of("SE").color(TextColor.AQUA))))) .build(); Component southCorners = TextComponent.builder() - .append("SouthCorners", TextColor.YELLOW) + .append(MessageCache.getInstance().CLAIMINFO_UI_SOUTH_CORNERS.color(TextColor.YELLOW)) .append(" : ") .append(southWestCorner) .append(southEastCorner).build(); @@ -632,7 +633,7 @@ public void execute(CommandSender src, String[] args) { Component dateCreated = TextComponent.builder() .append(MessageCache.getInstance().LABEL_CREATED.color(TextColor.YELLOW)) .append(" : ") - .append(created != null ? created.toString() : "Unknown", TextColor.GRAY).build(); + .append(created != null ? TextComponent.of(created.toString(), TextColor.GRAY) : MessageCache.getInstance().LABEL_UNKNOWN.color(TextColor.GRAY)).build(); Component dateLastActive = TextComponent.builder() .append(MessageCache.getInstance().CLAIMINFO_UI_LAST_ACTIVE.color(TextColor.YELLOW)) .append(" : ") diff --git a/bukkit/src/main/java/com/griefdefender/configuration/category/CustomFlagGroupDefinitionCategory.java b/bukkit/src/main/java/com/griefdefender/configuration/category/CustomFlagGroupDefinitionCategory.java index d037de4..66a4d56 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/category/CustomFlagGroupDefinitionCategory.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/category/CustomFlagGroupDefinitionCategory.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.Map; +import com.griefdefender.api.claim.ClaimContexts; import com.griefdefender.permission.flag.GDCustomFlagDefinition; import com.griefdefender.permission.flag.GDCustomFlagTypes; @@ -60,6 +61,7 @@ public void initDefaults() { } if (adminGroup.isEnabled() && adminGroup.getFlagDefinitions().isEmpty()) { for (GDCustomFlagDefinition definition : GDCustomFlagTypes.ADMIN_FLAGS) { + definition.getDefinitionContexts().add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); adminGroup.getFlagDefinitions().put(definition.getDisplayName(), definition); } adminGroup.isAdmin = true; diff --git a/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultPermissionCategory.java b/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultPermissionCategory.java index e29256f..cdc5505 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultPermissionCategory.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultPermissionCategory.java @@ -93,18 +93,31 @@ public DefaultPermissionCategory() { this.defaultUserOptions.put(Options.PLAYER_WALK_SPEED.getName(), "-1"); this.defaultUserOptions.put(Options.PLAYER_WEATHER.getName(), "undefined"); - //this.defaultTownOptions.put(Options.ABANDON_RETURN_RATIO.getName(), "1.0"); - this.defaultTownOptions.put(Options.CREATE_LIMIT.getName(), "-1"); - this.defaultTownOptions.put(Options.MIN_LEVEL.getName(), "-1"); + this.defaultBasicOptions.put(Options.MIN_SIZE_X.getName(), "5"); + this.defaultBasicOptions.put(Options.MIN_SIZE_Y.getName(), "5"); + this.defaultBasicOptions.put(Options.MIN_SIZE_Z.getName(), "5"); + this.defaultBasicOptions.put(Options.MAX_SIZE_X.getName(), "0"); + this.defaultBasicOptions.put(Options.MAX_SIZE_Y.getName(), "256"); + this.defaultBasicOptions.put(Options.MAX_SIZE_Z.getName(), "0"); + + this.defaultSubdivisionOptions.put(Options.MIN_SIZE_X.getName(), "1"); + this.defaultSubdivisionOptions.put(Options.MIN_SIZE_Y.getName(), "1"); + this.defaultSubdivisionOptions.put(Options.MIN_SIZE_Z.getName(), "1"); + this.defaultSubdivisionOptions.put(Options.MAX_SIZE_X.getName(), "1000"); + this.defaultSubdivisionOptions.put(Options.MAX_SIZE_Y.getName(), "256"); + this.defaultSubdivisionOptions.put(Options.MAX_SIZE_Z.getName(), "1000"); + + this.defaultTownOptions.put(Options.CREATE_LIMIT.getName(), "1"); + this.defaultTownOptions.put(Options.MIN_LEVEL.getName(), "0"); this.defaultTownOptions.put(Options.MIN_SIZE_X.getName(), "32"); this.defaultTownOptions.put(Options.MIN_SIZE_Y.getName(), "32"); this.defaultTownOptions.put(Options.MIN_SIZE_Z.getName(), "32"); - this.defaultTownOptions.put(Options.MAX_LEVEL.getName(), "-1"); - this.defaultTownOptions.put(Options.MAX_SIZE_X.getName(), "-1"); - this.defaultTownOptions.put(Options.MAX_SIZE_Y.getName(), "-1"); - this.defaultTownOptions.put(Options.MAX_SIZE_Z.getName(), "-1"); - this.defaultTownOptions.put(Options.TAX_EXPIRATION.getName(), "-1"); - this.defaultTownOptions.put(Options.TAX_EXPIRATION_DAYS_KEEP.getName(), "-1"); + this.defaultTownOptions.put(Options.MAX_LEVEL.getName(), "255"); + this.defaultTownOptions.put(Options.MAX_SIZE_X.getName(), "0"); + this.defaultTownOptions.put(Options.MAX_SIZE_Y.getName(), "256"); + this.defaultTownOptions.put(Options.MAX_SIZE_Z.getName(), "0"); + this.defaultTownOptions.put(Options.TAX_EXPIRATION.getName(), "7"); + this.defaultTownOptions.put(Options.TAX_EXPIRATION_DAYS_KEEP.getName(), "7"); this.defaultTownOptions.put(Options.TAX_RATE.getName(), "1.0"); } diff --git a/bukkit/src/main/java/com/griefdefender/configuration/category/MessageCategory.java b/bukkit/src/main/java/com/griefdefender/configuration/category/MessageCategory.java index f4f487f..ad89e9d 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/category/MessageCategory.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/category/MessageCategory.java @@ -31,7 +31,7 @@ public class MessageCategory extends ConfigCategory { @Setting(value = "locale", comment = "Set the locale to use for GD messages. (Default: en_US)\n" + - "Available languages: en_US, de_DE, fr_FR, ru_RU, zh_CN. The data is stored under assets in jar.\n" + + "Available languages: en_US, fr_FR, ru_RU. The data is stored under assets in jar.\n" + "Note: The language code must be lowercase and the country code must be uppercase.") public String locale = "en_US"; diff --git a/bukkit/src/main/java/com/griefdefender/configuration/serializer/CustomFlagSerializer.java b/bukkit/src/main/java/com/griefdefender/configuration/serializer/CustomFlagSerializer.java index 18952d7..a0808ad 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/serializer/CustomFlagSerializer.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/serializer/CustomFlagSerializer.java @@ -47,26 +47,22 @@ public class CustomFlagSerializer implements TypeSerializer { - private static final String INVALID_GD_CONTEXT = "Invalid 'gd-context' specified." - + "\nAccepted values are : " - + "\ngd_claim:" - + "\ngd_claim_default:" - + "\ngd_claim_override:|"; - //private static final Pattern DATA_PATTERN = Pattern.compile("^?\\[ *((?:[\\w.-]+=[\\#\\w.-]+(?::[\\#\\w\\/.-]+)? *(?:, *(?!\\]$)|(?=\\]$)))+) *\\]$"); - //private static final Pattern DATA_PATTERN = Pattern.compile("^?\\( *((?:[\\w.-]+=[\\w.-]+(?::[\\w\\/.-]+)? *(?:, *(?!\\)$)|(?=\\)$)))+) *\\)$"); - @Override public GDCustomFlagDefinition deserialize(TypeToken type, ConfigurationNode node) throws ObjectMappingException { final String flagDisplayName = node.getKey().toString(); final boolean enabled = node.getNode("enabled").getBoolean(); - final String gdContext = node.getNode("gd-context").getString(); final String descr = node.getNode("description").getString(); Component description = TextComponent.empty(); if (descr != null) { description = LegacyComponentSerializer.legacy().deserialize(descr, '&'); } + List contextList = node.getNode("contexts").getList(TypeToken.of(String.class)); List permissionList = node.getNode("permissions").getList(TypeToken.of(String.class)); + if (permissionList == null) { + throw new ObjectMappingException("No permissions found for flag definition '" + flagDisplayName + "'. You must specify at least 1 or more permissions."); + } + List flagDataList = new ArrayList<>(); for (String permissionEntry : permissionList) { String permission = permissionEntry.replace(" ", ""); @@ -114,44 +110,42 @@ public GDCustomFlagDefinition deserialize(TypeToken type, ConfigurationNode n } final GDCustomFlagDefinition flagDefinition = new GDCustomFlagDefinition(flagDataList, flagDisplayName, description); flagDefinition.setIsEnabled(enabled); - if (gdContext != null) { - final String parts[] = gdContext.split(":"); - if (parts.length <= 1) { - throw new ObjectMappingException(INVALID_GD_CONTEXT); - } - final String key = parts[0]; - final String value = parts[1]; - switch (key) { - case "gd_claim" : - UUID uuid = null; - try { - uuid = UUID.fromString(value); - } catch (IllegalArgumentException e) { - throw new ObjectMappingException(INVALID_GD_CONTEXT); - } - break; - case "gd_claim_default" : + Set contexts = new HashSet<>(); + if (contextList != null) { + for (String context : contextList) { + final String parts[] = context.split("="); + if (parts.length <= 1) { + throw new ObjectMappingException("Invalid context '" + context + "' for flag definition '" + flagDisplayName + "'. Skipping..."); + } + final String key = parts[0]; + final String value = parts[1]; + if (key.equalsIgnoreCase("default") || key.equalsIgnoreCase("gd_claim_default")) { if (!value.equalsIgnoreCase("global") && !value.equalsIgnoreCase("basic") && !value.equalsIgnoreCase("admin") && !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town")) { - throw new ObjectMappingException(INVALID_GD_CONTEXT); + throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'."); } - break; - case "gd_claim_override" : + contexts.add(new Context("gd_claim_default", value)); + } else if (key.equalsIgnoreCase("override") || key.equalsIgnoreCase("gd_claim_override")) { if (!value.equalsIgnoreCase("global") && !value.equalsIgnoreCase("basic") && !value.equalsIgnoreCase("admin") && !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town")) { // try UUID - uuid = null; - try { - uuid = UUID.fromString(value); - } catch (IllegalArgumentException e) { - throw new ObjectMappingException(INVALID_GD_CONTEXT); + if (value.length() == 36) { + UUID uuid = null; + try { + uuid = UUID.fromString(value); + } catch (IllegalArgumentException e) { + throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'."); + } + } else { + throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'."); } } - break; - default : - throw new ObjectMappingException(INVALID_GD_CONTEXT); + contexts.add(new Context("gd_claim_override", value)); + } else { + contexts.add(new Context(key, value)); + } } - flagDefinition.setGDContext(new Context(key, value)); + flagDefinition.setDefinitionContexts(contexts); } return flagDefinition; } @@ -164,15 +158,21 @@ public void serialize(TypeToken type, GDCustomFlagDefinition obj, Configurati description = LegacyComponentSerializer.legacy().serialize((Component) obj.getDescription(), '&'); node.getNode("description").setValue(description); } - if (obj.getGDContext() != null) { - node.getNode("gd-context").setValue(obj.getGDContext().getKey() + ":" + obj.getGDContext().getValue()); + + if (!obj.getDefinitionContexts().isEmpty()) { + List contextList = new ArrayList<>(); + ConfigurationNode contextNode = node.getNode("contexts"); + for (Context context : obj.getDefinitionContexts()) { + contextList.add(context.getKey().toLowerCase() + "=" + context.getValue().toLowerCase()); + } + contextNode.setValue(contextList); } ConfigurationNode permissionNode = node.getNode("permissions"); List permissions = new ArrayList<>(); for (CustomFlagData flagData : obj.getFlagData()) { int count = 0; final Flag flag = flagData.getFlag(); - final Set contexts = flagData.getContexts(); + final Set dataContexts = flagData.getContexts(); String permission = ""; if (count > 0) { permission += ", "; @@ -180,10 +180,11 @@ public void serialize(TypeToken type, GDCustomFlagDefinition obj, Configurati permission += "flag=" + flag.getName().toLowerCase(); count++; - for (Context context : contexts) { + for (Context context : dataContexts) { String key = context.getKey(); permission += ", " + key + "=" + context.getValue(); } + permissions.add(permission); } permissionNode.setValue(permissions); diff --git a/bukkit/src/main/java/com/griefdefender/configuration/type/GlobalConfig.java b/bukkit/src/main/java/com/griefdefender/configuration/type/GlobalConfig.java index aa9a637..b57eab7 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/type/GlobalConfig.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/type/GlobalConfig.java @@ -25,7 +25,6 @@ package com.griefdefender.configuration.type; import com.griefdefender.configuration.category.CustomFlagGroupDefinitionCategory; -import com.griefdefender.configuration.category.CustomFlagGroupCategory; import com.griefdefender.configuration.category.DefaultPermissionCategory; import com.griefdefender.configuration.category.EconomyCategory; import com.griefdefender.configuration.category.MessageCategory; @@ -45,9 +44,9 @@ public class GlobalConfig extends ConfigBase { + "\n admin-group=: Whether this group is considered for admin use only." + "\n hover=: The hover text to be displayed when hovering over group name in GUI." + "\n title=: The title text to be used for TAB display." - + "\n override=: This is used to force a permission to a specific claim type or global. Accepted values are : 'admin', 'basic', subdivision', 'town', 'global', 'claim UUID'" - + "\n default=: This is used to set a default permission " + "\n value=: This is used to set a default value for the flag definition. It is only used in conjunction with 'override=, default= settings." + + "\n contexts=[\"key=value\"]: A list of optional definition contexts that will be applied to all permissions." + + "\nNote: This is primary used with 'default' and 'override' contexts. Ex. contexts=[\"default=global\"]" + "\nEach group will have an associated permission in order to be viewable." + "\nThe 'user' group will use the permission : 'griefdefender.custom.flag.group.user'" + "\nThe 'admin' group will use the permission : 'griefdefender.custom.flag.group.admin'" diff --git a/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java index 9e0a1d4..6190604 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java @@ -413,26 +413,18 @@ public void onExplosionEvent(BlockExplodeEvent event) { } Block source = event.getBlock(); + GDCauseStackManager.getInstance().pushCause(source); if (GriefDefenderPlugin.isSourceIdBlacklisted(Flags.EXPLOSION_BLOCK.toString(), source, world.getUID())) { return; } final GDPermissionUser user = CauseContextHelper.getEventUser(event.getBlock().getLocation()); - if (user == null) { - // Cancel if no user found - event.setCancelled(true); - return; - } - GDTimings.EXPLOSION_EVENT.startTiming(); GDClaim targetClaim = null; final List filteredLocations = new ArrayList<>(); for (Block block : event.blockList()) { final Location location = block.getLocation(); targetClaim = GriefDefenderPlugin.getInstance().dataStore.getClaimAt(location, targetClaim); - /*if (GDFlags.EXPLOSION_SURFACE && location.getPosition().getY() > ((net.minecraft.world.World) world).getSeaLevel()) { - result = GPPermissionHandler.getClaimPermission(event, location, targetClaim, GPPermissions.EXPLOSION_SURFACE, source, location.getBlock(), user, true); - } else {*/ Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, targetClaim, GDPermissions.EXPLOSION_BLOCK, source, location.getBlock(), user, true); if (result == Tristate.FALSE) { // Avoid lagging server from large explosions. @@ -443,7 +435,7 @@ public void onExplosionEvent(BlockExplodeEvent event) { filteredLocations.add(block); } } - // Workaround for SpongeForge bug + if (event.isCancelled()) { event.blockList().clear(); } else if (!filteredLocations.isEmpty()) { diff --git a/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java index 6ff8519..01533cf 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java @@ -24,11 +24,13 @@ */ package com.griefdefender.listener; +import com.flowpowered.math.vector.Vector3i; import com.google.common.reflect.TypeToken; import com.griefdefender.GDPlayerData; import com.griefdefender.GDTimings; import com.griefdefender.GriefDefenderPlugin; import com.griefdefender.api.Tristate; +import com.griefdefender.api.claim.Claim; import com.griefdefender.api.claim.TrustType; import com.griefdefender.api.claim.TrustTypes; import com.griefdefender.api.permission.Context; @@ -37,6 +39,7 @@ import com.griefdefender.cache.MessageCache; import com.griefdefender.cache.PermissionHolderCache; import com.griefdefender.claim.GDClaim; +import com.griefdefender.claim.GDClaimManager; import com.griefdefender.event.GDCauseStackManager; import com.griefdefender.internal.tracking.EntityTracker; import com.griefdefender.internal.tracking.entity.GDEntity; @@ -47,14 +50,15 @@ import com.griefdefender.permission.flag.GDFlags; import com.griefdefender.storage.BaseStorage; import com.griefdefender.util.CauseContextHelper; -import com.griefdefender.util.PermissionUtil; import com.griefdefender.util.PlayerUtil; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; +import org.bukkit.entity.Creeper; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Item; @@ -62,6 +66,7 @@ import org.bukkit.entity.Projectile; import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.Tameable; +import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -78,7 +83,10 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.SlimeSplitEvent; import org.bukkit.event.entity.SpawnerSpawnEvent; +import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.vehicle.VehicleDamageEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleEnterEvent; @@ -152,6 +160,45 @@ public void onEntityChangeBlockEvent(EntityChangeBlockEvent event) { } } + @EventHandler(priority = EventPriority.LOWEST) + public void onExplosionPrimeEvent(ExplosionPrimeEvent event) { + final World world = event.getEntity().getLocation().getWorld(); + if (!GDFlags.EXPLOSION_BLOCK && !GDFlags.EXPLOSION_ENTITY) { + return; + } + if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUID())) { + return; + } + + GDCauseStackManager.getInstance().pushCause(event.getEntity()); + GDTimings.ENTITY_EXPLOSION_PRE_EVENT.startTiming(); + final GDEntity gdEntity = EntityTracker.getCachedEntity(event.getEntity().getEntityId()); + GDPermissionUser user = null; + if (gdEntity != null) { + user = PermissionHolderCache.getInstance().getOrCreateUser(gdEntity.getOwnerUUID()); + } else { + user = CauseContextHelper.getEventUser(event.getEntity().getLocation()); + } + + final Location location = event.getEntity().getLocation(); + final GDClaim radiusClaim = NMSUtil.getInstance().createClaimFromCenter(location, event.getRadius()); + final GDClaimManager claimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(location.getWorld().getUID()); + final Set surroundingClaims = claimManager.findOverlappingClaims(radiusClaim); + if (surroundingClaims.size() == 0) { + return; + } + for (Claim claim : surroundingClaims) { + // Use any location for permission check + final Vector3i pos = claim.getLesserBoundaryCorner(); + Location targetLocation = new Location(location.getWorld(), pos.getX(), pos.getY(), pos.getZ()); + Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, claim, GDPermissions.EXPLOSION_BLOCK, event.getEntity(), targetLocation, user, true); + if (result == Tristate.FALSE) { + event.setCancelled(true); + break; + } + } + } + @EventHandler(priority = EventPriority.LOWEST) public void onEntityExplodeEvent(EntityExplodeEvent event) { final World world = event.getEntity().getLocation().getWorld(); @@ -159,6 +206,7 @@ public void onEntityExplodeEvent(EntityExplodeEvent event) { return; } + GDCauseStackManager.getInstance().pushCause(event.getEntity()); // check entity tracker final GDEntity gdEntity = EntityTracker.getCachedEntity(event.getEntity().getEntityId()); GDPermissionUser user = null; @@ -249,11 +297,22 @@ public void onEntityDamage(EntityDamageByBlockEvent event) { } @EventHandler(priority = EventPriority.LOWEST) - public void onEntityDamage(EntityDamageByEntityEvent event) { - /*if (event.getDamager() instanceof Projectile) { - return; - }*/ + public void onHangingBreakEvent(HangingBreakEvent event) { GDTimings.ENTITY_DAMAGE_EVENT.startTiming(); + Object source = event.getCause().name(); + final Object causeSource = GDCauseStackManager.getInstance().getCurrentCause().first(Entity.class).orElse(null); + if (causeSource != null) { + source = causeSource; + } + + if (protectEntity(event, source, event.getEntity())) { + event.setCancelled(true); + } + GDTimings.ENTITY_DAMAGE_EVENT.stopTiming(); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onEntityDamage(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player) { final Player player = (Player) event.getDamager(); GDCauseStackManager.getInstance().pushCause(player); @@ -268,6 +327,7 @@ public void onEntityDamage(EntityDamageByEntityEvent event) { } } + GDTimings.ENTITY_DAMAGE_EVENT.startTiming(); if (protectEntity(event, event.getDamager(), event.getEntity())) { event.setCancelled(true); } @@ -322,6 +382,13 @@ public boolean protectEntity(Event event, Object source, Entity targetEntity) { return false; } + if (source instanceof Creeper || source instanceof TNTPrimed) { + final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, targetEntity.getLocation(), claim, GDPermissions.EXPLOSION_ENTITY, source, targetEntity, user, true); + if (result == Tristate.FALSE) { + return true; + } + } + GDPlayerData playerData = null; if (user != null) { playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(targetEntity.getWorld(), user.getUniqueId()); @@ -379,12 +446,17 @@ public boolean protectEntity(Event event, Object source, Entity targetEntity) { @EventHandler(priority = EventPriority.LOWEST) public void onCreatureSpawn(CreatureSpawnEvent event) { - handleEntitySpawn(event, event.getSpawnReason()); + handleEntitySpawn(event, event.getSpawnReason(), event.getEntity()); } @EventHandler(priority = EventPriority.LOWEST) public void onSpawnerSpawn(SpawnerSpawnEvent event) { - handleEntitySpawn(event, event.getSpawner()); + handleEntitySpawn(event, event.getSpawner(), event.getEntity()); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onSlimeSplitEvent(SlimeSplitEvent event) { + handleEntitySpawn(event, event.getEntity(), event.getEntity()); } @EventHandler(priority = EventPriority.LOWEST) @@ -397,26 +469,26 @@ public void onEntitySpawn(EntitySpawnEvent event) { gdEntity.setNotifierUUID(user.getUniqueId()); EntityTracker.addTempEntity(gdEntity); } - handleEntitySpawn(event, null); + handleEntitySpawn(event, null, event.getEntity()); } //@EventHandler(priority = EventPriority.LOWEST) //public void onEntitySpawn(EntitySpawnEvent event) { //} - public void handleEntitySpawn(EntitySpawnEvent event, Object source) { + public void handleEntitySpawn(Event event, Object source, Entity entity) { if (!GDFlags.ENTITY_SPAWN) { return; } - final World world = event.getEntity().getWorld(); + final World world = entity.getWorld(); if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUID())) { return; } if (GriefDefenderPlugin.isSourceIdBlacklisted(Flags.ENTITY_SPAWN.getName(), source, world.getUID())) { return; } - if (event.getEntity() instanceof FallingBlock) { + if (entity instanceof FallingBlock) { return; } @@ -439,7 +511,6 @@ public void handleEntitySpawn(EntitySpawnEvent event, Object source) { } } - final Entity entity = event.getEntity(); // Player drops are handled in PlayerDropItemEvent if (source instanceof GDPermissionUser && entity instanceof Item) { GDTimings.ENTITY_SPAWN_EVENT.stopTiming(); @@ -475,7 +546,7 @@ public void handleEntitySpawn(EntitySpawnEvent event, Object source) { } if (GDPermissionManager.getInstance().getFinalPermission(event, entity.getLocation(), targetClaim, permission, source, entity, user, TrustTypes.ACCESSOR, true) == Tristate.FALSE) { - event.setCancelled(true); + ((Cancellable) event).setCancelled(true); } GDTimings.ENTITY_SPAWN_EVENT.stopTiming(); diff --git a/bukkit/src/main/java/com/griefdefender/permission/ContextGroupKeys.java b/bukkit/src/main/java/com/griefdefender/permission/ContextGroupKeys.java index d5b452a..309d288 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/ContextGroupKeys.java +++ b/bukkit/src/main/java/com/griefdefender/permission/ContextGroupKeys.java @@ -30,6 +30,7 @@ public class ContextGroupKeys { public static final String ANIMAL = "#animal"; public static final String AQUATIC = "#aquatic"; public static final String FOOD = "#food"; + public static final String MISC = "#misc"; public static final String MONSTER = "#monster"; public static final String VEHICLE = "#vehicle"; } diff --git a/bukkit/src/main/java/com/griefdefender/permission/ContextGroups.java b/bukkit/src/main/java/com/griefdefender/permission/ContextGroups.java index 71a6b32..07c33c5 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/ContextGroups.java +++ b/bukkit/src/main/java/com/griefdefender/permission/ContextGroups.java @@ -33,11 +33,13 @@ public class ContextGroups { public static final Context SOURCE_AMBIENT = new Context(ContextKeys.SOURCE, ContextGroupKeys.AMBIENT); public static final Context SOURCE_ANIMAL = new Context(ContextKeys.SOURCE, ContextGroupKeys.ANIMAL); public static final Context SOURCE_AQUATIC = new Context(ContextKeys.SOURCE, ContextGroupKeys.AQUATIC); + public static final Context SOURCE_MISC = new Context(ContextKeys.SOURCE, ContextGroupKeys.MISC); public static final Context SOURCE_MONSTER = new Context(ContextKeys.SOURCE, ContextGroupKeys.MONSTER); public static final Context SOURCE_VEHICLE = new Context(ContextKeys.SOURCE, ContextGroupKeys.VEHICLE); public static final Context TARGET_AMBIENT = new Context(ContextKeys.TARGET, ContextGroupKeys.AMBIENT); public static final Context TARGET_ANIMAL = new Context(ContextKeys.TARGET, ContextGroupKeys.ANIMAL); public static final Context TARGET_AQUATIC = new Context(ContextKeys.TARGET, ContextGroupKeys.AQUATIC); + public static final Context TARGET_MISC = new Context(ContextKeys.TARGET, ContextGroupKeys.MISC); public static final Context TARGET_MONSTER = new Context(ContextKeys.TARGET, ContextGroupKeys.MONSTER); public static final Context TARGET_VEHICLE = new Context(ContextKeys.TARGET, ContextGroupKeys.VEHICLE); diff --git a/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java b/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java index 32ecf2a..75c215c 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java +++ b/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java @@ -333,16 +333,7 @@ private Tristate getFlagDefaultPermission(Claim claim, String permission) { } } - if (claim.isAdminClaim()) { - contexts.add(ClaimContexts.ADMIN_DEFAULT_CONTEXT); - } else if (claim.isBasicClaim() || claim.isSubdivision()) { - contexts.add(ClaimContexts.BASIC_DEFAULT_CONTEXT); - } else if (claim.isTown()) { - contexts.add(ClaimContexts.TOWN_DEFAULT_CONTEXT); - } else { // wilderness - contexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT); - } - + contexts.add(claim.getDefaultTypeContext()); contexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); //contexts.add(claim.getWorld().getContext()); contexts.addAll(this.eventContexts); @@ -689,12 +680,18 @@ public void addCustomEntityTypeContexts(Entity targetEntity, Set contex } else { contexts.add(ContextGroups.TARGET_MONSTER); } - } else { + } else if (creatureType.contains("ambient")) { if (isSource) { contexts.add(ContextGroups.SOURCE_AMBIENT); } else { contexts.add(ContextGroups.TARGET_AMBIENT); } + } else { + if (isSource) { + contexts.add(ContextGroups.SOURCE_MISC); + } else { + contexts.add(ContextGroups.TARGET_MISC); + } } } diff --git a/bukkit/src/main/java/com/griefdefender/permission/flag/CustomFlagData.java b/bukkit/src/main/java/com/griefdefender/permission/flag/CustomFlagData.java index 9be0b3d..9d98f13 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/flag/CustomFlagData.java +++ b/bukkit/src/main/java/com/griefdefender/permission/flag/CustomFlagData.java @@ -24,11 +24,8 @@ */ package com.griefdefender.permission.flag; -import java.util.ArrayList; -import java.util.List; import java.util.Set; -import com.griefdefender.api.Tristate; import com.griefdefender.api.permission.Context; import com.griefdefender.api.permission.flag.Flag; @@ -65,21 +62,4 @@ public boolean matches(Flag otherFlag, Set otherContexts) { } return true; } - - public String getCustomPermission() { - int count = 0; - final Flag flag = this.getFlag(); - final Set contexts = this.getContexts(); - String permission = ""; - if (count > 0) { - permission += ", "; - } - permission += "flag=" + flag.getName().toLowerCase(); - count++; - for (Context context : contexts) { - String key = context.getKey(); - permission += ", " + key + "=" + context.getValue(); - } - return permission; - } } diff --git a/bukkit/src/main/java/com/griefdefender/permission/flag/GDActiveFlagData.java b/bukkit/src/main/java/com/griefdefender/permission/flag/GDActiveFlagData.java new file mode 100644 index 0000000..b556b4e --- /dev/null +++ b/bukkit/src/main/java/com/griefdefender/permission/flag/GDActiveFlagData.java @@ -0,0 +1,94 @@ +/* + * This file is part of GriefDefender, licensed under the MIT License (MIT). + * + * Copyright (c) bloodmc + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.griefdefender.permission.flag; + +import com.griefdefender.api.Tristate; +import com.griefdefender.api.permission.Context; + +import net.kyori.text.Component; +import net.kyori.text.TextComponent; +import net.kyori.text.format.TextColor; + +public class GDActiveFlagData { + + public enum Type { + CLAIM, + DEFAULT, + OVERRIDE, + UNDEFINED + } + + private final CustomFlagData flagData; + private final Tristate value; + private final Type type; + + public GDActiveFlagData(CustomFlagData flagData, Tristate value, Type type) { + this.flagData = flagData; + this.value = value; + this.type = type; + } + + public CustomFlagData getFlagData() { + return this.flagData; + } + + public Tristate getValue() { + return this.value; + } + + public TextColor getColor() { + if (this.type == Type.CLAIM) { + return TextColor.YELLOW; + } + if (this.type == Type.OVERRIDE) { + return TextColor.RED; + } + if (this.type == Type.DEFAULT) { + return TextColor.LIGHT_PURPLE; + } + return TextColor.GRAY; + } + + public Component getComponent() { + TextComponent.Builder contextBuilder = TextComponent.builder(); + int count = 0; + for (Context context : this.flagData.getContexts()) { + if (count > 0) { + contextBuilder.append(", "); + } + contextBuilder.append(context.getKey().replace("gd_claim_", "").replace("gd_claim", ""), TextColor.GREEN) + .append("=") + .append(context.getValue(), TextColor.GRAY); + } + TextComponent.Builder builder = TextComponent.builder(); + builder + .append(this.flagData.getFlag().getName().toLowerCase(), this.getColor()) + .append("=", TextColor.WHITE) + .append(this.value.toString().toLowerCase(), TextColor.GOLD) + .append(" ") + .append(contextBuilder.build()); + return builder.build(); + } +} diff --git a/bukkit/src/main/java/com/griefdefender/permission/flag/GDCustomFlagDefinition.java b/bukkit/src/main/java/com/griefdefender/permission/flag/GDCustomFlagDefinition.java index c47a0ba..894fd1b 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/flag/GDCustomFlagDefinition.java +++ b/bukkit/src/main/java/com/griefdefender/permission/flag/GDCustomFlagDefinition.java @@ -44,7 +44,7 @@ public class GDCustomFlagDefinition { private boolean enabled = true; - private Context gdContext; + private Set definitionContexts = new HashSet<>(); private List data = new ArrayList<>(); private String displayName; private Tristate defaultValue = Tristate.UNDEFINED; @@ -82,12 +82,12 @@ public Component getDescription() { return this.description; } - public Context getGDContext() { - return this.gdContext; + public Set getDefinitionContexts() { + return this.definitionContexts; } - public void setGDContext(Context context) { - this.gdContext = context; + public void setDefinitionContexts(Set contexts) { + this.definitionContexts = contexts; } public String getDisplayName() { diff --git a/bukkit/src/main/java/com/griefdefender/permission/option/GDOption.java b/bukkit/src/main/java/com/griefdefender/permission/option/GDOption.java index bbf093f..99b4841 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/option/GDOption.java +++ b/bukkit/src/main/java/com/griefdefender/permission/option/GDOption.java @@ -45,25 +45,21 @@ public class GDOption implements Option { - private static final List