mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-24 23:23:44 +02:00 
			
		
		
		
	Compare commits
	
		
			21 Commits
		
	
	
		
			renovate/o
			...
			fix/v7/adm
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 4ce8a38304 | ||
|   | 6fc25bc034 | ||
|   | 1054018e1e | ||
|   | 0508a7f6b6 | ||
|   | da0a57a48c | ||
|   | 87859b002b | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 4f4ba07bd2 | ||
|   | 53771a3ece | ||
|   | f020a6c6da | ||
|   | d7e158747e | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 4d64ea83ec | ||
|   | 7ab334562c | ||
|   | fe1ef36f7e | ||
|   | 70bc02985f | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 3ec7e992a3 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 9acaa9c554 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | e132c01331 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 24e4e51884 | ||
|   | 84ec090df1 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 6c6ea1c1b4 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 97989face1 | 
							
								
								
									
										3
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							| @@ -2,7 +2,8 @@ | ||||
|   "$schema": "https://docs.renovatebot.com/renovate-schema.json", | ||||
|   "extends": [ | ||||
|     "config:recommended", | ||||
|     ":semanticCommitsDisabled" | ||||
|     ":semanticCommitsDisabled", | ||||
|     "schedule:earlyMondays" | ||||
|   ], | ||||
|   "automerge": true, | ||||
|   "labels": [ | ||||
|   | ||||
| @@ -837,7 +837,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|                         case "HOPPER_MINECART": | ||||
|                         case "MINECART_MOB_SPAWNER": | ||||
|                         case "SPAWNER_MINECART": | ||||
|                         case "ENDER_CRYSTAL": | ||||
|                         case "END_CRYSTAL": | ||||
|                         case "ENDER_CRYSTAL": // Backwards compatibility for 1.20.4 | ||||
|                         case "MINECART_TNT": | ||||
|                         case "TNT_MINECART": | ||||
|                         case "CHEST_BOAT": | ||||
| @@ -955,6 +956,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|                         case "ENDERMITE": | ||||
|                         case "ENDER_DRAGON": | ||||
|                         case "GHAST": | ||||
|                         case "HAPPY_GHAST": // 1.21.6+ | ||||
|                         case "GHASTLING": // 1.21.6+ | ||||
|                         case "GIANT": | ||||
|                         case "GUARDIAN": | ||||
|                         case "HORSE": | ||||
|   | ||||
| @@ -115,7 +115,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | ||||
|                 this.dataByte = getOrdinal(Boat.Type.values(), boat.getBoatType()); | ||||
|                 storeInventory(boat); | ||||
|             } | ||||
|             case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL", | ||||
|             case "ARROW", "EGG", "END_CRYSTAL", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL", | ||||
|                     "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER", | ||||
|                     "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION", | ||||
|                     "THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD", | ||||
| @@ -272,7 +272,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | ||||
|                 this.dataByte = (byte) entity1.getPhase().ordinal(); | ||||
|                 return; | ||||
|             } | ||||
|             case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", | ||||
|             case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "HAPPY_GHAST", "GHASTLING", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", | ||||
|                     "ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", | ||||
|                     "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN", "SNOW_GOLEM" -> { | ||||
|                 storeLiving((LivingEntity) entity); | ||||
| @@ -511,7 +511,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | ||||
|                 ((Slime) entity).setSize(this.dataByte); | ||||
|                 return entity; | ||||
|             } */ | ||||
|             case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK", | ||||
|             case "ARROW", "EGG", "END_CRYSTAL", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK", | ||||
|                     "FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", | ||||
|                     "MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL", | ||||
|                     "SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD", | ||||
| @@ -676,7 +676,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | ||||
|                 restoreLiving((LivingEntity) entity); | ||||
|                 return entity; | ||||
|             } | ||||
|             case "ENDERMITE", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> { | ||||
|             case "ENDERMITE", "GHAST", "HAPPY_GHAST", "GHASTLING", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> { | ||||
|                 restoreLiving((LivingEntity) entity); | ||||
|                 return entity; | ||||
|             } | ||||
|   | ||||
| @@ -64,9 +64,11 @@ import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.TileDropFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.UseFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.VillagerInteractFlag; | ||||
| import com.plotsquared.core.plot.flag.types.BlockTypeWrapper; | ||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | ||||
| import com.plotsquared.core.util.EventDispatcher; | ||||
| import com.plotsquared.core.util.MathMan; | ||||
| @@ -77,7 +79,9 @@ import com.plotsquared.core.util.task.TaskManager; | ||||
| import com.plotsquared.core.util.task.TaskTime; | ||||
| import com.sk89q.worldedit.WorldEdit; | ||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||
| import com.sk89q.worldedit.util.Enums; | ||||
| import com.sk89q.worldedit.world.block.BlockType; | ||||
| import com.sk89q.worldedit.world.block.BlockTypes; | ||||
| import io.papermc.lib.PaperLib; | ||||
| import net.kyori.adventure.text.Component; | ||||
| import net.kyori.adventure.text.minimessage.MiniMessage; | ||||
| @@ -152,9 +156,12 @@ import org.bukkit.util.Vector; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| import java.lang.reflect.Field; | ||||
| import java.util.Collections; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Locale; | ||||
| import java.util.Objects; | ||||
| import java.util.Optional; | ||||
| import java.util.Set; | ||||
| import java.util.UUID; | ||||
|  | ||||
| @@ -178,7 +185,17 @@ public class PlayerEventListener implements Listener { | ||||
|             Material.WRITABLE_BOOK, | ||||
|             Material.WRITTEN_BOOK | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * The correct EntityType for End Crystal, determined once at class loading time. | ||||
|      * Tries END_CRYSTAL first (1.21+), falls back to ENDER_CRYSTAL (1.20.4 and older). | ||||
|      */ | ||||
|     private static final EntityType END_CRYSTAL_ENTITY_TYPE = Objects.requireNonNull( | ||||
|             Enums.findByValue(EntityType.class, "END_CRYSTAL", "ENDER_CRYSTAL") | ||||
|     ); | ||||
|  | ||||
|     private static final Set<String> DYES; | ||||
|  | ||||
|     static { | ||||
|         Set<String> mutableDyes = new HashSet<>(Set.of( | ||||
|                 "WHITE_DYE", | ||||
| @@ -213,7 +230,7 @@ public class PlayerEventListener implements Listener { | ||||
|         // "temporary" fix for https://hub.spigotmc.org/jira/browse/SPIGOT-7813 | ||||
|         // can (and should) be removed when 1.21 support is dropped | ||||
|         // List of all interactable 1.21 materials | ||||
|         INTERACTABLE_MATERIALS = Material.CHEST.isInteractable() ? null :  Set.of( | ||||
|         INTERACTABLE_MATERIALS = Material.CHEST.isInteractable() ? null : Set.of( | ||||
|                 "REDSTONE_ORE", "DEEPSLATE_REDSTONE_ORE", "CHISELED_BOOKSHELF", "DECORATED_POT", "CHEST", "CRAFTING_TABLE", | ||||
|                 "FURNACE", "JUKEBOX", "OAK_FENCE", "SPRUCE_FENCE", "BIRCH_FENCE", "JUNGLE_FENCE", "ACACIA_FENCE", "CHERRY_FENCE", | ||||
|                 "DARK_OAK_FENCE", "MANGROVE_FENCE", "BAMBOO_FENCE", "CRIMSON_FENCE", "WARPED_FENCE", "PUMPKIN", | ||||
| @@ -531,12 +548,14 @@ public class PlayerEventListener implements Listener { | ||||
|         // Delayed | ||||
|  | ||||
|         // Async | ||||
|         TaskManager.runTaskLaterAsync(() -> { | ||||
|             if (!player.hasPlayedBefore() && player.isOnline()) { | ||||
|                 player.saveData(); | ||||
|             } | ||||
|             this.eventDispatcher.doJoinTask(pp); | ||||
|         }, TaskTime.seconds(1L)); | ||||
|         TaskManager.runTaskLaterAsync( | ||||
|                 () -> { | ||||
|                     if (!player.hasPlayedBefore() && player.isOnline()) { | ||||
|                         player.saveData(); | ||||
|                     } | ||||
|                     this.eventDispatcher.doJoinTask(pp); | ||||
|                 }, TaskTime.seconds(1L) | ||||
|         ); | ||||
|  | ||||
|         if (pp.hasPermission(Permission.PERMISSION_ADMIN_UPDATE_NOTIFICATION.toString()) && Settings.Enabled_Components.UPDATE_NOTIFICATIONS | ||||
|                 && PremiumVerification.isPremium() && UpdateUtility.hasUpdate) { | ||||
| @@ -597,7 +616,9 @@ public class PlayerEventListener implements Listener { | ||||
|                     // to is identical to the plot's home location, and untrusted-visit is true | ||||
|                     // i.e. untrusted-visit can override deny-teleport | ||||
|                     // 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) | ||||
|                         // don't let the move event cancel the entry after teleport, but rather catch and cancel early (#4647) | ||||
|                         if (!plotListener.plotEntry(pp, plot)) { | ||||
| @@ -941,12 +962,15 @@ public class PlayerEventListener implements Listener { | ||||
|         builder.tag("plot_id", Tag.inserting(Component.text(id.toString()))); | ||||
|         builder.tag("sender", Tag.inserting(Component.text(sender))); | ||||
|         if (plotPlayer.hasPermission("plots.chat.color")) { | ||||
|             builder.tag("msg", Tag.inserting(MiniMessage.miniMessage().deserialize( | ||||
|                     message, | ||||
|                     TagResolver.resolver(StandardTags.color(), StandardTags.gradient(), | ||||
|                             StandardTags.rainbow(), StandardTags.decorations() | ||||
|                     ) | ||||
|             ))); | ||||
|             builder.tag( | ||||
|                     "msg", Tag.inserting(MiniMessage.miniMessage().deserialize( | ||||
|                             message, | ||||
|                             TagResolver.resolver( | ||||
|                                     StandardTags.color(), StandardTags.gradient(), | ||||
|                                     StandardTags.rainbow(), StandardTags.decorations() | ||||
|                             ) | ||||
|                     )) | ||||
|             ); | ||||
|         } else { | ||||
|             builder.tag("msg", Tag.inserting(Component.text(message))); | ||||
|         } | ||||
| @@ -1255,7 +1279,9 @@ public class PlayerEventListener implements Listener { | ||||
|                 eventType = PlayerBlockEventType.INTERACT_BLOCK; | ||||
|                 blocktype1 = BukkitAdapter.asBlockType(block.getType()); | ||||
|  | ||||
|                 if (INTERACTABLE_MATERIALS != null ? INTERACTABLE_MATERIALS.contains(blockType.name()) : blockType.isInteractable()) { | ||||
|                 if (INTERACTABLE_MATERIALS != null | ||||
|                         ? INTERACTABLE_MATERIALS.contains(blockType.name()) | ||||
|                         : blockType.isInteractable()) { | ||||
|                     if (!player.isSneaking()) { | ||||
|                         break; | ||||
|                     } | ||||
| @@ -1273,7 +1299,7 @@ public class PlayerEventListener implements Listener { | ||||
|                 // in the following, lb needs to have the material of the item in hand i.e. type | ||||
|                 switch (type.toString()) { | ||||
|                     case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS", | ||||
|                             "SWEET_BERRIES", "GLOW_BERRIES" -> { | ||||
|                          "SWEET_BERRIES", "GLOW_BERRIES" -> { | ||||
|                         return; | ||||
|                     } | ||||
|                     default -> { | ||||
| @@ -1298,6 +1324,17 @@ public class PlayerEventListener implements Listener { | ||||
|                     //Allow all players to eat while also allowing the block place event to be fired | ||||
|                     return; | ||||
|                 } | ||||
|                 // Process creature spawning of armor stands & end crystals here if spawned by the player in order to be able to | ||||
|                 // reset the player's hand item if spawning needs to be cancelled. | ||||
|                 if (type == Material.ARMOR_STAND || type == Material.END_CRYSTAL) { | ||||
|                     Plot plot = location.getOwnedPlotAbs(); | ||||
|                     EntityType entityType = type == Material.ARMOR_STAND ? EntityType.ARMOR_STAND : END_CRYSTAL_ENTITY_TYPE; | ||||
|                     if (BukkitEntityUtil.checkEntity(entityType, plot)) { | ||||
|                         event.setCancelled(true); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 // Continue with normal place event checks | ||||
|                 if (type == Material.ARMOR_STAND) { | ||||
|                     location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); | ||||
|                     eventType = PlayerBlockEventType.PLACE_MISC; | ||||
| @@ -1380,6 +1417,16 @@ public class PlayerEventListener implements Listener { | ||||
|         } | ||||
|         BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); | ||||
|         Plot plot = area.getPlot(location); | ||||
|         final List<BlockTypeWrapper> use = | ||||
|                 Optional.ofNullable(plot).map(p -> p.getFlag(UseFlag.class)).orElse(area.isRoadFlags() ? | ||||
|                         area.getFlag(UseFlag.class) : Collections.emptyList()); | ||||
|         BlockType type = BukkitAdapter.asBlockType(block.getType()); | ||||
|         for (final BlockTypeWrapper blockTypeWrapper : use) { | ||||
|             if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper | ||||
|                     .accepts(type)) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|         if (plot == null) { | ||||
|             if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { | ||||
|                 return; | ||||
| @@ -1451,6 +1498,16 @@ public class PlayerEventListener implements Listener { | ||||
|         Player player = event.getPlayer(); | ||||
|         BukkitPlayer plotPlayer = BukkitUtil.adapt(player); | ||||
|         Plot plot = area.getPlot(location); | ||||
|         final List<BlockTypeWrapper> use = | ||||
|                 Optional.ofNullable(plot).map(p -> p.getFlag(UseFlag.class)).orElse(area.isRoadFlags() ? | ||||
|                         area.getFlag(UseFlag.class) : Collections.emptyList()); | ||||
|         BlockType type = BukkitAdapter.asBlockType(blockClicked.getType()); | ||||
|         for (final BlockTypeWrapper blockTypeWrapper : use) { | ||||
|             if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper | ||||
|                     .accepts(type)) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|         if (plot == null) { | ||||
|             if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { | ||||
|                 return; | ||||
|   | ||||
| @@ -354,13 +354,17 @@ public class BukkitEntityUtil { | ||||
|     } | ||||
|  | ||||
|     public static boolean checkEntity(Entity entity, Plot plot) { | ||||
|         return checkEntity(entity.getType(), plot); | ||||
|     } | ||||
|  | ||||
|     public static boolean checkEntity(EntityType type, Plot plot) { | ||||
|         if (plot == null || !plot.hasOwner() || plot.getFlags().isEmpty() && plot.getArea() | ||||
|                 .getFlagContainer().getFlagMap().isEmpty()) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         final com.sk89q.worldedit.world.entity.EntityType entityType = | ||||
|                 BukkitAdapter.adapt(entity.getType()); | ||||
|                 BukkitAdapter.adapt(type); | ||||
|  | ||||
|         if (EntityCategories.PLAYER.contains(entityType)) { | ||||
|             return false; | ||||
|   | ||||
| @@ -101,6 +101,10 @@ public class Grant extends Command { | ||||
|                                     ); | ||||
|                                 } else { | ||||
|                                     access.set(access.get().orElse(0) + 1); | ||||
|                                     player.sendMessage( | ||||
|                                             TranslatableCaption.of("grants.added"), | ||||
|                                             TagResolver.resolver("grants", Tag.inserting(Component.text(access.get().orElse(0)))) | ||||
|                                     ); | ||||
|                                 } | ||||
|                             } | ||||
|                         } else { | ||||
|   | ||||
| @@ -283,32 +283,41 @@ public class MainCommand extends Command { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private CompletableFuture<Optional<CommandExecutionData>> preparePlotArgument(@Nullable Plot newPlot, | ||||
|                                                                         @Nonnull CommandExecutionData data, | ||||
|                                                                                   @Nullable PlotArea area) { | ||||
|         if (newPlot != null && (data.player() instanceof ConsolePlayer | ||||
|                 || (area != null && area.equals(newPlot.getArea())) | ||||
|                 || data.player().hasPermission(Permission.PERMISSION_ADMIN) | ||||
|                 || data.player().hasPermission(Permission.PERMISSION_ADMIN_AREA_SUDO)) | ||||
|                 && !newPlot.isDenied(data.player().getUUID())) { | ||||
|             return fetchPlotCenterLocation(newPlot) | ||||
|                     .thenApply(newLoc -> { | ||||
|                         if (!data.player().canTeleport(newLoc)) { | ||||
|                             data.player().sendMessage(TranslatableCaption.of("border.denied")); | ||||
|                             return Optional.empty(); | ||||
|                         } | ||||
|                         // Save meta | ||||
|                         var originalCommandMeta = setCommandScope(data.player(), new TemporaryCommandMeta(newLoc, newPlot)); | ||||
|                         return Optional.of(new CommandExecutionData( | ||||
|                                 data.player(), | ||||
|                                 Arrays.copyOfRange(data.args(), 1, data.args().length), // Trimmed command | ||||
|                                 data.confirm(), | ||||
|                                 data.whenDone(), | ||||
|                                 originalCommandMeta | ||||
|                         )); | ||||
|                     }); | ||||
|     private CompletableFuture<Optional<CommandExecutionData>> preparePlotArgument( | ||||
|             @Nullable Plot newPlot, | ||||
|             @Nonnull CommandExecutionData data, | ||||
|             @Nullable PlotArea area | ||||
|     ) { | ||||
|         if (newPlot == null) { | ||||
|             return CompletableFuture.completedFuture(Optional.of(data)); | ||||
|         } | ||||
|         return CompletableFuture.completedFuture(Optional.of(data)); | ||||
|         final PlotPlayer<?> player = data.player(); | ||||
|         final boolean isAdmin = player instanceof ConsolePlayer || player.hasPermission(Permission.PERMISSION_ADMIN); | ||||
|         final boolean isDenied = newPlot.isDenied(player.getUUID()); | ||||
|         if (!isAdmin) { | ||||
|             if (isDenied) { | ||||
|                 return CompletableFuture.completedFuture(Optional.of(data)); | ||||
|             } | ||||
|             if (area != null && area.equals(newPlot.getArea()) && !player.hasPermission(Permission.PERMISSION_ADMIN_AREA_SUDO)) { | ||||
|                 return CompletableFuture.completedFuture(Optional.of(data)); | ||||
|             } | ||||
|         } | ||||
|         return fetchPlotCenterLocation(newPlot) | ||||
|                 .thenApply(newLoc -> { | ||||
|                     if (!player.canTeleport(newLoc)) { | ||||
|                         player.sendMessage(TranslatableCaption.of("border.denied")); | ||||
|                         return Optional.empty(); | ||||
|                     } | ||||
|                     // Save meta | ||||
|                     var originalCommandMeta = setCommandScope(player, new TemporaryCommandMeta(newLoc, newPlot)); | ||||
|                     return Optional.of(new CommandExecutionData( | ||||
|                             player, | ||||
|                             Arrays.copyOfRange(data.args(), 1, data.args().length), // Trimmed command | ||||
|                             data.confirm(), | ||||
|                             data.whenDone(), | ||||
|                             originalCommandMeta | ||||
|                     )); | ||||
|                 }); | ||||
|     } | ||||
|  | ||||
|     private Optional<CommandExecutionData> prepareFlagArgument(@Nonnull CommandExecutionData data, @Nonnull PlotArea area) { | ||||
|   | ||||
| @@ -57,7 +57,7 @@ public class Music extends SubCommand { | ||||
|                     "music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal", | ||||
|                     "music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside", | ||||
|                     "music_disc_pigstep", "music_disc_5", "music_disc_relic", "music_disc_creator", | ||||
|                     "music_disc_creator_music_box", "music_disc_precipice" | ||||
|                     "music_disc_creator_music_box", "music_disc_precipice", "music_disc_tears", "music_disc_lava_chicken" | ||||
|             ); | ||||
|  | ||||
|     // make sure all discs and the bedrock ("cancel") fit into the inventory | ||||
|   | ||||
| @@ -51,7 +51,7 @@ public interface Caption { | ||||
|      * @param localeHolder Local holder | ||||
|      * @param tagResolvers custom tag resolvers to replace placeholders / parameters | ||||
|      * @return {@link ComponentLike} | ||||
|      * @since TODO | ||||
|      * @since 7.5.4 | ||||
|      */ | ||||
|     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder, @NonNull TagResolver @NonNull... tagResolvers); | ||||
|  | ||||
|   | ||||
| @@ -63,4 +63,18 @@ public class PlotTitle { | ||||
|         return subtitle; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Provides a string representation of this plot title value (used in placeholders). | ||||
|      * | ||||
|      * @return the plot title representation in the format {@code "<title>" "<subtitle>"} | ||||
|      * @since TODO | ||||
|      */ | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "\"%s\" \"%s\"".formatted( | ||||
|                 this.title != null ? this.title : "", | ||||
|                 this.subtitle != null ? this.subtitle : "" | ||||
|         ); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -456,7 +456,7 @@ | ||||
|   "category.command_category_debug": "<gray>Debug</gray>", | ||||
|   "category.command_category_administration": "<gray>Admin</gray>", | ||||
|   "grants.granted_plots": "<prefix><gold>Result: <gray><amount> </gray>grants left.</gold>", | ||||
|   "grants.added": "<prefix><gold><grants></gold> <gray>grant(s) have been added.</gray>", | ||||
|   "grants.added": "<prefix><gold>1</gold> <gray>grant has been added. (<grants> total grants)</gray>", | ||||
|   "events.event_denied": "<prefix><gold><value> </gold><gray>Cancelled by external plugin.</gray>", | ||||
|   "backups.backup_impossible": "<prefix><red>Backups are not enabled for this plot: <plot>.</red>", | ||||
|   "backups.backup_save_success": "<prefix><gold>The backup was created successfully.</gold>", | ||||
|   | ||||
| @@ -37,12 +37,7 @@ class ClickStripTransformTest { | ||||
|     void removeClickEvent() { | ||||
|         var commonAction = ClickEvent.Action.OPEN_FILE; | ||||
|         var transform = new ClickStripTransform(EnumSet.of(commonAction)); | ||||
|         var component = Component.text("Hello") | ||||
|                 .clickEvent(ClickEvent.clickEvent( | ||||
|                                 commonAction, | ||||
|                                 "World" | ||||
|                         ) | ||||
|                 ); | ||||
|         var component = Component.text("Hello").clickEvent(ClickEvent.openFile("World")); | ||||
|         var transformedComponent = transform.transform(component); | ||||
|         Assertions.assertNull(transformedComponent.clickEvent()); | ||||
|     } | ||||
| @@ -52,10 +47,7 @@ class ClickStripTransformTest { | ||||
|     void ignoreClickEvent() { | ||||
|         var actionToRemove = ClickEvent.Action.SUGGEST_COMMAND; | ||||
|         var transform = new ClickStripTransform(EnumSet.of(actionToRemove)); | ||||
|         var originalClickEvent = ClickEvent.clickEvent( | ||||
|                 ClickEvent.Action.CHANGE_PAGE, | ||||
|                 "World" | ||||
|         ); | ||||
|         var originalClickEvent = ClickEvent.changePage(1337); | ||||
|         var component = Component.text("Hello") | ||||
|                 .clickEvent(originalClickEvent); | ||||
|         var transformedComponent = transform.transform(component); | ||||
| @@ -76,12 +68,12 @@ class ClickStripTransformTest { | ||||
|                 .insertion("DEF"); | ||||
|         var component = Component.text("Hello ") | ||||
|                 .append( | ||||
|                         inner.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, "https://example.org")) | ||||
|                         inner.clickEvent(ClickEvent.openUrl("https://example.org")) | ||||
|                 ); | ||||
|         var transformedComponent = transform.transform(component); | ||||
|         Assertions.assertFalse(transformedComponent.children().isEmpty()); // child still exists | ||||
|         Assertions.assertEquals(inner, transformedComponent.children().get(0)); // only the click event has changed | ||||
|         Assertions.assertNull(transformedComponent.children().get(0).clickEvent()); | ||||
|         Assertions.assertEquals(inner, transformedComponent.children().getFirst()); // only the click event has changed | ||||
|         Assertions.assertNull(transformedComponent.children().getFirst().clickEvent()); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,9 +1,7 @@ | ||||
| import com.diffplug.gradle.spotless.SpotlessPlugin | ||||
| import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin | ||||
| import com.vanniktech.maven.publish.SonatypeHost | ||||
| import groovy.json.JsonSlurper | ||||
| import xyz.jpenilla.runpaper.task.RunServer | ||||
| import java.net.URI | ||||
|  | ||||
| plugins { | ||||
|     java | ||||
| @@ -22,7 +20,7 @@ plugins { | ||||
| } | ||||
|  | ||||
| group = "com.intellectualsites.plotsquared" | ||||
| version = "7.5.4-SNAPSHOT" | ||||
| version = "7.5.5-SNAPSHOT" | ||||
|  | ||||
| if (!File("$rootDir/.git").exists()) { | ||||
|     logger.lifecycle(""" | ||||
| @@ -69,8 +67,8 @@ subprojects { | ||||
|  | ||||
|     dependencies { | ||||
|         // Tests | ||||
|         testImplementation("org.junit.jupiter:junit-jupiter:5.13.1") | ||||
|         testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.13.1") | ||||
|         testImplementation("org.junit.jupiter:junit-jupiter:5.13.3") | ||||
|         testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.13.3") | ||||
|     } | ||||
|  | ||||
|     plugins.withId("java") { | ||||
| @@ -172,7 +170,7 @@ subprojects { | ||||
|                 url.set("https://github.com/IntellectualSites/PlotSquared/issues") | ||||
|             } | ||||
|  | ||||
|             publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) | ||||
|             publishToMavenCentral() | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -206,7 +204,7 @@ tasks.getByName<Jar>("jar") { | ||||
|     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", "1.21.5", "1.21.6", "1.21.7", "1.21.8") | ||||
| tasks { | ||||
|     register("cacheLatestFaweArtifact") { | ||||
|         val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL() | ||||
|   | ||||
| @@ -3,11 +3,11 @@ | ||||
| paper = "1.20.4-R0.1-SNAPSHOT" | ||||
| guice = "7.0.0" | ||||
| spotbugs = "4.9.3" | ||||
| checkerqual = "3.49.4" | ||||
| checkerqual = "3.49.5" | ||||
| gson = "2.10" | ||||
| guava = "31.1-jre" | ||||
| snakeyaml = "2.0" | ||||
| adventure = "4.21.0" | ||||
| adventure = "4.23.0" | ||||
| adventure-bukkit = "4.4.0" | ||||
| log4j = "2.19.0" | ||||
|  | ||||
| @@ -33,10 +33,10 @@ vault = "1.7.1" | ||||
| serverlib = "2.3.7" | ||||
|  | ||||
| # Gradle plugins | ||||
| shadow = "8.3.7" | ||||
| shadow = "8.3.8" | ||||
| grgit = "4.1.1" | ||||
| spotless = "7.0.4" | ||||
| publish = "0.33.0" | ||||
| spotless = "7.2.0" | ||||
| publish = "0.34.0" | ||||
| runPaper = "2.3.1" | ||||
|  | ||||
| [libraries] | ||||
|   | ||||
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip | ||||
| networkTimeout=10000 | ||||
| validateDistributionUrl=true | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
|   | ||||
		Reference in New Issue
	
	Block a user