mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-29 16:43:43 +01:00 
			
		
		
		
	Compare commits
	
		
			69 Commits
		
	
	
		
			fix/avoid-
			...
			fix/v7/buk
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 18007c2367 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 161e3ffdc7 | ||
|   | be8f07c556 | ||
|   | 215053e364 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 4839a83279 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 0649ef33f0 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 1590a4b6eb | ||
|   | c793b4454a | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 7ab1a3eafb | ||
|   | c65c9e7827 | ||
|   | f88ea94bfe | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | c8e8eb919f | ||
|   | 83fe761fe4 | ||
|   | a7447c9d75 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 5867cc51a7 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 86e21f3e1a | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | d7d884ad6d | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 1c45e01a14 | ||
|   | 6ef1163325 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | c57d784df7 | ||
|   | c239908aa3 | ||
|   | a6412581a6 | ||
|   | f20c5f46e3 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 4db5954490 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 9f68654614 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 2e4c6199e5 | ||
|   | 7edca600fd | ||
|   | bc1cc074b8 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | d383187c6e | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 125a3f6772 | ||
|   | faca8c2da0 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 0ad5ef4f94 | ||
|   | 5e8d8629c2 | ||
|   | 9f4f213a8c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ce14036949 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 2dbb6ee025 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 0da1d9f17a | ||
|   | f1f41b0523 | ||
|   | fe324d3ea9 | ||
|   | ff83868cbc | ||
|   | 111ea7029e | ||
|   | 9be2eedf7f | ||
|   | 82f868ae7d | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | e46dbd826c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 809ddce2b3 | ||
|   | 1b40cea51f | ||
|   | 022e0fc224 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | b32137a650 | ||
|   | 17c41c0494 | ||
|   | 1ee76bf2d9 | ||
|   | 2321831044 | ||
|   | 25e98618b9 | ||
|   | 5344efd1b7 | ||
|   | 68701b6201 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 64c610ef37 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 931bb90600 | ||
|   | 1dfa3b4e66 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 8f236a56a6 | ||
|   | e51121960d | ||
|   | cc011de032 | ||
|   | 28298ffdd6 | ||
|   | 499d3c39bc | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 3d56937f14 | ||
|   | 0f1c2cb4e4 | ||
|   | 7b233c944a | ||
|   | d9537ee9df | ||
|   | 0de6887526 | ||
|   | a2e3274215 | ||
|   | b369683b9c | 
							
								
								
									
										7
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							| @@ -30,14 +30,7 @@ body: | |||||||
|         - '1.20.4' |         - '1.20.4' | ||||||
|         - '1.20' |         - '1.20' | ||||||
|         - '1.19.4' |         - '1.19.4' | ||||||
|         - '1.19.3' |  | ||||||
|         - '1.19.2' |  | ||||||
|         - '1.19.1' |  | ||||||
|         - '1.19' |  | ||||||
|         - '1.18.2' |         - '1.18.2' | ||||||
|         - '1.18.1' |  | ||||||
|         - '1.17.1' |  | ||||||
|         - '1.16.5' |  | ||||||
|     validations: |     validations: | ||||||
|       required: true |       required: true | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							| @@ -9,7 +9,6 @@ | |||||||
|     "dependencies" |     "dependencies" | ||||||
|   ], |   ], | ||||||
|   "rebaseWhen": "conflicted", |   "rebaseWhen": "conflicted", | ||||||
|   "schedule": ["on the first day of the month"], |  | ||||||
|   "ignoreDeps": [ |   "ignoreDeps": [ | ||||||
|     "com.google.code.gson:gson", |     "com.google.code.gson:gson", | ||||||
|     "com.google.guava:guava", |     "com.google.guava:guava", | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,7 +11,7 @@ jobs: | |||||||
|       - name: Checkout Repository |       - name: Checkout Repository | ||||||
|         uses: actions/checkout@v4 |         uses: actions/checkout@v4 | ||||||
|       - name: Validate Gradle Wrapper |       - name: Validate Gradle Wrapper | ||||||
|         uses: gradle/wrapper-validation-action@v2 |         uses: gradle/actions/wrapper-validation@v3 | ||||||
|       - name: Setup Java |       - name: Setup Java | ||||||
|         uses: actions/setup-java@v4 |         uses: actions/setup-java@v4 | ||||||
|         with: |         with: | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,7 +11,7 @@ jobs: | |||||||
|       - name: Checkout Repository |       - name: Checkout Repository | ||||||
|         uses: actions/checkout@v4 |         uses: actions/checkout@v4 | ||||||
|       - name: Validate Gradle Wrapper |       - name: Validate Gradle Wrapper | ||||||
|         uses: gradle/wrapper-validation-action@v2 |         uses: gradle/actions/wrapper-validation@v3 | ||||||
|       - name: Setup Java |       - name: Setup Java | ||||||
|         uses: actions/setup-java@v4 |         uses: actions/setup-java@v4 | ||||||
|         with: |         with: | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/label-merge-conflicts.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/label-merge-conflicts.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -15,7 +15,7 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Label conflicting PRs |       - name: Label conflicting PRs | ||||||
|         uses: eps1lon/actions-label-merge-conflict@v2.1.0 |         uses: eps1lon/actions-label-merge-conflict@v3.0.2 | ||||||
|         with: |         with: | ||||||
|           dirtyLabel: "unresolved-merge-conflict" |           dirtyLabel: "unresolved-merge-conflict" | ||||||
|           repoToken: "${{ secrets.GITHUB_TOKEN }}" |           repoToken: "${{ secrets.GITHUB_TOKEN }}" | ||||||
|   | |||||||
| @@ -113,5 +113,6 @@ tasks { | |||||||
|         opt.encoding("UTF-8") |         opt.encoding("UTF-8") | ||||||
|         opt.keyWords() |         opt.keyWords() | ||||||
|         opt.addStringOption("-since", isRelease) |         opt.addStringOption("-since", isRelease) | ||||||
|  |         opt.noTimestamp() | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ import com.google.inject.Injector; | |||||||
| import com.google.inject.Key; | import com.google.inject.Key; | ||||||
| import com.google.inject.Singleton; | import com.google.inject.Singleton; | ||||||
| import com.google.inject.Stage; | import com.google.inject.Stage; | ||||||
| import com.google.inject.TypeLiteral; |  | ||||||
| import com.plotsquared.bukkit.generator.BukkitPlotGenerator; | import com.plotsquared.bukkit.generator.BukkitPlotGenerator; | ||||||
| import com.plotsquared.bukkit.inject.BackupModule; | import com.plotsquared.bukkit.inject.BackupModule; | ||||||
| import com.plotsquared.bukkit.inject.BukkitModule; | import com.plotsquared.bukkit.inject.BukkitModule; | ||||||
| @@ -35,6 +34,7 @@ import com.plotsquared.bukkit.listener.BlockEventListener117; | |||||||
| import com.plotsquared.bukkit.listener.ChunkListener; | import com.plotsquared.bukkit.listener.ChunkListener; | ||||||
| import com.plotsquared.bukkit.listener.EntityEventListener; | import com.plotsquared.bukkit.listener.EntityEventListener; | ||||||
| import com.plotsquared.bukkit.listener.EntitySpawnListener; | import com.plotsquared.bukkit.listener.EntitySpawnListener; | ||||||
|  | import com.plotsquared.bukkit.listener.HighFreqBlockEventListener; | ||||||
| import com.plotsquared.bukkit.listener.PaperListener; | import com.plotsquared.bukkit.listener.PaperListener; | ||||||
| import com.plotsquared.bukkit.listener.PlayerEventListener; | import com.plotsquared.bukkit.listener.PlayerEventListener; | ||||||
| import com.plotsquared.bukkit.listener.PlayerEventListener1201; | import com.plotsquared.bukkit.listener.PlayerEventListener1201; | ||||||
| @@ -45,7 +45,6 @@ import com.plotsquared.bukkit.listener.SpigotListener; | |||||||
| import com.plotsquared.bukkit.listener.WorldEvents; | import com.plotsquared.bukkit.listener.WorldEvents; | ||||||
| import com.plotsquared.bukkit.placeholder.PAPIPlaceholders; | import com.plotsquared.bukkit.placeholder.PAPIPlaceholders; | ||||||
| import com.plotsquared.bukkit.placeholder.PlaceholderFormatter; | import com.plotsquared.bukkit.placeholder.PlaceholderFormatter; | ||||||
| import com.plotsquared.bukkit.player.BukkitPlayer; |  | ||||||
| import com.plotsquared.bukkit.player.BukkitPlayerManager; | import com.plotsquared.bukkit.player.BukkitPlayerManager; | ||||||
| import com.plotsquared.bukkit.util.BukkitUtil; | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
| import com.plotsquared.bukkit.util.BukkitWorld; | import com.plotsquared.bukkit.util.BukkitWorld; | ||||||
| @@ -364,6 +363,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|                 getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this); |                 getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this); | ||||||
|             } |             } | ||||||
|             getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this); |             getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this); | ||||||
|  |             if (Settings.HIGH_FREQUENCY_LISTENER) { | ||||||
|  |                 getServer().getPluginManager().registerEvents(injector().getInstance(HighFreqBlockEventListener.class), this); | ||||||
|  |             } | ||||||
|             if (serverVersion()[1] >= 17) { |             if (serverVersion()[1] >= 17) { | ||||||
|                 getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this); |                 getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this); | ||||||
|             } |             } | ||||||
| @@ -779,7 +781,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|                 Iterator<Entity> iterator = entities.iterator(); |                 Iterator<Entity> iterator = entities.iterator(); | ||||||
|                 while (iterator.hasNext()) { |                 while (iterator.hasNext()) { | ||||||
|                     Entity entity = iterator.next(); |                     Entity entity = iterator.next(); | ||||||
|                     if (PaperLib.isPaper() && "CUSTOM".equals(entity.getEntitySpawnReason().name())) { |                     //noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol. | ||||||
|  |                     if (PaperLib.isPaper() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) { | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|                     // Fallback for Spigot not having Entity#getEntitySpawnReason |                     // Fallback for Spigot not having Entity#getEntitySpawnReason | ||||||
| @@ -1270,15 +1273,13 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull PlatformWorldManager<?> worldManager() { |     public @NonNull PlatformWorldManager<?> worldManager() { | ||||||
|         return injector().getInstance(Key.get(new TypeLiteral<PlatformWorldManager<World>>() { |         return this.worldManager; | ||||||
|         })); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     @NonNull |     @NonNull | ||||||
|     @SuppressWarnings("unchecked") |  | ||||||
|     public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() { |     public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() { | ||||||
|         return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class); |         return this.playerManager; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ import com.plotsquared.bukkit.util.BukkitUtil; | |||||||
| import com.plotsquared.core.PlotSquared; | import com.plotsquared.core.PlotSquared; | ||||||
| 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.database.DBFunc; |  | ||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
| import com.plotsquared.core.permissions.Permission; | import com.plotsquared.core.permissions.Permission; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| @@ -48,7 +47,6 @@ import com.plotsquared.core.plot.flag.implementations.LeafDecayFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.LiquidFlowFlag; | import com.plotsquared.core.plot.flag.implementations.LiquidFlowFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.MycelGrowFlag; | import com.plotsquared.core.plot.flag.implementations.MycelGrowFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.PlaceFlag; | import com.plotsquared.core.plot.flag.implementations.PlaceFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.RedstoneFlag; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.SnowFormFlag; | import com.plotsquared.core.plot.flag.implementations.SnowFormFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag; | import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.SoilDryFlag; | import com.plotsquared.core.plot.flag.implementations.SoilDryFlag; | ||||||
| @@ -62,7 +60,6 @@ import com.plotsquared.core.util.task.TaskTime; | |||||||
| import com.sk89q.worldedit.WorldEdit; | import com.sk89q.worldedit.WorldEdit; | ||||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
| import com.sk89q.worldedit.world.block.BlockType; | import com.sk89q.worldedit.world.block.BlockType; | ||||||
| import net.kyori.adventure.text.Component; |  | ||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| @@ -92,11 +89,9 @@ import org.bukkit.event.block.BlockFromToEvent; | |||||||
| import org.bukkit.event.block.BlockGrowEvent; | import org.bukkit.event.block.BlockGrowEvent; | ||||||
| import org.bukkit.event.block.BlockIgniteEvent; | import org.bukkit.event.block.BlockIgniteEvent; | ||||||
| import org.bukkit.event.block.BlockMultiPlaceEvent; | import org.bukkit.event.block.BlockMultiPlaceEvent; | ||||||
| import org.bukkit.event.block.BlockPhysicsEvent; |  | ||||||
| import org.bukkit.event.block.BlockPistonExtendEvent; | import org.bukkit.event.block.BlockPistonExtendEvent; | ||||||
| import org.bukkit.event.block.BlockPistonRetractEvent; | import org.bukkit.event.block.BlockPistonRetractEvent; | ||||||
| import org.bukkit.event.block.BlockPlaceEvent; | import org.bukkit.event.block.BlockPlaceEvent; | ||||||
| import org.bukkit.event.block.BlockRedstoneEvent; |  | ||||||
| import org.bukkit.event.block.BlockSpreadEvent; | import org.bukkit.event.block.BlockSpreadEvent; | ||||||
| import org.bukkit.event.block.CauldronLevelChangeEvent; | import org.bukkit.event.block.CauldronLevelChangeEvent; | ||||||
| import org.bukkit.event.block.EntityBlockFormEvent; | import org.bukkit.event.block.EntityBlockFormEvent; | ||||||
| @@ -112,7 +107,6 @@ 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.Set; | ||||||
| import java.util.UUID; |  | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
| import java.util.stream.Stream; | import java.util.stream.Stream; | ||||||
|  |  | ||||||
| @@ -123,14 +117,6 @@ import static org.bukkit.Tag.WALL_CORALS; | |||||||
| @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 |     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 -> material.name().contains("SNOW")) | ||||||
|             .filter(Material::isBlock) |             .filter(Material::isBlock) | ||||||
| @@ -164,114 +150,6 @@ public class BlockEventListener implements Listener { | |||||||
|         }, TaskTime.ticks(3L)); |         }, TaskTime.ticks(3L)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler |  | ||||||
|     public void onRedstoneEvent(BlockRedstoneEvent event) { |  | ||||||
|         Block block = event.getBlock(); |  | ||||||
|         Location location = BukkitUtil.adapt(block.getLocation()); |  | ||||||
|         PlotArea area = location.getPlotArea(); |  | ||||||
|         if (area == null) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         Plot plot = location.getOwnedPlot(); |  | ||||||
|         if (plot == null) { |  | ||||||
|             if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) { |  | ||||||
|                 event.setNewCurrent(0); |  | ||||||
|             } |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (!plot.getFlag(RedstoneFlag.class)) { |  | ||||||
|             event.setNewCurrent(0); |  | ||||||
|             plot.debug("Redstone event was cancelled because redstone = false"); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (Settings.Redstone.DISABLE_OFFLINE) { |  | ||||||
|             boolean disable = false; |  | ||||||
|             if (!DBFunc.SERVER.equals(plot.getOwner())) { |  | ||||||
|                 if (plot.isMerged()) { |  | ||||||
|                     disable = true; |  | ||||||
|                     for (UUID owner : plot.getOwners()) { |  | ||||||
|                         if (PlotSquared.platform().playerManager().getPlayerIfExists(owner) != null) { |  | ||||||
|                             disable = false; |  | ||||||
|                             break; |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } else { |  | ||||||
|                     disable = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs()) == null; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             if (disable) { |  | ||||||
|                 for (UUID trusted : plot.getTrusted()) { |  | ||||||
|                     if (PlotSquared.platform().playerManager().getPlayerIfExists(trusted) != null) { |  | ||||||
|                         disable = false; |  | ||||||
|                         break; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 if (disable) { |  | ||||||
|                     event.setNewCurrent(0); |  | ||||||
|                     plot.debug("Redstone event was cancelled because no trusted player was in the plot"); |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if (Settings.Redstone.DISABLE_UNOCCUPIED) { |  | ||||||
|             for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) { |  | ||||||
|                 if (plot.equals(player.getCurrentPlot())) { |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             event.setNewCurrent(0); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) |  | ||||||
|     public void onPhysicsEvent(BlockPhysicsEvent event) { |  | ||||||
|         Block block = event.getBlock(); |  | ||||||
|         Location location = BukkitUtil.adapt(block.getLocation()); |  | ||||||
|         PlotArea area = location.getPlotArea(); |  | ||||||
|         if (area == null) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         Plot plot = area.getOwnedPlotAbs(location); |  | ||||||
|         if (plot == null) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (event.getChangedType().hasGravity() && plot.getFlag(DisablePhysicsFlag.class)) { |  | ||||||
|             event.setCancelled(true); |  | ||||||
|             sendBlockChange(event.getBlock().getLocation(), event.getBlock().getBlockData()); |  | ||||||
|             plot.debug("Prevented block physics and resent block change because disable-physics = true"); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (event.getChangedType() == Material.COMPARATOR) { |  | ||||||
|             if (!plot.getFlag(RedstoneFlag.class)) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 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)) { |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) { |  | ||||||
|                     event.setCancelled(true); |  | ||||||
|                     plot.debug("Prevented piston update because of invalid edge piston detection"); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|     public void blockCreate(BlockPlaceEvent event) { |     public void blockCreate(BlockPlaceEvent event) { | ||||||
|         Location location = BukkitUtil.adapt(event.getBlock().getLocation()); |         Location location = BukkitUtil.adapt(event.getBlock().getLocation()); | ||||||
| @@ -285,13 +163,6 @@ public class BlockEventListener implements Listener { | |||||||
|         if (plot != null) { |         if (plot != null) { | ||||||
|             if (area.notifyIfOutsideBuildArea(pp, location.getY())) { |             if (area.notifyIfOutsideBuildArea(pp, location.getY())) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 pp.sendMessage( |  | ||||||
|                         TranslatableCaption.of("height.height_limit"), |  | ||||||
|                         TagResolver.builder() |  | ||||||
|                                 .tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight()))) |  | ||||||
|                                 .tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight()))) |  | ||||||
|                                 .build() |  | ||||||
|                 ); |  | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (!plot.hasOwner()) { |             if (!plot.hasOwner()) { | ||||||
| @@ -383,13 +254,6 @@ public class BlockEventListener implements Listener { | |||||||
|                 } |                 } | ||||||
|             } else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) { |             } else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|                 plotPlayer.sendMessage( |  | ||||||
|                         TranslatableCaption.of("height.height_limit"), |  | ||||||
|                         TagResolver.builder() |  | ||||||
|                                 .tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight()))) |  | ||||||
|                                 .tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight()))) |  | ||||||
|                                 .build() |  | ||||||
|                 ); |  | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (!plot.hasOwner()) { |             if (!plot.hasOwner()) { | ||||||
| @@ -670,7 +534,11 @@ public class BlockEventListener implements Listener { | |||||||
|                 BlockBreakEvent call = new BlockBreakEvent(block, player); |                 BlockBreakEvent call = new BlockBreakEvent(block, player); | ||||||
|                 Bukkit.getServer().getPluginManager().callEvent(call); |                 Bukkit.getServer().getPluginManager().callEvent(call); | ||||||
|                 if (!call.isCancelled()) { |                 if (!call.isCancelled()) { | ||||||
|                     event.getBlock().breakNaturally(); |                     if (Settings.Flags.INSTABREAK_CONSIDER_TOOL) { | ||||||
|  |                         block.breakNaturally(event.getItemInHand()); | ||||||
|  |                     } else { | ||||||
|  |                         block.breakNaturally(); | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             // == rather than <= as we only care about the "ground level" not being destroyed |             // == rather than <= as we only care about the "ground level" not being destroyed | ||||||
| @@ -1341,18 +1209,9 @@ public class BlockEventListener implements Listener { | |||||||
|             if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { |             if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) { |             if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) { | ||||||
|                 pp.sendMessage( |                 event.setCancelled(true); | ||||||
|                         TranslatableCaption.of("height.height_limit"), |                 break; | ||||||
|                         TagResolver.builder() |  | ||||||
|                                 .tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight()))) |  | ||||||
|                                 .tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight()))) |  | ||||||
|                                 .build() |  | ||||||
|                 ); |  | ||||||
|                 if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) { |  | ||||||
|                     event.setCancelled(true); |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -56,6 +56,7 @@ import org.bukkit.entity.Player; | |||||||
| import org.bukkit.entity.Projectile; | import org.bukkit.entity.Projectile; | ||||||
| import org.bukkit.entity.TNTPrimed; | import org.bukkit.entity.TNTPrimed; | ||||||
| import org.bukkit.entity.Vehicle; | import org.bukkit.entity.Vehicle; | ||||||
|  | import org.bukkit.event.Cancellable; | ||||||
| import org.bukkit.event.EventHandler; | import org.bukkit.event.EventHandler; | ||||||
| import org.bukkit.event.EventPriority; | import org.bukkit.event.EventPriority; | ||||||
| import org.bukkit.event.Listener; | import org.bukkit.event.Listener; | ||||||
| @@ -98,37 +99,25 @@ public class EntityEventListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST) |     @EventHandler(priority = EventPriority.HIGHEST) | ||||||
|     public void onEntityCombustByEntity(EntityCombustByEntityEvent event) { |     public void onEntityCombustByEntity(EntityCombustByEntityEvent event) { | ||||||
|         EntityDamageByEntityEvent eventChange = |         onEntityDamageByEntityCommon(event.getCombuster(), event.getEntity(), EntityDamageEvent.DamageCause.FIRE_TICK, event); | ||||||
|                 new EntityDamageByEntityEvent( |  | ||||||
|                         event.getCombuster(), |  | ||||||
|                         event.getEntity(), |  | ||||||
|                         EntityDamageEvent.DamageCause.FIRE_TICK, |  | ||||||
|                         event.getDuration() |  | ||||||
|                 ); |  | ||||||
|         onEntityDamageByEntityEvent(eventChange); |  | ||||||
|         if (eventChange.isCancelled()) { |  | ||||||
|             event.setCancelled(true); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST) |     @EventHandler(priority = EventPriority.HIGHEST) | ||||||
|     public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { |     public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { | ||||||
|         Entity damager = event.getDamager(); |         onEntityDamageByEntityCommon(event.getDamager(), event.getEntity(), event.getCause(), event); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void onEntityDamageByEntityCommon( | ||||||
|  |             final Entity damager, | ||||||
|  |             final Entity victim, | ||||||
|  |             final EntityDamageEvent.DamageCause cause, | ||||||
|  |             final Cancellable event | ||||||
|  |     ) { | ||||||
|         Location location = BukkitUtil.adapt(damager.getLocation()); |         Location location = BukkitUtil.adapt(damager.getLocation()); | ||||||
|         if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { |         if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Entity victim = event.getEntity(); |         if (!BukkitEntityUtil.entityDamage(damager, victim, cause)) { | ||||||
| /* |  | ||||||
|         if (victim.getType().equals(EntityType.ITEM_FRAME)) { |  | ||||||
|             Plot plot = BukkitUtil.getLocation(victim).getPlot(); |  | ||||||
|             if (plot != null && !plot.isAdded(damager.getUniqueId())) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| */ |  | ||||||
|         if (!BukkitEntityUtil.entityDamage(damager, victim, event.getCause())) { |  | ||||||
|             if (event.isCancelled()) { |             if (event.isCancelled()) { | ||||||
|                 if (victim instanceof Ageable ageable) { |                 if (victim instanceof Ageable ageable) { | ||||||
|                     if (ageable.getAge() == -24000) { |                     if (ageable.getAge() == -24000) { | ||||||
| @@ -163,13 +152,13 @@ public class EntityEventListener implements Listener { | |||||||
|             } |             } | ||||||
|             case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", |             case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", | ||||||
|                     "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", |                     "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", | ||||||
|                     "DUPLICATION", "FROZEN", "SPELL", "DEFAULT" -> { |                     "FROZEN", "SPELL", "DEFAULT" -> { | ||||||
|                 if (!area.isMobSpawning()) { |                 if (!area.isMobSpawning()) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             case "BREEDING" -> { |             case "BREEDING", "DUPLICATION" -> { | ||||||
|                 if (!area.isSpawnBreeding()) { |                 if (!area.isSpawnBreeding()) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|   | |||||||
| @@ -124,7 +124,8 @@ public class EntitySpawnListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (PaperLib.isPaper()) { |         if (PaperLib.isPaper()) { | ||||||
|             if (area.isSpawnCustom() && "CUSTOM".equals(entity.getEntitySpawnReason().name())) { |             //noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol. | ||||||
|  |             if (area.isSpawnCustom() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -153,7 +154,7 @@ 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) { |         if (type == EntityType.ENDER_CRYSTAL || type == EntityType.ARMOR_STAND) { | ||||||
|             if (BukkitEntityUtil.checkEntity(entity, plot)) { |             if (BukkitEntityUtil.checkEntity(entity, plot)) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -0,0 +1,201 @@ | |||||||
|  | /* | ||||||
|  |  * PlotSquared, a land and world management plugin for Minecraft. | ||||||
|  |  * Copyright (C) IntellectualSites <https://intellectualsites.com> | ||||||
|  |  * Copyright (C) IntellectualSites team and contributors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.bukkit.listener; | ||||||
|  |  | ||||||
|  | import com.google.inject.Inject; | ||||||
|  | import com.plotsquared.bukkit.player.BukkitPlayer; | ||||||
|  | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
|  | import com.plotsquared.core.PlotSquared; | ||||||
|  | import com.plotsquared.core.configuration.Settings; | ||||||
|  | import com.plotsquared.core.database.DBFunc; | ||||||
|  | import com.plotsquared.core.location.Location; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.Plot; | ||||||
|  | import com.plotsquared.core.plot.PlotArea; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.RedstoneFlag; | ||||||
|  | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
|  | import com.plotsquared.core.util.PlotFlagUtil; | ||||||
|  | import com.plotsquared.core.util.task.TaskManager; | ||||||
|  | import com.plotsquared.core.util.task.TaskTime; | ||||||
|  | import com.sk89q.worldedit.WorldEdit; | ||||||
|  | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.Material; | ||||||
|  | import org.bukkit.block.Block; | ||||||
|  | import org.bukkit.block.BlockFace; | ||||||
|  | import org.bukkit.block.data.BlockData; | ||||||
|  | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.EventPriority; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.block.BlockPhysicsEvent; | ||||||
|  | import org.bukkit.event.block.BlockRedstoneEvent; | ||||||
|  | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
|  | import java.util.Set; | ||||||
|  | import java.util.UUID; | ||||||
|  |  | ||||||
|  | @SuppressWarnings("unused") | ||||||
|  | public class HighFreqBlockEventListener 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 final PlotAreaManager plotAreaManager; | ||||||
|  |     private final WorldEdit worldEdit; | ||||||
|  |  | ||||||
|  |     @Inject | ||||||
|  |     public HighFreqBlockEventListener(final @NonNull PlotAreaManager plotAreaManager, final @NonNull WorldEdit worldEdit) { | ||||||
|  |         this.plotAreaManager = plotAreaManager; | ||||||
|  |         this.worldEdit = worldEdit; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void sendBlockChange(final org.bukkit.Location bloc, final BlockData data) { | ||||||
|  |         TaskManager.runTaskLater(() -> { | ||||||
|  |             String world = bloc.getWorld().getName(); | ||||||
|  |             int x = bloc.getBlockX(); | ||||||
|  |             int z = bloc.getBlockZ(); | ||||||
|  |             int distance = Bukkit.getViewDistance() * 16; | ||||||
|  |  | ||||||
|  |             for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) { | ||||||
|  |                 Location location = player.getLocation(); | ||||||
|  |                 if (location.getWorldName().equals(world)) { | ||||||
|  |                     if (16 * Math.abs(location.getX() - x) / 16 > distance || 16 * Math.abs(location.getZ() - z) / 16 > distance) { | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                     ((BukkitPlayer) player).player.sendBlockChange(bloc, data); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, TaskTime.ticks(3L)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @EventHandler | ||||||
|  |     public void onRedstoneEvent(BlockRedstoneEvent event) { | ||||||
|  |         Block block = event.getBlock(); | ||||||
|  |         Location location = BukkitUtil.adapt(block.getLocation()); | ||||||
|  |         PlotArea area = location.getPlotArea(); | ||||||
|  |         if (area == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         Plot plot = location.getOwnedPlot(); | ||||||
|  |         if (plot == null) { | ||||||
|  |             if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) { | ||||||
|  |                 event.setNewCurrent(0); | ||||||
|  |             } | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (!plot.getFlag(RedstoneFlag.class)) { | ||||||
|  |             event.setNewCurrent(0); | ||||||
|  |             plot.debug("Redstone event was cancelled because redstone = false"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (Settings.Redstone.DISABLE_OFFLINE) { | ||||||
|  |             boolean disable = false; | ||||||
|  |             if (!DBFunc.SERVER.equals(plot.getOwner())) { | ||||||
|  |                 if (plot.isMerged()) { | ||||||
|  |                     disable = true; | ||||||
|  |                     for (UUID owner : plot.getOwners()) { | ||||||
|  |                         if (PlotSquared.platform().playerManager().getPlayerIfExists(owner) != null) { | ||||||
|  |                             disable = false; | ||||||
|  |                             break; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     disable = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs()) == null; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (disable) { | ||||||
|  |                 for (UUID trusted : plot.getTrusted()) { | ||||||
|  |                     if (PlotSquared.platform().playerManager().getPlayerIfExists(trusted) != null) { | ||||||
|  |                         disable = false; | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 if (disable) { | ||||||
|  |                     event.setNewCurrent(0); | ||||||
|  |                     plot.debug("Redstone event was cancelled because no trusted player was in the plot"); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (Settings.Redstone.DISABLE_UNOCCUPIED) { | ||||||
|  |             for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) { | ||||||
|  |                 if (plot.equals(player.getCurrentPlot())) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             event.setNewCurrent(0); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) | ||||||
|  |     public void onPhysicsEvent(BlockPhysicsEvent event) { | ||||||
|  |         Block block = event.getBlock(); | ||||||
|  |         Location location = BukkitUtil.adapt(block.getLocation()); | ||||||
|  |         PlotArea area = location.getPlotArea(); | ||||||
|  |         if (area == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         Plot plot = area.getOwnedPlotAbs(location); | ||||||
|  |         if (plot == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (event.getChangedType().hasGravity() && plot.getFlag(DisablePhysicsFlag.class)) { | ||||||
|  |             event.setCancelled(true); | ||||||
|  |             sendBlockChange(event.getBlock().getLocation(), event.getBlock().getBlockData()); | ||||||
|  |             plot.debug("Prevented block physics and resent block change because disable-physics = true"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (event.getChangedType() == Material.COMPARATOR) { | ||||||
|  |             if (!plot.getFlag(RedstoneFlag.class)) { | ||||||
|  |                 event.setCancelled(true); | ||||||
|  |                 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)) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) { | ||||||
|  |                     event.setCancelled(true); | ||||||
|  |                     plot.debug("Prevented piston update because of invalid edge piston detection"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -19,6 +19,7 @@ | |||||||
| package com.plotsquared.bukkit.listener; | package com.plotsquared.bukkit.listener; | ||||||
|  |  | ||||||
| import com.destroystokyo.paper.event.block.BeaconEffectEvent; | import com.destroystokyo.paper.event.block.BeaconEffectEvent; | ||||||
|  | import com.destroystokyo.paper.event.block.BlockDestroyEvent; | ||||||
| import com.destroystokyo.paper.event.entity.EntityPathfindEvent; | import com.destroystokyo.paper.event.entity.EntityPathfindEvent; | ||||||
| import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent; | import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent; | ||||||
| import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent; | import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent; | ||||||
| @@ -40,7 +41,9 @@ import com.plotsquared.core.plot.PlotArea; | |||||||
| import com.plotsquared.core.plot.flag.FlagContainer; | import com.plotsquared.core.plot.flag.FlagContainer; | ||||||
| import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; | import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DoneFlag; | import com.plotsquared.core.plot.flag.implementations.DoneFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.FishingFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; | import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.TileDropFlag; | ||||||
| import com.plotsquared.core.plot.flag.types.BooleanFlag; | import com.plotsquared.core.plot.flag.types.BooleanFlag; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.util.PlotFlagUtil; | import com.plotsquared.core.util.PlotFlagUtil; | ||||||
| @@ -83,6 +86,19 @@ public class PaperListener implements Listener { | |||||||
|         this.plotAreaManager = plotAreaManager; |         this.plotAreaManager = plotAreaManager; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) | ||||||
|  |     public void onBlockDestroy(final BlockDestroyEvent event) { | ||||||
|  |         Location location = BukkitUtil.adapt(event.getBlock().getLocation()); | ||||||
|  |         PlotArea area = location.getPlotArea(); | ||||||
|  |         if (area == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         Plot plot = area.getPlot(location); | ||||||
|  |         if (plot != null) { | ||||||
|  |             event.setWillDrop(plot.getFlag(TileDropFlag.class)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onEntityPathfind(EntityPathfindEvent event) { |     public void onEntityPathfind(EntityPathfindEvent event) { | ||||||
|         if (!Settings.Paper_Components.ENTITY_PATHING) { |         if (!Settings.Paper_Components.ENTITY_PATHING) { | ||||||
| @@ -348,6 +364,11 @@ public class PaperListener implements Listener { | |||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|         } else if (!plot.isAdded(pp.getUUID())) { |         } else if (!plot.isAdded(pp.getUUID())) { | ||||||
|  |             if (entity.getType().equals(EntityType.FISHING_HOOK)) { | ||||||
|  |                 if (plot.getFlag(FishingFlag.class)) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|             if (!plot.getFlag(ProjectilesFlag.class)) { |             if (!plot.getFlag(ProjectilesFlag.class)) { | ||||||
|                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { |                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { | ||||||
|                     pp.sendMessage( |                     pp.sendMessage( | ||||||
|   | |||||||
| @@ -61,6 +61,7 @@ import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag; | import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag; | import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag; | import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.TileDropFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag; | import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag; | import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag; | import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag; | ||||||
| @@ -107,6 +108,7 @@ import org.bukkit.event.EventHandler; | |||||||
| import org.bukkit.event.EventPriority; | import org.bukkit.event.EventPriority; | ||||||
| import org.bukkit.event.Listener; | import org.bukkit.event.Listener; | ||||||
| import org.bukkit.event.block.Action; | import org.bukkit.event.block.Action; | ||||||
|  | import org.bukkit.event.block.BlockBreakEvent; | ||||||
| import org.bukkit.event.entity.EntityPickupItemEvent; | import org.bukkit.event.entity.EntityPickupItemEvent; | ||||||
| import org.bukkit.event.entity.EntityPlaceEvent; | import org.bukkit.event.entity.EntityPlaceEvent; | ||||||
| import org.bukkit.event.entity.EntityPotionEffectEvent; | import org.bukkit.event.entity.EntityPotionEffectEvent; | ||||||
| @@ -236,6 +238,19 @@ public class PlayerEventListener implements Listener { | |||||||
|         this.plotListener = plotListener; |         this.plotListener = plotListener; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) | ||||||
|  |     public void onBlockBreak(final BlockBreakEvent event) { | ||||||
|  |         Location location = BukkitUtil.adapt(event.getBlock().getLocation()); | ||||||
|  |         PlotArea area = location.getPlotArea(); | ||||||
|  |         if (area == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         Plot plot = area.getPlot(location); | ||||||
|  |         if (plot != null) { | ||||||
|  |             event.setDropItems(plot.getFlag(TileDropFlag.class)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|     public void onPlayerDyeSign(PlayerInteractEvent event) { |     public void onPlayerDyeSign(PlayerInteractEvent event) { | ||||||
|         ItemStack itemStack = event.getItem(); |         ItemStack itemStack = event.getItem(); | ||||||
| @@ -1921,7 +1936,9 @@ public class PlayerEventListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) { |     public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) { | ||||||
|         Location location = BukkitUtil.adapt(event.getPlayer().getLocation()); |         Player player = event.getPlayer(); | ||||||
|  |         BukkitPlayer pp = BukkitUtil.adapt(player); | ||||||
|  |         Location location = pp.getLocation(); | ||||||
|         PlotArea area = location.getPlotArea(); |         PlotArea area = location.getPlotArea(); | ||||||
|         if (area == null) { |         if (area == null) { | ||||||
|             return; |             return; | ||||||
| @@ -1933,9 +1950,11 @@ public class PlayerEventListener implements Listener { | |||||||
|             } |             } | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (plot.getFlag(LecternReadBookFlag.class)) { |         if (!plot.isAdded(pp.getUUID())) { | ||||||
|             plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true"); |             if (plot.getFlag(LecternReadBookFlag.class)) { | ||||||
|             event.setCancelled(true); |                 plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true"); | ||||||
|  |                 event.setCancelled(true); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,12 +28,14 @@ import com.plotsquared.core.player.PlotPlayer; | |||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.PlotHandler; | import com.plotsquared.core.plot.PlotHandler; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.FishingFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; | import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.util.PlotFlagUtil; | import com.plotsquared.core.util.PlotFlagUtil; | ||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| import org.bukkit.entity.Entity; | import org.bukkit.entity.Entity; | ||||||
|  | import org.bukkit.entity.EntityType; | ||||||
| import org.bukkit.entity.LivingEntity; | import org.bukkit.entity.LivingEntity; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| import org.bukkit.entity.Projectile; | import org.bukkit.entity.Projectile; | ||||||
| @@ -132,6 +134,11 @@ public class ProjectileEventListener implements Listener { | |||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|         } else if (!plot.isAdded(pp.getUUID())) { |         } else if (!plot.isAdded(pp.getUUID())) { | ||||||
|  |             if (entity.getType().equals(EntityType.FISHING_HOOK)) { | ||||||
|  |                 if (plot.getFlag(FishingFlag.class)) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|             if (!plot.getFlag(ProjectilesFlag.class)) { |             if (!plot.getFlag(ProjectilesFlag.class)) { | ||||||
|                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { |                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) { | ||||||
|                     pp.sendMessage( |                     pp.sendMessage( | ||||||
| @@ -187,7 +194,8 @@ public class ProjectileEventListener implements Listener { | |||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag( |             if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag( | ||||||
|                     ProjectilesFlag.class)) { |                     ProjectilesFlag.class) || (entity.getType().equals(EntityType.FISHING_HOOK) && plot.getFlag( | ||||||
|  |                     FishingFlag.class))) { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             entity.remove(); |             entity.remove(); | ||||||
|   | |||||||
| @@ -95,7 +95,8 @@ public class SingleWorldListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.LOWEST) |     @EventHandler(priority = EventPriority.LOWEST) | ||||||
|     public void onChunkLoad(ChunkLoadEvent event) { |     public void onChunkLoad(ChunkLoadEvent event) { | ||||||
|         handle(event); |         // disable this for now, should address https://github.com/IntellectualSites/PlotSquared/issues/4413 | ||||||
|  |         // handle(event); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,6 +20,8 @@ package com.plotsquared.bukkit.placeholder; | |||||||
|  |  | ||||||
| import com.plotsquared.core.PlotSquared; | import com.plotsquared.core.PlotSquared; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.DoneFlag; | ||||||
|  | import com.plotsquared.core.util.query.PlotQuery; | ||||||
| import me.clip.placeholderapi.PlaceholderAPIPlugin; | import me.clip.placeholderapi.PlaceholderAPIPlugin; | ||||||
| import me.clip.placeholderapi.expansion.PlaceholderExpansion; | import me.clip.placeholderapi.expansion.PlaceholderExpansion; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| @@ -83,6 +85,20 @@ public class PAPIPlaceholders extends PlaceholderExpansion { | |||||||
|             return String.valueOf(pl.getPlotCount(identifier)); |             return String.valueOf(pl.getPlotCount(identifier)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (identifier.startsWith("base_plot_count_")) { | ||||||
|  |             identifier = identifier.substring("base_plot_count_".length()); | ||||||
|  |             if (identifier.isEmpty()) { | ||||||
|  |                 return ""; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return String.valueOf(PlotQuery.newQuery() | ||||||
|  |                     .ownedBy(pl) | ||||||
|  |                     .inWorld(identifier) | ||||||
|  |                     .whereBasePlot() | ||||||
|  |                     .thatPasses(plot -> !DoneFlag.isDone(plot)) | ||||||
|  |                     .count()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // PlotSquared placeholders |         // PlotSquared placeholders | ||||||
|         return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl); |         return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import com.plotsquared.core.plot.PlotWeather; | |||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
| import com.plotsquared.core.util.MathMan; | import com.plotsquared.core.util.MathMan; | ||||||
|  | import com.plotsquared.core.util.WorldUtil; | ||||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
| import com.sk89q.worldedit.extension.platform.Actor; | import com.sk89q.worldedit.extension.platform.Actor; | ||||||
| import com.sk89q.worldedit.world.item.ItemType; | import com.sk89q.worldedit.world.item.ItemType; | ||||||
| @@ -120,6 +121,9 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean canTeleport(final @NonNull Location location) { |     public boolean canTeleport(final @NonNull Location location) { | ||||||
|  |         if (!WorldUtil.isValidLocation(location)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|         final org.bukkit.Location to = BukkitUtil.adapt(location); |         final org.bukkit.Location to = BukkitUtil.adapt(location); | ||||||
|         final org.bukkit.Location from = player.getLocation(); |         final org.bukkit.Location from = player.getLocation(); | ||||||
|         PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to); |         PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to); | ||||||
| @@ -221,7 +225,7 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) { |     public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) { | ||||||
|         if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) { |         if (!WorldUtil.isValidLocation(location)) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         final org.bukkit.Location bukkitLocation = |         final org.bukkit.Location bukkitLocation = | ||||||
| @@ -322,7 +326,7 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         this.player.playSound(BukkitUtil.adapt(location), Sound.valueOf(BukkitAdapter.adapt(id).name()), |         this.player.playSound(BukkitUtil.adapt(location), Sound.valueOf(BukkitAdapter.adapt(id).name()), | ||||||
|                 SoundCategory.MUSIC, 1f, 1f |                 SoundCategory.MUSIC, Float.MAX_VALUE, 1f | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,11 +23,15 @@ import com.plotsquared.core.location.World; | |||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
|  | import java.lang.ref.SoftReference; | ||||||
|  | import java.lang.ref.WeakReference; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| public class BukkitWorld implements World<org.bukkit.World> { | public class BukkitWorld implements World<org.bukkit.World> { | ||||||
|  |  | ||||||
|     private static final Map<String, BukkitWorld> worldMap = Maps.newHashMap(); |     // Upon world unload we should probably have the P2 BukkitWorld be GCed relatively eagerly, thus freeing the bukkit world. | ||||||
|  |     //  We also want to avoid circumstances where a bukkit world has been GCed, but a P2 BukkitWorld has not | ||||||
|  |     private static final Map<String, WeakReference<BukkitWorld>> worldMap = Maps.newHashMap(); | ||||||
|     private static final boolean HAS_MIN_Y; |     private static final boolean HAS_MIN_Y; | ||||||
|  |  | ||||||
|     static { |     static { | ||||||
| @@ -41,10 +45,11 @@ public class BukkitWorld implements World<org.bukkit.World> { | |||||||
|         HAS_MIN_Y = temp; |         HAS_MIN_Y = temp; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private final org.bukkit.World world; |     // We want to allow GC to remove bukkit worlds, but not too eagerly | ||||||
|  |     private final SoftReference<org.bukkit.World> world; | ||||||
|  |  | ||||||
|     private BukkitWorld(final org.bukkit.World world) { |     private BukkitWorld(final org.bukkit.World world) { | ||||||
|         this.world = world; |         this.world = new SoftReference<>(world); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -68,12 +73,13 @@ public class BukkitWorld implements World<org.bukkit.World> { | |||||||
|      * @return World instance |      * @return World instance | ||||||
|      */ |      */ | ||||||
|     public static @NonNull BukkitWorld of(final org.bukkit.World world) { |     public static @NonNull BukkitWorld of(final org.bukkit.World world) { | ||||||
|         BukkitWorld bukkitWorld = worldMap.get(world.getName()); |         WeakReference<BukkitWorld> bukkitWorldRef = worldMap.get(world.getName()); | ||||||
|         if (bukkitWorld != null && bukkitWorld.getPlatformWorld().equals(world)) { |         BukkitWorld bukkitWorld; | ||||||
|  |         if (bukkitWorldRef != null && (bukkitWorld = bukkitWorldRef.get()) != null && world.equals(bukkitWorld.world.get())) { | ||||||
|             return bukkitWorld; |             return bukkitWorld; | ||||||
|         } |         } | ||||||
|         bukkitWorld = new BukkitWorld(world); |         bukkitWorld = new BukkitWorld(world); | ||||||
|         worldMap.put(world.getName(), bukkitWorld); |         worldMap.put(world.getName(), new WeakReference<>(bukkitWorld)); | ||||||
|         return bukkitWorld; |         return bukkitWorld; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -97,22 +103,26 @@ public class BukkitWorld implements World<org.bukkit.World> { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public org.bukkit.World getPlatformWorld() { |     public org.bukkit.World getPlatformWorld() { | ||||||
|         return this.world; |         org.bukkit.World world = this.world.get(); | ||||||
|  |         if (world == null) { | ||||||
|  |             throw new IllegalStateException("Bukkit platform world was unloaded from memory"); | ||||||
|  |         } | ||||||
|  |         return world; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull String getName() { |     public @NonNull String getName() { | ||||||
|         return this.world.getName(); |         return this.getPlatformWorld().getName(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public int getMinHeight() { |     public int getMinHeight() { | ||||||
|         return getMinWorldHeight(world); |         return getMinWorldHeight(getPlatformWorld()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public int getMaxHeight() { |     public int getMaxHeight() { | ||||||
|         return getMaxWorldHeight(world) - 1; |         return getMaxWorldHeight(getPlatformWorld()) - 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -78,5 +78,6 @@ tasks { | |||||||
|         opt.encoding("UTF-8") |         opt.encoding("UTF-8") | ||||||
|         opt.keyWords() |         opt.keyWords() | ||||||
|         opt.addStringOption("-since", isRelease) |         opt.addStringOption("-since", isRelease) | ||||||
|  |         opt.noTimestamp() | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,6 @@ package com.plotsquared.core.command; | |||||||
|  |  | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| import com.plotsquared.core.configuration.caption.StaticCaption; |  | ||||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
| import com.plotsquared.core.permissions.Permission; | import com.plotsquared.core.permissions.Permission; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| @@ -202,7 +201,6 @@ public class Download extends SubCommand { | |||||||
|                                                     .tag("delete", Tag.preProcessParsed("Not available")) |                                                     .tag("delete", Tag.preProcessParsed("Not available")) | ||||||
|                                                     .build() |                                                     .build() | ||||||
|                                     ); |                                     ); | ||||||
|                                     player.sendMessage(StaticCaption.of(value.toString())); |  | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                     )); |                     )); | ||||||
|   | |||||||
| @@ -268,6 +268,7 @@ public class MainCommand extends Command { | |||||||
|                     tp = true; |                     tp = true; | ||||||
|                 } else { |                 } else { | ||||||
|                     player.sendMessage(TranslatableCaption.of("border.denied")); |                     player.sendMessage(TranslatableCaption.of("border.denied")); | ||||||
|  |                     return CompletableFuture.completedFuture(false); | ||||||
|                 } |                 } | ||||||
|                 // Trim command |                 // Trim command | ||||||
|                 args = Arrays.copyOfRange(args, 1, args.length); |                 args = Arrays.copyOfRange(args, 1, args.length); | ||||||
|   | |||||||
| @@ -77,6 +77,7 @@ public class Visit extends Command { | |||||||
|             query.whereBasePlot(); |             query.whereBasePlot(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // without specified argument | ||||||
|         if (page == Integer.MIN_VALUE) { |         if (page == Integer.MIN_VALUE) { | ||||||
|             page = 1; |             page = 1; | ||||||
|         } |         } | ||||||
| @@ -94,10 +95,15 @@ public class Visit extends Command { | |||||||
|  |  | ||||||
|         final List<Plot> plots = query.asList(); |         final List<Plot> plots = query.asList(); | ||||||
|  |  | ||||||
|  |         // Conversion of reversed page argument | ||||||
|  |         if (page < 0) { | ||||||
|  |             page = (plots.size() + 1) + page; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (plots.isEmpty()) { |         if (plots.isEmpty()) { | ||||||
|             player.sendMessage(TranslatableCaption.of("invalid.found_no_plots")); |             player.sendMessage(TranslatableCaption.of("invalid.found_no_plots")); | ||||||
|             return; |             return; | ||||||
|         } else if (plots.size() < page || page < 1) { |         } else if (page > plots.size() || page < 1) { | ||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
|                     TranslatableCaption.of("invalid.number_not_in_range"), |                     TranslatableCaption.of("invalid.number_not_in_range"), | ||||||
|                     TagResolver.builder() |                     TagResolver.builder() | ||||||
| @@ -188,34 +194,22 @@ public class Visit extends Command { | |||||||
|         int page = Integer.MIN_VALUE; |         int page = Integer.MIN_VALUE; | ||||||
|  |  | ||||||
|         switch (args.length) { |         switch (args.length) { | ||||||
|             // /p v <user> <area> <page> |             // /p v <player> <area> <page> | ||||||
|             case 3: |             case 3: | ||||||
|                 if (!MathMan.isInteger(args[2])) { |                 if (isInvalidPageNr(args[2])) { | ||||||
|                     player.sendMessage( |                     sendInvalidPageNrMsg(player); | ||||||
|                             TranslatableCaption.of("invalid.not_valid_number"), |  | ||||||
|                             TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)"))) |  | ||||||
|                     ); |  | ||||||
|                     player.sendMessage( |  | ||||||
|                             TranslatableCaption.of("commandconfig.command_syntax"), |  | ||||||
|                             TagResolver.resolver("value", Tag.inserting(Component.text(getUsage()))) |  | ||||||
|                     ); |  | ||||||
|                     return CompletableFuture.completedFuture(false); |                     return CompletableFuture.completedFuture(false); | ||||||
|                 } |                 } | ||||||
|                 page = Integer.parseInt(args[2]); |                 page = getPageNr(args[2]); | ||||||
|                 // /p v <name> <area> [page] |                 // /p v <player> <area> [page] | ||||||
|                 // /p v <name> [page] |                 // /p v <player> [page] | ||||||
|             case 2: |             case 2: | ||||||
|                 if (page != Integer.MIN_VALUE || !MathMan.isInteger(args[1])) { |                 // If "case 3" is already through or the argument is not a page number: | ||||||
|  |                 // -> /p v <player> <area> [page] | ||||||
|  |                 if (page != Integer.MIN_VALUE || isInvalidPageNr(args[1])) { | ||||||
|                     sortByArea = this.plotAreaManager.getPlotAreaByString(args[1]); |                     sortByArea = this.plotAreaManager.getPlotAreaByString(args[1]); | ||||||
|                     if (sortByArea == null) { |                     if (sortByArea == null) { | ||||||
|                         player.sendMessage( |                         sendInvalidPageNrMsg(player); | ||||||
|                                 TranslatableCaption.of("invalid.not_valid_number"), |  | ||||||
|                                 TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)"))) |  | ||||||
|                         ); |  | ||||||
|                         player.sendMessage( |  | ||||||
|                                 TranslatableCaption.of("commandconfig.command_syntax"), |  | ||||||
|                                 TagResolver.resolver("value", Tag.inserting(Component.text(getUsage()))) |  | ||||||
|                         ); |  | ||||||
|                         return CompletableFuture.completedFuture(false); |                         return CompletableFuture.completedFuture(false); | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
| @@ -249,16 +243,13 @@ public class Visit extends Command { | |||||||
|                     }); |                     }); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|                 try { |                 // -> /p v <player> <page> | ||||||
|                     page = Integer.parseInt(args[1]); |                 if (isInvalidPageNr(args[1])) { | ||||||
|                 } catch (NumberFormatException ignored) { |                     sendInvalidPageNrMsg(player); | ||||||
|                     player.sendMessage( |  | ||||||
|                             TranslatableCaption.of("invalid.not_a_number"), |  | ||||||
|                             TagResolver.resolver("value", Tag.inserting(Component.text(args[1]))) |  | ||||||
|                     ); |  | ||||||
|                     return CompletableFuture.completedFuture(false); |                     return CompletableFuture.completedFuture(false); | ||||||
|                 } |                 } | ||||||
|                 // /p v <name> [page] |                 page = getPageNr(args[1]); | ||||||
|  |                 // /p v <player> [page] | ||||||
|                 // /p v <uuid> [page] |                 // /p v <uuid> [page] | ||||||
|                 // /p v <plot> [page] |                 // /p v <plot> [page] | ||||||
|                 // /p v <alias> |                 // /p v <alias> | ||||||
| @@ -326,6 +317,35 @@ public class Visit extends Command { | |||||||
|         return CompletableFuture.completedFuture(true); |         return CompletableFuture.completedFuture(true); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private boolean isInvalidPageNr(String arg) { | ||||||
|  |         if (MathMan.isInteger(arg)) { | ||||||
|  |             return false; | ||||||
|  |         } else if (arg.equals("last") || arg.equals("n")) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private int getPageNr(String arg) { | ||||||
|  |         if (MathMan.isInteger(arg)) { | ||||||
|  |             return Integer.parseInt(arg); | ||||||
|  |         } else if (arg.equals("last") || arg.equals("n")) { | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |         return Integer.MIN_VALUE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void sendInvalidPageNrMsg(PlotPlayer<?> player) { | ||||||
|  |         player.sendMessage( | ||||||
|  |                 TranslatableCaption.of("invalid.not_valid_number"), | ||||||
|  |                 TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)"))) | ||||||
|  |         ); | ||||||
|  |         player.sendMessage( | ||||||
|  |                 TranslatableCaption.of("commandconfig.command_syntax"), | ||||||
|  |                 TagResolver.resolver("value", Tag.inserting(Component.text(getUsage()))) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) { |     public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) { | ||||||
|         final List<Command> completions = new ArrayList<>(); |         final List<Command> completions = new ArrayList<>(); | ||||||
| @@ -334,6 +354,7 @@ public class Visit extends Command { | |||||||
|             case 1 -> { |             case 1 -> { | ||||||
|                 completions.addAll( |                 completions.addAll( | ||||||
|                         TabCompletions.completeAreas(args[1])); |                         TabCompletions.completeAreas(args[1])); | ||||||
|  |                 completions.addAll(TabCompletions.asCompletions("last")); | ||||||
|                 if (args[1].isEmpty()) { |                 if (args[1].isEmpty()) { | ||||||
|                     // if no input is given, only suggest 1 - 3 |                     // if no input is given, only suggest 1 - 3 | ||||||
|                     completions.addAll( |                     completions.addAll( | ||||||
| @@ -344,6 +365,7 @@ public class Visit extends Command { | |||||||
|                         TabCompletions.completeNumbers(args[1], 10, 999)); |                         TabCompletions.completeNumbers(args[1], 10, 999)); | ||||||
|             } |             } | ||||||
|             case 2 -> { |             case 2 -> { | ||||||
|  |                 completions.addAll(TabCompletions.asCompletions("last")); | ||||||
|                 if (args[2].isEmpty()) { |                 if (args[2].isEmpty()) { | ||||||
|                     // if no input is given, only suggest 1 - 3 |                     // if no input is given, only suggest 1 - 3 | ||||||
|                     completions.addAll( |                     completions.addAll( | ||||||
|   | |||||||
| @@ -43,6 +43,11 @@ public class Settings extends Config { | |||||||
|             "Leave it off if you don't need it, it can spam your console."}) |             "Leave it off if you don't need it, it can spam your console."}) | ||||||
|     public static boolean DEBUG = true; |     public static boolean DEBUG = true; | ||||||
|  |  | ||||||
|  |     @Comment({"The activity of high-frequency event listener can be deactivated here to improve the server performance. ", | ||||||
|  |             "Affected settings: 'redstone' settings here below. Affected flags: 'disable-physics', 'redstone'. ", | ||||||
|  |             "Only deactivate this setting if you do not need any of the mentioned settings or flags."}) | ||||||
|  |     public static boolean HIGH_FREQUENCY_LISTENER = true; | ||||||
|  |  | ||||||
|     @Create // This value will be generated automatically |     @Create // This value will be generated automatically | ||||||
|     public static ConfigBlock<Auto_Clear> AUTO_CLEAR = null; |     public static ConfigBlock<Auto_Clear> AUTO_CLEAR = null; | ||||||
|     // A ConfigBlock is a section that can have multiple instances e.g. multiple expiry tasks |     // A ConfigBlock is a section that can have multiple instances e.g. multiple expiry tasks | ||||||
| @@ -723,6 +728,12 @@ public class Settings extends Config { | |||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Comment("Settings related to flags") | ||||||
|  |     public static final class Flags { | ||||||
|  |  | ||||||
|  |         @Comment("If \"instabreak\" should consider the used tool.") | ||||||
|  |         public static boolean INSTABREAK_CONSIDER_TOOL = false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Comment({"Enable or disable parts of the plugin", |     @Comment({"Enable or disable parts of the plugin", | ||||||
|             "Note: A cache will use some memory if enabled"}) |             "Note: A cache will use some memory if enabled"}) | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ import com.plotsquared.core.plot.Plot; | |||||||
| public class PlayerEnterPlotEvent extends PlotPlayerEvent { | public class PlayerEnterPlotEvent extends PlotPlayerEvent { | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Called when a player leaves a plot. |      * PlayerEnterPlotEvent: Called when a player enters a plot | ||||||
|      * |      * | ||||||
|      * @param player Player that entered the plot |      * @param player Player that entered the plot | ||||||
|      * @param plot   Plot that was entered |      * @param plot   Plot that was entered | ||||||
|   | |||||||
| @@ -106,6 +106,10 @@ public class PlotListener { | |||||||
|                             iterator.remove(); |                             iterator.remove(); | ||||||
|                             continue; |                             continue; | ||||||
|                         } |                         } | ||||||
|  |                         // Don't attempt to heal dead players - they will get stuck in the abyss (#4406) | ||||||
|  |                         if (PlotSquared.platform().worldUtil().getHealth(player) <= 0) { | ||||||
|  |                             continue; | ||||||
|  |                         } | ||||||
|                         double level = PlotSquared.platform().worldUtil().getHealth(player); |                         double level = PlotSquared.platform().worldUtil().getHealth(player); | ||||||
|                         if (level != value.max) { |                         if (level != value.max) { | ||||||
|                             PlotSquared.platform().worldUtil().setHealth(player, Math.min(level + value.amount, value.max)); |                             PlotSquared.platform().worldUtil().setHealth(player, Math.min(level + value.amount, value.max)); | ||||||
|   | |||||||
| @@ -643,35 +643,22 @@ public class Plot { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Gets a immutable set of owner UUIDs for a plot (supports multi-owner mega-plots). |      * Gets an immutable set of owner UUIDs for a plot (supports multi-owner mega-plots). | ||||||
|      * <p> |      * <p> | ||||||
|      * This method cannot be used to add or remove owners from a plot. |      * This method cannot be used to add or remove owners from a plot. | ||||||
|      * </p> |      * </p> | ||||||
|      * |      * | ||||||
|      * @return Immutable view of plot owners |      * @return Immutable set of plot owners | ||||||
|      */ |      */ | ||||||
|     public @NonNull Set<UUID> getOwners() { |     public @NonNull Set<UUID> getOwners() { | ||||||
|         if (this.getOwner() == null) { |         ImmutableSet.Builder<UUID> owners = ImmutableSet.builder(); | ||||||
|             return ImmutableSet.of(); |         for (Plot plot : getConnectedPlots()) { | ||||||
|         } |             UUID owner = plot.getOwner(); | ||||||
|         if (isMerged()) { |             if (owner != null) { | ||||||
|             Set<Plot> plots = getConnectedPlots(); |                 owners.add(owner); | ||||||
|             Plot[] array = plots.toArray(new Plot[0]); |  | ||||||
|             ImmutableSet.Builder<UUID> owners = ImmutableSet.builder(); |  | ||||||
|             UUID last = this.getOwner(); |  | ||||||
|             owners.add(this.getOwner()); |  | ||||||
|             for (final Plot current : array) { |  | ||||||
|                 if (current.getOwner() == null) { |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|                 if (last == null || current.getOwner().getMostSignificantBits() != last.getMostSignificantBits()) { |  | ||||||
|                     owners.add(current.getOwner()); |  | ||||||
|                     last = current.getOwner(); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|             return owners.build(); |  | ||||||
|         } |         } | ||||||
|         return ImmutableSet.of(this.getOwner()); |         return owners.build(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -2574,6 +2561,12 @@ public class Plot { | |||||||
|      */ |      */ | ||||||
|     public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) { |     public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) { | ||||||
|         Plot plot = this.getBasePlot(false); |         Plot plot = this.getBasePlot(false); | ||||||
|  |         if ((getArea() == null || !(getArea() instanceof SinglePlotArea)) && !WorldUtil.isValidLocation(plot.getBottomAbs())) { | ||||||
|  |             // prevent from teleporting into unsafe regions | ||||||
|  |             player.sendMessage(TranslatableCaption.of("border.denied")); | ||||||
|  |             resultConsumer.accept(false); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause); |         PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause); | ||||||
|         if (event.getEventResult() == Result.DENY) { |         if (event.getEventResult() == Result.DENY) { | ||||||
|   | |||||||
| @@ -679,10 +679,8 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|                     TranslatableCaption.of("height.height_limit"), |                     TranslatableCaption.of("height.height_limit"), | ||||||
|                     TagResolver.builder() |                     TagResolver.builder() | ||||||
|                             .tag("minheight", Tag.inserting(Component.text(minBuildHeight))) |                             .tag("minheight", Tag.inserting(Component.text(minBuildHeight))) | ||||||
|                             .tag( |                             .tag("maxheight", Tag.inserting(Component.text(maxBuildHeight))) | ||||||
|                                     "maxheight", |                             .build() | ||||||
|                                     Tag.inserting(Component.text(maxBuildHeight)) |  | ||||||
|                             ).build() |  | ||||||
|             ); |             ); | ||||||
|             // Return true if "failed" as the method will always be inverted otherwise |             // Return true if "failed" as the method will always be inverted otherwise | ||||||
|             return true; |             return true; | ||||||
| @@ -1455,7 +1453,7 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|     /** |     /** | ||||||
|      * Get the maximum height that changes to plot components (wall filling, air, all etc.) may operate to |      * Get the maximum height that changes to plot components (wall filling, air, all etc.) may operate to | ||||||
|      * |      * | ||||||
|      * @since TODO |      * @since 7.3.4 | ||||||
|      */ |      */ | ||||||
|     public int getMaxComponentHeight() { |     public int getMaxComponentHeight() { | ||||||
|         return this.maxBuildHeight; |         return this.maxBuildHeight; | ||||||
| @@ -1464,7 +1462,7 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|     /** |     /** | ||||||
|      * Get the minimum height that changes to plot components (wall filling, air, all etc.) may operate to |      * Get the minimum height that changes to plot components (wall filling, air, all etc.) may operate to | ||||||
|      * |      * | ||||||
|      * @since TODO |      * @since 7.3.4 | ||||||
|      */ |      */ | ||||||
|     public int getMinComponentHeight() { |     public int getMinComponentHeight() { | ||||||
|         return this.minBuildHeight; |         return this.minBuildHeight; | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.ExplosionFlag; | import com.plotsquared.core.plot.flag.implementations.ExplosionFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.FarewellFlag; | import com.plotsquared.core.plot.flag.implementations.FarewellFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.FeedFlag; | import com.plotsquared.core.plot.flag.implementations.FeedFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.FishingFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.FlyFlag; | import com.plotsquared.core.plot.flag.implementations.FlyFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag; | import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.GamemodeFlag; | import com.plotsquared.core.plot.flag.implementations.GamemodeFlag; | ||||||
| @@ -101,6 +102,7 @@ import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.SoilDryFlag; | import com.plotsquared.core.plot.flag.implementations.SoilDryFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag; | import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag; | import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.TileDropFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.TimeFlag; | import com.plotsquared.core.plot.flag.implementations.TimeFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.TitlesFlag; | import com.plotsquared.core.plot.flag.implementations.TitlesFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag; | import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag; | ||||||
| @@ -158,6 +160,7 @@ public final class GlobalFlagContainer extends FlagContainer { | |||||||
|         this.addFlag(EditSignFlag.EDIT_SIGN_FALSE); |         this.addFlag(EditSignFlag.EDIT_SIGN_FALSE); | ||||||
|         this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE); |         this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE); | ||||||
|         this.addFlag(ExplosionFlag.EXPLOSION_FALSE); |         this.addFlag(ExplosionFlag.EXPLOSION_FALSE); | ||||||
|  |         this.addFlag(FishingFlag.FISHING_FALSE); | ||||||
|         this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE); |         this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE); | ||||||
|         this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE); |         this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE); | ||||||
|         this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE); |         this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE); | ||||||
| @@ -196,6 +199,7 @@ public final class GlobalFlagContainer extends FlagContainer { | |||||||
|         this.addFlag(SoilDryFlag.SOIL_DRY_FALSE); |         this.addFlag(SoilDryFlag.SOIL_DRY_FALSE); | ||||||
|         this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE); |         this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE); | ||||||
|         this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE); |         this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE); | ||||||
|  |         this.addFlag(TileDropFlag.TILE_DROP_TRUE); | ||||||
|         this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE); |         this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE); | ||||||
|         this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE); |         this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE); | ||||||
|         this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE); |         this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE); | ||||||
|   | |||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | /* | ||||||
|  |  * 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.plot.flag.implementations; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
|  | import com.plotsquared.core.plot.flag.types.BooleanFlag; | ||||||
|  | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
|  | public class FishingFlag extends BooleanFlag<FishingFlag> { | ||||||
|  |  | ||||||
|  |     public static final FishingFlag FISHING_TRUE = new FishingFlag(true); | ||||||
|  |     public static final FishingFlag FISHING_FALSE = new FishingFlag(false); | ||||||
|  |  | ||||||
|  |     private FishingFlag(boolean value) { | ||||||
|  |         super(value, TranslatableCaption.of("flags.flag_description_fishing")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected FishingFlag flagOf(@NonNull final Boolean value) { | ||||||
|  |         return value ? FISHING_TRUE : FISHING_FALSE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | /* | ||||||
|  |  * 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.plot.flag.implementations; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
|  | import com.plotsquared.core.plot.flag.types.BooleanFlag; | ||||||
|  | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @since 7.3.7 | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | public class TileDropFlag extends BooleanFlag<TileDropFlag> { | ||||||
|  |  | ||||||
|  |     public static final TileDropFlag TILE_DROP_TRUE = new TileDropFlag(true); | ||||||
|  |     public static final TileDropFlag TILE_DROP_FALSE = new TileDropFlag(false); | ||||||
|  |  | ||||||
|  |     private TileDropFlag(boolean value) { | ||||||
|  |         super(value, TranslatableCaption.of("flags.flag_description_tile_drop")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected TileDropFlag flagOf(@NonNull Boolean value) { | ||||||
|  |         return value ? TILE_DROP_TRUE : TILE_DROP_FALSE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -37,7 +37,7 @@ import java.util.List; | |||||||
|  |  | ||||||
| public class SinglePlotManager extends PlotManager { | public class SinglePlotManager extends PlotManager { | ||||||
|  |  | ||||||
|     private static final int MAX_COORDINATE = 30000000; |     private static final int MAX_COORDINATE = 20000000; | ||||||
|  |  | ||||||
|     public SinglePlotManager(final @NonNull PlotArea plotArea) { |     public SinglePlotManager(final @NonNull PlotArea plotArea) { | ||||||
|         super(plotArea); |         super(plotArea); | ||||||
|   | |||||||
| @@ -551,6 +551,7 @@ public class EventDispatcher { | |||||||
|                             ) |                             ) | ||||||
|                     ); |                     ); | ||||||
|                 } |                 } | ||||||
|  |                 return false; | ||||||
|             } |             } | ||||||
|             default -> { |             default -> { | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -62,6 +62,15 @@ import java.util.zip.ZipOutputStream; | |||||||
|  |  | ||||||
| public abstract class WorldUtil { | public abstract class WorldUtil { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * {@return whether the given location is valid in the world} | ||||||
|  |      * @param location the location to check | ||||||
|  |      * @since 7.3.6 | ||||||
|  |      */ | ||||||
|  |     public static boolean isValidLocation(Location location) { | ||||||
|  |         return Math.abs(location.getX()) < 30000000 && Math.abs(location.getZ()) < 30000000; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Set the biome in a region |      * Set the biome in a region | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -27,13 +27,17 @@ import com.plotsquared.core.PlotSquared; | |||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| import com.plotsquared.core.configuration.caption.LocaleHolder; | import com.plotsquared.core.configuration.caption.LocaleHolder; | ||||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
|  | import com.plotsquared.core.player.MetaDataAccess; | ||||||
|  | import com.plotsquared.core.player.PlayerMetaDataKeys; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| import com.plotsquared.core.plot.flag.GlobalFlagContainer; | import com.plotsquared.core.plot.flag.GlobalFlagContainer; | ||||||
| import com.plotsquared.core.plot.flag.PlotFlag; | import com.plotsquared.core.plot.flag.PlotFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.DoneFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; | import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
| import com.plotsquared.core.util.PlayerManager; | import com.plotsquared.core.util.PlayerManager; | ||||||
|  | import com.plotsquared.core.util.query.PlotQuery; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| import org.checkerframework.checker.nullness.qual.Nullable; | import org.checkerframework.checker.nullness.qual.Nullable; | ||||||
| @@ -95,6 +99,12 @@ public final class PlaceholderRegistry { | |||||||
|             } |             } | ||||||
|             return Integer.toString(player.getAllowedPlots()); |             return Integer.toString(player.getAllowedPlots()); | ||||||
|         }); |         }); | ||||||
|  |         this.createPlaceholder("base_plot_count", player -> Integer.toString(PlotQuery.newQuery() | ||||||
|  |                 .ownedBy(player) | ||||||
|  |                 .whereBasePlot() | ||||||
|  |                 .thatPasses(plot -> !DoneFlag.isDone(plot)) | ||||||
|  |                 .count()) | ||||||
|  |         ); | ||||||
|         this.createPlaceholder("plot_count", player -> Integer.toString(player.getPlotCount())); |         this.createPlaceholder("plot_count", player -> Integer.toString(player.getPlotCount())); | ||||||
|         this.createPlaceholder("currentplot_alias", (player, plot) -> { |         this.createPlaceholder("currentplot_alias", (player, plot) -> { | ||||||
|             if (plot.getAlias().isEmpty()) { |             if (plot.getAlias().isEmpty()) { | ||||||
| @@ -189,6 +199,11 @@ public final class PlaceholderRegistry { | |||||||
|         }); |         }); | ||||||
|         this.createPlaceholder("currentplot_biome", (player, plot) -> plot.getBiomeSynchronous().toString()); |         this.createPlaceholder("currentplot_biome", (player, plot) -> plot.getBiomeSynchronous().toString()); | ||||||
|         this.createPlaceholder("currentplot_size", (player, plot) -> String.valueOf(plot.getConnectedPlots().size())); |         this.createPlaceholder("currentplot_size", (player, plot) -> String.valueOf(plot.getConnectedPlots().size())); | ||||||
|  |         this.createPlaceholder("total_grants", player -> { | ||||||
|  |             try (final MetaDataAccess<Integer> metaDataAccess = player.accessPersistentMetaData(PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) { | ||||||
|  |                 return Integer.toString(metaDataAccess.get().orElse(0)); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -559,6 +559,7 @@ | |||||||
|   "flags.flag_description_drop_protection": "<gray>Set to `true` to prevent dropped items from being picked up by non-members of the plot.</gray>", |   "flags.flag_description_drop_protection": "<gray>Set to `true` to prevent dropped items from being picked up by non-members of the plot.</gray>", | ||||||
|   "flags.flag_description_edit_sign": "<gray>Set to `true` to allow editing signs in the plot.</gray>", |   "flags.flag_description_edit_sign": "<gray>Set to `true` to allow editing signs in the plot.</gray>", | ||||||
|   "flags.flag_description_feed": "<gray>Specify an interval in seconds and an optional amount by which the players will be fed (amount is 1 by default).</gray>", |   "flags.flag_description_feed": "<gray>Specify an interval in seconds and an optional amount by which the players will be fed (amount is 1 by default).</gray>", | ||||||
|  |   "flags.flag_description_fishing": "<gray>Set to `true` to allow guests to use a fishing rod in the plot.</gray>", | ||||||
|   "flags.flag_description_forcefield": "<gray>Set to `true` to enable member forcefield in the plot.</gray>", |   "flags.flag_description_forcefield": "<gray>Set to `true` to enable member forcefield in the plot.</gray>", | ||||||
|   "flags.flag_description_grass_grow": "<gray>Set to `false` to prevent grass from growing within the plot.</gray>", |   "flags.flag_description_grass_grow": "<gray>Set to `false` to prevent grass from growing within the plot.</gray>", | ||||||
|   "flags.flag_description_hanging_break": "<gray>Set to `true` to allow guests to break hanging objects in the plot.</gray>", |   "flags.flag_description_hanging_break": "<gray>Set to `true` to allow guests to break hanging objects in the plot.</gray>", | ||||||
| @@ -605,6 +606,7 @@ | |||||||
|   "flags.flag_description_tamed_attack": "<gray>Set to `true` to allow guests to attack tamed animals in the plot.</gray>", |   "flags.flag_description_tamed_attack": "<gray>Set to `true` to allow guests to attack tamed animals in the plot.</gray>", | ||||||
|   "flags.flag_description_tamed_interact": "<gray>Set to `true` to allow guests to interact with tamed animals in the plot.</gray>", |   "flags.flag_description_tamed_interact": "<gray>Set to `true` to allow guests to interact with tamed animals in the plot.</gray>", | ||||||
|   "flags.flag_description_time": "<gray>Set the time in the plot to a fixed value.</gray>", |   "flags.flag_description_time": "<gray>Set the time in the plot to a fixed value.</gray>", | ||||||
|  |   "flags.flag_description_tile_drop": "<gray>Set to `false` to prevent blocks from dropping items in the plot.</gray>", | ||||||
|   "flags.flag_description_titles": "<gray>Set to `false` to disable plot titles. Can be set to: `none` (to inherit world settings), `true`, or `false`</gray>", |   "flags.flag_description_titles": "<gray>Set to `false` to disable plot titles. Can be set to: `none` (to inherit world settings), `true`, or `false`</gray>", | ||||||
|   "flags.flag_description_title": "<gray>Set the pop-up title's title and subtitle. Format: /plot flag set title \"A title\" \"The subtitle\"</gray>", |   "flags.flag_description_title": "<gray>Set the pop-up title's title and subtitle. Format: /plot flag set title \"A title\" \"The subtitle\"</gray>", | ||||||
|   "flags.flag_description_use": "<gray>Define a list of materials players should be able to interact with in the plot.</gray>", |   "flags.flag_description_use": "<gray>Define a list of materials players should be able to interact with in the plot.</gray>", | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ plugins { | |||||||
| } | } | ||||||
|  |  | ||||||
| group = "com.intellectualsites.plotsquared" | group = "com.intellectualsites.plotsquared" | ||||||
| version = "7.3.4-SNAPSHOT" | version = "7.3.9-SNAPSHOT" | ||||||
|  |  | ||||||
| if (!File("$rootDir/.git").exists()) { | if (!File("$rootDir/.git").exists()) { | ||||||
|     logger.lifecycle(""" |     logger.lifecycle(""" | ||||||
| @@ -94,7 +94,7 @@ subprojects { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     configurations.all { |     configurations.all { | ||||||
|         attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) |         attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     spotless { |     spotless { | ||||||
| @@ -118,7 +118,7 @@ subprojects { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     signing { |     signing { | ||||||
|         if (!version.toString().endsWith("-SNAPSHOT")) { |         if (!project.hasProperty("skip.signing") && !version.toString().endsWith("-SNAPSHOT")) { | ||||||
|             val signingKey: String? by project |             val signingKey: String? by project | ||||||
|             val signingPassword: String? by project |             val signingPassword: String? by project | ||||||
|             useInMemoryPgpKeys(signingKey, signingPassword) |             useInMemoryPgpKeys(signingKey, signingPassword) | ||||||
| @@ -209,6 +209,11 @@ subprojects { | |||||||
|         test { |         test { | ||||||
|             useJUnitPlatform() |             useJUnitPlatform() | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         withType<AbstractArchiveTask>().configureEach { | ||||||
|  |             isPreserveFileTimestamps = false | ||||||
|  |             isReproducibleFileOrder = true | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -225,7 +230,7 @@ tasks.getByName<Jar>("jar") { | |||||||
|     enabled = false |     enabled = false | ||||||
| } | } | ||||||
|  |  | ||||||
| val supportedVersions = listOf("1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.1", "1.20.4") | val supportedVersions = listOf("1.18.2", "1.19.4", "1.20.1", "1.20.4") | ||||||
| tasks { | tasks { | ||||||
|     register("cacheLatestFaweArtifact") { |     register("cacheLatestFaweArtifact") { | ||||||
|         val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL() |         val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL() | ||||||
|   | |||||||
| @@ -2,19 +2,19 @@ | |||||||
| # Platform expectations | # Platform expectations | ||||||
| paper = "1.20.2-R0.1-SNAPSHOT" | paper = "1.20.2-R0.1-SNAPSHOT" | ||||||
| guice = "7.0.0" | guice = "7.0.0" | ||||||
| spotbugs = "4.8.3" | spotbugs = "4.8.5" | ||||||
| checkerqual = "3.42.0" | checkerqual = "3.43.0" | ||||||
| gson = "2.10" | gson = "2.10" | ||||||
| guava = "31.1-jre" | guava = "31.1-jre" | ||||||
| snakeyaml = "2.0" | snakeyaml = "2.0" | ||||||
| adventure = "4.15.0" | adventure = "4.17.0" | ||||||
| adventure-bukkit = "4.3.2" | adventure-bukkit = "4.3.3" | ||||||
| log4j = "2.19.0" | log4j = "2.19.0" | ||||||
|  |  | ||||||
| # Plugins | # Plugins | ||||||
| worldedit = "7.2.18" | worldedit = "7.2.20" | ||||||
| fawe = "2.8.4" | fawe = "2.10.0" | ||||||
| placeholderapi = "2.11.5" | placeholderapi = "2.11.6" | ||||||
| luckperms = "5.4" | luckperms = "5.4" | ||||||
| essentialsx = "2.20.1" | essentialsx = "2.20.1" | ||||||
| mvdwapi = "3.1.1" | mvdwapi = "3.1.1" | ||||||
| @@ -23,21 +23,21 @@ mvdwapi = "3.1.1" | |||||||
| prtree = "2.0.1" | prtree = "2.0.1" | ||||||
| aopalliance = "1.0" | aopalliance = "1.0" | ||||||
| cloud-services = "1.8.4" | cloud-services = "1.8.4" | ||||||
| arkitektonika = "2.1.2" | arkitektonika = "2.1.3" | ||||||
| squirrelid = "0.3.2" | squirrelid = "0.3.2" | ||||||
| paster = "1.1.5" | paster = "1.1.6" | ||||||
| bstats = "3.0.2" | bstats = "3.0.2" | ||||||
| paperlib = "1.0.8" | paperlib = "1.0.8" | ||||||
| informative-annotations = "1.4" | informative-annotations = "1.5" | ||||||
| vault = "1.7.1" | vault = "1.7.1" | ||||||
| serverlib = "2.3.4" | serverlib = "2.3.6" | ||||||
|  |  | ||||||
| # Gradle plugins | # Gradle plugins | ||||||
| shadow = "8.1.1" | shadow = "8.1.1" | ||||||
| grgit = "4.1.1" | grgit = "4.1.1" | ||||||
| spotless = "6.25.0" | spotless = "6.25.0" | ||||||
| nexus = "1.3.0" | nexus = "2.0.0" | ||||||
| runPaper = "2.2.3" | runPaper = "2.3.0" | ||||||
|  |  | ||||||
| [libraries] | [libraries] | ||||||
| # Platform expectations | # Platform expectations | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||||
| distributionPath=wrapper/dists | distributionPath=wrapper/dists | ||||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip | distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip | ||||||
| networkTimeout=10000 | networkTimeout=10000 | ||||||
| validateDistributionUrl=true | validateDistributionUrl=true | ||||||
| zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -55,7 +55,7 @@ | |||||||
| #       Darwin, MinGW, and NonStop. | #       Darwin, MinGW, and NonStop. | ||||||
| # | # | ||||||
| #   (3) This script is generated from the Groovy template | #   (3) This script is generated from the Groovy template | ||||||
| #       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | #       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||||
| #       within the Gradle project. | #       within the Gradle project. | ||||||
| # | # | ||||||
| #       You can find Gradle at https://github.com/gradle/gradle/. | #       You can find Gradle at https://github.com/gradle/gradle/. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user