mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-25 23:53:44 +02:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			feat/range
			...
			brand-dp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 092ee41e52 | 
| @@ -22,20 +22,12 @@ import com.google.inject.AbstractModule; | |||||||
| import com.google.inject.Provides; | import com.google.inject.Provides; | ||||||
| import com.google.inject.Singleton; | import com.google.inject.Singleton; | ||||||
| import com.plotsquared.bukkit.permissions.BukkitPermissionHandler; | import com.plotsquared.bukkit.permissions.BukkitPermissionHandler; | ||||||
| import com.plotsquared.bukkit.permissions.BukkitRangedPermissionResolver; |  | ||||||
| import com.plotsquared.bukkit.permissions.LuckPermsRangedPermissionResolver; |  | ||||||
| import com.plotsquared.bukkit.permissions.VaultPermissionHandler; | import com.plotsquared.bukkit.permissions.VaultPermissionHandler; | ||||||
| import com.plotsquared.core.configuration.Settings; |  | ||||||
| import com.plotsquared.core.permissions.PermissionHandler; | import com.plotsquared.core.permissions.PermissionHandler; | ||||||
| import com.plotsquared.core.permissions.RangedPermissionResolver; |  | ||||||
| import org.apache.logging.log4j.LogManager; |  | ||||||
| import org.apache.logging.log4j.Logger; |  | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
|  |  | ||||||
| public class PermissionModule extends AbstractModule { | public class PermissionModule extends AbstractModule { | ||||||
|  |  | ||||||
|     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PermissionModule.class.getSimpleName()); |  | ||||||
|  |  | ||||||
|     @Provides |     @Provides | ||||||
|     @Singleton |     @Singleton | ||||||
|     PermissionHandler providePermissionHandler() { |     PermissionHandler providePermissionHandler() { | ||||||
| @@ -48,18 +40,4 @@ public class PermissionModule extends AbstractModule { | |||||||
|         return new BukkitPermissionHandler(); |         return new BukkitPermissionHandler(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Provides |  | ||||||
|     @Singleton |  | ||||||
|     RangedPermissionResolver provideRangedPermissionResolver() { |  | ||||||
|         if (Settings.Permissions.USE_LUCKPERMS_RANGE_RESOLVER) { |  | ||||||
|             if (Bukkit.getPluginManager().isPluginEnabled("LuckPerms")) { |  | ||||||
|                 LOGGER.info("Using experimental LuckPerms ranged permission resolver"); |  | ||||||
|                 return new LuckPermsRangedPermissionResolver(); |  | ||||||
|             } |  | ||||||
|             LOGGER.warn("Enabled LuckPerms ranged permission resolver, but LuckPerms is not installed. " + |  | ||||||
|                     "Falling back to default Bukkit ranged permission resolver"); |  | ||||||
|         } |  | ||||||
|         return new BukkitRangedPermissionResolver(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag; | import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag; | ||||||
| import com.plotsquared.core.util.PlotFlagUtil; | import com.plotsquared.core.util.PlotFlagUtil; | ||||||
|  | import org.bukkit.Material; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.entity.Entity; | import org.bukkit.entity.Entity; | ||||||
| import org.bukkit.entity.Item; | import org.bukkit.entity.Item; | ||||||
| @@ -41,11 +42,31 @@ import org.bukkit.event.block.BlockReceiveGameEvent; | |||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
|  | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| @SuppressWarnings("unused") | @SuppressWarnings("unused") | ||||||
| public class BlockEventListener117 implements Listener { | public class BlockEventListener117 implements Listener { | ||||||
|  |  | ||||||
|  |     private static final Set<Material> COPPER_OXIDIZING = Set.of( | ||||||
|  |             Material.COPPER_BLOCK, | ||||||
|  |             Material.EXPOSED_COPPER, | ||||||
|  |             Material.WEATHERED_COPPER, | ||||||
|  |             Material.OXIDIZED_COPPER, | ||||||
|  |             Material.CUT_COPPER, | ||||||
|  |             Material.EXPOSED_CUT_COPPER, | ||||||
|  |             Material.WEATHERED_CUT_COPPER, | ||||||
|  |             Material.OXIDIZED_CUT_COPPER, | ||||||
|  |             Material.CUT_COPPER_STAIRS, | ||||||
|  |             Material.EXPOSED_CUT_COPPER_STAIRS, | ||||||
|  |             Material.WEATHERED_CUT_COPPER_STAIRS, | ||||||
|  |             Material.OXIDIZED_CUT_COPPER_STAIRS, | ||||||
|  |             Material.CUT_COPPER_SLAB, | ||||||
|  |             Material.EXPOSED_CUT_COPPER_SLAB, | ||||||
|  |             Material.WEATHERED_CUT_COPPER_SLAB, | ||||||
|  |             Material.OXIDIZED_CUT_COPPER_SLAB | ||||||
|  |     ); | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
|     public BlockEventListener117() { |     public BlockEventListener117() { | ||||||
|     } |     } | ||||||
| @@ -163,7 +184,7 @@ public class BlockEventListener117 implements Listener { | |||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (event.getNewState().getType().name().contains("COPPER")) { |         if (COPPER_OXIDIZING.contains(event.getNewState().getType())) { | ||||||
|             if (!plot.getFlag(CopperOxideFlag.class)) { |             if (!plot.getFlag(CopperOxideFlag.class)) { | ||||||
|                 plot.debug("Copper could not oxide because copper-oxide = false"); |                 plot.debug("Copper could not oxide because copper-oxide = false"); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|   | |||||||
| @@ -29,7 +29,6 @@ import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent; | |||||||
| import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent; | import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent; | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import com.plotsquared.bukkit.util.BukkitUtil; | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
| import com.plotsquared.core.PlotSquared; |  | ||||||
| import com.plotsquared.core.command.Command; | import com.plotsquared.core.command.Command; | ||||||
| import com.plotsquared.core.command.MainCommand; | import com.plotsquared.core.command.MainCommand; | ||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| @@ -39,7 +38,6 @@ import com.plotsquared.core.permissions.Permission; | |||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.PlotAreaType; |  | ||||||
| import com.plotsquared.core.plot.flag.FlagContainer; | import com.plotsquared.core.plot.flag.FlagContainer; | ||||||
| import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; | import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DoneFlag; | import com.plotsquared.core.plot.flag.implementations.DoneFlag; | ||||||
| @@ -50,7 +48,6 @@ import com.plotsquared.core.plot.flag.types.BooleanFlag; | |||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.util.PlotFlagUtil; | import com.plotsquared.core.util.PlotFlagUtil; | ||||||
| import io.papermc.paper.event.entity.EntityMoveEvent; | import io.papermc.paper.event.entity.EntityMoveEvent; | ||||||
| import io.papermc.paper.event.world.StructuresLocateEvent; |  | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| @@ -461,21 +458,6 @@ public class PaperListener implements Listener { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Don't let the server die when populating cartographers (villager offering maps) in classic plot worlds |  | ||||||
|      * (as those don't generate POIs) |  | ||||||
|      */ |  | ||||||
|     @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) |  | ||||||
|     public void onStructuresLocate(StructuresLocateEvent event) { |  | ||||||
|         if (!PlotSquared.get().getPlotAreaManager().hasPlotArea(event.getWorld().getName())) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         final PlotArea area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(event.getWorld().getName()); |  | ||||||
|         if (area != null && area.getType() == PlotAreaType.NORMAL) { |  | ||||||
|             event.setCancelled(true); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private boolean getBooleanFlagValue( |     private boolean getBooleanFlagValue( | ||||||
|             @NonNull FlagContainer container, |             @NonNull FlagContainer container, | ||||||
|             @NonNull Class<? extends BooleanFlag<?>> flagClass, |             @NonNull Class<? extends BooleanFlag<?>> flagClass, | ||||||
|   | |||||||
| @@ -88,8 +88,10 @@ import org.bukkit.Bukkit; | |||||||
| import org.bukkit.FluidCollisionMode; | import org.bukkit.FluidCollisionMode; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
|  | import org.bukkit.block.BlockFace; | ||||||
| import org.bukkit.block.BlockState; | import org.bukkit.block.BlockState; | ||||||
| import org.bukkit.block.Sign; | import org.bukkit.block.Sign; | ||||||
|  | import org.bukkit.block.data.Waterlogged; | ||||||
| import org.bukkit.command.PluginCommand; | import org.bukkit.command.PluginCommand; | ||||||
| import org.bukkit.entity.ArmorStand; | import org.bukkit.entity.ArmorStand; | ||||||
| import org.bukkit.entity.Boat; | import org.bukkit.entity.Boat; | ||||||
| @@ -598,11 +600,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                     // i.e. untrusted-visit can override deny-teleport |                     // i.e. untrusted-visit can override deny-teleport | ||||||
|                     // this is acceptable, because otherwise it wouldn't make sense to have both flags set |                     // this is acceptable, because otherwise it wouldn't make sense to have both flags set | ||||||
|                     if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) { |                     if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) { | ||||||
|                         // returns false if the player is not allowed to enter the plot (if they are denied, for example) |                         plotListener.plotEntry(pp, plot); | ||||||
|                         // don't let the move event cancel the entry after teleport, but rather catch and cancel early (#4647) |  | ||||||
|                         if (!plotListener.plotEntry(pp, plot)) { |  | ||||||
|                             event.setCancelled(true); |  | ||||||
|                         } |  | ||||||
|                     } else { |                     } else { | ||||||
|                         pp.sendMessage( |                         pp.sendMessage( | ||||||
|                                 TranslatableCaption.of("deny.no_enter"), |                                 TranslatableCaption.of("deny.no_enter"), | ||||||
| @@ -1372,7 +1370,22 @@ public class PlayerEventListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|     public void onBucketEmpty(PlayerBucketEmptyEvent event) { |     public void onBucketEmpty(PlayerBucketEmptyEvent event) { | ||||||
|         final Block block = event.getBlock(); |         BlockFace bf = event.getBlockFace(); | ||||||
|  |         // Note: a month after Bukkit 1.14.4 released, they added the API method | ||||||
|  |         // PlayerBucketEmptyEvent#getBlock(), which returns the block the | ||||||
|  |         // bucket contents is going to be placed at. Currently we determine this | ||||||
|  |         // block ourselves to retain compatibility with 1.13. | ||||||
|  |         final Block block; | ||||||
|  |         // if the block can be waterlogged, the event might waterlog the block | ||||||
|  |         // sometimes | ||||||
|  |         if (event.getBlockClicked().getBlockData() instanceof Waterlogged waterlogged | ||||||
|  |                 && !waterlogged.isWaterlogged() && event.getBucket() != Material.LAVA_BUCKET) { | ||||||
|  |             block = event.getBlockClicked(); | ||||||
|  |         } else { | ||||||
|  |             block = event.getBlockClicked().getLocation() | ||||||
|  |                     .add(bf.getModX(), bf.getModY(), bf.getModZ()) | ||||||
|  |                     .getBlock(); | ||||||
|  |         } | ||||||
|         Location location = BukkitUtil.adapt(block.getLocation()); |         Location location = BukkitUtil.adapt(block.getLocation()); | ||||||
|         PlotArea area = location.getPlotArea(); |         PlotArea area = location.getPlotArea(); | ||||||
|         if (area == null) { |         if (area == null) { | ||||||
|   | |||||||
| @@ -1,107 +0,0 @@ | |||||||
| /* |  | ||||||
|  * PlotSquared, a land and world management plugin for Minecraft. |  | ||||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> |  | ||||||
|  * Copyright (C) IntellectualSites team and contributors |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| package com.plotsquared.bukkit.permissions; |  | ||||||
|  |  | ||||||
| import com.plotsquared.bukkit.player.BukkitPlayer; |  | ||||||
| import com.plotsquared.core.permissions.RangedPermissionResolver; |  | ||||||
| import com.plotsquared.core.player.PlotPlayer; |  | ||||||
| import com.plotsquared.core.util.MathMan; |  | ||||||
| import org.bukkit.permissions.PermissionAttachmentInfo; |  | ||||||
| import org.checkerframework.checker.index.qual.NonNegative; |  | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; |  | ||||||
| import org.checkerframework.checker.nullness.qual.Nullable; |  | ||||||
|  |  | ||||||
| import java.util.Set; |  | ||||||
| import java.util.stream.IntStream; |  | ||||||
|  |  | ||||||
| public class BukkitRangedPermissionResolver implements RangedPermissionResolver { |  | ||||||
|  |  | ||||||
|     private static boolean CHECK_EFFECTIVE = true; |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNegative int getPermissionRange( |  | ||||||
|             final @NonNull PlotPlayer<?> generic, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext, |  | ||||||
|             @NonNegative final int range |  | ||||||
|     ) { |  | ||||||
|         if (!(generic instanceof BukkitPlayer player)) { |  | ||||||
|             throw new IllegalArgumentException("PlotPlayer is not a BukkitPlayer"); |  | ||||||
|         } |  | ||||||
|         if (hasWildcardRange(player, stub, worldContext)) { |  | ||||||
|             return INFINITE_RANGE_VALUE; |  | ||||||
|         } |  | ||||||
|         int max = 0; |  | ||||||
|         if (CHECK_EFFECTIVE) { |  | ||||||
|             boolean hasAny = false; |  | ||||||
|             String stubPlus = stub + "."; |  | ||||||
|             final Set<PermissionAttachmentInfo> effective = player.getPlatformPlayer().getEffectivePermissions(); |  | ||||||
|             if (!effective.isEmpty()) { |  | ||||||
|                 for (PermissionAttachmentInfo attach : effective) { |  | ||||||
|                     // Ignore all "false" permissions |  | ||||||
|                     if (!attach.getValue()) { |  | ||||||
|                         continue; |  | ||||||
|                     } |  | ||||||
|                     String permStr = attach.getPermission(); |  | ||||||
|                     if (permStr.startsWith(stubPlus)) { |  | ||||||
|                         hasAny = true; |  | ||||||
|                         String end = permStr.substring(stubPlus.length()); |  | ||||||
|                         if (MathMan.isInteger(end)) { |  | ||||||
|                             int val = Integer.parseInt(end); |  | ||||||
|                             if (val > range) { |  | ||||||
|                                 return val; |  | ||||||
|                             } |  | ||||||
|                             if (val > max) { |  | ||||||
|                                 max = val; |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 if (hasAny) { |  | ||||||
|                     return max; |  | ||||||
|                 } |  | ||||||
|                 // Workaround |  | ||||||
|                 for (PermissionAttachmentInfo attach : effective) { |  | ||||||
|                     String permStr = attach.getPermission(); |  | ||||||
|                     if (permStr.startsWith("plots.") && !permStr.equals("plots.use")) { |  | ||||||
|                         return max; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 CHECK_EFFECTIVE = false; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         for (int i = range; i > 0; i--) { |  | ||||||
|             if (player.hasPermission(worldContext, stub + "." + i)) { |  | ||||||
|                 return i; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return max; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNull IntStream streamFullPermissionRange( |  | ||||||
|             final @NonNull PlotPlayer<?> player, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext, |  | ||||||
|             @NonNegative final int range |  | ||||||
|     ) { |  | ||||||
|         return IntStream.of(getPermissionRange(player, stub, worldContext, range)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,95 +0,0 @@ | |||||||
| /* |  | ||||||
|  * PlotSquared, a land and world management plugin for Minecraft. |  | ||||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> |  | ||||||
|  * Copyright (C) IntellectualSites team and contributors |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| package com.plotsquared.bukkit.permissions; |  | ||||||
|  |  | ||||||
| import com.plotsquared.core.permissions.RangedPermissionResolver; |  | ||||||
| import com.plotsquared.core.player.PlotPlayer; |  | ||||||
| import com.plotsquared.core.util.MathMan; |  | ||||||
| import net.luckperms.api.LuckPerms; |  | ||||||
| import net.luckperms.api.context.ImmutableContextSet; |  | ||||||
| import net.luckperms.api.model.user.User; |  | ||||||
| import net.luckperms.api.node.NodeType; |  | ||||||
| import net.luckperms.api.node.types.PermissionNode; |  | ||||||
| import net.luckperms.api.query.QueryOptions; |  | ||||||
| import org.bukkit.Bukkit; |  | ||||||
| import org.checkerframework.checker.index.qual.NonNegative; |  | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; |  | ||||||
| import org.checkerframework.checker.nullness.qual.Nullable; |  | ||||||
|  |  | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.stream.IntStream; |  | ||||||
|  |  | ||||||
| public class LuckPermsRangedPermissionResolver implements RangedPermissionResolver { |  | ||||||
|  |  | ||||||
|     private final LuckPerms luckPerms; |  | ||||||
|  |  | ||||||
|     public LuckPermsRangedPermissionResolver() { |  | ||||||
|         this.luckPerms = Objects.requireNonNull( |  | ||||||
|                 Bukkit.getServicesManager().getRegistration(LuckPerms.class), |  | ||||||
|                 "LuckPerms is not available" |  | ||||||
|         ).getProvider(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNegative int getPermissionRange( |  | ||||||
|             final @NonNull PlotPlayer<?> player, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext, |  | ||||||
|             final @NonNegative int range |  | ||||||
|     ) { |  | ||||||
|         // no need to use LuckPerms for basic checks |  | ||||||
|         if (this.hasWildcardRange(player, stub, worldContext)) { |  | ||||||
|             return INFINITE_RANGE_VALUE; |  | ||||||
|         } |  | ||||||
|         return this.streamFullPermissionRange(player, stub, worldContext, range) |  | ||||||
|                 .sorted() |  | ||||||
|                 .reduce((first, second) -> second) |  | ||||||
|                 .orElse(0); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @NonNull |  | ||||||
|     public IntStream streamFullPermissionRange( |  | ||||||
|             final @NonNull PlotPlayer<?> player, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext, |  | ||||||
|             @NonNegative final int range |  | ||||||
|     ) { |  | ||||||
|         final User user = this.luckPerms.getUserManager().getUser(player.getUUID()); |  | ||||||
|         if (user == null) { |  | ||||||
|             throw new IllegalStateException("Luckperms User is null - is the Player online? (UUID: %s)".formatted(player.getUUID())); |  | ||||||
|         } |  | ||||||
|         final QueryOptions queryOptions = worldContext == null ? |  | ||||||
|                 QueryOptions.nonContextual() : |  | ||||||
|                 QueryOptions.contextual(ImmutableContextSet.of("world", worldContext)); |  | ||||||
|         return user.resolveInheritedNodes(queryOptions).stream() |  | ||||||
|                 // only support normal permission nodes (regex permission nodes would be a pita to support) |  | ||||||
|                 .filter(NodeType.PERMISSION::matches) |  | ||||||
|                 .map(node -> ((PermissionNode) node).getPermission()) |  | ||||||
|                 // check that the node actually has additional data after the stub |  | ||||||
|                 .filter(permission -> permission.startsWith(stub + ".")) |  | ||||||
|                 // extract the raw data after the stub |  | ||||||
|                 .map(permission -> permission.substring(stub.length() + 1)) |  | ||||||
|                 // check if data is integer and parse |  | ||||||
|                 .filter(MathMan::isInteger) |  | ||||||
|                 .mapToInt(Integer::parseInt) |  | ||||||
|                 // only use values that are positive |  | ||||||
|                 .filter(value -> value > -1); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -24,12 +24,14 @@ import com.plotsquared.core.PlotSquared; | |||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| import com.plotsquared.core.events.TeleportCause; | import com.plotsquared.core.events.TeleportCause; | ||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
|  | import com.plotsquared.core.permissions.Permission; | ||||||
| import com.plotsquared.core.permissions.PermissionHandler; | import com.plotsquared.core.permissions.PermissionHandler; | ||||||
| import com.plotsquared.core.player.ConsolePlayer; | import com.plotsquared.core.player.ConsolePlayer; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.PlotWeather; | import com.plotsquared.core.plot.PlotWeather; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
|  | import com.plotsquared.core.util.MathMan; | ||||||
| import com.plotsquared.core.util.WorldUtil; | import com.plotsquared.core.util.WorldUtil; | ||||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
| import com.sk89q.worldedit.extension.platform.Actor; | import com.sk89q.worldedit.extension.platform.Actor; | ||||||
| @@ -45,11 +47,13 @@ import org.bukkit.entity.Player; | |||||||
| import org.bukkit.event.Event; | import org.bukkit.event.Event; | ||||||
| import org.bukkit.event.EventException; | import org.bukkit.event.EventException; | ||||||
| import org.bukkit.event.player.PlayerTeleportEvent; | import org.bukkit.event.player.PlayerTeleportEvent; | ||||||
|  | import org.bukkit.permissions.PermissionAttachmentInfo; | ||||||
| import org.bukkit.plugin.RegisteredListener; | import org.bukkit.plugin.RegisteredListener; | ||||||
| import org.bukkit.potion.PotionEffectType; | import org.bukkit.potion.PotionEffectType; | ||||||
| import org.checkerframework.checker.index.qual.NonNegative; | import org.checkerframework.checker.index.qual.NonNegative; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
|  | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| import static com.sk89q.worldedit.world.gamemode.GameModes.ADVENTURE; | import static com.sk89q.worldedit.world.gamemode.GameModes.ADVENTURE; | ||||||
| @@ -146,13 +150,77 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @SuppressWarnings("StringSplitter") | ||||||
|     @Override |     @Override | ||||||
|     @NonNegative |     @NonNegative | ||||||
|     public int hasPermissionRange( |     public int hasPermissionRange( | ||||||
|             final @NonNull String stub, |             final @NonNull String stub, | ||||||
|             @NonNegative final int range |             @NonNegative final int range | ||||||
|     ) { |     ) { | ||||||
|         return PlotSquared.platform().rangedPermissionResolver().getPermissionRange(this, stub, null, range); |         if (hasPermission(Permission.PERMISSION_ADMIN.toString())) { | ||||||
|  |             return Integer.MAX_VALUE; | ||||||
|  |         } | ||||||
|  |         final String[] nodes = stub.split("\\."); | ||||||
|  |         final StringBuilder n = new StringBuilder(); | ||||||
|  |         // Wildcard check from less specific permission to more specific permission | ||||||
|  |         for (int i = 0; i < (nodes.length - 1); i++) { | ||||||
|  |             n.append(nodes[i]).append("."); | ||||||
|  |             if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) { | ||||||
|  |                 if (hasPermission(n + Permission.PERMISSION_STAR.toString())) { | ||||||
|  |                     return Integer.MAX_VALUE; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         // Wildcard check for the full permission | ||||||
|  |         if (hasPermission(stub + ".*")) { | ||||||
|  |             return Integer.MAX_VALUE; | ||||||
|  |         } | ||||||
|  |         // Permission value cache for iterative check | ||||||
|  |         int max = 0; | ||||||
|  |         if (CHECK_EFFECTIVE) { | ||||||
|  |             boolean hasAny = false; | ||||||
|  |             String stubPlus = stub + "."; | ||||||
|  |             final Set<PermissionAttachmentInfo> effective = player.getEffectivePermissions(); | ||||||
|  |             if (!effective.isEmpty()) { | ||||||
|  |                 for (PermissionAttachmentInfo attach : effective) { | ||||||
|  |                     // Ignore all "false" permissions | ||||||
|  |                     if (!attach.getValue()) { | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                     String permStr = attach.getPermission(); | ||||||
|  |                     if (permStr.startsWith(stubPlus)) { | ||||||
|  |                         hasAny = true; | ||||||
|  |                         String end = permStr.substring(stubPlus.length()); | ||||||
|  |                         if (MathMan.isInteger(end)) { | ||||||
|  |                             int val = Integer.parseInt(end); | ||||||
|  |                             if (val > range) { | ||||||
|  |                                 return val; | ||||||
|  |                             } | ||||||
|  |                             if (val > max) { | ||||||
|  |                                 max = val; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 if (hasAny) { | ||||||
|  |                     return max; | ||||||
|  |                 } | ||||||
|  |                 // Workaround | ||||||
|  |                 for (PermissionAttachmentInfo attach : effective) { | ||||||
|  |                     String permStr = attach.getPermission(); | ||||||
|  |                     if (permStr.startsWith("plots.") && !permStr.equals("plots.use")) { | ||||||
|  |                         return max; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 CHECK_EFFECTIVE = false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         for (int i = range; i > 0; i--) { | ||||||
|  |             if (hasPermission(stub + "." + i)) { | ||||||
|  |                 return i; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return max; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -31,7 +31,6 @@ import com.plotsquared.core.generator.IndependentPlotGenerator; | |||||||
| import com.plotsquared.core.inject.annotations.DefaultGenerator; | import com.plotsquared.core.inject.annotations.DefaultGenerator; | ||||||
| import com.plotsquared.core.location.World; | import com.plotsquared.core.location.World; | ||||||
| import com.plotsquared.core.permissions.PermissionHandler; | import com.plotsquared.core.permissions.PermissionHandler; | ||||||
| import com.plotsquared.core.permissions.RangedPermissionResolver; |  | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.expiration.ExpireManager; | import com.plotsquared.core.plot.expiration.ExpireManager; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| @@ -125,7 +124,7 @@ public interface PlotPlatform<P> extends LocaleHolder { | |||||||
|      * Gets the server brand name |      * Gets the server brand name | ||||||
|      * |      * | ||||||
|      * @return server brand |      * @return server brand | ||||||
|      * @since 7.5.3 |      * @since TODO | ||||||
|      */ |      */ | ||||||
|     @NonNull String serverBrand(); |     @NonNull String serverBrand(); | ||||||
|  |  | ||||||
| @@ -350,10 +349,6 @@ public interface PlotPlatform<P> extends LocaleHolder { | |||||||
|         return injector().getInstance(PermissionHandler.class); |         return injector().getInstance(PermissionHandler.class); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     default @NonNull RangedPermissionResolver rangedPermissionResolver() { |  | ||||||
|         return injector().getInstance(RangedPermissionResolver.class); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get the {@link ServicePipeline} implementation |      * Get the {@link ServicePipeline} implementation | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -144,7 +144,6 @@ public class Buy extends Command { | |||||||
|             plot.getPlotModificationManager().setSign(player.getName()); |             plot.getPlotModificationManager().setSign(player.getName()); | ||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
|                     TranslatableCaption.of("working.claimed"), |                     TranslatableCaption.of("working.claimed"), | ||||||
|                     TagResolver.resolver("world", Tag.inserting(Component.text(plot.getArea().getWorldName()))), |  | ||||||
|                     TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) |                     TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) | ||||||
|             ); |             ); | ||||||
|             this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price); |             this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price); | ||||||
|   | |||||||
| @@ -131,7 +131,6 @@ public class Clear extends Command { | |||||||
|                     player.sendMessage( |                     player.sendMessage( | ||||||
|                             TranslatableCaption.of("working.clearing_done"), |                             TranslatableCaption.of("working.clearing_done"), | ||||||
|                             TagResolver.builder() |                             TagResolver.builder() | ||||||
|                                     .tag("world", Tag.inserting(Component.text(plot.getArea().getWorldName()))) |  | ||||||
|                                     .tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start))) |                                     .tag("amount", Tag.inserting(Component.text(System.currentTimeMillis() - start))) | ||||||
|                                     .tag("plot", Tag.inserting(Component.text(plot.getId().toString()))) |                                     .tag("plot", Tag.inserting(Component.text(plot.getId().toString()))) | ||||||
|                                     .build() |                                     .build() | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption; | |||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.minimessage.MiniMessage; | import net.kyori.adventure.text.minimessage.MiniMessage; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; |  | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
|  |  | ||||||
| @@ -99,14 +98,6 @@ public enum CommandCategory implements Caption { | |||||||
|         return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); |         return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNull Component toComponent( |  | ||||||
|             @NonNull final LocaleHolder localeHolder, |  | ||||||
|             final @NonNull TagResolver @NonNull ... tagResolvers |  | ||||||
|     ) { |  | ||||||
|         return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Checks if a player has access to this command category |      * Checks if a player has access to this command category | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -124,7 +124,6 @@ public class Delete extends SubCommand { | |||||||
|                                 "amount", |                                 "amount", | ||||||
|                                 Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start))) |                                 Tag.inserting(Component.text(String.valueOf(System.currentTimeMillis() - start))) | ||||||
|                         ), |                         ), | ||||||
|                         TagResolver.resolver("world", Tag.inserting(Component.text(plotArea.getWorldName()))), |  | ||||||
|                         TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) |                         TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString()))) | ||||||
|                 ); |                 ); | ||||||
|                 eventDispatcher.callPostDelete(plot); |                 eventDispatcher.callPostDelete(plot); | ||||||
|   | |||||||
| @@ -113,34 +113,38 @@ public class Help extends Command { | |||||||
|             } |             } | ||||||
|             if (cat == null && page == 0) { |             if (cat == null && page == 0) { | ||||||
|                 TextComponent.Builder builder = Component.text(); |                 TextComponent.Builder builder = Component.text(); | ||||||
|                 builder.append(TranslatableCaption.of("help.help_header").toComponent(player)); |                 builder.append(MINI_MESSAGE.deserialize(TranslatableCaption.of("help.help_header").getComponent(player))); | ||||||
|                 for (CommandCategory c : CommandCategory.values()) { |                 for (CommandCategory c : CommandCategory.values()) { | ||||||
|                     if (!c.canAccess(player)) { |                     if (!c.canAccess(player)) { | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|                     builder.append(Component.newline()); |                     builder.append(Component.newline()).append(MINI_MESSAGE | ||||||
|                     builder.append(TranslatableCaption.of("help.help_info_item").toComponent( |                             .deserialize( | ||||||
|                             player, TagResolver.builder() |                                     TranslatableCaption.of("help.help_info_item").getComponent(player), | ||||||
|                                     .tag("command", Tag.inserting(Component.text("/plot help"))) |                                     TagResolver.builder() | ||||||
|                                     .tag("category", Tag.inserting(Component.text(c.name().toLowerCase()))) |                                             .tag("command", Tag.inserting(Component.text("/plot help"))) | ||||||
|                                     .tag("category_desc", Tag.inserting(c.toComponent(player))) |                                             .tag("category", Tag.inserting(Component.text(c.name().toLowerCase()))) | ||||||
|                                     .build() |                                             .tag("category_desc", Tag.inserting(c.toComponent(player))) | ||||||
|                     )); |                                             .build() | ||||||
|  |                             )); | ||||||
|                 } |                 } | ||||||
|                 builder.append(Component.newline()); |                 builder.append(Component.newline()).append(MINI_MESSAGE | ||||||
|                 builder.append(TranslatableCaption.of("help.help_info_item").toComponent( |                         .deserialize( | ||||||
|                         player, TagResolver.builder() |                                 TranslatableCaption.of("help.help_info_item").getComponent(player), | ||||||
|                                 .tag("command", Tag.inserting(Component.text("/plot help"))) |                                 TagResolver.builder() | ||||||
|                                 .tag("category", Tag.inserting(Component.text("all"))) |                                         .tag("command", Tag.inserting(Component.text("/plot help"))) | ||||||
|                                 .tag( |                                         .tag("category", Tag.inserting(Component.text("all"))) | ||||||
|                                         "category_desc", Tag.inserting(TranslatableCaption |                                         .tag( | ||||||
|                                                 .of("help.help_display_all_commands") |                                                 "category_desc", | ||||||
|                                                 .toComponent(player)) |                                                 Tag.inserting(TranslatableCaption | ||||||
|                                 ) |                                                         .of("help.help_display_all_commands") | ||||||
|                                 .build() |                                                         .toComponent(player)) | ||||||
|                 )); |                                         ) | ||||||
|                 builder.append(Component.newline()); |                                         .build() | ||||||
|                 builder.append(TranslatableCaption.of("help.help_footer").toComponent(player)); |                         )); | ||||||
|  |                 builder.append(Component.newline()).append(MINI_MESSAGE.deserialize(TranslatableCaption | ||||||
|  |                         .of("help.help_footer") | ||||||
|  |                         .getComponent(player))); | ||||||
|                 player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent()))); |                 player.sendMessage(StaticCaption.of(MINI_MESSAGE.serialize(builder.asComponent()))); | ||||||
|                 return true; |                 return true; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -525,8 +525,8 @@ public class Settings extends Config { | |||||||
|     public static final class Limit { |     public static final class Limit { | ||||||
|  |  | ||||||
|         @Comment("Should the limit be global (over multiple worlds)") |         @Comment("Should the limit be global (over multiple worlds)") | ||||||
|         public static boolean GLOBAL = false; |         public static boolean GLOBAL = | ||||||
|  |                 false; | ||||||
|         @Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'", |         @Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'", | ||||||
|                 "The value covers the permission range to check, you need to assign the permission to players/groups still", |                 "The value covers the permission range to check, you need to assign the permission to players/groups still", | ||||||
|                 "Modifying the value does NOT change the amount of plots players can claim"}) |                 "Modifying the value does NOT change the amount of plots players can claim"}) | ||||||
| @@ -737,7 +737,6 @@ public class Settings extends Config { | |||||||
|  |  | ||||||
|         @Comment("If \"instabreak\" should consider the used tool.") |         @Comment("If \"instabreak\" should consider the used tool.") | ||||||
|         public static boolean INSTABREAK_CONSIDER_TOOL = false; |         public static boolean INSTABREAK_CONSIDER_TOOL = false; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Comment({"Enable or disable parts of the plugin", |     @Comment({"Enable or disable parts of the plugin", | ||||||
| @@ -831,17 +830,4 @@ public class Settings extends Config { | |||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Comment({"Permission-Resolver specific settings"}) |  | ||||||
|     public static final class Permissions { |  | ||||||
|  |  | ||||||
|         @Comment({ |  | ||||||
|                 "use the new LuckPerms resolver for ranged permissions (e.g., plots.plot.<number>).", |  | ||||||
|                 "in contrary to the default resolver, this resolver can handle inheritance of permissions.", |  | ||||||
|                 "e.g. if the player has multiple matching permissions, for example, due to multiple group memberships " + |  | ||||||
|                         "(plots.plot.5 & plots.plot.15), this resolver would use 15 as the limit as opposed to the previous 5." |  | ||||||
|         }) |  | ||||||
|         public static boolean USE_LUCKPERMS_RANGE_RESOLVER = false; |  | ||||||
|  |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,6 @@ package com.plotsquared.core.configuration.caption; | |||||||
|  |  | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.ComponentLike; | import net.kyori.adventure.text.ComponentLike; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; |  | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -45,16 +44,6 @@ public interface Caption { | |||||||
|      */ |      */ | ||||||
|     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder); |     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder); | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Get the Adventure {@link ComponentLike} for this caption while applying custom {@link TagResolver} |  | ||||||
|      * (apart from the default {@code core.prefix}) |  | ||||||
|      * @param localeHolder Local holder |  | ||||||
|      * @param tagResolvers custom tag resolvers to replace placeholders / parameters |  | ||||||
|      * @return {@link ComponentLike} |  | ||||||
|      * @since TODO |  | ||||||
|      */ |  | ||||||
|     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder, @NonNull TagResolver @NonNull... tagResolvers); |  | ||||||
|  |  | ||||||
|     @NonNull String toString(); |     @NonNull String toString(); | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ package com.plotsquared.core.configuration.caption; | |||||||
| import com.google.common.base.Preconditions; | import com.google.common.base.Preconditions; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.minimessage.MiniMessage; | import net.kyori.adventure.text.minimessage.MiniMessage; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; |  | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| public final class StaticCaption implements Caption { | public final class StaticCaption implements Caption { | ||||||
| @@ -52,14 +51,6 @@ public final class StaticCaption implements Caption { | |||||||
|         return MiniMessage.miniMessage().deserialize(this.value); |         return MiniMessage.miniMessage().deserialize(this.value); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNull Component toComponent( |  | ||||||
|             @NonNull final LocaleHolder localeHolder, |  | ||||||
|             final @NonNull TagResolver @NonNull ... tagResolvers |  | ||||||
|     ) { |  | ||||||
|         return MiniMessage.miniMessage().deserialize(this.value, tagResolvers); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull String toString() { |     public @NonNull String toString() { | ||||||
|         return "StaticCaption(" + value + ")"; |         return "StaticCaption(" + value + ")"; | ||||||
|   | |||||||
| @@ -27,7 +27,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | |||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
|  |  | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||||
|  |  | ||||||
| @@ -97,23 +96,13 @@ public final class TranslatableCaption implements NamespacedCaption { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) { |     public @NonNull Component toComponent(@NonNull final LocaleHolder localeHolder) { | ||||||
|         return this.toComponent(localeHolder, new TagResolver[0]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNull Component toComponent( |  | ||||||
|             @NonNull final LocaleHolder localeHolder, |  | ||||||
|             final @NonNull TagResolver @NonNull ... tagResolvers |  | ||||||
|     ) { |  | ||||||
|         if (getKey().equals("core.prefix")) { |         if (getKey().equals("core.prefix")) { | ||||||
|             return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); |             return MiniMessage.miniMessage().deserialize(getComponent(localeHolder)); | ||||||
|         } |         } | ||||||
|         TagResolver[] finalResolvers = Arrays.copyOf(tagResolvers, tagResolvers.length + 1); |         return MiniMessage.miniMessage().deserialize(getComponent(localeHolder), TagResolver.resolver( | ||||||
|         finalResolvers[finalResolvers.length - 1] = TagResolver.resolver( |  | ||||||
|                 "prefix", |                 "prefix", | ||||||
|                 Tag.inserting(TranslatableCaption.of("core.prefix").toComponent(localeHolder)) |                 Tag.inserting(TranslatableCaption.of("core.prefix").toComponent(localeHolder)) | ||||||
|         ); |         )); | ||||||
|         return MiniMessage.miniMessage().deserialize(getComponent(localeHolder), finalResolvers); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -1,126 +0,0 @@ | |||||||
| /* |  | ||||||
|  * PlotSquared, a land and world management plugin for Minecraft. |  | ||||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> |  | ||||||
|  * Copyright (C) IntellectualSites team and contributors |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| package com.plotsquared.core.permissions; |  | ||||||
|  |  | ||||||
| import com.plotsquared.core.player.PlotPlayer; |  | ||||||
| import org.checkerframework.checker.index.qual.NonNegative; |  | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; |  | ||||||
| import org.checkerframework.checker.nullness.qual.Nullable; |  | ||||||
|  |  | ||||||
| import java.util.stream.IntStream; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Represents a resolver for ranged permissions. Return values depend on the actual implementation (see Bukkit module). |  | ||||||
|  * <br> |  | ||||||
|  * Even though this interface is not linked to platform implementations by design, implementation-specific details are added to |  | ||||||
|  * the Javadocs. |  | ||||||
|  * |  | ||||||
|  * @since TODO |  | ||||||
|  */ |  | ||||||
| public interface RangedPermissionResolver { |  | ||||||
|  |  | ||||||
|     int INFINITE_RANGE_VALUE = Integer.MAX_VALUE; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Gets the applicable range value of a player for a specific permission stub |  | ||||||
|      * ({@code plots.plot} would check for {@code plots.plot.<numeric>}). |  | ||||||
|      * <br> |  | ||||||
|      * The standard bukkit implementation would return the lowest numeric value, while the LuckPerms specific resolver would |  | ||||||
|      * try returning the highest possible value. |  | ||||||
|      * |  | ||||||
|      * @param player       the permission holder |  | ||||||
|      * @param stub         the permission stub to check against |  | ||||||
|      * @param worldContext the optional world context of the action requiring the range |  | ||||||
|      * @param range        the maximum permission range to check against (for the default bukkit resolver) |  | ||||||
|      * @return the applicable range value of the player for the given permission stub |  | ||||||
|      * @since TODO |  | ||||||
|      */ |  | ||||||
|     @NonNegative |  | ||||||
|     int getPermissionRange( |  | ||||||
|             final @NonNull PlotPlayer<?> player, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext, |  | ||||||
|             final @NonNegative int range |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Gets a stream of all applicable permission range values for the given stub. The stream is unordered by default. If a |  | ||||||
|      * specific order is needed, use the stateful {@link IntStream#sorted()} operation. |  | ||||||
|      * <br> |  | ||||||
|      * The standard bukkit implementation will only return a stream containing a single value equal to |  | ||||||
|      * {@link #getPermissionRange(PlotPlayer, String, String, int)}. For LuckPerms, all applicable node values will be in the |  | ||||||
|      * stream. |  | ||||||
|      * |  | ||||||
|      * @param player       the permission holder |  | ||||||
|      * @param stub         the permission stub to check against |  | ||||||
|      * @param worldContext the optional world context of the action requiring the range |  | ||||||
|      * @param range        the maximum permission range to check against (for the default bukkit resolver) |  | ||||||
|      * @return a stream of all applicable permission range values for the given stub |  | ||||||
|      * @since TODO |  | ||||||
|      */ |  | ||||||
|     @NonNull |  | ||||||
|     IntStream streamFullPermissionRange( |  | ||||||
|             final @NonNull PlotPlayer<?> player, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext, |  | ||||||
|             final @NonNegative int range |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Checks if the given player has a wildcard range for the given permission stub. |  | ||||||
|      * <br> |  | ||||||
|      * For example, if checking for the stub {@code plots.plot}, this method would check for: |  | ||||||
|      * <ul> |  | ||||||
|      *     <li>{@code *}</li> |  | ||||||
|      *     <li>{@code plots.admin}</li> |  | ||||||
|      *     <li>{@code plots.plot.*}</li> |  | ||||||
|      *     <li>{@code plots.*}</li> |  | ||||||
|      * </ul> |  | ||||||
|      * |  | ||||||
|      * @param player       the permission holder |  | ||||||
|      * @param stub         the permission stub to check against |  | ||||||
|      * @param worldContext the optional world context of the action requiring the range |  | ||||||
|      * @return {@code true} if the player has a wildcard range for the given permission stub, else {@code false} |  | ||||||
|      * @since TODO |  | ||||||
|      */ |  | ||||||
|     default boolean hasWildcardRange( |  | ||||||
|             final @NonNull PlotPlayer<?> player, |  | ||||||
|             final @NonNull String stub, |  | ||||||
|             final @Nullable String worldContext |  | ||||||
|     ) { |  | ||||||
|         if (player.hasPermission(Permission.PERMISSION_STAR) || |  | ||||||
|                 player.hasPermission(Permission.PERMISSION_ADMIN) || |  | ||||||
|                 player.hasPermission(worldContext, stub + ".*")) { |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
|         String node = stub; |  | ||||||
|         while (true) { |  | ||||||
|             int lastIndex = node.lastIndexOf('.'); |  | ||||||
|             if (lastIndex == -1) { |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|             node = node.substring(0, lastIndex); |  | ||||||
|             if (player.hasPermission(worldContext, node + ".*")) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1717,7 +1717,6 @@ public class Plot { | |||||||
|         } |         } | ||||||
|         player.sendMessage( |         player.sendMessage( | ||||||
|                 TranslatableCaption.of("working.claimed"), |                 TranslatableCaption.of("working.claimed"), | ||||||
|                 TagResolver.resolver("world", Tag.inserting(Component.text(this.getWorldName()))), |  | ||||||
|                 TagResolver.resolver("plot", Tag.inserting(Component.text(this.getId().toString()))) |                 TagResolver.resolver("plot", Tag.inserting(Component.text(this.getId().toString()))) | ||||||
|         ); |         ); | ||||||
|         if (teleport) { |         if (teleport) { | ||||||
|   | |||||||
| @@ -25,24 +25,30 @@ import com.plotsquared.core.player.PlotPlayer; | |||||||
| import com.plotsquared.core.util.StringMan; | import com.plotsquared.core.util.StringMan; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.ComponentLike; | import net.kyori.adventure.text.ComponentLike; | ||||||
|  | import net.kyori.adventure.text.minimessage.MiniMessage; | ||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
|  |  | ||||||
| public class HelpObject implements ComponentLike { | public class HelpObject implements ComponentLike { | ||||||
|  |  | ||||||
|  |     static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage(); | ||||||
|  |  | ||||||
|     private final Component rendered; |     private final Component rendered; | ||||||
|  |  | ||||||
|     public HelpObject(final Command command, final String label, final PlotPlayer<?> audience) { |     public HelpObject(final Command command, final String label, final PlotPlayer<?> audience) { | ||||||
|         this.rendered = TranslatableCaption.of("help.help_item").toComponent(audience, TagResolver.builder() |         rendered = MINI_MESSAGE.deserialize( | ||||||
|                 .tag("usage", Tag.inserting(Component.text(command.getUsage().replace("{label}", label)))) |                 TranslatableCaption.of("help.help_item").getComponent(audience), | ||||||
|                 .tag("alias", Tag.inserting(Component.text( |                 TagResolver.builder() | ||||||
|                         command.getAliases().isEmpty() ? "" : StringMan.join(command.getAliases(), " | ") |                         .tag("usage", Tag.inserting(Component.text(command.getUsage().replace("{label}", label)))) | ||||||
|                 ))) |                         .tag("alias", Tag.inserting(Component.text( | ||||||
|                 .tag("desc", Tag.inserting(command.getDescription().toComponent(audience))) |                                 command.getAliases().isEmpty() ? "" : StringMan.join(command.getAliases(), " | ") | ||||||
|                 .tag("arguments", Tag.inserting(Component.text(buildArgumentList(command.getRequiredArguments())))) |                         ))) | ||||||
|                 .tag("label", Tag.inserting(Component.text(label))) |                         .tag("desc", Tag.inserting(command.getDescription().toComponent(audience))) | ||||||
|                 .build()); |                         .tag("arguments", Tag.inserting(Component.text(buildArgumentList(command.getRequiredArguments())))) | ||||||
|  |                         .tag("label", Tag.inserting(Component.text(label))) | ||||||
|  |                         .build() | ||||||
|  |         ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private String buildArgumentList(final Argument<?>[] arguments) { |     private String buildArgumentList(final Argument<?>[] arguments) { | ||||||
|   | |||||||
| @@ -390,11 +390,11 @@ | |||||||
|   "info.area_list_tooltip": "<gold>Claimed=</gold><gray><claimed></gray>\n<gold>Usage=</gold><gray><usage></gray>\n<gold>Clusters=</gold><gray><clusters></gray>\n<gold>Region=</gold><gray><region></gray>\n<gold>Generator=</gold><gray><generator></gray>", |   "info.area_list_tooltip": "<gold>Claimed=</gold><gray><claimed></gray>\n<gold>Usage=</gold><gray><usage></gray>\n<gold>Clusters=</gold><gray><clusters></gray>\n<gold>Region=</gold><gray><region></gray>\n<gold>Generator=</gold><gray><generator></gray>", | ||||||
|   "info.area_list_item": "<click:run_command:'<command_tp>'><hover:show_text:'<command_tp>'><dark_gray>[</dark_gray><gold><number></gold><dark_gray>]</dark_gray></hover></click> <click:run_command:'<command_info>'><hover:show_text:'<hover_info>'><gold><area_name></gold></hover></click><gray> - </gray><gray><area_type>:<area_terrain></gray>", |   "info.area_list_item": "<click:run_command:'<command_tp>'><hover:show_text:'<command_tp>'><dark_gray>[</dark_gray><gold><number></gold><dark_gray>]</dark_gray></hover></click> <click:run_command:'<command_info>'><hover:show_text:'<hover_info>'><gold><area_name></gold></hover></click><gray> - </gray><gray><area_type>:<area_terrain></gray>", | ||||||
|   "working.generating_component": "<prefix><gold>Started generating component from your settings.</gold>", |   "working.generating_component": "<prefix><gold>Started generating component from your settings.</gold>", | ||||||
|   "working.clearing_done": "<prefix><dark_aqua>Plot </dark_aqua><gold><world>;<plot></gold><dark_aqua> has been cleared! Took </dark_aqua><gold><amount>ms</gold><dark_aqua>.</dark_aqua>", |   "working.clearing_done": "<prefix><dark_aqua>Plot </dark_aqua><gold><plot></gold><dark_aqua> has been cleared! Took </dark_aqua><gold><amount>ms</gold><dark_aqua>.</dark_aqua>", | ||||||
|   "working.deleting_done": "<prefix><dark_aqua>Plot </dark_aqua><gold><world>;<plot></gold><dark_aqua> has been deleted! Took </dark_aqua><gold><amount>ms</gold><dark_aqua>.</dark_aqua>", |   "working.deleting_done": "<prefix><dark_aqua>Plot </dark_aqua><gold><plot></gold><dark_aqua> has been deleted! Took </dark_aqua><gold><amount>ms</gold><dark_aqua>.</dark_aqua>", | ||||||
|   "working.plot_not_claimed": "<prefix><gray>Plot not claimed.</gray>", |   "working.plot_not_claimed": "<prefix><gray>Plot not claimed.</gray>", | ||||||
|   "working.plot_is_claimed": "<prefix><gray>This plot is already claimed.</gray>", |   "working.plot_is_claimed": "<prefix><gray>This plot is already claimed.</gray>", | ||||||
|   "working.claimed": "<prefix><dark_aqua>You successfully claimed the plot </dark_aqua><gold><world>;<plot></gold><dark_aqua>.</dark_aqua>", |   "working.claimed": "<prefix><dark_aqua>You successfully claimed the plot </dark_aqua><gold><plot></gold><dark_aqua>.</dark_aqua>", | ||||||
|   "working.progress": "<prefix><gray>Current progress: </gray><gold><progress></gold><gray>%</gray>", |   "working.progress": "<prefix><gray>Current progress: </gray><gold><progress></gold><gray>%</gray>", | ||||||
|   "working.component_complete": "<prefix><gold>Component generation has finished for plot <plot>.</gold>", |   "working.component_complete": "<prefix><gold>Component generation has finished for plot <plot>.</gold>", | ||||||
|   "list.comment_list_header_paged": "<gray>(Page </gray><gold><cur></gold><gray>/</gray><gold><max></gold><gray>) </gray><gold>List of <amount> comment(s):</gold>", |   "list.comment_list_header_paged": "<gray>(Page </gray><gold><cur></gold><gray>/</gray><gold><max></gold><gray>) </gray><gold>List of <amount> comment(s):</gold>", | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ plugins { | |||||||
| } | } | ||||||
|  |  | ||||||
| group = "com.intellectualsites.plotsquared" | group = "com.intellectualsites.plotsquared" | ||||||
| version = "7.5.4-SNAPSHOT" | version = "7.5.3-SNAPSHOT" | ||||||
|  |  | ||||||
| if (!File("$rootDir/.git").exists()) { | if (!File("$rootDir/.git").exists()) { | ||||||
|     logger.lifecycle(""" |     logger.lifecycle(""" | ||||||
| @@ -69,8 +69,8 @@ subprojects { | |||||||
|  |  | ||||||
|     dependencies { |     dependencies { | ||||||
|         // Tests |         // Tests | ||||||
|         testImplementation("org.junit.jupiter:junit-jupiter:5.13.0") |         testImplementation("org.junit.jupiter:junit-jupiter:5.12.2") | ||||||
|         testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.13.0") |         testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.12.2") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     plugins.withId("java") { |     plugins.withId("java") { | ||||||
| @@ -206,14 +206,14 @@ tasks.getByName<Jar>("jar") { | |||||||
|     enabled = false |     enabled = false | ||||||
| } | } | ||||||
|  |  | ||||||
| val supportedVersions = listOf("1.19.4", "1.20.6", "1.21.1", "1.21.3", "1.21.4", "1.21.5") | val supportedVersions = listOf("1.19.4", "1.20.6", "1.21.1", "1.21.3", "1.21.4") | ||||||
| tasks { | tasks { | ||||||
|     register("cacheLatestFaweArtifact") { |     register("cacheLatestFaweArtifact") { | ||||||
|         val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL() |         val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL() | ||||||
|         val artifact = ((JsonSlurper().parse(lastSuccessfulBuildUrl) as Map<*, *>)["artifacts"] as List<*>) |         val artifact = ((JsonSlurper().parse(lastSuccessfulBuildUrl) as Map<*, *>)["artifacts"] as List<*>) | ||||||
|                 .map { it as Map<*, *> } |                 .map { it as Map<*, *> } | ||||||
|                 .map { it["fileName"] as String } |                 .map { it["fileName"] as String } | ||||||
|                 .first { it -> it.contains("Paper") } |                 .first { it -> it.contains("Bukkit") } | ||||||
|         project.ext["faweArtifact"] = artifact |         project.ext["faweArtifact"] = artifact | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,29 +3,29 @@ | |||||||
| paper = "1.20.4-R0.1-SNAPSHOT" | paper = "1.20.4-R0.1-SNAPSHOT" | ||||||
| guice = "7.0.0" | guice = "7.0.0" | ||||||
| spotbugs = "4.9.3" | spotbugs = "4.9.3" | ||||||
| checkerqual = "3.49.3" | checkerqual = "3.49.2" | ||||||
| gson = "2.10" | gson = "2.10" | ||||||
| guava = "31.1-jre" | guava = "31.1-jre" | ||||||
| snakeyaml = "2.0" | snakeyaml = "2.0" | ||||||
| adventure = "4.21.0" | adventure = "4.20.0" | ||||||
| adventure-bukkit = "4.4.0" | adventure-bukkit = "4.3.4" | ||||||
| log4j = "2.19.0" | log4j = "2.19.0" | ||||||
|  |  | ||||||
| # Plugins | # Plugins | ||||||
| worldedit = "7.2.20" | worldedit = "7.2.20" | ||||||
| fawe = "2.13.0" | fawe = "2.13.0" | ||||||
| placeholderapi = "2.11.6" | placeholderapi = "2.11.6" | ||||||
| luckperms = "5.5" | luckperms = "5.4" | ||||||
| essentialsx = "2.21.1" | essentialsx = "2.21.0" | ||||||
| mvdwapi = "3.1.1" | mvdwapi = "3.1.1" | ||||||
|  |  | ||||||
| # Third party | # Third party | ||||||
| prtree = "2.0.1" | prtree = "2.0.1" | ||||||
| aopalliance = "1.0" | aopalliance = "1.0" | ||||||
| cloud-services = "1.8.4" | cloud-services = "1.8.4" | ||||||
| arkitektonika = "2.1.4" | arkitektonika = "2.1.3" | ||||||
| squirrelid = "0.3.2" | squirrelid = "0.3.2" | ||||||
| paster = "1.1.7" | paster = "1.1.6" | ||||||
| bstats = "3.1.0" | bstats = "3.1.0" | ||||||
| paperlib = "1.0.8" | paperlib = "1.0.8" | ||||||
| informative-annotations = "1.6" | informative-annotations = "1.6" | ||||||
| @@ -35,8 +35,8 @@ serverlib = "2.3.7" | |||||||
| # Gradle plugins | # Gradle plugins | ||||||
| shadow = "8.3.6" | shadow = "8.3.6" | ||||||
| grgit = "4.1.1" | grgit = "4.1.1" | ||||||
| spotless = "7.0.4" | spotless = "7.0.3" | ||||||
| publish = "0.32.0" | publish = "0.31.0" | ||||||
| runPaper = "2.3.1" | runPaper = "2.3.1" | ||||||
|  |  | ||||||
| [libraries] | [libraries] | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||||
| distributionPath=wrapper/dists | distributionPath=wrapper/dists | ||||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip | ||||||
| networkTimeout=10000 | networkTimeout=10000 | ||||||
| validateDistributionUrl=true | validateDistributionUrl=true | ||||||
| zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -114,7 +114,7 @@ case "$( uname )" in                #( | |||||||
|   NONSTOP* )        nonstop=true ;; |   NONSTOP* )        nonstop=true ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| CLASSPATH="\\\"\\\"" | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||||
|  |  | ||||||
|  |  | ||||||
| # Determine the Java command to use to start the JVM. | # Determine the Java command to use to start the JVM. | ||||||
| @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |||||||
| set -- \ | set -- \ | ||||||
|         "-Dorg.gradle.appname=$APP_BASE_NAME" \ |         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||||
|         -classpath "$CLASSPATH" \ |         -classpath "$CLASSPATH" \ | ||||||
|         -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ |         org.gradle.wrapper.GradleWrapperMain \ | ||||||
|         "$@" |         "$@" | ||||||
|  |  | ||||||
| # Stop when "xargs" is not available. | # Stop when "xargs" is not available. | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							| @@ -70,11 +70,11 @@ goto fail | |||||||
| :execute | :execute | ||||||
| @rem Setup the command line | @rem Setup the command line | ||||||
|  |  | ||||||
| set CLASSPATH= | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||||
|  |  | ||||||
|  |  | ||||||
| @rem Execute Gradle | @rem Execute Gradle | ||||||
| "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||||||
|  |  | ||||||
| :end | :end | ||||||
| @rem End local scope for the variables with windows NT shell | @rem End local scope for the variables with windows NT shell | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user