mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-31 17:43:44 +01:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			feature/al
			...
			docs/v6/pu
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | ad635d3598 | ||
|   | 3672ba9965 | ||
|   | 6a8bcceb2a | 
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							| @@ -27,11 +27,10 @@ body: | |||||||
|       description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. |       description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. | ||||||
|       multiple: false |       multiple: false | ||||||
|       options: |       options: | ||||||
|         - '1.19.2' |  | ||||||
|         - '1.19.1' |  | ||||||
|         - '1.19' |         - '1.19' | ||||||
|         - '1.18.2' |         - '1.18.2' | ||||||
|         - '1.18.1' |         - '1.18.1' | ||||||
|  |         - '1.18' | ||||||
|         - '1.17.1' |         - '1.17.1' | ||||||
|         - '1.16.5' |         - '1.16.5' | ||||||
|     validations: |     validations: | ||||||
|   | |||||||
| @@ -50,7 +50,6 @@ dependencies { | |||||||
|     implementation(libs.arkitektonika) |     implementation(libs.arkitektonika) | ||||||
|     implementation(libs.http4j) |     implementation(libs.http4j) | ||||||
|     implementation("com.intellectualsites.paster:Paster") |     implementation("com.intellectualsites.paster:Paster") | ||||||
|     implementation("com.intellectualsites.informative-annotations:informative-annotations") |  | ||||||
|  |  | ||||||
|     // Adventure |     // Adventure | ||||||
|     implementation("net.kyori:adventure-platform-bukkit") |     implementation("net.kyori:adventure-platform-bukkit") | ||||||
| @@ -88,7 +87,6 @@ tasks.named<ShadowJar>("shadowJar") { | |||||||
|     relocate("javax.inject", "com.plotsquared.core.annotation.inject") |     relocate("javax.inject", "com.plotsquared.core.annotation.inject") | ||||||
|     relocate("net.jcip", "com.plotsquared.core.annotations.jcip") |     relocate("net.jcip", "com.plotsquared.core.annotations.jcip") | ||||||
|     relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs") |     relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs") | ||||||
|     relocate("com.intellectualsites.informative-annotations", "com.plotsquared.core.annotation.informative") |  | ||||||
|  |  | ||||||
|     // Get rid of all the libs which are 100% unused. |     // Get rid of all the libs which are 100% unused. | ||||||
|     minimize() |     minimize() | ||||||
| @@ -105,6 +103,5 @@ tasks { | |||||||
|         opt.links("https://jd.adventure.kyori.net/api/4.9.3/") |         opt.links("https://jd.adventure.kyori.net/api/4.9.3/") | ||||||
|         opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") |         opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") | ||||||
|         opt.links("https://checkerframework.org/api/") |         opt.links("https://checkerframework.org/api/") | ||||||
|         opt.encoding("UTF-8") |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -656,15 +656,20 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|             final @NonNull SQLiteUUIDService sqLiteUUIDService, |             final @NonNull SQLiteUUIDService sqLiteUUIDService, | ||||||
|             final @NonNull CacheUUIDService cacheUUIDService |             final @NonNull CacheUUIDService cacheUUIDService | ||||||
|     ) { |     ) { | ||||||
|         // Record all unique UUID's and put them into a queue |         // Load all uuids into a big chunky boi queue | ||||||
|         final Set<UUID> uuidSet = new HashSet<>(); |         final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>(); | ||||||
|         PlotSquared.get().forEachPlotRaw(plot -> { |         PlotSquared.get().forEachPlotRaw(plot -> { | ||||||
|             uuidSet.add(plot.getOwnerAbs()); |             final Set<UUID> uuids = new HashSet<>(); | ||||||
|             uuidSet.addAll(plot.getMembers()); |             uuids.add(plot.getOwnerAbs()); | ||||||
|             uuidSet.addAll(plot.getTrusted()); |             uuids.addAll(plot.getMembers()); | ||||||
|             uuidSet.addAll(plot.getDenied()); |             uuids.addAll(plot.getTrusted()); | ||||||
|  |             uuids.addAll(plot.getDenied()); | ||||||
|  |             for (final UUID uuid : uuids) { | ||||||
|  |                 if (!uuidQueue.contains(uuid)) { | ||||||
|  |                     uuidQueue.add(uuid); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         }); |         }); | ||||||
|         final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>(uuidSet); |  | ||||||
|  |  | ||||||
|         LOGGER.info("(UUID) {} UUIDs will be cached", uuidQueue.size()); |         LOGGER.info("(UUID) {} UUIDs will be cached", uuidQueue.size()); | ||||||
|  |  | ||||||
| @@ -727,11 +732,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|         this.getServer().getPluginManager().disablePlugin(this); |         this.getServer().getPluginManager().disablePlugin(this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public void shutdownServer() { |  | ||||||
|         getServer().shutdown(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void registerCommands() { |     private void registerCommands() { | ||||||
|         final BukkitCommand bukkitCommand = new BukkitCommand(); |         final BukkitCommand bukkitCommand = new BukkitCommand(); | ||||||
|         final PluginCommand plotCommand = getCommand("plots"); |         final PluginCommand plotCommand = getCommand("plots"); | ||||||
|   | |||||||
| @@ -65,7 +65,6 @@ import net.kyori.adventure.text.minimessage.Template; | |||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.GameMode; | import org.bukkit.GameMode; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
| import org.bukkit.Tag; |  | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.block.BlockFace; | import org.bukkit.block.BlockFace; | ||||||
| import org.bukkit.block.BlockState; | import org.bukkit.block.BlockState; | ||||||
| @@ -107,27 +106,11 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
| import java.util.Iterator; | import java.util.Iterator; | ||||||
| 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; | ||||||
| import java.util.stream.Collectors; |  | ||||||
| import java.util.stream.Stream; |  | ||||||
|  |  | ||||||
| @SuppressWarnings("unused") | @SuppressWarnings("unused") | ||||||
| public class BlockEventListener implements Listener { | public class BlockEventListener implements Listener { | ||||||
|  |  | ||||||
|     private static final Set<Material> PISTONS = Set.of( |  | ||||||
|             Material.PISTON, |  | ||||||
|             Material.STICKY_PISTON |  | ||||||
|     ); |  | ||||||
|     private static final Set<Material> PHYSICS_BLOCKS = Set.of( |  | ||||||
|             Material.TURTLE_EGG, |  | ||||||
|             Material.TURTLE_SPAWN_EGG |  | ||||||
|     ); |  | ||||||
|     private static final Set<Material> SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5 |  | ||||||
|             .filter(material -> material.name().contains("SNOW")) |  | ||||||
|             .filter(Material::isBlock) |  | ||||||
|             .collect(Collectors.toUnmodifiableSet()); |  | ||||||
|  |  | ||||||
|     private final PlotAreaManager plotAreaManager; |     private final PlotAreaManager plotAreaManager; | ||||||
|     private final WorldEdit worldEdit; |     private final WorldEdit worldEdit; | ||||||
|  |  | ||||||
| @@ -233,31 +216,48 @@ public class BlockEventListener implements Listener { | |||||||
|             plot.debug("Prevented block physics and resent block change because disable-physics = true"); |             plot.debug("Prevented block physics and resent block change because disable-physics = true"); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (event.getChangedType() == Material.COMPARATOR) { |         switch (event.getChangedType()) { | ||||||
|             if (!plot.getFlag(RedstoneFlag.class)) { |             case COMPARATOR: { | ||||||
|                 event.setCancelled(true); |                 if (!plot.getFlag(RedstoneFlag.class)) { | ||||||
|                 plot.debug("Prevented comparator update because redstone = false"); |  | ||||||
|             } |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (PHYSICS_BLOCKS.contains(event.getChangedType())) { |  | ||||||
|             if (plot.getFlag(DisablePhysicsFlag.class)) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 plot.debug("Prevented block physics because disable-physics = true"); |  | ||||||
|             } |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { |  | ||||||
|             if (PISTONS.contains(block.getType())) { |  | ||||||
|                 org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); |  | ||||||
|                 final BlockFace facing = piston.getFacing(); |  | ||||||
|                 location = location.add(facing.getModX(), facing.getModY(), facing.getModZ()); |  | ||||||
|                 Plot newPlot = area.getOwnedPlotAbs(location); |  | ||||||
|                 if (!plot.equals(newPlot)) { |  | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     plot.debug("Prevented piston update because of invalid edge piston detection"); |                     plot.debug("Prevented comparator update because redstone = false"); | ||||||
|                 } |                 } | ||||||
|  |                 return; | ||||||
|             } |             } | ||||||
|  |             case ANVIL: | ||||||
|  |             case DRAGON_EGG: | ||||||
|  |             case GRAVEL: | ||||||
|  |             case SAND: | ||||||
|  |             case TURTLE_EGG: | ||||||
|  |             case TURTLE_HELMET: | ||||||
|  |             case TURTLE_SPAWN_EGG: { | ||||||
|  |                 if (plot.getFlag(DisablePhysicsFlag.class)) { | ||||||
|  |                     event.setCancelled(true); | ||||||
|  |                     plot.debug("Prevented block physics because disable-physics = true"); | ||||||
|  |                 } | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             default: | ||||||
|  |                 if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { | ||||||
|  |                     switch (block.getType()) { | ||||||
|  |                         case PISTON, STICKY_PISTON -> { | ||||||
|  |                             org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); | ||||||
|  |                             switch (piston.getFacing()) { | ||||||
|  |                                 case EAST -> location = location.add(1, 0, 0); | ||||||
|  |                                 case SOUTH -> location = location.add(-1, 0, 0); | ||||||
|  |                                 case WEST -> location = location.add(0, 0, 1); | ||||||
|  |                                 case NORTH -> location = location.add(0, 0, -1); | ||||||
|  |                             } | ||||||
|  |                             Plot newPlot = area.getOwnedPlotAbs(location); | ||||||
|  |                             if (!plot.equals(newPlot)) { | ||||||
|  |                                 event.setCancelled(true); | ||||||
|  |                                 plot.debug("Prevented piston update because of invalid edge piston detection"); | ||||||
|  |                                 return; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -272,9 +272,15 @@ public class BlockEventListener implements Listener { | |||||||
|         BukkitPlayer pp = BukkitUtil.adapt(player); |         BukkitPlayer pp = BukkitUtil.adapt(player); | ||||||
|         Plot plot = area.getPlot(location); |         Plot plot = area.getPlot(location); | ||||||
|         if (plot != null) { |         if (plot != null) { | ||||||
|             if (area.notifyIfOutsideBuildArea(pp, location.getY())) { |             if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area | ||||||
|  |                     .getMinBuildHeight()) && !Permissions | ||||||
|  |                     .hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 pp.sendMessage( | ||||||
|  |                         TranslatableCaption.of("height.height_limit"), | ||||||
|  |                         Template.of("minHeight", String.valueOf(area.getMinBuildHeight())), | ||||||
|  |                         Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight())) | ||||||
|  |                 ); | ||||||
|             } |             } | ||||||
|             if (!plot.hasOwner()) { |             if (!plot.hasOwner()) { | ||||||
|                 if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { |                 if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { | ||||||
| @@ -352,9 +358,15 @@ public class BlockEventListener implements Listener { | |||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|             } else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) { |             } else if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area | ||||||
|  |                     .getMinBuildHeight()) && !Permissions | ||||||
|  |                     .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 plotPlayer.sendMessage( | ||||||
|  |                         TranslatableCaption.of("height.height_limit"), | ||||||
|  |                         Template.of("minHeight", String.valueOf(area.getMinBuildHeight())), | ||||||
|  |                         Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight())) | ||||||
|  |                 ); | ||||||
|             } |             } | ||||||
|             if (!plot.hasOwner()) { |             if (!plot.hasOwner()) { | ||||||
|                 if (!Permissions |                 if (!Permissions | ||||||
| @@ -532,22 +544,25 @@ public class BlockEventListener implements Listener { | |||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (!area.buildRangeContainsY(location.getY())) { |         if (location.getY() >= area.getMaxBuildHeight() || location.getY() < area.getMinBuildHeight()) { | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (SNOW.contains(event.getNewState().getType())) { |         switch (event.getNewState().getType()) { | ||||||
|             if (!plot.getFlag(SnowFormFlag.class)) { |             case SNOW: | ||||||
|                 plot.debug("Snow could not form because snow-form = false"); |             case SNOW_BLOCK: | ||||||
|                 event.setCancelled(true); |                 if (!plot.getFlag(SnowFormFlag.class)) { | ||||||
|             } |                     plot.debug("Snow could not form because snow-form = false"); | ||||||
|             return; |                     event.setCancelled(true); | ||||||
|         } |                 } | ||||||
|         if (Tag.ICE.isTagged(event.getNewState().getType())) { |                 return; | ||||||
|             if (!plot.getFlag(IceFormFlag.class)) { |             case ICE: | ||||||
|                 plot.debug("Ice could not form because ice-form = false"); |             case FROSTED_ICE: | ||||||
|                 event.setCancelled(true); |             case PACKED_ICE: | ||||||
|             } |                 if (!plot.getFlag(IceFormFlag.class)) { | ||||||
|  |                     plot.debug("Ice could not form because ice-form = false"); | ||||||
|  |                     event.setCancelled(true); | ||||||
|  |                 } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -568,12 +583,18 @@ public class BlockEventListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Class<? extends BooleanFlag<?>> flag; |         Class<? extends BooleanFlag<?>> flag; | ||||||
|         if (SNOW.contains(event.getNewState().getType())) { |         switch (event.getNewState().getType()) { | ||||||
|             flag = SnowFormFlag.class; |             case SNOW: | ||||||
|         } else if (Tag.ICE.isTagged(event.getNewState().getType())) { |             case SNOW_BLOCK: | ||||||
|             flag = IceFormFlag.class; |                 flag = SnowFormFlag.class; | ||||||
|         } else { |                 break; | ||||||
|             return; |             case ICE: | ||||||
|  |             case FROSTED_ICE: | ||||||
|  |             case PACKED_ICE: | ||||||
|  |                 flag = IceFormFlag.class; | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 return; // other blocks are ignored by this event | ||||||
|         } |         } | ||||||
|         boolean allowed = plot.getFlag(flag); |         boolean allowed = plot.getFlag(flag); | ||||||
|         Entity entity = event.getEntity(); |         Entity entity = event.getEntity(); | ||||||
| @@ -677,33 +698,50 @@ public class BlockEventListener implements Listener { | |||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Material blockType = block.getType(); |         switch (block.getType()) { | ||||||
|         if (Tag.ICE.isTagged(blockType)) { |             case ICE: | ||||||
|             if (!plot.getFlag(IceMeltFlag.class)) { |                 if (!plot.getFlag(IceMeltFlag.class)) { | ||||||
|                 plot.debug("Ice could not melt because ice-melt = false"); |                     plot.debug("Ice could not melt because ice-melt = false"); | ||||||
|                 event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|             } |                 } | ||||||
|             return; |                 break; | ||||||
|         } |             case SNOW: | ||||||
|         if (SNOW.contains(blockType)) { |                 if (!plot.getFlag(SnowMeltFlag.class)) { | ||||||
|             if (!plot.getFlag(SnowMeltFlag.class)) { |                     plot.debug("Snow could not melt because snow-melt = false"); | ||||||
|                 plot.debug("Snow could not melt because snow-melt = false"); |                     event.setCancelled(true); | ||||||
|                 event.setCancelled(true); |                 } | ||||||
|             } |                 break; | ||||||
|             return; |             case FARMLAND: | ||||||
|         } |                 if (!plot.getFlag(SoilDryFlag.class)) { | ||||||
|         if (blockType == Material.FARMLAND) { |                     plot.debug("Soil could not dry because soil-dry = false"); | ||||||
|             if (!plot.getFlag(SoilDryFlag.class)) { |                     event.setCancelled(true); | ||||||
|                 plot.debug("Soil could not dry because soil-dry = false"); |                 } | ||||||
|                 event.setCancelled(true); |                 break; | ||||||
|             } |             case TUBE_CORAL_BLOCK: | ||||||
|             return; |             case BRAIN_CORAL_BLOCK: | ||||||
|         } |             case BUBBLE_CORAL_BLOCK: | ||||||
|         if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType) || Tag.WALL_CORALS.isTagged(blockType)) { |             case FIRE_CORAL_BLOCK: | ||||||
|             if (!plot.getFlag(CoralDryFlag.class)) { |             case HORN_CORAL_BLOCK: | ||||||
|                 plot.debug("Coral could not dry because coral-dry = false"); |             case TUBE_CORAL: | ||||||
|                 event.setCancelled(true); |             case BRAIN_CORAL: | ||||||
|             } |             case BUBBLE_CORAL: | ||||||
|  |             case FIRE_CORAL: | ||||||
|  |             case HORN_CORAL: | ||||||
|  |             case TUBE_CORAL_FAN: | ||||||
|  |             case BRAIN_CORAL_FAN: | ||||||
|  |             case BUBBLE_CORAL_FAN: | ||||||
|  |             case FIRE_CORAL_FAN: | ||||||
|  |             case HORN_CORAL_FAN: | ||||||
|  |             case BRAIN_CORAL_WALL_FAN: | ||||||
|  |             case BUBBLE_CORAL_WALL_FAN: | ||||||
|  |             case FIRE_CORAL_WALL_FAN: | ||||||
|  |             case HORN_CORAL_WALL_FAN: | ||||||
|  |             case TUBE_CORAL_WALL_FAN: | ||||||
|  |                 if (!plot.getFlag(CoralDryFlag.class)) { | ||||||
|  |                     plot.debug("Coral could not dry because coral-dry = false"); | ||||||
|  |                     event.setCancelled(true); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -734,7 +772,7 @@ public class BlockEventListener implements Listener { | |||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (!toArea.buildRangeContainsY(toLocation.getY())) { |         if (toLocation.getY() >= toArea.getMaxBuildHeight() || toLocation.getY() < toArea.getMinBuildHeight()) { | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -808,11 +846,6 @@ public class BlockEventListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!area.buildRangeContainsY(location.getY())) { |  | ||||||
|             event.setCancelled(true); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         Plot plot = location.getOwnedPlot(); |         Plot plot = location.getOwnedPlot(); | ||||||
|         if (plot == null || !plot.getFlag(CropGrowFlag.class)) { |         if (plot == null || !plot.getFlag(CropGrowFlag.class)) { | ||||||
|             if (plot != null) { |             if (plot != null) { | ||||||
| @@ -856,16 +889,15 @@ public class BlockEventListener implements Listener { | |||||||
|         } |         } | ||||||
|         for (Block block1 : event.getBlocks()) { |         for (Block block1 : event.getBlocks()) { | ||||||
|             Location bloc = BukkitUtil.adapt(block1.getLocation()); |             Location bloc = BukkitUtil.adapt(block1.getLocation()); | ||||||
|             Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ()); |             if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains( | ||||||
|             if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains(newLoc)) { |                     bloc.getX() + relative.getBlockX(), | ||||||
|  |                     bloc.getZ() + relative.getBlockZ() | ||||||
|  |             )) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (!plot.equals(area.getOwnedPlot(bloc)) || !plot.equals(area.getOwnedPlot(newLoc))) { |             if (!plot.equals(area.getOwnedPlot(bloc)) || !plot | ||||||
|                 event.setCancelled(true); |                     .equals(area.getOwnedPlot(bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ())))) { | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (!area.buildRangeContainsY(bloc.getY()) || !area.buildRangeContainsY(newLoc.getY())) { |  | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| @@ -891,8 +923,9 @@ public class BlockEventListener implements Listener { | |||||||
|             } |             } | ||||||
|             for (Block block1 : event.getBlocks()) { |             for (Block block1 : event.getBlocks()) { | ||||||
|                 Location bloc = BukkitUtil.adapt(block1.getLocation()); |                 Location bloc = BukkitUtil.adapt(block1.getLocation()); | ||||||
|                 Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ()); |                 if (bloc.isPlotArea() || bloc | ||||||
|                 if (bloc.isPlotArea() || newLoc.isPlotArea()) { |                         .add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ()) | ||||||
|  |                         .isPlotArea()) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
| @@ -906,16 +939,15 @@ public class BlockEventListener implements Listener { | |||||||
|         } |         } | ||||||
|         for (Block block1 : event.getBlocks()) { |         for (Block block1 : event.getBlocks()) { | ||||||
|             Location bloc = BukkitUtil.adapt(block1.getLocation()); |             Location bloc = BukkitUtil.adapt(block1.getLocation()); | ||||||
|             Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ()); |             if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains( | ||||||
|             if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains(newLoc)) { |                     bloc.getX() + relative.getBlockX(), | ||||||
|  |                     bloc.getZ() + relative.getBlockZ() | ||||||
|  |             )) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (!plot.equals(area.getOwnedPlot(bloc)) || !plot.equals(area.getOwnedPlot(newLoc))) { |             if (!plot.equals(area.getOwnedPlot(bloc)) || !plot | ||||||
|                 event.setCancelled(true); |                     .equals(area.getOwnedPlot(bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ())))) { | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (!area.buildRangeContainsY(bloc.getY()) || !area.buildRangeContainsY(newLoc.getY())) { |  | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| @@ -939,11 +971,6 @@ public class BlockEventListener implements Listener { | |||||||
|                 Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation()); |                 Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation()); | ||||||
|                 if (location.isPlotRoad()) { |                 if (location.isPlotRoad()) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 PlotArea area = location.getPlotArea(); |  | ||||||
|                 if (area != null && !area.buildRangeContainsY(location.getY())) { |  | ||||||
|                     event.setCancelled(true); |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -983,10 +1010,6 @@ public class BlockEventListener implements Listener { | |||||||
|                 Plot plot = area.getOwnedPlot(location); |                 Plot plot = area.getOwnedPlot(location); | ||||||
|                 if (!Objects.equals(plot, origin)) { |                 if (!Objects.equals(plot, origin)) { | ||||||
|                     event.getBlocks().remove(i); |                     event.getBlocks().remove(i); | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|                 if (!area.buildRangeContainsY(location.getY())) { |  | ||||||
|                     event.getBlocks().remove(i); |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -1078,10 +1101,6 @@ public class BlockEventListener implements Listener { | |||||||
|         Plot plot = area.getOwnedPlot(location1); |         Plot plot = area.getOwnedPlot(location1); | ||||||
|         if (player != null) { |         if (player != null) { | ||||||
|             BukkitPlayer pp = BukkitUtil.adapt(player); |             BukkitPlayer pp = BukkitUtil.adapt(player); | ||||||
|             if (area.notifyIfOutsideBuildArea(pp, location1.getY())) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (plot == null) { |             if (plot == null) { | ||||||
|                 if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { |                 if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { | ||||||
|                     pp.sendMessage( |                     pp.sendMessage( | ||||||
| @@ -1189,10 +1208,7 @@ public class BlockEventListener implements Listener { | |||||||
|                     return true; |                     return true; | ||||||
|                 } |                 } | ||||||
|                 Plot plot = area.getOwnedPlot(blockLocation); |                 Plot plot = area.getOwnedPlot(blockLocation); | ||||||
|                 if (!Objects.equals(plot, origin)) { |                 return !Objects.equals(plot, origin); | ||||||
|                     return true; |  | ||||||
|                 } |  | ||||||
|                 return !area.buildRangeContainsY(location.getY()); |  | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         if (blocks.isEmpty()) { |         if (blocks.isEmpty()) { | ||||||
| @@ -1234,7 +1250,15 @@ public class BlockEventListener implements Listener { | |||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) { |             if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |             if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) { | ||||||
|  |                 pp.sendMessage( | ||||||
|  |                         TranslatableCaption.of("height.height_limit"), | ||||||
|  |                         Template.of("minHeight", String.valueOf(area.getMinBuildHeight())), | ||||||
|  |                         Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight())) | ||||||
|  |                 ); | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -26,7 +26,6 @@ import com.plotsquared.core.plot.Plot; | |||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | 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 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; | ||||||
| @@ -40,31 +39,11 @@ 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() { | ||||||
|     } |     } | ||||||
| @@ -80,19 +59,10 @@ public class BlockEventListener117 implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         BukkitPlayer plotPlayer = null; |  | ||||||
|  |  | ||||||
|         if (entity instanceof Player player) { |  | ||||||
|             plotPlayer = BukkitUtil.adapt(player); |  | ||||||
|             if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         Plot plot = location.getOwnedPlot(); |         Plot plot = location.getOwnedPlot(); | ||||||
|         if (plot == null || !plot.getFlag(MiscInteractFlag.class)) { |         if (plot == null || !plot.getFlag(MiscInteractFlag.class)) { | ||||||
|             if (plotPlayer != null) { |             if (entity instanceof Player player) { | ||||||
|  |                 BukkitPlayer plotPlayer = BukkitUtil.adapt(player); | ||||||
|                 if (plot != null) { |                 if (plot != null) { | ||||||
|                     if (!plot.isAdded(plotPlayer.getUUID())) { |                     if (!plot.isAdded(plotPlayer.getUUID())) { | ||||||
|                         plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false"); |                         plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false"); | ||||||
| @@ -124,12 +94,12 @@ public class BlockEventListener117 implements Listener { | |||||||
|         PlotArea area = location.getPlotArea(); |         PlotArea area = location.getPlotArea(); | ||||||
|         if (area == null) { |         if (area == null) { | ||||||
|             for (int i = blocks.size() - 1; i >= 0; i--) { |             for (int i = blocks.size() - 1; i >= 0; i--) { | ||||||
|                 Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation()); |                 location = BukkitUtil.adapt(blocks.get(i).getLocation()); | ||||||
|                 blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation()); |                 if (location.isPlotArea()) { | ||||||
|                 if (blockLocation.isPlotArea()) { |  | ||||||
|                     blocks.remove(i); |                     blocks.remove(i); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |             return; | ||||||
|         } else { |         } else { | ||||||
|             Plot origin = area.getOwnedPlot(location); |             Plot origin = area.getOwnedPlot(location); | ||||||
|             if (origin == null) { |             if (origin == null) { | ||||||
| @@ -137,21 +107,29 @@ public class BlockEventListener117 implements Listener { | |||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             for (int i = blocks.size() - 1; i >= 0; i--) { |             for (int i = blocks.size() - 1; i >= 0; i--) { | ||||||
|                 Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation()); |                 location = BukkitUtil.adapt(blocks.get(i).getLocation()); | ||||||
|                 if (!area.contains(blockLocation.getX(), blockLocation.getZ())) { |                 if (!area.contains(location.getX(), location.getZ())) { | ||||||
|                     blocks.remove(i); |                     blocks.remove(i); | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 Plot plot = area.getOwnedPlot(blockLocation); |                 Plot plot = area.getOwnedPlot(location); | ||||||
|                 if (!Objects.equals(plot, origin)) { |                 if (!Objects.equals(plot, origin)) { | ||||||
|                     event.getBlocks().remove(i); |                     event.getBlocks().remove(i); | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|                 if (!area.buildRangeContainsY(location.getY())) { |  | ||||||
|                     event.getBlocks().remove(i); |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         Plot origin = area.getPlot(location); | ||||||
|  |         if (origin == null) { | ||||||
|  |             event.setCancelled(true); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         for (int i = blocks.size() - 1; i >= 0; i--) { | ||||||
|  |             location = BukkitUtil.adapt(blocks.get(i).getLocation()); | ||||||
|  |             Plot plot = area.getOwnedPlot(location); | ||||||
|  |             if (!Objects.equals(plot, origin) && (!plot.isMerged() && !origin.isMerged())) { | ||||||
|  |                 event.getBlocks().remove(i); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
| @@ -170,11 +148,27 @@ public class BlockEventListener117 implements Listener { | |||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (COPPER_OXIDIZING.contains(event.getNewState().getType())) { |         switch (event.getNewState().getType()) { | ||||||
|             if (!plot.getFlag(CopperOxideFlag.class)) { |             case COPPER_BLOCK: | ||||||
|                 plot.debug("Copper could not oxide because copper-oxide = false"); |             case EXPOSED_COPPER: | ||||||
|                 event.setCancelled(true); |             case WEATHERED_COPPER: | ||||||
|             } |             case OXIDIZED_COPPER: | ||||||
|  |             case CUT_COPPER: | ||||||
|  |             case EXPOSED_CUT_COPPER: | ||||||
|  |             case WEATHERED_CUT_COPPER: | ||||||
|  |             case OXIDIZED_CUT_COPPER: | ||||||
|  |             case CUT_COPPER_STAIRS: | ||||||
|  |             case EXPOSED_CUT_COPPER_STAIRS: | ||||||
|  |             case WEATHERED_CUT_COPPER_STAIRS: | ||||||
|  |             case OXIDIZED_CUT_COPPER_STAIRS: | ||||||
|  |             case CUT_COPPER_SLAB: | ||||||
|  |             case EXPOSED_CUT_COPPER_SLAB: | ||||||
|  |             case WEATHERED_CUT_COPPER_SLAB: | ||||||
|  |             case OXIDIZED_CUT_COPPER_SLAB: | ||||||
|  |                 if (!plot.getFlag(CopperOxideFlag.class)) { | ||||||
|  |                     plot.debug("Copper could not oxide because copper-oxide = false"); | ||||||
|  |                     event.setCancelled(true); | ||||||
|  |                 } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -124,17 +124,17 @@ public class EntitySpawnListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Plot plot = location.getOwnedPlotAbs(); |         Plot plot = location.getOwnedPlotAbs(); | ||||||
|         EntityType type = entity.getType(); |  | ||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             if (type == EntityType.DROPPED_ITEM) { |             EntityType type = entity.getType(); | ||||||
|                 if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { |  | ||||||
|                     event.setCancelled(true); |  | ||||||
|                 } |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (!area.isMobSpawning()) { |             if (!area.isMobSpawning()) { | ||||||
|                 if (type == EntityType.PLAYER) { |                 switch (type) { | ||||||
|                     return; |                     case DROPPED_ITEM: | ||||||
|  |                         if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { | ||||||
|  |                             event.setCancelled(true); | ||||||
|  |                             return; | ||||||
|  |                         } | ||||||
|  |                     case PLAYER: | ||||||
|  |                         return; | ||||||
|                 } |                 } | ||||||
|                 if (type.isAlive()) { |                 if (type.isAlive()) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
| @@ -148,16 +148,15 @@ public class EntitySpawnListener implements Listener { | |||||||
|         if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { |         if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|         } |         } | ||||||
|         if (type == EntityType.ENDER_CRYSTAL) { |         switch (entity.getType()) { | ||||||
|             if (BukkitEntityUtil.checkEntity(entity, plot)) { |             case ENDER_CRYSTAL: | ||||||
|                 event.setCancelled(true); |                 if (BukkitEntityUtil.checkEntity(entity, plot)) { | ||||||
|             } |                     event.setCancelled(true); | ||||||
|             return; |                 } | ||||||
|         } |             case SHULKER: | ||||||
|         if (type == EntityType.SHULKER) { |                 if (!entity.hasMetadata("shulkerPlot")) { | ||||||
|             if (!entity.hasMetadata("shulkerPlot")) { |                     entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); | ||||||
|                 entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); |                 } | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -229,16 +229,16 @@ public class PaperListener implements Listener { | |||||||
|         Plot plot = location.getOwnedPlotAbs(); |         Plot plot = location.getOwnedPlotAbs(); | ||||||
|         if (plot == null) { |         if (plot == null) { | ||||||
|             EntityType type = event.getType(); |             EntityType type = event.getType(); | ||||||
|             // PreCreatureSpawnEvent **should** not be called for DROPPED_ITEM, just for the sake of consistency |  | ||||||
|             if (type == EntityType.DROPPED_ITEM) { |  | ||||||
|                 if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { |  | ||||||
|                     event.setCancelled(true); |  | ||||||
|                 } |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (!area.isMobSpawning()) { |             if (!area.isMobSpawning()) { | ||||||
|                 if (type == EntityType.PLAYER) { |                 switch (type) { | ||||||
|                     return; |                     case DROPPED_ITEM: | ||||||
|  |                         if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { | ||||||
|  |                             event.setShouldAbortSpawn(true); | ||||||
|  |                             event.setCancelled(true); | ||||||
|  |                             return; | ||||||
|  |                         } | ||||||
|  |                     case PLAYER: | ||||||
|  |                         return; | ||||||
|                 } |                 } | ||||||
|                 if (type.isAlive()) { |                 if (type.isAlive()) { | ||||||
|                     event.setShouldAbortSpawn(true); |                     event.setShouldAbortSpawn(true); | ||||||
|   | |||||||
| @@ -82,7 +82,6 @@ import org.bukkit.Bukkit; | |||||||
| import org.bukkit.ChatColor; | import org.bukkit.ChatColor; | ||||||
| import org.bukkit.FluidCollisionMode; | import org.bukkit.FluidCollisionMode; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
| import org.bukkit.Tag; |  | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| import org.bukkit.block.BlockFace; | import org.bukkit.block.BlockFace; | ||||||
| import org.bukkit.block.BlockState; | import org.bukkit.block.BlockState; | ||||||
| @@ -146,36 +145,23 @@ import org.bukkit.util.Vector; | |||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| import java.lang.reflect.Field; | import java.lang.reflect.Field; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  | import java.util.regex.Pattern; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Player Events involving plots. |  * Player Events involving plots. | ||||||
|  */ |  */ | ||||||
| @SuppressWarnings("unused") | @SuppressWarnings("unused") | ||||||
| public class PlayerEventListener implements Listener { | public class PlayerEventListener extends PlotListener implements Listener { | ||||||
|  |  | ||||||
|     private static final Set<Material> MINECARTS = Set.of( |  | ||||||
|             Material.MINECART, |  | ||||||
|             Material.TNT_MINECART, |  | ||||||
|             Material.CHEST_MINECART, |  | ||||||
|             Material.COMMAND_BLOCK_MINECART, |  | ||||||
|             Material.FURNACE_MINECART, |  | ||||||
|             Material.HOPPER_MINECART |  | ||||||
|     ); |  | ||||||
|     private static final Set<Material> BOOKS = Set.of( |  | ||||||
|             Material.BOOK, |  | ||||||
|             Material.KNOWLEDGE_BOOK, |  | ||||||
|             Material.WRITABLE_BOOK, |  | ||||||
|             Material.WRITTEN_BOOK |  | ||||||
|     ); |  | ||||||
|     private final EventDispatcher eventDispatcher; |     private final EventDispatcher eventDispatcher; | ||||||
|     private final WorldEdit worldEdit; |     private final WorldEdit worldEdit; | ||||||
|     private final PlotAreaManager plotAreaManager; |     private final PlotAreaManager plotAreaManager; | ||||||
|     private final PlotListener plotListener; |  | ||||||
|     // To prevent recursion |     // To prevent recursion | ||||||
|     private boolean tmpTeleport = true; |     private boolean tmpTeleport = true; | ||||||
|     private Field fieldPlayer; |     private Field fieldPlayer; | ||||||
| @@ -195,13 +181,12 @@ public class PlayerEventListener implements Listener { | |||||||
|     public PlayerEventListener( |     public PlayerEventListener( | ||||||
|             final @NonNull PlotAreaManager plotAreaManager, |             final @NonNull PlotAreaManager plotAreaManager, | ||||||
|             final @NonNull EventDispatcher eventDispatcher, |             final @NonNull EventDispatcher eventDispatcher, | ||||||
|             final @NonNull WorldEdit worldEdit, |             final @NonNull WorldEdit worldEdit | ||||||
|             final @NonNull PlotListener plotListener |  | ||||||
|     ) { |     ) { | ||||||
|  |         super(eventDispatcher); | ||||||
|         this.eventDispatcher = eventDispatcher; |         this.eventDispatcher = eventDispatcher; | ||||||
|         this.worldEdit = worldEdit; |         this.worldEdit = worldEdit; | ||||||
|         this.plotAreaManager = plotAreaManager; |         this.plotAreaManager = plotAreaManager; | ||||||
|         this.plotListener = plotListener; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
| @@ -354,7 +339,7 @@ public class PlayerEventListener implements Listener { | |||||||
|         if (area != null) { |         if (area != null) { | ||||||
|             Plot plot = area.getPlot(location); |             Plot plot = area.getPlot(location); | ||||||
|             if (plot != null) { |             if (plot != null) { | ||||||
|                 plotListener.plotEntry(pp, plot); |                 plotEntry(pp, plot); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // Delayed |         // Delayed | ||||||
| @@ -406,7 +391,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                 PlotArea area = location.getPlotArea(); |                 PlotArea area = location.getPlotArea(); | ||||||
|                 if (area == null) { |                 if (area == null) { | ||||||
|                     if (lastPlot != null) { |                     if (lastPlot != null) { | ||||||
|                         plotListener.plotExit(pp, lastPlot); |                         plotExit(pp, lastPlot); | ||||||
|                         lastPlotAccess.remove(); |                         lastPlotAccess.remove(); | ||||||
|                     } |                     } | ||||||
|                     try (final MetaDataAccess<Location> lastLocationAccess = |                     try (final MetaDataAccess<Location> lastLocationAccess = | ||||||
| @@ -540,7 +525,7 @@ public class PlayerEventListener implements Listener { | |||||||
|             if (now == null) { |             if (now == null) { | ||||||
|                 try (final MetaDataAccess<Boolean> kickAccess = |                 try (final MetaDataAccess<Boolean> kickAccess = | ||||||
|                              pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { |                              pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { | ||||||
|                     if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) { |                     if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) { | ||||||
|                         pp.sendMessage( |                         pp.sendMessage( | ||||||
|                                 TranslatableCaption.of("permission.no_permission_event"), |                                 TranslatableCaption.of("permission.no_permission_event"), | ||||||
|                                 Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) |                                 Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) | ||||||
| @@ -558,7 +543,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                 } |                 } | ||||||
|             } else if (now.equals(lastPlot)) { |             } else if (now.equals(lastPlot)) { | ||||||
|                 ForceFieldListener.handleForcefield(player, pp, now); |                 ForceFieldListener.handleForcefield(player, pp, now); | ||||||
|             } else if (!plotListener.plotEntry(pp, now) && this.tmpTeleport) { |             } else if (!plotEntry(pp, now) && this.tmpTeleport) { | ||||||
|                 pp.sendMessage( |                 pp.sendMessage( | ||||||
|                         TranslatableCaption.of("deny.no_enter"), |                         TranslatableCaption.of("deny.no_enter"), | ||||||
|                         Template.of("plot", now.toString()) |                         Template.of("plot", now.toString()) | ||||||
| @@ -630,7 +615,7 @@ public class PlayerEventListener implements Listener { | |||||||
|             if (plot == null) { |             if (plot == null) { | ||||||
|                 try (final MetaDataAccess<Boolean> kickAccess = |                 try (final MetaDataAccess<Boolean> kickAccess = | ||||||
|                              pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { |                              pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { | ||||||
|                     if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) { |                     if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) { | ||||||
|                         pp.sendMessage( |                         pp.sendMessage( | ||||||
|                                 TranslatableCaption.of("permission.no_permission_event"), |                                 TranslatableCaption.of("permission.no_permission_event"), | ||||||
|                                 Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) |                                 Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) | ||||||
| @@ -648,7 +633,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                 } |                 } | ||||||
|             } else if (plot.equals(lastPlot)) { |             } else if (plot.equals(lastPlot)) { | ||||||
|                 ForceFieldListener.handleForcefield(player, pp, plot); |                 ForceFieldListener.handleForcefield(player, pp, plot); | ||||||
|             } else if (!plotListener.plotEntry(pp, plot) && this.tmpTeleport) { |             } else if (!plotEntry(pp, plot) && this.tmpTeleport) { | ||||||
|                 pp.sendMessage( |                 pp.sendMessage( | ||||||
|                         TranslatableCaption.of("deny.no_enter"), |                         TranslatableCaption.of("deny.no_enter"), | ||||||
|                         Template.of("plot", plot.toString()) |                         Template.of("plot", plot.toString()) | ||||||
| @@ -795,7 +780,7 @@ public class PlayerEventListener implements Listener { | |||||||
|             lastLocationAccess.remove(); |             lastLocationAccess.remove(); | ||||||
|         } |         } | ||||||
|         if (plot != null) { |         if (plot != null) { | ||||||
|             plotListener.plotExit(pp, plot); |             plotExit(pp, plot); | ||||||
|         } |         } | ||||||
|         if (this.worldEdit != null) { |         if (this.worldEdit != null) { | ||||||
|             if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) { |             if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) { | ||||||
| @@ -809,7 +794,7 @@ public class PlayerEventListener implements Listener { | |||||||
|         if (location.isPlotArea()) { |         if (location.isPlotArea()) { | ||||||
|             plot = location.getPlot(); |             plot = location.getPlot(); | ||||||
|             if (plot != null) { |             if (plot != null) { | ||||||
|                 plotListener.plotEntry(pp, plot); |                 plotEntry(pp, plot); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -845,10 +830,10 @@ public class PlayerEventListener implements Listener { | |||||||
|         if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) { |         if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         ItemStack oldItem = inv.getItemInHand(); |         ItemStack current = inv.getItemInHand(); | ||||||
|         ItemMeta oldMeta = oldItem.getItemMeta(); |  | ||||||
|         ItemStack newItem = event.getCursor(); |         ItemStack newItem = event.getCursor(); | ||||||
|         ItemMeta newMeta = newItem.getItemMeta(); |         ItemMeta newMeta = newItem.getItemMeta(); | ||||||
|  |         ItemMeta oldMeta = newItem.getItemMeta(); | ||||||
|  |  | ||||||
|         if (event.getClick() == ClickType.CREATIVE) { |         if (event.getClick() == ClickType.CREATIVE) { | ||||||
|             final Plot plot = pp.getCurrentPlot(); |             final Plot plot = pp.getCurrentPlot(); | ||||||
| @@ -888,26 +873,34 @@ public class PlayerEventListener implements Listener { | |||||||
|                 oldLore = lore.toString(); |                 oldLore = lore.toString(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         Material itemType = newItem.getType(); |         if (!"[(+NBT)]".equals(newLore) || (current.equals(newItem) && newLore.equals(oldLore))) { | ||||||
|         if (!"[(+NBT)]".equals(newLore) || (oldItem.equals(newItem) && newLore.equals(oldLore))) { |             switch (newItem.getType()) { | ||||||
|             if (newMeta == null || (itemType != Material.LEGACY_BANNER && itemType != Material.PLAYER_HEAD)) { |                 case LEGACY_BANNER: | ||||||
|                 return; |                 case PLAYER_HEAD: | ||||||
|  |                     if (newMeta != null) { | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 default: | ||||||
|  |                     return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         Block block = player.getTargetBlock(null, 7); |         Block block = player.getTargetBlock(null, 7); | ||||||
|         org.bukkit.block.BlockState state = block.getState(); |         org.bukkit.block.BlockState state = block.getState(); | ||||||
|         Material stateType = state.getType(); |         Material stateType = state.getType(); | ||||||
|  |         Material itemType = newItem.getType(); | ||||||
|         if (stateType != itemType) { |         if (stateType != itemType) { | ||||||
|             if (stateType == Material.LEGACY_WALL_BANNER || stateType == Material.LEGACY_STANDING_BANNER) { |             switch (stateType) { | ||||||
|                 if (itemType != Material.LEGACY_BANNER) { |                 case LEGACY_STANDING_BANNER: | ||||||
|  |                 case LEGACY_WALL_BANNER: | ||||||
|  |                     if (itemType == Material.LEGACY_BANNER) { | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 case LEGACY_SKULL: | ||||||
|  |                     if (itemType == Material.LEGACY_SKULL_ITEM) { | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 default: | ||||||
|                     return; |                     return; | ||||||
|                 } |  | ||||||
|             } else if (stateType == Material.LEGACY_SKULL) { |  | ||||||
|                 if (itemType != Material.LEGACY_SKULL_ITEM) { |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|             } else { |  | ||||||
|                 return; |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         Location location = BukkitUtil.adapt(state.getLocation()); |         Location location = BukkitUtil.adapt(state.getLocation()); | ||||||
| @@ -946,7 +939,7 @@ public class PlayerEventListener implements Listener { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (cancelled) { |         if (cancelled) { | ||||||
|             if ((oldItem.getType() == newItem.getType()) && (oldItem.getDurability() == newItem |             if ((current.getType() == newItem.getType()) && (current.getDurability() == newItem | ||||||
|                     .getDurability())) { |                     .getDurability())) { | ||||||
|                 event.setCursor( |                 event.setCursor( | ||||||
|                         new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability())); |                         new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability())); | ||||||
| @@ -1133,21 +1126,14 @@ public class PlayerEventListener implements Listener { | |||||||
|                     //Allow all players to eat while also allowing the block place event ot be fired |                     //Allow all players to eat while also allowing the block place event ot be fired | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 if (type == Material.ARMOR_STAND) { |                 switch (type) { | ||||||
|                     location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); |                     case ACACIA_BOAT, BIRCH_BOAT, CHEST_MINECART, COMMAND_BLOCK_MINECART, DARK_OAK_BOAT, FURNACE_MINECART, HOPPER_MINECART, JUNGLE_BOAT, MINECART, OAK_BOAT, SPRUCE_BOAT, TNT_MINECART -> eventType = PlayerBlockEventType.PLACE_VEHICLE; | ||||||
|                     eventType = PlayerBlockEventType.PLACE_MISC; |                     case FIREWORK_ROCKET, FIREWORK_STAR -> eventType = PlayerBlockEventType.SPAWN_MOB; | ||||||
|                 } |                     case BOOK, KNOWLEDGE_BOOK, WRITABLE_BOOK, WRITTEN_BOOK -> eventType = PlayerBlockEventType.READ; | ||||||
|                 if (Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) { |                     case ARMOR_STAND -> { | ||||||
|                     eventType = PlayerBlockEventType.PLACE_VEHICLE; |                         location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); | ||||||
|                     break; |                         eventType = PlayerBlockEventType.PLACE_MISC; | ||||||
|                 } |                     } | ||||||
|                 if (type == Material.FIREWORK_ROCKET || type == Material.FIREWORK_STAR) { |  | ||||||
|                     eventType = PlayerBlockEventType.SPAWN_MOB; |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|                 if (BOOKS.contains(type)) { |  | ||||||
|                     eventType = PlayerBlockEventType.READ; |  | ||||||
|                     break; |  | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| @@ -1282,7 +1268,7 @@ public class PlayerEventListener implements Listener { | |||||||
|         TaskManager.removeFromTeleportQueue(event.getPlayer().getName()); |         TaskManager.removeFromTeleportQueue(event.getPlayer().getName()); | ||||||
|         BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); |         BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); | ||||||
|         pp.unregister(); |         pp.unregister(); | ||||||
|         plotListener.logout(pp.getUUID()); |         this.logout(pp.getUUID()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
| @@ -1719,7 +1705,6 @@ public class PlayerEventListener implements Listener { | |||||||
|         if (PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world).size() == 0) { |         if (PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world).size() == 0) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         BukkitPlayer pp = (event.getEntity() instanceof Player player) ? BukkitUtil.adapt(player) : null; |  | ||||||
|         int minX = Integer.MAX_VALUE; |         int minX = Integer.MAX_VALUE; | ||||||
|         int maxX = Integer.MIN_VALUE; |         int maxX = Integer.MIN_VALUE; | ||||||
|         int minZ = Integer.MAX_VALUE; |         int minZ = Integer.MAX_VALUE; | ||||||
| @@ -1741,10 +1726,6 @@ public class PlayerEventListener implements Listener { | |||||||
|             if (area == null) { |             if (area == null) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             if (area.notifyIfOutsideBuildArea(pp, location.getY())) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             Plot plot = location.getOwnedPlot(); |             Plot plot = location.getOwnedPlot(); | ||||||
|             if (plot == null) { |             if (plot == null) { | ||||||
|                 if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) { |                 if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) { | ||||||
|   | |||||||
| @@ -89,7 +89,7 @@ public class ProjectileEventListener implements Listener { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(ignoreCancelled = true) |     @EventHandler | ||||||
|     public void onProjectileLaunch(ProjectileLaunchEvent event) { |     public void onProjectileLaunch(ProjectileLaunchEvent event) { | ||||||
|         Projectile entity = event.getEntity(); |         Projectile entity = event.getEntity(); | ||||||
|         ProjectileSource shooter = entity.getShooter(); |         ProjectileSource shooter = entity.getShooter(); | ||||||
| @@ -149,18 +149,6 @@ public class ProjectileEventListener implements Listener { | |||||||
|         Plot plot = area.getPlot(location); |         Plot plot = area.getPlot(location); | ||||||
|         ProjectileSource shooter = entity.getShooter(); |         ProjectileSource shooter = entity.getShooter(); | ||||||
|         if (shooter instanceof Player) { |         if (shooter instanceof Player) { | ||||||
|             if (!((Player) shooter).isOnline()) { |  | ||||||
|                 if (plot != null) { |  | ||||||
|                     if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) { |  | ||||||
|                         return; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 entity.remove(); |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter); |             PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter); | ||||||
|             if (plot == null) { |             if (plot == null) { | ||||||
|                 if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { |                 if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { | ||||||
|   | |||||||
| @@ -19,12 +19,12 @@ | |||||||
| package com.plotsquared.bukkit.queue; | package com.plotsquared.bukkit.queue; | ||||||
|  |  | ||||||
| import com.google.common.base.Preconditions; | import com.google.common.base.Preconditions; | ||||||
| import com.intellectualsites.annotations.DoNotUse; |  | ||||||
| import com.plotsquared.bukkit.util.BukkitBlockUtil; | import com.plotsquared.bukkit.util.BukkitBlockUtil; | ||||||
| import com.plotsquared.bukkit.util.BukkitUtil; | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
| import com.plotsquared.core.location.ChunkWrapper; | import com.plotsquared.core.location.ChunkWrapper; | ||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
| import com.plotsquared.core.queue.ScopedQueueCoordinator; | import com.plotsquared.core.queue.ScopedQueueCoordinator; | ||||||
|  | import com.plotsquared.core.util.AnnotationHelper; | ||||||
| import com.plotsquared.core.util.ChunkUtil; | import com.plotsquared.core.util.ChunkUtil; | ||||||
| import com.plotsquared.core.util.PatternUtil; | import com.plotsquared.core.util.PatternUtil; | ||||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
| @@ -44,7 +44,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; | |||||||
|  |  | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
|  |  | ||||||
| @DoNotUse | @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
| public class GenChunk extends ScopedQueueCoordinator { | public class GenChunk extends ScopedQueueCoordinator { | ||||||
|  |  | ||||||
|     public final Biome[] biomes; |     public final Biome[] biomes; | ||||||
|   | |||||||
| @@ -58,7 +58,6 @@ import org.bukkit.block.BlockFace; | |||||||
| import org.bukkit.block.Sign; | import org.bukkit.block.Sign; | ||||||
| import org.bukkit.block.data.Directional; | import org.bukkit.block.data.Directional; | ||||||
| import org.bukkit.block.data.type.WallSign; | import org.bukkit.block.data.type.WallSign; | ||||||
| import org.bukkit.entity.Allay; |  | ||||||
| import org.bukkit.entity.Ambient; | import org.bukkit.entity.Ambient; | ||||||
| import org.bukkit.entity.Animals; | import org.bukkit.entity.Animals; | ||||||
| import org.bukkit.entity.AreaEffectCloud; | import org.bukkit.entity.AreaEffectCloud; | ||||||
| @@ -438,9 +437,6 @@ public class BukkitUtil extends WorldUtil { | |||||||
|                 allowedInterfaces.add(Animals.class); |                 allowedInterfaces.add(Animals.class); | ||||||
|                 allowedInterfaces.add(WaterMob.class); |                 allowedInterfaces.add(WaterMob.class); | ||||||
|                 allowedInterfaces.add(Ambient.class); |                 allowedInterfaces.add(Ambient.class); | ||||||
|                 if (PlotSquared.platform().serverVersion()[1] >= 19) { |  | ||||||
|                     allowedInterfaces.add(Allay.class); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|             case "tameable" -> allowedInterfaces.add(Tameable.class); |             case "tameable" -> allowedInterfaces.add(Tameable.class); | ||||||
|             case "vehicle" -> allowedInterfaces.add(Vehicle.class); |             case "vehicle" -> allowedInterfaces.add(Vehicle.class); | ||||||
|   | |||||||
| @@ -43,7 +43,6 @@ dependencies { | |||||||
|     api(libs.cloudServices) |     api(libs.cloudServices) | ||||||
|     api(libs.arkitektonika) |     api(libs.arkitektonika) | ||||||
|     api("com.intellectualsites.paster:Paster") |     api("com.intellectualsites.paster:Paster") | ||||||
|     api("com.intellectualsites.informative-annotations:informative-annotations") |  | ||||||
| } | } | ||||||
|  |  | ||||||
| tasks.processResources { | tasks.processResources { | ||||||
| @@ -63,7 +62,5 @@ tasks { | |||||||
|         opt.links("https://jd.adventure.kyori.net/api/4.9.3/") |         opt.links("https://jd.adventure.kyori.net/api/4.9.3/") | ||||||
|         opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") |         opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") | ||||||
|         opt.links("https://checkerframework.org/api/") |         opt.links("https://checkerframework.org/api/") | ||||||
|         opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/") |  | ||||||
|         opt.encoding("UTF-8") |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,7 +22,6 @@ import cloud.commandframework.services.ServicePipeline; | |||||||
| import com.google.inject.Injector; | import com.google.inject.Injector; | ||||||
| import com.google.inject.Key; | import com.google.inject.Key; | ||||||
| import com.google.inject.TypeLiteral; | import com.google.inject.TypeLiteral; | ||||||
| import com.intellectualsites.annotations.DoNotUse; |  | ||||||
| import com.plotsquared.core.backup.BackupManager; | import com.plotsquared.core.backup.BackupManager; | ||||||
| import com.plotsquared.core.configuration.caption.LocaleHolder; | import com.plotsquared.core.configuration.caption.LocaleHolder; | ||||||
| import com.plotsquared.core.generator.GeneratorWrapper; | import com.plotsquared.core.generator.GeneratorWrapper; | ||||||
| @@ -34,6 +33,7 @@ import com.plotsquared.core.permissions.PermissionHandler; | |||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.queue.GlobalBlockQueue; | import com.plotsquared.core.queue.GlobalBlockQueue; | ||||||
|  | import com.plotsquared.core.util.AnnotationHelper; | ||||||
| import com.plotsquared.core.util.ChunkManager; | import com.plotsquared.core.util.ChunkManager; | ||||||
| import com.plotsquared.core.util.EconHandler; | import com.plotsquared.core.util.EconHandler; | ||||||
| import com.plotsquared.core.util.PlatformWorldManager; | import com.plotsquared.core.util.PlatformWorldManager; | ||||||
| @@ -75,11 +75,6 @@ public interface PlotPlatform<P> extends LocaleHolder { | |||||||
|      */ |      */ | ||||||
|     void shutdown(); |     void shutdown(); | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Completely shuts down the server. |  | ||||||
|      */ |  | ||||||
|     void shutdownServer(); |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get the name of the plugin |      * Get the name of the plugin | ||||||
|      * |      * | ||||||
| @@ -313,7 +308,7 @@ public interface PlotPlatform<P> extends LocaleHolder { | |||||||
|      * @return worldedit implementations |      * @return worldedit implementations | ||||||
|      * @since 6.3.0 |      * @since 6.3.0 | ||||||
|      */ |      */ | ||||||
|     @DoNotUse |     @AnnotationHelper.ApiDescription(info = "Internal use only") | ||||||
|     @NonNull String worldEditImplementations(); |     @NonNull String worldEditImplementations(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -197,9 +197,6 @@ public class PlotSquared { | |||||||
|             this.loadCaptionMap(); |             this.loadCaptionMap(); | ||||||
|         } catch (final Exception e) { |         } catch (final Exception e) { | ||||||
|             LOGGER.error("Failed to load caption map", e); |             LOGGER.error("Failed to load caption map", e); | ||||||
|             LOGGER.error("Shutting down server to prevent further issues"); |  | ||||||
|             this.platform.shutdownServer(); |  | ||||||
|             throw new RuntimeException("Abort loading PlotSquared"); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Setup the global flag container |         // Setup the global flag container | ||||||
| @@ -270,7 +267,7 @@ public class PlotSquared { | |||||||
|             captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang")); |             captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang")); | ||||||
|         } else { |         } else { | ||||||
|             String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json"; |             String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json"; | ||||||
|             captionMap = this.captionLoader.loadOrCreateSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName)); |             captionMap = this.captionLoader.loadSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName)); | ||||||
|         } |         } | ||||||
|         this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap); |         this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap); | ||||||
|         LOGGER.info( |         LOGGER.info( | ||||||
|   | |||||||
| @@ -462,7 +462,6 @@ public final class FlagCommand extends Command { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         final Plot plot = player.getLocation().getPlotAbs(); |         final Plot plot = player.getLocation().getPlotAbs(); | ||||||
|         final PlotFlag<?, ?> flagWithOldValue = plot.getFlagContainer().getFlag(flag.getClass()); |  | ||||||
|         PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot); |         PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot); | ||||||
|         if (event.getEventResult() == Result.DENY) { |         if (event.getEventResult() == Result.DENY) { | ||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
| @@ -507,7 +506,7 @@ public final class FlagCommand extends Command { | |||||||
|                     if (plot.removeFlag(flag)) { |                     if (plot.removeFlag(flag)) { | ||||||
|                         player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( |                         player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( | ||||||
|                                 "value", |                                 "value", | ||||||
|                                 String.valueOf(flagWithOldValue) |                                 String.valueOf(flag) | ||||||
|                         )); |                         )); | ||||||
|                         return; |                         return; | ||||||
|                     } else { |                     } else { | ||||||
| @@ -545,7 +544,7 @@ public final class FlagCommand extends Command { | |||||||
|         } |         } | ||||||
|         player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( |         player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( | ||||||
|                 "value", |                 "value", | ||||||
|                 String.valueOf(flagWithOldValue) |                 String.valueOf(flag) | ||||||
|         )); |         )); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import com.plotsquared.core.util.TabCompletions; | |||||||
| import com.plotsquared.core.util.task.RunnableVal; | import com.plotsquared.core.util.task.RunnableVal; | ||||||
| import com.plotsquared.core.util.task.RunnableVal2; | import com.plotsquared.core.util.task.RunnableVal2; | ||||||
| import com.plotsquared.core.util.task.RunnableVal3; | import com.plotsquared.core.util.task.RunnableVal3; | ||||||
|  | import com.plotsquared.core.uuid.UUIDMapping; | ||||||
| import net.kyori.adventure.text.minimessage.Template; | import net.kyori.adventure.text.minimessage.Template; | ||||||
|  |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @@ -39,7 +40,6 @@ import java.util.Collections; | |||||||
| import java.util.LinkedList; | import java.util.LinkedList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.UUID; |  | ||||||
| import java.util.concurrent.CompletableFuture; | import java.util.concurrent.CompletableFuture; | ||||||
| import java.util.concurrent.TimeoutException; | import java.util.concurrent.TimeoutException; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
| @@ -88,8 +88,8 @@ public class Grant extends Command { | |||||||
|                                 Template.of("value", String.valueOf(uuids)) |                                 Template.of("value", String.valueOf(uuids)) | ||||||
|                         ); |                         ); | ||||||
|                     } else { |                     } else { | ||||||
|                         final UUID uuid = uuids.iterator().next(); |                         final UUIDMapping uuid = uuids.toArray(new UUIDMapping[0])[0]; | ||||||
|                         PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid); |                         PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid.getUuid()); | ||||||
|                         if (pp != null) { |                         if (pp != null) { | ||||||
|                             try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData( |                             try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData( | ||||||
|                                     PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) { |                                     PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) { | ||||||
| @@ -103,7 +103,7 @@ public class Grant extends Command { | |||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                         } else { |                         } else { | ||||||
|                             DBFunc.getPersistentMeta(uuid, new RunnableVal<>() { |                             DBFunc.getPersistentMeta(uuid.getUuid(), new RunnableVal<>() { | ||||||
|                                 @Override |                                 @Override | ||||||
|                                 public void run(Map<String, byte[]> value) { |                                 public void run(Map<String, byte[]> value) { | ||||||
|                                     final byte[] array = value.get("grantedPlots"); |                                     final byte[] array = value.get("grantedPlots"); | ||||||
| @@ -128,7 +128,7 @@ public class Grant extends Command { | |||||||
|                                         boolean replace = array != null; |                                         boolean replace = array != null; | ||||||
|                                         String key = "grantedPlots"; |                                         String key = "grantedPlots"; | ||||||
|                                         byte[] rawData = Ints.toByteArray(amount); |                                         byte[] rawData = Ints.toByteArray(amount); | ||||||
|                                         DBFunc.addPersistentMeta(uuid, key, rawData, replace); |                                         DBFunc.addPersistentMeta(uuid.getUuid(), key, rawData, replace); | ||||||
|                                         player.sendMessage( |                                         player.sendMessage( | ||||||
|                                                 TranslatableCaption.of("grants.added"), |                                                 TranslatableCaption.of("grants.added"), | ||||||
|                                                 Template.of("grants", String.valueOf(amount)) |                                                 Template.of("grants", String.valueOf(amount)) | ||||||
|   | |||||||
| @@ -115,8 +115,8 @@ public class Remove extends SubCommand { | |||||||
|             } |             } | ||||||
|             if (count == 0) { |             if (count == 0) { | ||||||
|                 player.sendMessage( |                 player.sendMessage( | ||||||
|                         TranslatableCaption.of("member.player_not_removed"), |                         TranslatableCaption.of("errors.invalid_player"), | ||||||
|                         Template.of("player", args[0]) |                         Template.of("value", args[0]) | ||||||
|                 ); |                 ); | ||||||
|             } else { |             } else { | ||||||
|                 player.sendMessage( |                 player.sendMessage( | ||||||
|   | |||||||
| @@ -174,7 +174,7 @@ public final class CaptionLoader { | |||||||
|     public @NonNull CaptionMap loadAll(final @NonNull Path directory) throws IOException { |     public @NonNull CaptionMap loadAll(final @NonNull Path directory) throws IOException { | ||||||
|         final Map<Locale, CaptionMap> localeMaps = new HashMap<>(); |         final Map<Locale, CaptionMap> localeMaps = new HashMap<>(); | ||||||
|         try (final Stream<Path> files = Files.list(directory)) { |         try (final Stream<Path> files = Files.list(directory)) { | ||||||
|             final List<Path> captionFiles = files.filter(Files::isRegularFile).toList(); |             final List<Path> captionFiles = files.filter(Files::isRegularFile).collect(Collectors.toList()); | ||||||
|             for (Path file : captionFiles) { |             for (Path file : captionFiles) { | ||||||
|                 try { |                 try { | ||||||
|                     final CaptionMap localeMap = loadSingle(file); |                     final CaptionMap localeMap = loadSingle(file); | ||||||
| @@ -190,14 +190,13 @@ public final class CaptionLoader { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Load a message file into a new CaptionMap. The file name must match |      * Load a message file into a new CaptionMap. The file name must match | ||||||
|      * the pattern expected by the {@link #localeExtractor}. |      * the pattern {@code messages_<locale>.json} where {@code <locale>} | ||||||
|      * Note that this method does not attempt to create a new file. |      * is a valid {@link Locale} string. | ||||||
|      * |      * | ||||||
|      * @param file The file to load |      * @param file The file to load | ||||||
|      * @return A new CaptionMap containing the loaded messages |      * @return A new CaptionMap containing the loaded messages | ||||||
|      * @throws IOException              if the file couldn't be accessed or read successfully. |      * @throws IOException              if the file couldn't be accessed or read successfully. | ||||||
|      * @throws IllegalArgumentException if the file name doesn't match the specified format. |      * @throws IllegalArgumentException if the file name doesn't match the specified format. | ||||||
|      * @see #loadOrCreateSingle(Path) |  | ||||||
|      */ |      */ | ||||||
|     public @NonNull CaptionMap loadSingle(final @NonNull Path file) throws IOException { |     public @NonNull CaptionMap loadSingle(final @NonNull Path file) throws IOException { | ||||||
|         final Locale locale = this.localeExtractor.apply(file); |         final Locale locale = this.localeExtractor.apply(file); | ||||||
| @@ -206,43 +205,15 @@ public final class CaptionLoader { | |||||||
|             if (patch(map, locale)) { |             if (patch(map, locale)) { | ||||||
|                 save(file, map); // update the file using the modified map |                 save(file, map); // update the file using the modified map | ||||||
|             } |             } | ||||||
|             return new LocalizedCaptionMap(locale, mapToCaptions(map)); |             return new LocalizedCaptionMap(locale, map.entrySet().stream() | ||||||
|  |                     .collect(Collectors.toMap( | ||||||
|  |                                     entry -> TranslatableCaption.of(this.namespace, entry.getKey()), | ||||||
|  |                                     Map.Entry::getValue | ||||||
|  |                             ) | ||||||
|  |                     )); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Load a message file into a new CaptionMap. The file name must match |  | ||||||
|      * the pattern expected by the {@link #localeExtractor}. |  | ||||||
|      * If no file exists at the given path, this method will |  | ||||||
|      * attempt to create one and fill it with default values. |  | ||||||
|      * |  | ||||||
|      * @param file The file to load |  | ||||||
|      * @return A new CaptionMap containing the loaded messages |  | ||||||
|      * @throws IOException              if the file couldn't be accessed or read successfully. |  | ||||||
|      * @throws IllegalArgumentException if the file name doesn't match the specified format. |  | ||||||
|      * @see #loadSingle(Path) |  | ||||||
|      * @since 6.9.3 |  | ||||||
|      */ |  | ||||||
|     public @NonNull CaptionMap loadOrCreateSingle(final @NonNull Path file) throws IOException { |  | ||||||
|         final Locale locale = this.localeExtractor.apply(file); |  | ||||||
|         if (!Files.exists(file) ) { |  | ||||||
|             Map<String, String> map = new LinkedHashMap<>(); |  | ||||||
|             patch(map, locale); |  | ||||||
|             save(file, map); |  | ||||||
|             return new LocalizedCaptionMap(locale, mapToCaptions(map)); |  | ||||||
|         } else { |  | ||||||
|             return loadSingle(file); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private @NonNull Map<TranslatableCaption, String> mapToCaptions(Map<String, String> map) { |  | ||||||
|         return map.entrySet().stream().collect( |  | ||||||
|                 Collectors.toMap( |  | ||||||
|                         entry -> TranslatableCaption.of(this.namespace, entry.getKey()), |  | ||||||
|                         Map.Entry::getValue |  | ||||||
|                 )); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Add missing entries to the given map. |      * Add missing entries to the given map. | ||||||
|      * Entries are missing if the key exists in {@link #defaultLocale} but isn't present |      * Entries are missing if the key exists in {@link #defaultLocale} but isn't present | ||||||
|   | |||||||
| @@ -20,8 +20,6 @@ package com.plotsquared.core.generator; | |||||||
|  |  | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import com.google.inject.assistedinject.Assisted; | import com.google.inject.assistedinject.Assisted; | ||||||
| import com.intellectualsites.annotations.DoNotUse; |  | ||||||
| import com.intellectualsites.annotations.NotPublic; |  | ||||||
| import com.plotsquared.core.PlotSquared; | import com.plotsquared.core.PlotSquared; | ||||||
| import com.plotsquared.core.configuration.ConfigurationSection; | import com.plotsquared.core.configuration.ConfigurationSection; | ||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| @@ -35,6 +33,7 @@ import com.plotsquared.core.plot.PlotId; | |||||||
| import com.plotsquared.core.plot.PlotManager; | import com.plotsquared.core.plot.PlotManager; | ||||||
| import com.plotsquared.core.plot.schematic.Schematic; | import com.plotsquared.core.plot.schematic.Schematic; | ||||||
| import com.plotsquared.core.queue.GlobalBlockQueue; | import com.plotsquared.core.queue.GlobalBlockQueue; | ||||||
|  | import com.plotsquared.core.util.AnnotationHelper; | ||||||
| import com.plotsquared.core.util.FileUtils; | import com.plotsquared.core.util.FileUtils; | ||||||
| import com.plotsquared.core.util.MathMan; | import com.plotsquared.core.util.MathMan; | ||||||
| import com.plotsquared.core.util.SchematicHandler; | import com.plotsquared.core.util.SchematicHandler; | ||||||
| @@ -460,7 +459,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|         int pair = MathMan.pair(x, z); |         int pair = MathMan.pair(x, z); | ||||||
|         BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]); |         BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]); | ||||||
|         if (y >= height) { |         if (y >= height) { | ||||||
|             if (y > lastOverlayHeightError) { |             if (y != lastOverlayHeightError) { | ||||||
|                 lastOverlayHeightError = y; |                 lastOverlayHeightError = y; | ||||||
|                 LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height)); |                 LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height)); | ||||||
|             } |             } | ||||||
| @@ -489,7 +488,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|      * |      * | ||||||
|      * @since 6.9.0 |      * @since 6.9.0 | ||||||
|      */ |      */ | ||||||
|     @DoNotUse |     @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
|     public @Nullable List<Entity> getPlotSchematicEntities() { |     public @Nullable List<Entity> getPlotSchematicEntities() { | ||||||
|         return schem3Entities; |         return schem3Entities; | ||||||
|     } |     } | ||||||
| @@ -499,7 +498,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|      * |      * | ||||||
|      * @since 6.9.0 |      * @since 6.9.0 | ||||||
|      */ |      */ | ||||||
|     @DoNotUse |     @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
|     public @Nullable BlockVector3 getPlotSchematicMinPoint() { |     public @Nullable BlockVector3 getPlotSchematicMinPoint() { | ||||||
|         return schem3MinPoint; |         return schem3MinPoint; | ||||||
|     } |     } | ||||||
| @@ -509,7 +508,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|      * |      * | ||||||
|      * @since 6.9.0 |      * @since 6.9.0 | ||||||
|      */ |      */ | ||||||
|     @DoNotUse |     @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
|     public boolean populationNeeded() { |     public boolean populationNeeded() { | ||||||
|         return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded; |         return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -189,13 +189,13 @@ public class HybridUtils { | |||||||
|                 if (X == ctx) { |                 if (X == ctx) { | ||||||
|                     maxX = tx & 15; |                     maxX = tx & 15; | ||||||
|                 } else { |                 } else { | ||||||
|                     maxX = 15; |                     maxX = 16; | ||||||
|                 } |                 } | ||||||
|                 int maxZ; |                 int maxZ; | ||||||
|                 if (Z == ctz) { |                 if (Z == ctz) { | ||||||
|                     maxZ = tz & 15; |                     maxZ = tz & 15; | ||||||
|                 } else { |                 } else { | ||||||
|                     maxZ = 15; |                     maxZ = 16; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 int chunkBlockX = X << 4; |                 int chunkBlockX = X << 4; | ||||||
| @@ -221,7 +221,7 @@ public class HybridUtils { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             final Runnable run = () -> { |             final Runnable run = () -> TaskManager.runTaskAsync(() -> { | ||||||
|                 int size = width * length; |                 int size = width * length; | ||||||
|                 int[] changes = new int[size]; |                 int[] changes = new int[size]; | ||||||
|                 int[] faces = new int[size]; |                 int[] faces = new int[size]; | ||||||
| @@ -296,7 +296,7 @@ public class HybridUtils { | |||||||
|                 analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety) * 100); |                 analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety) * 100); | ||||||
|                 whenDone.value = analysis; |                 whenDone.value = analysis; | ||||||
|                 whenDone.run(); |                 whenDone.run(); | ||||||
|             }; |             }); | ||||||
|             queue.setCompleteTask(run); |             queue.setCompleteTask(run); | ||||||
|             queue.enqueue(); |             queue.enqueue(); | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -313,7 +313,7 @@ public sealed class Location extends BlockLoc implements Comparable<Location> pe | |||||||
|     /** |     /** | ||||||
|      * Get the absolute {@link Plot}, if any, that contains this location |      * Get the absolute {@link Plot}, if any, that contains this location | ||||||
|      * |      * | ||||||
|      * @return (Absolute) plot containing the location, or {@code null} |      * @return (Absolute) plot containing the location, or {code null} | ||||||
|      */ |      */ | ||||||
|     public @Nullable Plot getPlotAbs() { |     public @Nullable Plot getPlotAbs() { | ||||||
|         final PlotArea area = this.getPlotArea(); |         final PlotArea area = this.getPlotArea(); | ||||||
| @@ -327,7 +327,7 @@ public sealed class Location extends BlockLoc implements Comparable<Location> pe | |||||||
|     /** |     /** | ||||||
|      * Get the {@link Plot}, if any, that contains this location |      * Get the {@link Plot}, if any, that contains this location | ||||||
|      * |      * | ||||||
|      * @return plot containing the location, or {@code null} |      * @return plot containing the location, or {code null} | ||||||
|      */ |      */ | ||||||
|     public @Nullable Plot getPlot() { |     public @Nullable Plot getPlot() { | ||||||
|         final PlotArea area = this.getPlotArea(); |         final PlotArea area = this.getPlotArea(); | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
|  */ |  */ | ||||||
| package com.plotsquared.core.location; | package com.plotsquared.core.location; | ||||||
|  |  | ||||||
| import com.intellectualsites.annotations.DoNotUse; | import com.plotsquared.core.util.AnnotationHelper; | ||||||
| import com.sk89q.worldedit.math.BlockVector3; | import com.sk89q.worldedit.math.BlockVector3; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| @@ -28,7 +28,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
|  * |  * | ||||||
|  * @since 6.9.0 |  * @since 6.9.0 | ||||||
|  */ |  */ | ||||||
| @DoNotUse | @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
| public final class UncheckedWorldLocation extends Location { | public final class UncheckedWorldLocation extends Location { | ||||||
|  |  | ||||||
|     private final String worldName; |     private final String worldName; | ||||||
| @@ -54,7 +54,7 @@ public final class UncheckedWorldLocation extends Location { | |||||||
|      * |      * | ||||||
|      * @since 6.9.0 |      * @since 6.9.0 | ||||||
|      */ |      */ | ||||||
|     @DoNotUse |     @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
|     public static @NonNull UncheckedWorldLocation at( |     public static @NonNull UncheckedWorldLocation at( | ||||||
|             final @NonNull String world, final int x, final int y, final int z |             final @NonNull String world, final int x, final int y, final int z | ||||||
|     ) { |     ) { | ||||||
| @@ -62,7 +62,7 @@ public final class UncheckedWorldLocation extends Location { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     @DoNotUse |     @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") | ||||||
|     public @NonNull String getWorldName() { |     public @NonNull String getWorldName() { | ||||||
|         return this.worldName; |         return this.worldName; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -36,7 +36,6 @@ import com.plotsquared.core.location.BlockLoc; | |||||||
| import com.plotsquared.core.location.Direction; | import com.plotsquared.core.location.Direction; | ||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
| import com.plotsquared.core.location.PlotLoc; | import com.plotsquared.core.location.PlotLoc; | ||||||
| import com.plotsquared.core.permissions.Permission; |  | ||||||
| import com.plotsquared.core.player.ConsolePlayer; | import com.plotsquared.core.player.ConsolePlayer; | ||||||
| import com.plotsquared.core.player.MetaDataAccess; | import com.plotsquared.core.player.MetaDataAccess; | ||||||
| import com.plotsquared.core.player.PlayerMetaDataKeys; | import com.plotsquared.core.player.PlayerMetaDataKeys; | ||||||
| @@ -49,7 +48,6 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag; | |||||||
| import com.plotsquared.core.queue.GlobalBlockQueue; | import com.plotsquared.core.queue.GlobalBlockQueue; | ||||||
| import com.plotsquared.core.queue.QueueCoordinator; | import com.plotsquared.core.queue.QueueCoordinator; | ||||||
| import com.plotsquared.core.util.MathMan; | import com.plotsquared.core.util.MathMan; | ||||||
| import com.plotsquared.core.util.Permissions; |  | ||||||
| import com.plotsquared.core.util.PlotExpression; | import com.plotsquared.core.util.PlotExpression; | ||||||
| import com.plotsquared.core.util.RegionUtil; | import com.plotsquared.core.util.RegionUtil; | ||||||
| import com.plotsquared.core.util.StringMan; | import com.plotsquared.core.util.StringMan; | ||||||
| @@ -626,38 +624,6 @@ public abstract class PlotArea { | |||||||
|                 getRegionAbs() == null || this.region.contains(location.getBlockVector3())); |                 getRegionAbs() == null || this.region.contains(location.getBlockVector3())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Get if the {@code PlotArea}'s build range (min build height -> max build height) contains the given y value |  | ||||||
|      * |  | ||||||
|      * @param y y height |  | ||||||
|      * @return if build height contains y |  | ||||||
|      */ |  | ||||||
|     public boolean buildRangeContainsY(int y) { |  | ||||||
|         return y >= minBuildHeight && y < maxBuildHeight; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Utility method to check if the player is attempting to place blocks outside the build area, and notify of this if the |  | ||||||
|      * player does not have permissions. |  | ||||||
|      * |  | ||||||
|      * @param player Player to check |  | ||||||
|      * @param y      y height to check |  | ||||||
|      * @return true if outside build area with no permissions |  | ||||||
|      * @since 6.9.1 |  | ||||||
|      */ |  | ||||||
|     public boolean notifyIfOutsideBuildArea(PlotPlayer<?> player, int y) { |  | ||||||
|         if (!buildRangeContainsY(y) && !Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { |  | ||||||
|             player.sendMessage( |  | ||||||
|                     TranslatableCaption.of("height.height_limit"), |  | ||||||
|                     Template.of("minHeight", String.valueOf(minBuildHeight)), |  | ||||||
|                     Template.of("maxHeight", String.valueOf(maxBuildHeight)) |  | ||||||
|             ); |  | ||||||
|             // Return true if "failed" as the method will always be inverted otherwise |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public @NonNull Set<Plot> getPlotsAbs(final UUID uuid) { |     public @NonNull Set<Plot> getPlotsAbs(final UUID uuid) { | ||||||
|         if (uuid == null) { |         if (uuid == null) { | ||||||
|             return Collections.emptySet(); |             return Collections.emptySet(); | ||||||
|   | |||||||
| @@ -20,8 +20,8 @@ package com.plotsquared.core.plot.flag; | |||||||
|  |  | ||||||
| import com.google.common.base.Preconditions; | import com.google.common.base.Preconditions; | ||||||
| import com.google.common.collect.ImmutableMap; | import com.google.common.collect.ImmutableMap; | ||||||
| import com.intellectualsites.annotations.NotPublic; |  | ||||||
| import com.plotsquared.core.configuration.caption.CaptionUtility; | import com.plotsquared.core.configuration.caption.CaptionUtility; | ||||||
|  | import com.plotsquared.core.util.AnnotationHelper; | ||||||
| import org.apache.logging.log4j.LogManager; | import org.apache.logging.log4j.LogManager; | ||||||
| import org.apache.logging.log4j.Logger; | import org.apache.logging.log4j.Logger; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| @@ -32,6 +32,7 @@ import java.util.HashMap; | |||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Container type for {@link PlotFlag plot flags}. |  * Container type for {@link PlotFlag plot flags}. | ||||||
| @@ -352,7 +353,7 @@ public class FlagContainer { | |||||||
|      * @return a new Runnable that cleans up once the FlagContainer isn't needed anymore. |      * @return a new Runnable that cleans up once the FlagContainer isn't needed anymore. | ||||||
|      * @since 6.0.10 |      * @since 6.0.10 | ||||||
|      */ |      */ | ||||||
|     @NotPublic |     @AnnotationHelper.ApiDescription(info = "This method should not be considered as public or API.") | ||||||
|     public Runnable createCleanupHook() { |     public Runnable createCleanupHook() { | ||||||
|         return () -> GlobalFlagContainer.getInstance().unsubscribe(unknownsRef); |         return () -> GlobalFlagContainer.getInstance().unsubscribe(unknownsRef); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -18,8 +18,8 @@ | |||||||
|  */ |  */ | ||||||
| package com.plotsquared.core.queue; | package com.plotsquared.core.queue; | ||||||
|  |  | ||||||
| import com.intellectualsites.annotations.DoNotUse; |  | ||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
|  | import com.plotsquared.core.util.AnnotationHelper; | ||||||
| import com.sk89q.jnbt.CompoundTag; | import com.sk89q.jnbt.CompoundTag; | ||||||
| import com.sk89q.worldedit.function.pattern.Pattern; | import com.sk89q.worldedit.function.pattern.Pattern; | ||||||
| import com.sk89q.worldedit.math.BlockVector3; | import com.sk89q.worldedit.math.BlockVector3; | ||||||
| @@ -37,7 +37,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; | |||||||
|  * in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and |  * in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and | ||||||
|  * {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)} |  * {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)} | ||||||
|  */ |  */ | ||||||
| @DoNotUse | @AnnotationHelper.ApiDescription(info = "Internal use only. Subject to change at any time and created for specific use cases.") | ||||||
| public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinator { | public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinator { | ||||||
|  |  | ||||||
|     private final BlockState[][][] blockStates; |     private final BlockState[][][] blockStates; | ||||||
|   | |||||||
| @@ -0,0 +1,55 @@ | |||||||
|  | /* | ||||||
|  |  * 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.util; | ||||||
|  |  | ||||||
|  | import java.lang.annotation.Documented; | ||||||
|  | import java.lang.annotation.Retention; | ||||||
|  | import java.lang.annotation.RetentionPolicy; | ||||||
|  | import java.lang.annotation.Target; | ||||||
|  |  | ||||||
|  | import static java.lang.annotation.ElementType.METHOD; | ||||||
|  | import static java.lang.annotation.ElementType.MODULE; | ||||||
|  | import static java.lang.annotation.ElementType.PACKAGE; | ||||||
|  | import static java.lang.annotation.ElementType.RECORD_COMPONENT; | ||||||
|  | import static java.lang.annotation.ElementType.TYPE; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @since 6.2.2 | ||||||
|  |  */ | ||||||
|  | @AnnotationHelper.ApiDescription(info = "An internal class for custom annotations." + | ||||||
|  |         "This is in no form part of the API and is subject to change at any time.") | ||||||
|  | public final class AnnotationHelper { | ||||||
|  |  | ||||||
|  |     private AnnotationHelper() { | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Documented | ||||||
|  |     @Retention(RetentionPolicy.CLASS) | ||||||
|  |     @Target(value = {METHOD, PACKAGE, MODULE, RECORD_COMPONENT, TYPE}) | ||||||
|  |     public @interface ApiDescription { | ||||||
|  |         /** | ||||||
|  |          * Returns additional information how to use a class for the API | ||||||
|  |          * | ||||||
|  |          * @return the version string | ||||||
|  |          * @since 6.2.2 | ||||||
|  |          */ | ||||||
|  |         String info() default ""; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -19,7 +19,6 @@ | |||||||
| package com.plotsquared.core.util; | package com.plotsquared.core.util; | ||||||
|  |  | ||||||
| import com.google.common.eventbus.EventBus; | import com.google.common.eventbus.EventBus; | ||||||
| import com.intellectualsites.annotations.DoNotUse; |  | ||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
| import com.plotsquared.core.events.PlayerAutoPlotEvent; | import com.plotsquared.core.events.PlayerAutoPlotEvent; | ||||||
| @@ -82,7 +81,8 @@ import java.util.ArrayList; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| @DoNotUse | @AnnotationHelper.ApiDescription(info = "This is an internal class used by PlotSquared to dispatch events." + | ||||||
|  |         "This is in no form part of the API and is subject to change at any time.") | ||||||
| public class EventDispatcher { | public class EventDispatcher { | ||||||
|  |  | ||||||
|     private final EventBus eventBus = new EventBus("PlotSquaredEvents"); |     private final EventBus eventBus = new EventBus("PlotSquaredEvents"); | ||||||
| @@ -332,15 +332,6 @@ public class EventDispatcher { | |||||||
|     ) { |     ) { | ||||||
|         PlotArea area = location.getPlotArea(); |         PlotArea area = location.getPlotArea(); | ||||||
|         assert area != null; |         assert area != null; | ||||||
|         if (!area.buildRangeContainsY(location.getY()) && !Permissions |  | ||||||
|                 .hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { |  | ||||||
|             player.sendMessage( |  | ||||||
|                     TranslatableCaption.of("height.height_limit"), |  | ||||||
|                     Template.of("minHeight", String.valueOf(area.getMinBuildHeight())), |  | ||||||
|                     Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight())) |  | ||||||
|             ); |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         Plot plot = area.getPlot(location); |         Plot plot = area.getPlot(location); | ||||||
|         if (plot != null) { |         if (plot != null) { | ||||||
|             if (plot.isAdded(player.getUUID())) { |             if (plot.isAdded(player.getUUID())) { | ||||||
|   | |||||||
| @@ -30,18 +30,9 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
|  * The Permissions class handles checking user permissions.<br> |  * The Permissions class handles checking user permissions.<br> | ||||||
|  * - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br> |  * - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br> | ||||||
|  * - Checking the PlotPlayer class directly will not take the above into account<br> |  * - Checking the PlotPlayer class directly will not take the above into account<br> | ||||||
|  * |  | ||||||
|  * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|  * classes |  | ||||||
|  */ |  */ | ||||||
| @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
| public class Permissions { | public class Permissions { | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |  | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) { |     public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) { | ||||||
|         return hasPermission(player, permission.toString(), notify); |         return hasPermission(player, permission.toString(), notify); | ||||||
|     } |     } | ||||||
| @@ -52,25 +43,18 @@ public class Permissions { | |||||||
|      * @param caller     permission holder |      * @param caller     permission holder | ||||||
|      * @param permission Permission |      * @param permission Permission | ||||||
|      * @return {@code true} if the owner has the given permission, else {@code false} |      * @return {@code true} if the owner has the given permission, else {@code false} | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) { |     public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) { | ||||||
|         return caller.hasPermission(permission.toString()); |         return caller.hasPermission(permission.toString()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Check if the owner of the profile has a given (global) permission. There is no guarantee that per-world permissions will |      * Check if the owner of the profile has a given (global) permission | ||||||
|      * be checked because unmaintained crap plugins like PEX exist. |  | ||||||
|      * |      * | ||||||
|      * @param caller     permission holder |      * @param caller     permission holder | ||||||
|      * @param permission Permission |      * @param permission Permission | ||||||
|      * @return {@code true} if the owner has the given permission, else {@code false} |      * @return {@code true} if the owner has the given permission, else {@code false} | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) { |     public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) { | ||||||
|         return caller.hasPermission(permission); |         return caller.hasPermission(permission); | ||||||
|     } |     } | ||||||
| @@ -84,10 +68,7 @@ public class Permissions { | |||||||
|      * @param key        Permission "key" |      * @param key        Permission "key" | ||||||
|      * @return {@code true} if the owner has the given permission, else {@code false} |      * @return {@code true} if the owner has the given permission, else {@code false} | ||||||
|      * @since 6.0.10 |      * @since 6.0.10 | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static boolean hasKeyedPermission( |     public static boolean hasKeyedPermission( | ||||||
|             final @NonNull PermissionHolder caller, final @NonNull String permission, |             final @NonNull PermissionHolder caller, final @NonNull String permission, | ||||||
|             final @NonNull String key |             final @NonNull String key | ||||||
| @@ -102,10 +83,7 @@ public class Permissions { | |||||||
|      * @param permission permission |      * @param permission permission | ||||||
|      * @param notify     if to notify the permission holder |      * @param notify     if to notify the permission holder | ||||||
|      * @return if permission is had |      * @return if permission is had | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) { |     public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) { | ||||||
|         if (!hasPermission(player, permission)) { |         if (!hasPermission(player, permission)) { | ||||||
|             if (notify) { |             if (notify) { | ||||||
| @@ -119,11 +97,6 @@ public class Permissions { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |  | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) { |     public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) { | ||||||
|         return hasPermissionRange(player, Permission.toString(), range); |         return hasPermissionRange(player, Permission.toString(), range); | ||||||
|     } |     } | ||||||
| @@ -137,10 +110,7 @@ public class Permissions { | |||||||
|      * @param stub   The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` |      * @param stub   The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` | ||||||
|      * @param range  The range to check |      * @param range  The range to check | ||||||
|      * @return The highest permission they have within that range |      * @return The highest permission they have within that range | ||||||
|      * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed |  | ||||||
|      * classes |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(forRemoval = true, since = "6.9.3") |  | ||||||
|     public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) { |     public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) { | ||||||
|         return player.hasPermissionRange(stub, range); |         return player.hasPermissionRange(stub, range); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -164,7 +164,7 @@ public final class PlaceholderRegistry { | |||||||
|                     PlayerManager.getPlayerList(plot.getDenied(), player)); |                     PlayerManager.getPlayerList(plot.getDenied(), player)); | ||||||
|         }); |         }); | ||||||
|         this.createPlaceholder("currentplot_creationdate", (player, plot) -> { |         this.createPlaceholder("currentplot_creationdate", (player, plot) -> { | ||||||
|             if (plot.getTimestamp() == 0 || !plot.hasOwner()) { |             if (plot.getTimestamp() == 0) { | ||||||
|                 return legacyComponent(TranslatableCaption.of("info.unknown"), player); |                 return legacyComponent(TranslatableCaption.of("info.unknown"), player); | ||||||
|             } |             } | ||||||
|             long creationDate = plot.getTimestamp(); |             long creationDate = plot.getTimestamp(); | ||||||
|   | |||||||
| @@ -414,7 +414,6 @@ | |||||||
|   "kick.you_got_kicked": "<prefix><dark_aqua>You got kicked from the plot!</dark_aqua>", |   "kick.you_got_kicked": "<prefix><dark_aqua>You got kicked from the plot!</dark_aqua>", | ||||||
|   "trusted.trusted_added": "<prefix><dark_aqua>You successfully trusted a user to the plot.</dark_aqua>", |   "trusted.trusted_added": "<prefix><dark_aqua>You successfully trusted a user to the plot.</dark_aqua>", | ||||||
|   "trusted.plot_removed_user": "<prefix><red>Plot <plot> of which you were added to has been deleted due to owner inactivity.</red>", |   "trusted.plot_removed_user": "<prefix><red>Plot <plot> of which you were added to has been deleted due to owner inactivity.</red>", | ||||||
|   "member.player_not_removed": "<prefix><gray><player></gray><red> is neither added, trusted or denied on the plot, thus doesn't need to be removed.</red>", |  | ||||||
|   "member.removed_players": "<prefix><gray>Removed <amount> player(s) from this plot.</gray>", |   "member.removed_players": "<prefix><gray>Removed <amount> player(s) from this plot.</gray>", | ||||||
|   "member.plot_left": "<prefix><gray><player> left the plot.</gray>", |   "member.plot_left": "<prefix><gray><player> left the plot.</gray>", | ||||||
|   "member.plot_cant_leave_owner": "<prefix><red>You are the plot owner. You cannot leave this plot.</red>", |   "member.plot_cant_leave_owner": "<prefix><red>You are the plot owner. You cannot leave this plot.</red>", | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ plugins { | |||||||
| } | } | ||||||
|  |  | ||||||
| group = "com.plotsquared" | group = "com.plotsquared" | ||||||
| version = "6.9.5-SNAPSHOT" | version = "6.9.1-SNAPSHOT" | ||||||
|  |  | ||||||
| subprojects { | subprojects { | ||||||
|     group = rootProject.group |     group = rootProject.group | ||||||
| @@ -65,12 +65,12 @@ subprojects { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     dependencies { |     dependencies { | ||||||
|         implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.13")) |         implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.5")) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     dependencies { |     dependencies { | ||||||
|         // Tests |         // Tests | ||||||
|         testImplementation("org.junit.jupiter:junit-jupiter:5.9.0") |         testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     plugins.withId("java") { |     plugins.withId("java") { | ||||||
|   | |||||||
| @@ -1,20 +1,21 @@ | |||||||
| [versions] | [versions] | ||||||
| # Platform expectations | # Platform expectations | ||||||
| paper = "1.18.1-R0.1-SNAPSHOT" | paper = "1.18.1-R0.1-SNAPSHOT" | ||||||
|  | checker-qual = "3.22.0" | ||||||
| guice = "5.1.0" | guice = "5.1.0" | ||||||
| spotbugs = "4.7.1" | spotbugs = "4.7.0" | ||||||
|  |  | ||||||
| # Plugins | # Plugins | ||||||
| worldedit = "7.2.12" | worldedit = "7.2.10" | ||||||
| placeholderapi = "2.11.2" | placeholderapi = "2.11.1" | ||||||
| luckperms = "5.4" | luckperms = "5.4" | ||||||
| essentialsx = "2.19.7" | essentialsx = "2.19.4" | ||||||
| mvdwapi = "3.1.1" | mvdwapi = "3.1.1" | ||||||
|  |  | ||||||
| # Third party | # Third party | ||||||
| prtree = "2.0.0" | prtree = "2.0.0" | ||||||
| aopalliance = "1.0" | aopalliance = "1.0" | ||||||
| cloud-services = "1.7.1" | cloud-services = "1.6.2" | ||||||
| arkitektonika = "2.1.1" | arkitektonika = "2.1.1" | ||||||
| squirrelid = "0.3.1" | squirrelid = "0.3.1" | ||||||
| http4j = "1.3" | http4j = "1.3" | ||||||
| @@ -28,6 +29,7 @@ nexus = "1.1.0" | |||||||
| [libraries] | [libraries] | ||||||
| # Platform expectations | # Platform expectations | ||||||
| paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } | paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } | ||||||
|  | checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" } | ||||||
|  |  | ||||||
| # Platform expectations | # Platform expectations | ||||||
| guice = { group = "com.google.inject", name = "guice", version.ref = "guice" } | guice = { group = "com.google.inject", name = "guice", version.ref = "guice" } | ||||||
|   | |||||||
							
								
								
									
										
											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,5 +1,5 @@ | |||||||
| distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||||
| distributionPath=wrapper/dists | distributionPath=wrapper/dists | ||||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip | ||||||
| zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||||
| zipStorePath=wrapper/dists | zipStorePath=wrapper/dists | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -205,12 +205,6 @@ set -- \ | |||||||
|         org.gradle.wrapper.GradleWrapperMain \ |         org.gradle.wrapper.GradleWrapperMain \ | ||||||
|         "$@" |         "$@" | ||||||
|  |  | ||||||
| # Stop when "xargs" is not available. |  | ||||||
| if ! command -v xargs >/dev/null 2>&1 |  | ||||||
| then |  | ||||||
|     die "xargs is not available" |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Use "xargs" to parse quoted args. | # Use "xargs" to parse quoted args. | ||||||
| # | # | ||||||
| # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							| @@ -14,7 +14,7 @@ | |||||||
| @rem limitations under the License. | @rem limitations under the License. | ||||||
| @rem | @rem | ||||||
|  |  | ||||||
| @if "%DEBUG%"=="" @echo off | @if "%DEBUG%" == "" @echo off | ||||||
| @rem ########################################################################## | @rem ########################################################################## | ||||||
| @rem | @rem | ||||||
| @rem  Gradle startup script for Windows | @rem  Gradle startup script for Windows | ||||||
| @@ -25,7 +25,7 @@ | |||||||
| if "%OS%"=="Windows_NT" setlocal | if "%OS%"=="Windows_NT" setlocal | ||||||
|  |  | ||||||
| set DIRNAME=%~dp0 | set DIRNAME=%~dp0 | ||||||
| if "%DIRNAME%"=="" set DIRNAME=. | if "%DIRNAME%" == "" set DIRNAME=. | ||||||
| set APP_BASE_NAME=%~n0 | set APP_BASE_NAME=%~n0 | ||||||
| set APP_HOME=%DIRNAME% | set APP_HOME=%DIRNAME% | ||||||
|  |  | ||||||
| @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome | |||||||
|  |  | ||||||
| set JAVA_EXE=java.exe | set JAVA_EXE=java.exe | ||||||
| %JAVA_EXE% -version >NUL 2>&1 | %JAVA_EXE% -version >NUL 2>&1 | ||||||
| if %ERRORLEVEL% equ 0 goto execute | if "%ERRORLEVEL%" == "0" goto execute | ||||||
|  |  | ||||||
| echo. | echo. | ||||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
| @@ -75,15 +75,13 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | |||||||
|  |  | ||||||
| :end | :end | ||||||
| @rem End local scope for the variables with windows NT shell | @rem End local scope for the variables with windows NT shell | ||||||
| if %ERRORLEVEL% equ 0 goto mainEnd | if "%ERRORLEVEL%"=="0" goto mainEnd | ||||||
|  |  | ||||||
| :fail | :fail | ||||||
| rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||||
| rem the _cmd.exe /c_ return code! | rem the _cmd.exe /c_ return code! | ||||||
| set EXIT_CODE=%ERRORLEVEL% | if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||||||
| if %EXIT_CODE% equ 0 set EXIT_CODE=1 | exit /b 1 | ||||||
| if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% |  | ||||||
| exit /b %EXIT_CODE% |  | ||||||
|  |  | ||||||
| :mainEnd | :mainEnd | ||||||
| if "%OS%"=="Windows_NT" endlocal | if "%OS%"=="Windows_NT" endlocal | ||||||
|   | |||||||
| @@ -1,9 +1,13 @@ | |||||||
| { | { | ||||||
|   "$schema": "https://docs.renovatebot.com/renovate-schema.json", |  | ||||||
|   "extends": [ |   "extends": [ | ||||||
|     "config:base", |     "config:base", | ||||||
|     ":semanticCommitsDisabled" |     ":disableDependencyDashboard" | ||||||
|  |   ], | ||||||
|  |   "timezone": "Europe/Berlin", | ||||||
|  |   "schedule": [ | ||||||
|  |     "every monday" | ||||||
|   ], |   ], | ||||||
|   "labels": ["Renovate"], |   "labels": ["Renovate"], | ||||||
|  |   "commitMessagePrefix": "build: ", | ||||||
|   "rebaseWhen": "conflicted" |   "rebaseWhen": "conflicted" | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user