mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-25 23:53:44 +02:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			refactor/v
			...
			renovate/s
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ![renovate[bot]](/assets/img/avatar_default.png)  | 8471fb470b | 
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							| @@ -27,7 +27,7 @@ body: | |||||||
|       description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. |       description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. | ||||||
|       multiple: false |       multiple: false | ||||||
|       options: |       options: | ||||||
|         - '1.20.2' |         - '1.20.1' | ||||||
|         - '1.20' |         - '1.20' | ||||||
|         - '1.19.4' |         - '1.19.4' | ||||||
|         - '1.19.3' |         - '1.19.3' | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							| @@ -14,6 +14,6 @@ | |||||||
|     "com.google.code.gson:gson", |     "com.google.code.gson:gson", | ||||||
|     "com.google.guava:guava", |     "com.google.guava:guava", | ||||||
|     "org.yaml:snakeyaml", |     "org.yaml:snakeyaml", | ||||||
|     "org.apache.logging.log4j:log4j-api" |     "org.apache.logging.log4j:log4j-api", | ||||||
|   ] |   ] | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,11 +9,11 @@ jobs: | |||||||
|         os: [ ubuntu-latest, windows-latest, macos-latest ] |         os: [ ubuntu-latest, windows-latest, macos-latest ] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout Repository |       - name: Checkout Repository | ||||||
|         uses: actions/checkout@v4 |         uses: actions/checkout@v3 | ||||||
|       - name: Validate Gradle Wrapper |       - name: Validate Gradle Wrapper | ||||||
|         uses: gradle/wrapper-validation-action@v1 |         uses: gradle/wrapper-validation-action@v1 | ||||||
|       - name: Setup Java |       - name: Setup Java | ||||||
|         uses: actions/setup-java@v4 |         uses: actions/setup-java@v3 | ||||||
|         with: |         with: | ||||||
|           distribution: temurin |           distribution: temurin | ||||||
|           java-version: 17 |           java-version: 17 | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,11 +9,11 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout Repository |       - name: Checkout Repository | ||||||
|         uses: actions/checkout@v4 |         uses: actions/checkout@v3 | ||||||
|       - name: Validate Gradle Wrapper |       - name: Validate Gradle Wrapper | ||||||
|         uses: gradle/wrapper-validation-action@v1 |         uses: gradle/wrapper-validation-action@v1 | ||||||
|       - name: Setup Java |       - name: Setup Java | ||||||
|         uses: actions/setup-java@v4 |         uses: actions/setup-java@v3 | ||||||
|         with: |         with: | ||||||
|           distribution: temurin |           distribution: temurin | ||||||
|           java-version: 17 |           java-version: 17 | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							| @@ -20,9 +20,9 @@ jobs: | |||||||
|         language: [ 'java' ] |         language: [ 'java' ] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout repository |       - name: Checkout repository | ||||||
|         uses: actions/checkout@v4 |         uses: actions/checkout@v3 | ||||||
|       - name: Setup Java |       - name: Setup Java | ||||||
|         uses: actions/setup-java@v4 |         uses: actions/setup-java@v3 | ||||||
|         with: |         with: | ||||||
|           distribution: temurin |           distribution: temurin | ||||||
|           java-version: 17 |           java-version: 17 | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								.github/workflows/label-merge-conflicts.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								.github/workflows/label-merge-conflicts.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,23 +0,0 @@ | |||||||
| name: "Label conflicting PRs" |  | ||||||
| on: |  | ||||||
|   push: |  | ||||||
|   pull_request_target: |  | ||||||
|     types: [ synchronize ] |  | ||||||
|   pull_request: |  | ||||||
|     types: [ synchronize ] |  | ||||||
|  |  | ||||||
| permissions: |  | ||||||
|   pull-requests: write |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   main: |  | ||||||
|     if: github.event.pull_request.user.login != 'dependabot[bot]' |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     steps: |  | ||||||
|       - name: Label conflicting PRs |  | ||||||
|         uses: eps1lon/actions-label-merge-conflict@v2.1.0 |  | ||||||
|         with: |  | ||||||
|           dirtyLabel: "unresolved-merge-conflict" |  | ||||||
|           repoToken: "${{ secrets.GITHUB_TOKEN }}" |  | ||||||
|           commentOnDirty: "Please take a moment and address the merge conflicts of your pull request. Thanks!" |  | ||||||
|           continueOnMissingPermissions: true |  | ||||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -138,5 +138,6 @@ build/ | |||||||
|  |  | ||||||
| .DS_Store | .DS_Store | ||||||
| # Ignore run folders | # Ignore run folders | ||||||
| run-[0-9].[0-9][0-9]/ | run-[0-0].[0-9]/ | ||||||
| run-[0-9].[0-9][0-9].[0-9]/ | run-[0-0].[0-9].[0-9]/ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ tasks { | |||||||
|     withType<Javadoc> { |     withType<Javadoc> { | ||||||
|         val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString() |         val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString() | ||||||
|         val opt = options as StandardJavadocDocletOptions |         val opt = options as StandardJavadocDocletOptions | ||||||
|         opt.links("https://jd.papermc.io/paper/1.20/") |         opt.links("https://jd.papermc.io/paper/1.19/") | ||||||
|         opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) |         opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) | ||||||
|         opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/") |         opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/") | ||||||
|         opt.links("https://jd.advntr.dev/api/4.14.0/") |         opt.links("https://jd.advntr.dev/api/4.14.0/") | ||||||
|   | |||||||
| @@ -37,7 +37,6 @@ import com.plotsquared.bukkit.listener.EntityEventListener; | |||||||
| import com.plotsquared.bukkit.listener.EntitySpawnListener; | import com.plotsquared.bukkit.listener.EntitySpawnListener; | ||||||
| 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.ProjectileEventListener; | import com.plotsquared.bukkit.listener.ProjectileEventListener; | ||||||
| import com.plotsquared.bukkit.listener.ServerListener; | import com.plotsquared.bukkit.listener.ServerListener; | ||||||
| import com.plotsquared.bukkit.listener.SingleWorldListener; | import com.plotsquared.bukkit.listener.SingleWorldListener; | ||||||
| @@ -136,7 +135,6 @@ import org.bukkit.generator.ChunkGenerator; | |||||||
| import org.bukkit.metadata.FixedMetadataValue; | import org.bukkit.metadata.FixedMetadataValue; | ||||||
| import org.bukkit.metadata.MetadataValue; | import org.bukkit.metadata.MetadataValue; | ||||||
| import org.bukkit.plugin.Plugin; | import org.bukkit.plugin.Plugin; | ||||||
| import org.bukkit.plugin.RegisteredServiceProvider; |  | ||||||
| import org.bukkit.plugin.java.JavaPlugin; | import org.bukkit.plugin.java.JavaPlugin; | ||||||
| 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; | ||||||
| @@ -254,7 +252,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     public void onEnable() { |     public void onEnable() { | ||||||
|         this.pluginName = getDescription().getName(); |         this.pluginName = getDescription().getName(); | ||||||
|  |  | ||||||
| @@ -360,9 +357,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|  |  | ||||||
|         if (Settings.Enabled_Components.EVENTS) { |         if (Settings.Enabled_Components.EVENTS) { | ||||||
|             getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this); |             getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this); | ||||||
|             if ((serverVersion()[1] == 20 && serverVersion()[2] >= 1) || serverVersion()[1] > 20) { |  | ||||||
|                 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 (serverVersion()[1] >= 17) { |             if (serverVersion()[1] >= 17) { | ||||||
|                 getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this); |                 getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this); | ||||||
| @@ -556,7 +550,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|         this.startMetrics(); |         this.startMetrics(); | ||||||
|  |  | ||||||
|         if (Settings.Enabled_Components.WORLDS) { |         if (Settings.Enabled_Components.WORLDS) { | ||||||
|             TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L)); |             TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L)); | ||||||
|             try { |             try { | ||||||
|                 singleWorldListener = injector().getInstance(SingleWorldListener.class); |                 singleWorldListener = injector().getInstance(SingleWorldListener.class); | ||||||
|                 Bukkit.getPluginManager().registerEvents(singleWorldListener, this); |                 Bukkit.getPluginManager().registerEvents(singleWorldListener, this); | ||||||
| @@ -818,7 +812,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|                         case "MINECART_MOB_SPAWNER": |                         case "MINECART_MOB_SPAWNER": | ||||||
|                         case "ENDER_CRYSTAL": |                         case "ENDER_CRYSTAL": | ||||||
|                         case "MINECART_TNT": |                         case "MINECART_TNT": | ||||||
|                         case "CHEST_BOAT": |  | ||||||
|                         case "BOAT": |                         case "BOAT": | ||||||
|                             if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) { |                             if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) { | ||||||
|                                 com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation()); |                                 com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation()); | ||||||
| @@ -1167,7 +1160,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|         return new BukkitPlotGenerator(world, generator, this.plotAreaManager); |         return new BukkitPlotGenerator(world, generator, this.plotAreaManager); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull String pluginsFormatted() { |     public @NonNull String pluginsFormatted() { | ||||||
|         StringBuilder msg = new StringBuilder(); |         StringBuilder msg = new StringBuilder(); | ||||||
| @@ -1184,23 +1176,12 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|                     .append("  • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n") |                     .append("  • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n") | ||||||
|                     .append("  • Dependencies: ").append(p.getDescription().getDepend()).append("\n") |                     .append("  • Dependencies: ").append(p.getDescription().getDepend()).append("\n") | ||||||
|                     .append("  • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).append("\n"); |                     .append("  • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).append("\n"); | ||||||
|             List<RegisteredServiceProvider<?>> providers = Bukkit.getServicesManager().getRegistrations(p); |  | ||||||
|             if (!providers.isEmpty()) { |  | ||||||
|                 msg.append("  • Provided Services: \n"); |  | ||||||
|                 for (RegisteredServiceProvider<?> provider : providers) { |  | ||||||
|                     msg.append("    • ") |  | ||||||
|                             .append(provider.getService().getName()).append(" = ") |  | ||||||
|                             .append(provider.getProvider().getClass().getName()) |  | ||||||
|                             .append(" (priority: ").append(provider.getPriority()).append(")") |  | ||||||
|                             .append("\n"); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         return msg.toString(); |         return msg.toString(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     @SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation |     @SuppressWarnings("ConstantConditions") | ||||||
|     public @NonNull String worldEditImplementations() { |     public @NonNull String worldEditImplementations() { | ||||||
|         StringBuilder msg = new StringBuilder(); |         StringBuilder msg = new StringBuilder(); | ||||||
|         if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) { |         if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) { | ||||||
|   | |||||||
| @@ -33,7 +33,6 @@ import org.bukkit.entity.Ageable; | |||||||
| import org.bukkit.entity.ArmorStand; | import org.bukkit.entity.ArmorStand; | ||||||
| import org.bukkit.entity.Bat; | import org.bukkit.entity.Bat; | ||||||
| import org.bukkit.entity.Boat; | import org.bukkit.entity.Boat; | ||||||
| import org.bukkit.entity.Breedable; |  | ||||||
| import org.bukkit.entity.ChestedHorse; | import org.bukkit.entity.ChestedHorse; | ||||||
| import org.bukkit.entity.EnderDragon; | import org.bukkit.entity.EnderDragon; | ||||||
| import org.bukkit.entity.Entity; | import org.bukkit.entity.Entity; | ||||||
| @@ -75,7 +74,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|     private HorseStats horse; |     private HorseStats horse; | ||||||
|     private boolean noGravity; |     private boolean noGravity; | ||||||
|  |  | ||||||
|     @SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards |  | ||||||
|     public ReplicatingEntityWrapper(Entity entity, short depth) { |     public ReplicatingEntityWrapper(Entity entity, short depth) { | ||||||
|         super(entity); |         super(entity); | ||||||
|  |  | ||||||
| @@ -166,7 +164,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|                 //this.horse.style = horse.getStyle(); |                 //this.horse.style = horse.getStyle(); | ||||||
|                 //this.horse.color = horse.getColor(); |                 //this.horse.color = horse.getColor(); | ||||||
|                 storeTameable(horse); |                 storeTameable(horse); | ||||||
|                 storeBreedable(horse); |                 storeAgeable(horse); | ||||||
|                 storeLiving(horse); |                 storeLiving(horse); | ||||||
|                 storeInventory(horse); |                 storeInventory(horse); | ||||||
|                 return; |                 return; | ||||||
| @@ -174,7 +172,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|             // END INVENTORY HOLDER // |             // END INVENTORY HOLDER // | ||||||
|             case "WOLF", "OCELOT" -> { |             case "WOLF", "OCELOT" -> { | ||||||
|                 storeTameable((Tameable) entity); |                 storeTameable((Tameable) entity); | ||||||
|                 storeBreedable((Breedable) entity); |                 storeAgeable((Ageable) entity); | ||||||
|                 storeLiving((LivingEntity) entity); |                 storeLiving((LivingEntity) entity); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| @@ -188,18 +186,18 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|                     this.dataByte = (byte) 0; |                     this.dataByte = (byte) 0; | ||||||
|                 } |                 } | ||||||
|                 this.dataByte2 = sheep.getColor().getDyeData(); |                 this.dataByte2 = sheep.getColor().getDyeData(); | ||||||
|                 storeBreedable(sheep); |                 storeAgeable(sheep); | ||||||
|                 storeLiving(sheep); |                 storeLiving(sheep); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> { |             case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> { | ||||||
|                 storeBreedable((Breedable) entity); |                 storeAgeable((Ageable) entity); | ||||||
|                 storeLiving((LivingEntity) entity); |                 storeLiving((LivingEntity) entity); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             case "RABBIT" -> { |             case "RABBIT" -> { | ||||||
|                 this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType()); |                 this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType()); | ||||||
|                 storeBreedable((Breedable) entity); |                 storeAgeable((Ageable) entity); | ||||||
|                 storeLiving((LivingEntity) entity); |                 storeLiving((LivingEntity) entity); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| @@ -383,11 +381,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @deprecated Use {@link #restoreBreedable(Breedable)} instead |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     @Deprecated(forRemoval = true, since = "7.1.0") |  | ||||||
|     private void restoreAgeable(Ageable entity) { |     private void restoreAgeable(Ageable entity) { | ||||||
|         if (!this.aged.adult) { |         if (!this.aged.adult) { | ||||||
|             entity.setBaby(); |             entity.setBaby(); | ||||||
| @@ -398,11 +391,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @deprecated Use {@link #storeBreedable(Breedable)} instead |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     @Deprecated(forRemoval = true, since = "7.1.0") |  | ||||||
|     public void storeAgeable(Ageable aged) { |     public void storeAgeable(Ageable aged) { | ||||||
|         this.aged = new AgeableStats(); |         this.aged = new AgeableStats(); | ||||||
|         this.aged.age = aged.getAge(); |         this.aged.age = aged.getAge(); | ||||||
| @@ -410,29 +398,6 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|         this.aged.adult = aged.isAdult(); |         this.aged.adult = aged.isAdult(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     private void restoreBreedable(Breedable entity) { |  | ||||||
|         if (!this.aged.adult) { |  | ||||||
|             entity.setBaby(); |  | ||||||
|         } |  | ||||||
|         entity.setAgeLock(this.aged.locked); |  | ||||||
|         if (this.aged.age > 0) { |  | ||||||
|             entity.setAge(this.aged.age); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     private void storeBreedable(Breedable breedable) { |  | ||||||
|         this.aged = new AgeableStats(); |  | ||||||
|         this.aged.age = breedable.getAge(); |  | ||||||
|         this.aged.locked = breedable.getAgeLock(); |  | ||||||
|         this.aged.adult = breedable.isAdult(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void storeTameable(Tameable tamed) { |     public void storeTameable(Tameable tamed) { | ||||||
|         this.tamed = new TameableStats(); |         this.tamed = new TameableStats(); | ||||||
|         this.tamed.owner = tamed.getOwner(); |         this.tamed.owner = tamed.getOwner(); | ||||||
| @@ -536,7 +501,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|                 //horse.setStyle(this.horse.style); |                 //horse.setStyle(this.horse.style); | ||||||
|                 //horse.setColor(this.horse.color); |                 //horse.setColor(this.horse.color); | ||||||
|                 restoreTameable(horse); |                 restoreTameable(horse); | ||||||
|                 restoreBreedable(horse); |                 restoreAgeable(horse); | ||||||
|                 restoreLiving(horse); |                 restoreLiving(horse); | ||||||
|                 restoreInventory(horse); |                 restoreInventory(horse); | ||||||
|                 return entity; |                 return entity; | ||||||
| @@ -544,7 +509,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|             // END INVENTORY HOLDER // |             // END INVENTORY HOLDER // | ||||||
|             case "WOLF", "OCELOT" -> { |             case "WOLF", "OCELOT" -> { | ||||||
|                 restoreTameable((Tameable) entity); |                 restoreTameable((Tameable) entity); | ||||||
|                 restoreBreedable((Breedable) entity); |                 restoreAgeable((Ageable) entity); | ||||||
|                 restoreLiving((LivingEntity) entity); |                 restoreLiving((LivingEntity) entity); | ||||||
|                 return entity; |                 return entity; | ||||||
|             } |             } | ||||||
| @@ -557,12 +522,12 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|                 if (this.dataByte2 != 0) { |                 if (this.dataByte2 != 0) { | ||||||
|                     sheep.setColor(DyeColor.getByDyeData(this.dataByte2)); |                     sheep.setColor(DyeColor.getByDyeData(this.dataByte2)); | ||||||
|                 } |                 } | ||||||
|                 restoreBreedable(sheep); |                 restoreAgeable(sheep); | ||||||
|                 restoreLiving(sheep); |                 restoreLiving(sheep); | ||||||
|                 return sheep; |                 return sheep; | ||||||
|             } |             } | ||||||
|             case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> { |             case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> { | ||||||
|                 restoreBreedable((Breedable) entity); |                 restoreAgeable((Ageable) entity); | ||||||
|                 restoreLiving((LivingEntity) entity); |                 restoreLiving((LivingEntity) entity); | ||||||
|                 return entity; |                 return entity; | ||||||
|             } |             } | ||||||
| @@ -571,7 +536,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | |||||||
|                 if (this.dataByte != 0) { |                 if (this.dataByte != 0) { | ||||||
|                     ((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]); |                     ((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]); | ||||||
|                 } |                 } | ||||||
|                 restoreBreedable((Breedable) entity); |                 restoreAgeable((Ageable) entity); | ||||||
|                 restoreLiving((LivingEntity) entity); |                 restoreLiving((LivingEntity) entity); | ||||||
|                 return entity; |                 return entity; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -23,13 +23,13 @@ import com.google.inject.Provides; | |||||||
| import com.google.inject.Singleton; | import com.google.inject.Singleton; | ||||||
| import com.google.inject.assistedinject.FactoryModuleBuilder; | import com.google.inject.assistedinject.FactoryModuleBuilder; | ||||||
| import com.plotsquared.bukkit.BukkitPlatform; | import com.plotsquared.bukkit.BukkitPlatform; | ||||||
| import com.plotsquared.bukkit.listener.ServerListener; |  | ||||||
| import com.plotsquared.bukkit.listener.SingleWorldListener; | import com.plotsquared.bukkit.listener.SingleWorldListener; | ||||||
| import com.plotsquared.bukkit.player.BukkitPlayerManager; | import com.plotsquared.bukkit.player.BukkitPlayerManager; | ||||||
| import com.plotsquared.bukkit.queue.BukkitChunkCoordinator; | import com.plotsquared.bukkit.queue.BukkitChunkCoordinator; | ||||||
| import com.plotsquared.bukkit.queue.BukkitQueueCoordinator; | import com.plotsquared.bukkit.queue.BukkitQueueCoordinator; | ||||||
| import com.plotsquared.bukkit.schematic.BukkitSchematicHandler; | import com.plotsquared.bukkit.schematic.BukkitSchematicHandler; | ||||||
| import com.plotsquared.bukkit.util.BukkitChunkManager; | import com.plotsquared.bukkit.util.BukkitChunkManager; | ||||||
|  | import com.plotsquared.bukkit.util.BukkitEconHandler; | ||||||
| import com.plotsquared.bukkit.util.BukkitInventoryUtil; | import com.plotsquared.bukkit.util.BukkitInventoryUtil; | ||||||
| import com.plotsquared.bukkit.util.BukkitRegionManager; | import com.plotsquared.bukkit.util.BukkitRegionManager; | ||||||
| import com.plotsquared.bukkit.util.BukkitSetupUtils; | import com.plotsquared.bukkit.util.BukkitSetupUtils; | ||||||
| @@ -47,9 +47,6 @@ import com.plotsquared.core.inject.factory.ChunkCoordinatorBuilderFactory; | |||||||
| import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory; | import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory; | ||||||
| import com.plotsquared.core.inject.factory.HybridPlotWorldFactory; | import com.plotsquared.core.inject.factory.HybridPlotWorldFactory; | ||||||
| import com.plotsquared.core.inject.factory.ProgressSubscriberFactory; | import com.plotsquared.core.inject.factory.ProgressSubscriberFactory; | ||||||
| import com.plotsquared.core.player.OfflinePlotPlayer; |  | ||||||
| import com.plotsquared.core.player.PlotPlayer; |  | ||||||
| import com.plotsquared.core.plot.PlotArea; |  | ||||||
| import com.plotsquared.core.plot.world.DefaultPlotAreaManager; | import com.plotsquared.core.plot.world.DefaultPlotAreaManager; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.plot.world.SinglePlotAreaManager; | import com.plotsquared.core.plot.world.SinglePlotAreaManager; | ||||||
| @@ -75,8 +72,6 @@ import org.bukkit.command.ConsoleCommandSender; | |||||||
| import org.bukkit.plugin.java.JavaPlugin; | import org.bukkit.plugin.java.JavaPlugin; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| import java.util.Objects; |  | ||||||
|  |  | ||||||
| public class BukkitModule extends AbstractModule { | public class BukkitModule extends AbstractModule { | ||||||
|  |  | ||||||
|     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName()); |     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName()); | ||||||
| @@ -133,64 +128,21 @@ public class BukkitModule extends AbstractModule { | |||||||
|     @Provides |     @Provides | ||||||
|     @Singleton |     @Singleton | ||||||
|     @NonNull EconHandler provideEconHandler() { |     @NonNull EconHandler provideEconHandler() { | ||||||
|         if (!Settings.Enabled_Components.ECONOMY || !Bukkit.getPluginManager().isPluginEnabled("Vault")) { |         if (!Settings.Enabled_Components.ECONOMY) { | ||||||
|             return EconHandler.nullEconHandler(); |             return EconHandler.nullEconHandler(); | ||||||
|         } |         } | ||||||
|         // Guice eagerly initializes singletons, so we need to bring the laziness ourselves |         if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { | ||||||
|         return new LazyEconHandler(); |             try { | ||||||
|  |                 BukkitEconHandler econHandler = new BukkitEconHandler(); | ||||||
|  |                 if (!econHandler.init()) { | ||||||
|  |                     LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back..."); | ||||||
|  |                     return EconHandler.nullEconHandler(); | ||||||
|                 } |                 } | ||||||
|  |                 return econHandler; | ||||||
|     private static final class LazyEconHandler extends EconHandler implements ServerListener.MutableEconHandler { |             } catch (final Exception ignored) { | ||||||
|         private volatile EconHandler implementation; |  | ||||||
|  |  | ||||||
|         public void setImplementation(EconHandler econHandler) { |  | ||||||
|             this.implementation = econHandler; |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public boolean init() { |  | ||||||
|             return get().init(); |  | ||||||
|         } |         } | ||||||
|  |         return EconHandler.nullEconHandler(); | ||||||
|         @Override |  | ||||||
|         public double getBalance(final PlotPlayer<?> player) { |  | ||||||
|             return get().getBalance(player); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public void withdrawMoney(final PlotPlayer<?> player, final double amount) { |  | ||||||
|             get().withdrawMoney(player, amount); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public void depositMoney(final PlotPlayer<?> player, final double amount) { |  | ||||||
|             get().depositMoney(player, amount); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public void depositMoney(final OfflinePlotPlayer player, final double amount) { |  | ||||||
|             get().depositMoney(player, amount); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public boolean isEnabled(final PlotArea plotArea) { |  | ||||||
|             return get().isEnabled(plotArea); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public @NonNull String format(final double balance) { |  | ||||||
|             return get().format(balance); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         @Override |  | ||||||
|         public boolean isSupported() { |  | ||||||
|             return get().isSupported(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         private EconHandler get() { |  | ||||||
|             return Objects.requireNonNull(this.implementation, "EconHandler not ready yet."); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,7 +33,6 @@ import com.plotsquared.core.plot.PlotArea; | |||||||
| import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag; | import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag; | import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.BreakFlag; | import com.plotsquared.core.plot.flag.implementations.BreakFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.CoralDryFlag; | import com.plotsquared.core.plot.flag.implementations.CoralDryFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.CropGrowFlag; | import com.plotsquared.core.plot.flag.implementations.CropGrowFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag; | import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag; | ||||||
| @@ -587,12 +586,6 @@ public class BlockEventListener implements Listener { | |||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (event.getNewState().getType().toString().endsWith("CONCRETE")) { |  | ||||||
|             if (!plot.getFlag(ConcreteHardenFlag.class)) { |  | ||||||
|                 plot.debug("Concrete powder could not harden because concrete-harden = false"); |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|   | |||||||
| @@ -143,10 +143,6 @@ public class EntityEventListener implements Listener { | |||||||
|         if (area == null) { |         if (area == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         // Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options |  | ||||||
|         if (entity.getType() == EntityType.ARMOR_STAND) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason(); |         CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason(); | ||||||
|         switch (reason.toString()) { |         switch (reason.toString()) { | ||||||
|             case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> { |             case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> { | ||||||
| @@ -157,7 +153,7 @@ 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" -> { |                     "DUPLICATION", "FROZEN", "SPELL" -> { | ||||||
|                 if (!area.isMobSpawning()) { |                 if (!area.isMobSpawning()) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
| @@ -170,7 +166,7 @@ public class EntityEventListener implements Listener { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> { |             case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> { | ||||||
|                 if (!area.isSpawnCustom()) { |                 if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) { | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -124,7 +124,7 @@ public class PaperListener implements Listener { | |||||||
|         } |         } | ||||||
|         Slime slime = event.getEntity(); |         Slime slime = event.getEntity(); | ||||||
|  |  | ||||||
|         Block b = slime.getTargetBlockExact(4); |         Block b = slime.getTargetBlock(4); | ||||||
|         if (b == null) { |         if (b == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -166,16 +166,12 @@ public class PaperListener implements Listener { | |||||||
|         } |         } | ||||||
|         Location location = BukkitUtil.adapt(event.getSpawnLocation()); |         Location location = BukkitUtil.adapt(event.getSpawnLocation()); | ||||||
|         PlotArea area = location.getPlotArea(); |         PlotArea area = location.getPlotArea(); | ||||||
|         if (area == null) { |         if (!location.isPlotArea()) { | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         // Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options |  | ||||||
|         if (event.getType() == EntityType.ARMOR_STAND) { |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         //If entities are spawning... the chunk should be loaded? |         //If entities are spawning... the chunk should be loaded? | ||||||
|         Entity[] entities = event.getSpawnLocation().getChunk().getEntities(); |         Entity[] entities = event.getSpawnLocation().getChunk().getEntities(); | ||||||
|         if (entities.length >= Settings.Chunk_Processor.MAX_ENTITIES) { |         if (entities.length > Settings.Chunk_Processor.MAX_ENTITIES) { | ||||||
|             event.setShouldAbortSpawn(true); |             event.setShouldAbortSpawn(true); | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             return; |             return; | ||||||
| @@ -204,7 +200,7 @@ public class PaperListener implements Listener { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> { |             case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> { | ||||||
|                 if (!area.isSpawnCustom()) { |                 if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) { | ||||||
|                     event.setShouldAbortSpawn(true); |                     event.setShouldAbortSpawn(true); | ||||||
|                     event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                     return; |                     return; | ||||||
|   | |||||||
| @@ -369,7 +369,6 @@ public class PlayerEventListener implements Listener { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     public void onConnect(PlayerJoinEvent event) { |     public void onConnect(PlayerJoinEvent event) { | ||||||
|         final Player player = event.getPlayer(); |         final Player player = event.getPlayer(); | ||||||
|         PlotSquared.platform().playerManager().removePlayer(player.getUniqueId()); |         PlotSquared.platform().playerManager().removePlayer(player.getUniqueId()); | ||||||
| @@ -608,7 +607,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                 this.tmpTeleport = true; |                 this.tmpTeleport = true; | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             int border = area.getBorder(true); |             int border = area.getBorder(); | ||||||
|             int x1; |             int x1; | ||||||
|             if (x2 > border && this.tmpTeleport) { |             if (x2 > border && this.tmpTeleport) { | ||||||
|                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { |                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { | ||||||
| @@ -703,7 +702,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                 this.tmpTeleport = true; |                 this.tmpTeleport = true; | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             int border = area.getBorder(true); |             int border = area.getBorder(); | ||||||
|             int z1; |             int z1; | ||||||
|             if (z2 > border && this.tmpTeleport) { |             if (z2 > border && this.tmpTeleport) { | ||||||
|                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { |                 if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { | ||||||
| @@ -734,7 +733,6 @@ public class PlayerEventListener implements Listener { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.LOW) |     @EventHandler(priority = EventPriority.LOW) | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     public void onChat(AsyncPlayerChatEvent event) { |     public void onChat(AsyncPlayerChatEvent event) { | ||||||
|         if (event.isCancelled()) { |         if (event.isCancelled()) { | ||||||
|             return; |             return; | ||||||
| @@ -1065,7 +1063,6 @@ public class PlayerEventListener implements Listener { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.LOW) |     @EventHandler(priority = EventPriority.LOW) | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     public void onCancelledInteract(PlayerInteractEvent event) { |     public void onCancelledInteract(PlayerInteractEvent event) { | ||||||
|         if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) { |         if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) { | ||||||
|             Player player = event.getPlayer(); |             Player player = event.getPlayer(); | ||||||
|   | |||||||
| @@ -1,63 +0,0 @@ | |||||||
| /* |  | ||||||
|  * PlotSquared, a land and world management plugin for Minecraft. |  | ||||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> |  | ||||||
|  * Copyright (C) IntellectualSites team and contributors |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| package com.plotsquared.bukkit.listener; |  | ||||||
|  |  | ||||||
| import com.plotsquared.bukkit.util.BukkitUtil; |  | ||||||
| import com.plotsquared.core.location.Location; |  | ||||||
| import com.plotsquared.core.plot.Plot; |  | ||||||
| import com.plotsquared.core.plot.PlotArea; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.EditSignFlag; |  | ||||||
| import com.plotsquared.core.util.PlotFlagUtil; |  | ||||||
| import org.bukkit.block.Sign; |  | ||||||
| import org.bukkit.event.EventHandler; |  | ||||||
| import org.bukkit.event.Listener; |  | ||||||
| import org.bukkit.event.player.PlayerSignOpenEvent; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * For events since 1.20.1 |  | ||||||
|  * @since TODO |  | ||||||
|  */ |  | ||||||
| public class PlayerEventListener1201 implements Listener { |  | ||||||
|  |  | ||||||
|     @EventHandler(ignoreCancelled = true) |  | ||||||
|     @SuppressWarnings({"removal", "UnstableApiUsage"}) // thanks Paper, thanks Spigot |  | ||||||
|     public void onPlayerSignOpenEvent(PlayerSignOpenEvent event) { |  | ||||||
|         Sign sign = event.getSign(); |  | ||||||
|         Location location = BukkitUtil.adapt(sign.getLocation()); |  | ||||||
|         PlotArea area = location.getPlotArea(); |  | ||||||
|         if (area == null) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         Plot plot = location.getOwnedPlot(); |  | ||||||
|         if (plot == null) { |  | ||||||
|             if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, EditSignFlag.class, false)) { |  | ||||||
|                 event.setCancelled(true); |  | ||||||
|             } |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (plot.isAdded(event.getPlayer().getUniqueId())) { |  | ||||||
|             return; // allow for added players |  | ||||||
|         } |  | ||||||
|         if (!plot.getFlag(EditSignFlag.class)) { |  | ||||||
|             plot.debug(event.getPlayer().getName() + " could not edit the sign because of edit-sign = false"); |  | ||||||
|             event.setCancelled(true); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -21,14 +21,9 @@ package com.plotsquared.bukkit.listener; | |||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import com.plotsquared.bukkit.BukkitPlatform; | import com.plotsquared.bukkit.BukkitPlatform; | ||||||
| import com.plotsquared.bukkit.placeholder.MVdWPlaceholders; | import com.plotsquared.bukkit.placeholder.MVdWPlaceholders; | ||||||
| import com.plotsquared.bukkit.util.BukkitEconHandler; |  | ||||||
| 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.player.ConsolePlayer; | import com.plotsquared.core.player.ConsolePlayer; | ||||||
| import com.plotsquared.core.util.EconHandler; |  | ||||||
| import org.apache.logging.log4j.LogManager; |  | ||||||
| import org.apache.logging.log4j.Logger; |  | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.event.EventHandler; | import org.bukkit.event.EventHandler; | ||||||
| import org.bukkit.event.Listener; | import org.bukkit.event.Listener; | ||||||
| @@ -37,8 +32,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
|  |  | ||||||
| public class ServerListener implements Listener { | public class ServerListener implements Listener { | ||||||
|  |  | ||||||
|     private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ServerListener.class.getSimpleName()); |  | ||||||
|  |  | ||||||
|     private final BukkitPlatform plugin; |     private final BukkitPlatform plugin; | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
| @@ -52,29 +45,6 @@ public class ServerListener implements Listener { | |||||||
|             new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry()); |             new MVdWPlaceholders(this.plugin, this.plugin.placeholderRegistry()); | ||||||
|             ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.hooked")); |             ConsolePlayer.getConsole().sendMessage(TranslatableCaption.of("placeholder.hooked")); | ||||||
|         } |         } | ||||||
|         if (Settings.Enabled_Components.ECONOMY && Bukkit.getPluginManager().isPluginEnabled("Vault")) { |  | ||||||
|             EconHandler econHandler = new BukkitEconHandler(); |  | ||||||
|             try { |  | ||||||
|                 if (!econHandler.init()) { |  | ||||||
|                     LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back..."); |  | ||||||
|                     econHandler = EconHandler.nullEconHandler(); |  | ||||||
|                 } |  | ||||||
|             } catch (final Exception ignored) { |  | ||||||
|                 econHandler = EconHandler.nullEconHandler(); |  | ||||||
|             } |  | ||||||
|             if (PlotSquared.platform().econHandler() instanceof MutableEconHandler meh) { |  | ||||||
|                 meh.setImplementation(econHandler); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Internal use only. Required to implement lazy econ loading using Guice. |  | ||||||
|      * |  | ||||||
|      * @since 7.2.0 |  | ||||||
|      */ |  | ||||||
|     public interface MutableEconHandler { |  | ||||||
|         void setImplementation(EconHandler econHandler); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -158,7 +158,6 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|         } |         } | ||||||
|         final String[] nodes = stub.split("\\."); |         final String[] nodes = stub.split("\\."); | ||||||
|         final StringBuilder n = new StringBuilder(); |         final StringBuilder n = new StringBuilder(); | ||||||
|         // Wildcard check from less specific permission to more specific permission |  | ||||||
|         for (int i = 0; i < (nodes.length - 1); i++) { |         for (int i = 0; i < (nodes.length - 1); i++) { | ||||||
|             n.append(nodes[i]).append("."); |             n.append(nodes[i]).append("."); | ||||||
|             if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) { |             if (!stub.equals(n + Permission.PERMISSION_STAR.toString())) { | ||||||
| @@ -167,11 +166,9 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // Wildcard check for the full permission |  | ||||||
|         if (hasPermission(stub + ".*")) { |         if (hasPermission(stub + ".*")) { | ||||||
|             return Integer.MAX_VALUE; |             return Integer.MAX_VALUE; | ||||||
|         } |         } | ||||||
|         // Permission value cache for iterative check |  | ||||||
|         int max = 0; |         int max = 0; | ||||||
|         if (CHECK_EFFECTIVE) { |         if (CHECK_EFFECTIVE) { | ||||||
|             boolean hasAny = false; |             boolean hasAny = false; | ||||||
|   | |||||||
| @@ -44,7 +44,6 @@ import java.util.stream.IntStream; | |||||||
| @Singleton | @Singleton | ||||||
| public class BukkitInventoryUtil extends InventoryUtil { | public class BukkitInventoryUtil extends InventoryUtil { | ||||||
|  |  | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     private static @Nullable ItemStack getItem(PlotItemStack item) { |     private static @Nullable ItemStack getItem(PlotItemStack item) { | ||||||
|         if (item == null) { |         if (item == null) { | ||||||
|             return null; |             return null; | ||||||
|   | |||||||
| @@ -67,7 +67,6 @@ public class BukkitSetupUtils extends SetupUtils { | |||||||
|         this.worldFile = worldFile; |         this.worldFile = worldFile; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @SuppressWarnings("deprecation") // Paper deprecation |  | ||||||
|     @Override |     @Override | ||||||
|     public void updateGenerators(final boolean force) { |     public void updateGenerators(final boolean force) { | ||||||
|         if (loaded && !SetupUtils.generators.isEmpty() && !force) { |         if (loaded && !SetupUtils.generators.isEmpty() && !force) { | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask; | |||||||
| import javax.net.ssl.HttpsURLConnection; | import javax.net.ssl.HttpsURLConnection; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||||||
| import java.net.URI; | import java.net.URL; | ||||||
|  |  | ||||||
| public class UpdateUtility implements Listener { | public class UpdateUtility implements Listener { | ||||||
|  |  | ||||||
| @@ -59,9 +59,8 @@ public class UpdateUtility implements Listener { | |||||||
|     public void updateChecker() { |     public void updateChecker() { | ||||||
|         task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> { |         task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> { | ||||||
|             try { |             try { | ||||||
|                 HttpsURLConnection connection = (HttpsURLConnection) URI.create( |                 HttpsURLConnection connection = (HttpsURLConnection) new URL( | ||||||
|                         "https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506") |                         "https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506") | ||||||
|                         .toURL() |  | ||||||
|                         .openConnection(); |                         .openConnection(); | ||||||
|                 connection.setRequestMethod("GET"); |                 connection.setRequestMethod("GET"); | ||||||
|                 JsonObject result = new JsonParser() |                 JsonObject result = new JsonParser() | ||||||
|   | |||||||
| @@ -57,8 +57,8 @@ tasks.processResources { | |||||||
|  |  | ||||||
|     doLast { |     doLast { | ||||||
|         copy { |         copy { | ||||||
|             from(layout.buildDirectory.file("$rootDir/LICENSE")) |             from(File("$rootDir/LICENSE")) | ||||||
|             into(layout.buildDirectory.dir("resources/main")) |             into("$buildDir/resources/main/") | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -72,6 +72,7 @@ tasks { | |||||||
|         opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/") |         opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/") | ||||||
|         opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") |         opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") | ||||||
|         opt.links("https://checkerframework.org/api/") |         opt.links("https://checkerframework.org/api/") | ||||||
|  |         opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/") | ||||||
|         opt.isLinkSource = true |         opt.isLinkSource = true | ||||||
|         opt.bottom(File("$rootDir/javadocfooter.html").readText()) |         opt.bottom(File("$rootDir/javadocfooter.html").readText()) | ||||||
|         opt.isUse = true |         opt.isUse = true | ||||||
|   | |||||||
| @@ -84,7 +84,7 @@ import java.io.InputStream; | |||||||
| import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||||||
| import java.io.ObjectInputStream; | import java.io.ObjectInputStream; | ||||||
| import java.io.ObjectOutputStream; | import java.io.ObjectOutputStream; | ||||||
| import java.net.URI; | import java.net.MalformedURLException; | ||||||
| import java.net.URISyntaxException; | import java.net.URISyntaxException; | ||||||
| import java.net.URL; | import java.net.URL; | ||||||
| import java.nio.file.Files; | import java.nio.file.Files; | ||||||
| @@ -210,10 +210,9 @@ public class PlotSquared { | |||||||
|             try { |             try { | ||||||
|                 URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation(); |                 URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation(); | ||||||
|                 this.jarFile = new File( |                 this.jarFile = new File( | ||||||
|                         URI.create( |                         new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file")) | ||||||
|                                 logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file")) |                                 .toURI().getPath()); | ||||||
|                                 .getPath()); |             } catch (MalformedURLException | URISyntaxException | SecurityException e) { | ||||||
|             } catch (URISyntaxException | SecurityException e) { |  | ||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
|                 this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar"); |                 this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar"); | ||||||
|                 if (!this.jarFile.exists()) { |                 if (!this.jarFile.exists()) { | ||||||
|   | |||||||
| @@ -19,7 +19,6 @@ | |||||||
| package com.plotsquared.core.command; | package com.plotsquared.core.command; | ||||||
|  |  | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| 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.database.DBFunc; | ||||||
| @@ -102,13 +101,8 @@ public class Add extends Command { | |||||||
|                                 Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { |                                 Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { | ||||||
|                             player.sendMessage( |                             player.sendMessage( | ||||||
|                                     TranslatableCaption.of("errors.invalid_player"), |                                     TranslatableCaption.of("errors.invalid_player"), | ||||||
|                                     PlotSquared |                                     TagResolver.resolver("value", Tag.inserting( | ||||||
|                                             .platform() |                                             PlayerManager.resolveName(uuid).toComponent(player) | ||||||
|                                             .playerManager() |  | ||||||
|                                             .getUsernameCaption(uuid) |  | ||||||
|                                             .thenApply(caption -> TagResolver.resolver( |  | ||||||
|                                                     "value", |  | ||||||
|                                                     Tag.inserting(caption.toComponent(player)) |  | ||||||
|                                     )) |                                     )) | ||||||
|                             ); |                             ); | ||||||
|                             iterator.remove(); |                             iterator.remove(); | ||||||
| @@ -117,10 +111,8 @@ public class Add extends Command { | |||||||
|                         if (plot.isOwner(uuid)) { |                         if (plot.isOwner(uuid)) { | ||||||
|                             player.sendMessage( |                             player.sendMessage( | ||||||
|                                     TranslatableCaption.of("member.already_added"), |                                     TranslatableCaption.of("member.already_added"), | ||||||
|                                     PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                                     TagResolver.resolver("player", Tag.inserting( | ||||||
|                                             .thenApply(caption -> TagResolver.resolver( |                                             PlayerManager.resolveName(uuid).toComponent(player) | ||||||
|                                                     "player", |  | ||||||
|                                                     Tag.inserting(caption.toComponent(player)) |  | ||||||
|                                     )) |                                     )) | ||||||
|                             ); |                             ); | ||||||
|                             iterator.remove(); |                             iterator.remove(); | ||||||
| @@ -129,10 +121,8 @@ public class Add extends Command { | |||||||
|                         if (plot.getMembers().contains(uuid)) { |                         if (plot.getMembers().contains(uuid)) { | ||||||
|                             player.sendMessage( |                             player.sendMessage( | ||||||
|                                     TranslatableCaption.of("member.already_added"), |                                     TranslatableCaption.of("member.already_added"), | ||||||
|                                     PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                                     TagResolver.resolver("player", Tag.inserting( | ||||||
|                                             .thenApply(caption -> TagResolver.resolver( |                                             PlayerManager.resolveName(uuid).toComponent(player) | ||||||
|                                                     "player", |  | ||||||
|                                                     Tag.inserting(caption.toComponent(player)) |  | ||||||
|                                     )) |                                     )) | ||||||
|                             ); |                             ); | ||||||
|                             iterator.remove(); |                             iterator.remove(); | ||||||
|   | |||||||
| @@ -193,7 +193,7 @@ public class Claim extends SubCommand { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { |         if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { | ||||||
|             int border = area.getBorder(false); |             int border = area.getBorder(); | ||||||
|             if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) { |             if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) { | ||||||
|                 player.sendMessage(TranslatableCaption.of("border.denied")); |                 player.sendMessage(TranslatableCaption.of("border.denied")); | ||||||
|                 return false; |                 return false; | ||||||
|   | |||||||
| @@ -25,7 +25,6 @@ import com.plotsquared.core.player.PlotPlayer; | |||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.minimessage.MiniMessage; | import net.kyori.adventure.text.minimessage.MiniMessage; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| import org.jetbrains.annotations.NotNull; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * CommandCategory. |  * CommandCategory. | ||||||
| @@ -83,7 +82,7 @@ public enum CommandCategory implements Caption { | |||||||
|     // TODO this method shouldn't be invoked |     // TODO this method shouldn't be invoked | ||||||
|     @Deprecated |     @Deprecated | ||||||
|     @Override |     @Override | ||||||
|     public @NotNull String toString() { |     public String toString() { | ||||||
|         return this.caption.getComponent(LocaleHolder.console()); |         return this.caption.getComponent(LocaleHolder.console()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -109,5 +108,4 @@ public enum CommandCategory implements Caption { | |||||||
|         return !MainCommand.getInstance().getCommands(this, player).isEmpty(); |         return !MainCommand.getInstance().getCommands(this, player).isEmpty(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ import com.plotsquared.core.util.WorldUtil; | |||||||
| import com.plotsquared.core.util.entity.EntityCategories; | import com.plotsquared.core.util.entity.EntityCategories; | ||||||
| import com.plotsquared.core.util.entity.EntityCategory; | import com.plotsquared.core.util.entity.EntityCategory; | ||||||
| import com.plotsquared.core.util.query.PlotQuery; | import com.plotsquared.core.util.query.PlotQuery; | ||||||
|  | import com.plotsquared.core.util.task.TaskManager; | ||||||
| import com.plotsquared.core.uuid.UUIDMapping; | import com.plotsquared.core.uuid.UUIDMapping; | ||||||
| import com.sk89q.worldedit.world.entity.EntityType; | import com.sk89q.worldedit.world.entity.EntityType; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| @@ -70,7 +71,7 @@ public class Debug extends SubCommand { | |||||||
|                     TranslatableCaption.of("commandconfig.command_syntax"), |                     TranslatableCaption.of("commandconfig.command_syntax"), | ||||||
|                     TagResolver.resolver( |                     TagResolver.resolver( | ||||||
|                             "value", |                             "value", | ||||||
|                             Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>")) |                             Tag.inserting(Component.text("/plot debug <loadedchunks | player | debug-players | entitytypes | msg>")) | ||||||
|                     ) |                     ) | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
| @@ -84,6 +85,16 @@ public class Debug extends SubCommand { | |||||||
|                 return true; |                 return true; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         if (args.length > 0 && "loadedchunks".equalsIgnoreCase(args[0])) { | ||||||
|  |             final long start = System.currentTimeMillis(); | ||||||
|  |             player.sendMessage(TranslatableCaption.of("debug.fetching_loaded_chunks")); | ||||||
|  |             TaskManager.runTaskAsync(() -> player.sendMessage(StaticCaption | ||||||
|  |                     .of("Loaded chunks: " + this.worldUtil | ||||||
|  |                             .getChunkChunks(player.getLocation().getWorldName()) | ||||||
|  |                             .size() + " (" + (System.currentTimeMillis() | ||||||
|  |                             - start) + "ms) using thread: " + Thread.currentThread().getName()))); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|         if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) { |         if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) { | ||||||
|             final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately(); |             final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately(); | ||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
| @@ -185,7 +196,7 @@ public class Debug extends SubCommand { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) { |     public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) { | ||||||
|         return Stream.of("debug-players", "entitytypes") |         return Stream.of("loadedchunks", "debug-players", "entitytypes") | ||||||
|                 .filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH))) |                 .filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH))) | ||||||
|                 .map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) { |                 .map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) { | ||||||
|                 }).collect(Collectors.toList()); |                 }).collect(Collectors.toList()); | ||||||
|   | |||||||
| @@ -117,11 +117,10 @@ public class Deny extends SubCommand { | |||||||
|                     } else if (plot.getDenied().contains(uuid)) { |                     } else if (plot.getDenied().contains(uuid)) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
|                                 TranslatableCaption.of("member.already_added"), |                                 TranslatableCaption.of("member.already_added"), | ||||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                                 TagResolver.resolver( | ||||||
|                                         .thenApply(caption -> TagResolver.resolver( |  | ||||||
|                                         "player", |                                         "player", | ||||||
|                                         Tag.inserting(caption.toComponent(player)) |                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||||
|                                 )) |                                 ) | ||||||
|                         ); |                         ); | ||||||
|                         return; |                         return; | ||||||
|                     } else { |                     } else { | ||||||
|   | |||||||
| @@ -136,9 +136,7 @@ public class Download extends SubCommand { | |||||||
|                     } |                     } | ||||||
|                     player.sendMessage( |                     player.sendMessage( | ||||||
|                             TranslatableCaption.of("web.generation_link_success_legacy_world"), |                             TranslatableCaption.of("web.generation_link_success_legacy_world"), | ||||||
|                             TagResolver.builder() |                             TagResolver.resolver("url", Tag.inserting(Component.text(url.toString()))) | ||||||
|                                     .tag("url", Tag.preProcessParsed(url.toString())) |  | ||||||
|                                     .build() |  | ||||||
|                     ); |                     ); | ||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|   | |||||||
| @@ -103,10 +103,9 @@ public final class FlagCommand extends Command { | |||||||
|         if (flag instanceof IntegerFlag && MathMan.isInteger(value)) { |         if (flag instanceof IntegerFlag && MathMan.isInteger(value)) { | ||||||
|             try { |             try { | ||||||
|                 int numeric = Integer.parseInt(value); |                 int numeric = Integer.parseInt(value); | ||||||
|                 // Getting full permission without ".<amount>" at the end |  | ||||||
|                 perm = perm.substring(0, perm.length() - value.length() - 1); |                 perm = perm.substring(0, perm.length() - value.length() - 1); | ||||||
|                 boolean result = false; |                 boolean result = false; | ||||||
|                 if (numeric >= 0) { |                 if (numeric > 0) { | ||||||
|                     int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ? |                     int checkRange = PlotSquared.get().getPlatform().equalsIgnoreCase("bukkit") ? | ||||||
|                             numeric : |                             numeric : | ||||||
|                             Settings.Limit.MAX_PLOTS; |                             Settings.Limit.MAX_PLOTS; | ||||||
|   | |||||||
| @@ -517,7 +517,6 @@ public class ListCmd extends SubCommand { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 finalResolver.tag("players", Tag.inserting(builder.asComponent())); |                 finalResolver.tag("players", Tag.inserting(builder.asComponent())); | ||||||
|                 finalResolver.tag("size", Tag.inserting(Component.text(plot.getConnectedPlots().size()))); |  | ||||||
|                 caption.set(TranslatableCaption.of("info.plot_list_item")); |                 caption.set(TranslatableCaption.of("info.plot_list_item")); | ||||||
|                 caption.setTagResolvers(finalResolver.build()); |                 caption.setTagResolvers(finalResolver.build()); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -41,7 +41,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | |||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||||
| import java.net.URI; |  | ||||||
| import java.net.URL; | import java.net.URL; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -117,7 +116,7 @@ public class Load extends SubCommand { | |||||||
|                     } |                     } | ||||||
|                     final URL url; |                     final URL url; | ||||||
|                     try { |                     try { | ||||||
|                         url = URI.create(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic).toURL(); |                         url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic); | ||||||
|                     } catch (MalformedURLException e) { |                     } catch (MalformedURLException e) { | ||||||
|                         e.printStackTrace(); |                         e.printStackTrace(); | ||||||
|                         player.sendMessage(TranslatableCaption.of("web.load_failed")); |                         player.sendMessage(TranslatableCaption.of("web.load_failed")); | ||||||
|   | |||||||
| @@ -31,6 +31,7 @@ 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.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
|  | import com.plotsquared.core.util.PlayerManager; | ||||||
| import com.plotsquared.core.util.TabCompletions; | import com.plotsquared.core.util.TabCompletions; | ||||||
| import com.plotsquared.core.util.task.TaskManager; | import com.plotsquared.core.util.task.TaskManager; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| @@ -135,11 +136,10 @@ public class Owner extends SetCommand { | |||||||
|             if (plot.isOwner(uuid)) { |             if (plot.isOwner(uuid)) { | ||||||
|                 player.sendMessage( |                 player.sendMessage( | ||||||
|                         TranslatableCaption.of("member.already_owner"), |                         TranslatableCaption.of("member.already_owner"), | ||||||
|                         PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                         TagResolver.resolver( | ||||||
|                                 .thenApply(caption -> TagResolver.resolver( |  | ||||||
|                                 "player", |                                 "player", | ||||||
|                                 Tag.inserting(caption.toComponent(player)) |                                 Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player)) | ||||||
|                         )) |                         ) | ||||||
|                 ); |                 ); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| @@ -147,11 +147,10 @@ public class Owner extends SetCommand { | |||||||
|                 if (other == null) { |                 if (other == null) { | ||||||
|                     player.sendMessage( |                     player.sendMessage( | ||||||
|                             TranslatableCaption.of("errors.invalid_player_offline"), |                             TranslatableCaption.of("errors.invalid_player_offline"), | ||||||
|                             PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                             TagResolver.resolver( | ||||||
|                                     .thenApply(caption -> TagResolver.resolver( |  | ||||||
|                                     "player", |                                     "player", | ||||||
|                                     Tag.inserting(caption.toComponent(player)) |                                     Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||||
|                             )) |                             ) | ||||||
|                     ); |                     ); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -100,17 +100,15 @@ public class Remove extends SubCommand { | |||||||
|                             count++; |                             count++; | ||||||
|                         } |                         } | ||||||
|                     } else if (uuid == DBFunc.EVERYONE) { |                     } else if (uuid == DBFunc.EVERYONE) { | ||||||
|                         count += plot.getTrusted().size(); |  | ||||||
|                         if (plot.removeTrusted(uuid)) { |                         if (plot.removeTrusted(uuid)) { | ||||||
|                             this.eventDispatcher.callTrusted(player, plot, uuid, false); |                             this.eventDispatcher.callTrusted(player, plot, uuid, false); | ||||||
|                         } |                             count++; | ||||||
|                         count += plot.getMembers().size(); |                         } else if (plot.removeMember(uuid)) { | ||||||
|                         if (plot.removeMember(uuid)) { |  | ||||||
|                             this.eventDispatcher.callMember(player, plot, uuid, false); |                             this.eventDispatcher.callMember(player, plot, uuid, false); | ||||||
|                         } |                             count++; | ||||||
|                         count += plot.getDenied().size(); |                         } else if (plot.removeDenied(uuid)) { | ||||||
|                         if (plot.removeDenied(uuid)) { |  | ||||||
|                             this.eventDispatcher.callDenied(player, plot, uuid, false); |                             this.eventDispatcher.callDenied(player, plot, uuid, false); | ||||||
|  |                             count++; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -40,7 +40,6 @@ 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.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| import java.net.URI; |  | ||||||
| import java.net.URL; | import java.net.URL; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @@ -131,7 +130,8 @@ public class SchematicCmd extends SubCommand { | |||||||
|                     if (location.startsWith("url:")) { |                     if (location.startsWith("url:")) { | ||||||
|                         try { |                         try { | ||||||
|                             UUID uuid = UUID.fromString(location.substring(4)); |                             UUID uuid = UUID.fromString(location.substring(4)); | ||||||
|                             URL url = URI.create(Settings.Web.URL + "uploads/" + uuid + ".schematic").toURL(); |                             URL base = new URL(Settings.Web.URL); | ||||||
|  |                             URL url = new URL(base, "uploads/" + uuid + ".schematic"); | ||||||
|                             schematic = this.schematicHandler.getSchematic(url); |                             schematic = this.schematicHandler.getSchematic(url); | ||||||
|                         } catch (Exception e) { |                         } catch (Exception e) { | ||||||
|                             e.printStackTrace(); |                             e.printStackTrace(); | ||||||
|   | |||||||
| @@ -19,7 +19,6 @@ | |||||||
| package com.plotsquared.core.command; | package com.plotsquared.core.command; | ||||||
|  |  | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| 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.database.DBFunc; | ||||||
| @@ -104,11 +103,10 @@ public class Trust extends Command { | |||||||
|                             player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { |                             player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
|                                 TranslatableCaption.of("errors.invalid_player"), |                                 TranslatableCaption.of("errors.invalid_player"), | ||||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                                 TagResolver.resolver( | ||||||
|                                         .thenApply(caption -> TagResolver.resolver( |  | ||||||
|                                         "value", |                                         "value", | ||||||
|                                         Tag.inserting(caption.toComponent(player)) |                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||||
|                                 )) |                                 ) | ||||||
|                         ); |                         ); | ||||||
|                         iterator.remove(); |                         iterator.remove(); | ||||||
|                         continue; |                         continue; | ||||||
| @@ -116,11 +114,10 @@ public class Trust extends Command { | |||||||
|                     if (currentPlot.isOwner(uuid)) { |                     if (currentPlot.isOwner(uuid)) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
|                                 TranslatableCaption.of("member.already_added"), |                                 TranslatableCaption.of("member.already_added"), | ||||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                                 TagResolver.resolver( | ||||||
|                                         .thenApply(caption -> TagResolver.resolver( |                                         "value", | ||||||
|                                         "player", |                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||||
|                                         Tag.inserting(caption.toComponent(player)) |                                 ) | ||||||
|                                 )) |  | ||||||
|                         ); |                         ); | ||||||
|                         iterator.remove(); |                         iterator.remove(); | ||||||
|                         continue; |                         continue; | ||||||
| @@ -128,11 +125,10 @@ public class Trust extends Command { | |||||||
|                     if (currentPlot.getTrusted().contains(uuid)) { |                     if (currentPlot.getTrusted().contains(uuid)) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
|                                 TranslatableCaption.of("member.already_added"), |                                 TranslatableCaption.of("member.already_added"), | ||||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) |                                 TagResolver.resolver( | ||||||
|                                         .thenApply(caption -> TagResolver.resolver( |                                         "value", | ||||||
|                                         "player", |                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||||
|                                         Tag.inserting(caption.toComponent(player)) |                                 ) | ||||||
|                                 )) |  | ||||||
|                         ); |                         ); | ||||||
|                         iterator.remove(); |                         iterator.remove(); | ||||||
|                         continue; |                         continue; | ||||||
|   | |||||||
| @@ -522,7 +522,7 @@ public class Settings extends Config { | |||||||
|         @Comment("Should the limit be global (over multiple worlds)") |         @Comment("Should the limit be global (over multiple worlds)") | ||||||
|         public static boolean GLOBAL = |         public static boolean GLOBAL = | ||||||
|                 false; |                 false; | ||||||
|         @Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'", |         @Comment({"The max range of permissions to check for, e.g. plots.plot.127", | ||||||
|                 "The value covers the permission range to check, you need to assign the permission to players/groups still", |                 "The value covers the permission range to check, you need to assign the permission to players/groups still", | ||||||
|                 "Modifying the value does NOT change the amount of plots players can claim"}) |                 "Modifying the value does NOT change the amount of plots players can claim"}) | ||||||
|         public static int MAX_PLOTS = 127; |         public static int MAX_PLOTS = 127; | ||||||
|   | |||||||
| @@ -44,6 +44,4 @@ public interface Caption { | |||||||
|      */ |      */ | ||||||
|     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder); |     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder); | ||||||
|  |  | ||||||
|     @NonNull String toString(); |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -51,9 +51,4 @@ public final class StaticCaption implements Caption { | |||||||
|         return MiniMessage.miniMessage().deserialize(this.value); |         return MiniMessage.miniMessage().deserialize(this.value); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NonNull String toString() { |  | ||||||
|         return "StaticCaption(" + value + ")"; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -25,7 +25,6 @@ import net.kyori.adventure.text.minimessage.MiniMessage; | |||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
| import org.jetbrains.annotations.NotNull; |  | ||||||
|  |  | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||||
| @@ -133,9 +132,4 @@ public final class TranslatableCaption implements NamespacedCaption { | |||||||
|         return Objects.hashCode(this.getNamespace(), this.getKey()); |         return Objects.hashCode(this.getNamespace(), this.getKey()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public @NotNull String toString() { |  | ||||||
|         return "TranslatableCaption(" + getNamespace() + ":" + getKey() + ")"; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -130,7 +130,6 @@ public class SQLManager implements AbstractDB { | |||||||
|     public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks; |     public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks; | ||||||
|     // Private |     // Private | ||||||
|     private Connection connection; |     private Connection connection; | ||||||
|     private boolean supportsGetGeneratedKeys; |  | ||||||
|     private boolean closed = false; |     private boolean closed = false; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -155,8 +154,6 @@ public class SQLManager implements AbstractDB { | |||||||
|         this.worldConfiguration = worldConfiguration; |         this.worldConfiguration = worldConfiguration; | ||||||
|         this.database = database; |         this.database = database; | ||||||
|         this.connection = database.openConnection(); |         this.connection = database.openConnection(); | ||||||
|         final DatabaseMetaData databaseMetaData = this.connection.getMetaData(); |  | ||||||
|         this.supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys(); |  | ||||||
|         this.mySQL = database instanceof MySQL; |         this.mySQL = database instanceof MySQL; | ||||||
|         this.globalTasks = new ConcurrentLinkedQueue<>(); |         this.globalTasks = new ConcurrentLinkedQueue<>(); | ||||||
|         this.notifyTasks = new ConcurrentLinkedQueue<>(); |         this.notifyTasks = new ConcurrentLinkedQueue<>(); | ||||||
| @@ -164,14 +161,6 @@ public class SQLManager implements AbstractDB { | |||||||
|         this.playerTasks = new ConcurrentHashMap<>(); |         this.playerTasks = new ConcurrentHashMap<>(); | ||||||
|         this.clusterTasks = new ConcurrentHashMap<>(); |         this.clusterTasks = new ConcurrentHashMap<>(); | ||||||
|         this.prefix = prefix; |         this.prefix = prefix; | ||||||
|  |  | ||||||
|         if (mySQL && !supportsGetGeneratedKeys) { |  | ||||||
|             String driver = databaseMetaData.getDriverName(); |  | ||||||
|             String driverVersion = databaseMetaData.getDriverVersion(); |  | ||||||
|             throw new SQLException("Database Driver for MySQL does not support Statement#getGeneratedKeys - which breaks " + |  | ||||||
|                     "PlotSquared functionality (Using " + driver + ":" + driverVersion + ")"); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         this.SET_OWNER = "UPDATE `" + this.prefix |         this.SET_OWNER = "UPDATE `" + this.prefix | ||||||
|                 + "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?"; |                 + "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?"; | ||||||
|         this.GET_ALL_PLOTS = |         this.GET_ALL_PLOTS = | ||||||
| @@ -182,32 +171,20 @@ public class SQLManager implements AbstractDB { | |||||||
|                 "INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values "; |                 "INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values "; | ||||||
|         this.CREATE_TIERS = |         this.CREATE_TIERS = | ||||||
|                 "INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values "; |                 "INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values "; | ||||||
|         String tempCreatePlot = "INSERT INTO `" + this.prefix |         this.CREATE_PLOT = "INSERT INTO `" + this.prefix | ||||||
|                 + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)"; |                 + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)"; | ||||||
|         if (!supportsGetGeneratedKeys) { |  | ||||||
|             tempCreatePlot += " RETURNING `id`"; |  | ||||||
|         } |  | ||||||
|         this.CREATE_PLOT = tempCreatePlot; |  | ||||||
|         if (mySQL) { |         if (mySQL) { | ||||||
|             this.CREATE_PLOT_SAFE = "INSERT IGNORE INTO `" + this.prefix |             this.CREATE_PLOT_SAFE = "INSERT IGNORE INTO `" + this.prefix | ||||||
|                     + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? FROM DUAL WHERE NOT EXISTS (SELECT null FROM `" |                     + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? FROM DUAL WHERE NOT EXISTS (SELECT null FROM `" | ||||||
|                     + this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)"; |                     + this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)"; | ||||||
|         } else { |         } else { | ||||||
|             String tempCreatePlotSafe = "INSERT INTO `" + this.prefix |             this.CREATE_PLOT_SAFE = "INSERT INTO `" + this.prefix | ||||||
|                     + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT null FROM `" |                     + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT null FROM `" | ||||||
|                     + this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)"; |                     + this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)"; | ||||||
|             if (!supportsGetGeneratedKeys) { |  | ||||||
|                 tempCreatePlotSafe += " RETURNING `id`"; |  | ||||||
|         } |         } | ||||||
|             this.CREATE_PLOT_SAFE = tempCreatePlotSafe; |         this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix | ||||||
|         } |  | ||||||
|         String tempCreateCluster = "INSERT INTO `" + this.prefix |  | ||||||
|                 + "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)"; |                 + "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)"; | ||||||
|         if (!supportsGetGeneratedKeys) { |  | ||||||
|             tempCreateCluster += " RETURNING `id`"; |  | ||||||
|         } |  | ||||||
|         this.CREATE_CLUSTER = tempCreateCluster; |  | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
|             createTables(); |             createTables(); | ||||||
|         } catch (SQLException e) { |         } catch (SQLException e) { | ||||||
| @@ -1096,8 +1073,9 @@ public class SQLManager implements AbstractDB { | |||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
|             public void addBatch(PreparedStatement statement) throws SQLException { |             public void addBatch(PreparedStatement statement) throws SQLException { | ||||||
|                 if (statement.execute() || statement.getUpdateCount() > 0) { |                 int inserted = statement.executeUpdate(); | ||||||
|                     try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) { |                 if (inserted > 0) { | ||||||
|  |                     try (ResultSet keys = statement.getGeneratedKeys()) { | ||||||
|                         if (keys.next()) { |                         if (keys.next()) { | ||||||
|                             plot.temp = keys.getInt(1); |                             plot.temp = keys.getInt(1); | ||||||
|                             addPlotTask(plot, new UniqueStatement( |                             addPlotTask(plot, new UniqueStatement( | ||||||
| @@ -1167,8 +1145,8 @@ public class SQLManager implements AbstractDB { | |||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
|             public void addBatch(PreparedStatement statement) throws SQLException { |             public void addBatch(PreparedStatement statement) throws SQLException { | ||||||
|                 statement.execute(); |                 statement.executeUpdate(); | ||||||
|                 try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) { |                 try (ResultSet keys = statement.getGeneratedKeys()) { | ||||||
|                     if (keys.next()) { |                     if (keys.next()) { | ||||||
|                         plot.temp = keys.getInt(1); |                         plot.temp = keys.getInt(1); | ||||||
|                     } |                     } | ||||||
| @@ -3080,8 +3058,8 @@ public class SQLManager implements AbstractDB { | |||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
|             public void addBatch(PreparedStatement statement) throws SQLException { |             public void addBatch(PreparedStatement statement) throws SQLException { | ||||||
|                 statement.execute(); |                 statement.executeUpdate(); | ||||||
|                 try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) { |                 try (ResultSet keys = statement.getGeneratedKeys()) { | ||||||
|                     if (keys.next()) { |                     if (keys.next()) { | ||||||
|                         cluster.temp = keys.getInt(1); |                         cluster.temp = keys.getInt(1); | ||||||
|                     } |                     } | ||||||
|   | |||||||
| @@ -21,26 +21,21 @@ package com.plotsquared.core.events; | |||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
| 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 org.checkerframework.checker.nullness.qual.Nullable; |  | ||||||
|  |  | ||||||
| import java.util.function.UnaryOperator; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Called when a player teleports to a plot |  * Called when a player teleports to a plot | ||||||
|  */ |  */ | ||||||
| public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent { | public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent { | ||||||
|  |  | ||||||
|  |     private final Location from; | ||||||
|     private final TeleportCause cause; |     private final TeleportCause cause; | ||||||
|     private Result eventResult; |     private Result eventResult; | ||||||
|     private final Location from; |  | ||||||
|     private UnaryOperator<Location> locationTransformer; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * PlayerTeleportToPlotEvent: Called when a player teleports to a plot |      * PlayerTeleportToPlotEvent: Called when a player teleports to a plot | ||||||
|      * |      * | ||||||
|      * @param player That was teleported |      * @param player That was teleported | ||||||
|      * @param from   The origin location, from where the teleport was triggered (players location most likely) |      * @param from   Start location | ||||||
|      * @param plot   Plot to which the player was teleported |      * @param plot   Plot to which the player was teleported | ||||||
|      * @param cause  Why the teleport is being completed |      * @param cause  Why the teleport is being completed | ||||||
|      * @since 6.1.0 |      * @since 6.1.0 | ||||||
| @@ -62,8 +57,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get the location, from where the teleport was triggered |      * Get the from location | ||||||
|      * (the players current location when executing the home command for example) |  | ||||||
|      * |      * | ||||||
|      * @return Location |      * @return Location | ||||||
|      */ |      */ | ||||||
| @@ -71,27 +65,6 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel | |||||||
|         return this.from; |         return this.from; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Gets the currently applied {@link UnaryOperator<Location> transformer} or null, if none was set |  | ||||||
|      * |  | ||||||
|      * @return LocationTransformer |  | ||||||
|      * @since TODO |  | ||||||
|      */ |  | ||||||
|     public @Nullable UnaryOperator<Location> getLocationTransformer() { |  | ||||||
|         return this.locationTransformer; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Sets the {@link UnaryOperator<Location> transformer} to mutate the location where the player will be teleported to. |  | ||||||
|      * May be {@code null}, if any previous set transformations should be discarded. |  | ||||||
|      * |  | ||||||
|      * @param locationTransformer The new transformer |  | ||||||
|      * @since TODO |  | ||||||
|      */ |  | ||||||
|     public void setLocationTransformer(@Nullable UnaryOperator<Location> locationTransformer) { |  | ||||||
|         this.locationTransformer = locationTransformer; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Result getEventResult() { |     public Result getEventResult() { | ||||||
|         return eventResult; |         return eventResult; | ||||||
|   | |||||||
| @@ -189,7 +189,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|                 } |                 } | ||||||
|                 Object value; |                 Object value; | ||||||
|                 try { |                 try { | ||||||
|                     final boolean accessible = field.canAccess(this); |                     final boolean accessible = field.isAccessible(); | ||||||
|                     field.setAccessible(true); |                     field.setAccessible(true); | ||||||
|                     value = field.get(this); |                     value = field.get(this); | ||||||
|                     field.setAccessible(accessible); |                     field.setAccessible(accessible); | ||||||
|   | |||||||
| @@ -55,6 +55,7 @@ import com.plotsquared.core.plot.flag.implementations.TitlesFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.WeatherFlag; | import com.plotsquared.core.plot.flag.implementations.WeatherFlag; | ||||||
| import com.plotsquared.core.plot.flag.types.TimedFlag; | import com.plotsquared.core.plot.flag.types.TimedFlag; | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
|  | import com.plotsquared.core.util.PlayerManager; | ||||||
| import com.plotsquared.core.util.task.TaskManager; | import com.plotsquared.core.util.task.TaskManager; | ||||||
| import com.plotsquared.core.util.task.TaskTime; | import com.plotsquared.core.util.task.TaskTime; | ||||||
| import com.sk89q.worldedit.world.gamemode.GameMode; | import com.sk89q.worldedit.world.gamemode.GameMode; | ||||||
| @@ -62,6 +63,7 @@ import com.sk89q.worldedit.world.gamemode.GameModes; | |||||||
| import com.sk89q.worldedit.world.item.ItemType; | import com.sk89q.worldedit.world.item.ItemType; | ||||||
| import com.sk89q.worldedit.world.item.ItemTypes; | import com.sk89q.worldedit.world.item.ItemTypes; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
|  | import net.kyori.adventure.text.ComponentLike; | ||||||
| import net.kyori.adventure.text.minimessage.MiniMessage; | import net.kyori.adventure.text.minimessage.MiniMessage; | ||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| @@ -75,7 +77,6 @@ import java.util.List; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
| import java.util.concurrent.CompletableFuture; |  | ||||||
|  |  | ||||||
| public class PlotListener { | public class PlotListener { | ||||||
|  |  | ||||||
| @@ -320,27 +321,22 @@ public class PlotListener { | |||||||
|                         } |                         } | ||||||
|                         if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) { |                         if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) { | ||||||
|                             final UUID plotOwner = plot.getOwnerAbs(); |                             final UUID plotOwner = plot.getOwnerAbs(); | ||||||
|  |                             ComponentLike owner = PlayerManager.resolveName(plotOwner, true).toComponent(player); | ||||||
|                             Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" + |                             Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" + | ||||||
|                                     ".title_entered_plot"); |                                     ".title_entered_plot"); | ||||||
|                             Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" + |                             Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" + | ||||||
|                                     ".title_entered_plot_sub"); |                                     ".title_entered_plot_sub"); | ||||||
|  |                             TagResolver resolver = TagResolver.builder() | ||||||
|                             CompletableFuture<TagResolver> future = PlotSquared.platform().playerManager() |  | ||||||
|                                     .getUsernameCaption(plotOwner).thenApply(caption -> TagResolver.builder() |  | ||||||
|                                             .tag("owner", Tag.inserting(caption.toComponent(player))) |  | ||||||
|                                     .tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString()))) |                                     .tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString()))) | ||||||
|                                     .tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName()))) |                                     .tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName()))) | ||||||
|  |                                     .tag("owner", Tag.inserting(owner)) | ||||||
|                                     .tag("alias", Tag.inserting(Component.text(plot.getAlias()))) |                                     .tag("alias", Tag.inserting(Component.text(plot.getAlias()))) | ||||||
|                                             .build() |                                     .build(); | ||||||
|                                     ); |  | ||||||
|  |  | ||||||
|                             future.whenComplete((tagResolver, throwable) -> { |  | ||||||
|                             if (Settings.Titles.TITLES_AS_ACTIONBAR) { |                             if (Settings.Titles.TITLES_AS_ACTIONBAR) { | ||||||
|                                     player.sendActionBar(header, tagResolver); |                                 player.sendActionBar(header, resolver); | ||||||
|                             } else { |                             } else { | ||||||
|                                     player.sendTitle(header, subHeader, tagResolver); |                                 player.sendTitle(header, subHeader, resolver); | ||||||
|                             } |                             } | ||||||
|                             }); |  | ||||||
|                         } |                         } | ||||||
|                     }, TaskTime.seconds(1L)); |                     }, TaskTime.seconds(1L)); | ||||||
|                 } |                 } | ||||||
| @@ -364,6 +360,7 @@ public class PlotListener { | |||||||
|     public boolean plotExit(final PlotPlayer<?> player, Plot plot) { |     public boolean plotExit(final PlotPlayer<?> player, Plot plot) { | ||||||
|         try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { |         try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { | ||||||
|             final Plot previous = lastPlot.remove(); |             final Plot previous = lastPlot.remove(); | ||||||
|  |             this.eventDispatcher.callLeave(player, plot); | ||||||
|  |  | ||||||
|             List<StatusEffect> effects = playerEffects.remove(player.getUUID()); |             List<StatusEffect> effects = playerEffects.remove(player.getUUID()); | ||||||
|             if (effects != null) { |             if (effects != null) { | ||||||
| @@ -466,8 +463,6 @@ public class PlotListener { | |||||||
|                 feedRunnable.remove(player.getUUID()); |                 feedRunnable.remove(player.getUUID()); | ||||||
|                 healRunnable.remove(player.getUUID()); |                 healRunnable.remove(player.getUUID()); | ||||||
|             } |             } | ||||||
|         } finally { |  | ||||||
|             this.eventDispatcher.callLeave(player, plot); |  | ||||||
|         } |         } | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -55,25 +55,6 @@ public enum Direction { | |||||||
|         return NORTH; |         return NORTH; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * {@return the opposite direction} |  | ||||||
|      * If this is {@link Direction#ALL}, then {@link Direction#ALL} is returned. |  | ||||||
|      * @since 7.2.0 |  | ||||||
|      */ |  | ||||||
|     public Direction opposite() { |  | ||||||
|         return switch (this) { |  | ||||||
|             case ALL -> ALL; |  | ||||||
|             case NORTH -> SOUTH; |  | ||||||
|             case EAST -> WEST; |  | ||||||
|             case SOUTH -> NORTH; |  | ||||||
|             case WEST -> EAST; |  | ||||||
|             case NORTHEAST -> SOUTHWEST; |  | ||||||
|             case SOUTHEAST -> NORTHWEST; |  | ||||||
|             case SOUTHWEST -> NORTHEAST; |  | ||||||
|             case NORTHWEST -> SOUTHEAST; |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public int getIndex() { |     public int getIndex() { | ||||||
|         return index; |         return index; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -100,7 +100,6 @@ public interface PermissionHolder { | |||||||
|         } |         } | ||||||
|         String[] nodes = stub.split("\\."); |         String[] nodes = stub.split("\\."); | ||||||
|         StringBuilder builder = new StringBuilder(); |         StringBuilder builder = new StringBuilder(); | ||||||
|         // Wildcard check from less specific permission to more specific permission |  | ||||||
|         for (int i = 0; i < (nodes.length - 1); i++) { |         for (int i = 0; i < (nodes.length - 1); i++) { | ||||||
|             builder.append(nodes[i]).append("."); |             builder.append(nodes[i]).append("."); | ||||||
|             if (!stub.equals(builder + Permission.PERMISSION_STAR.toString())) { |             if (!stub.equals(builder + Permission.PERMISSION_STAR.toString())) { | ||||||
| @@ -109,7 +108,6 @@ public interface PermissionHolder { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // Wildcard check for the full permission |  | ||||||
|         if (hasPermission(stub + ".*")) { |         if (hasPermission(stub + ".*")) { | ||||||
|             return Integer.MAX_VALUE; |             return Integer.MAX_VALUE; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -25,9 +25,9 @@ import java.util.UUID; | |||||||
| public interface OfflinePlotPlayer extends PermissionHolder { | public interface OfflinePlotPlayer extends PermissionHolder { | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the UUID of the player. |      * Gets the {@code UUID} of this player | ||||||
|      * |      * | ||||||
|      * @return the UUID of the player |      * @return the player {@link UUID} | ||||||
|      */ |      */ | ||||||
|     UUID getUUID(); |     UUID getUUID(); | ||||||
|  |  | ||||||
| @@ -39,9 +39,9 @@ public interface OfflinePlotPlayer extends PermissionHolder { | |||||||
|     long getLastPlayed(); |     long getLastPlayed(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the name of the player. |      * Gets the name of this player. | ||||||
|      * |      * | ||||||
|      * @return the name of the player |      * @return the player name | ||||||
|      */ |      */ | ||||||
|     String getName(); |     String getName(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -80,7 +80,6 @@ import java.util.Map; | |||||||
| import java.util.Queue; | import java.util.Queue; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
| import java.util.concurrent.CompletableFuture; |  | ||||||
| import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||||
| import java.util.concurrent.atomic.AtomicInteger; | import java.util.concurrent.atomic.AtomicInteger; | ||||||
|  |  | ||||||
| @@ -274,9 +273,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | |||||||
|         return this.meta == null ? null : this.meta.remove(key); |         return this.meta == null ? null : this.meta.remove(key); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the name of the player. |      * This player's name. | ||||||
|      * |      * | ||||||
|      * @return the name of the player |      * @return the name of the player | ||||||
|      */ |      */ | ||||||
| @@ -882,7 +880,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | |||||||
|         final Component titleComponent = MiniMessage.miniMessage().deserialize(title.getComponent(this), replacements); |         final Component titleComponent = MiniMessage.miniMessage().deserialize(title.getComponent(this), replacements); | ||||||
|         final Component subtitleComponent = |         final Component subtitleComponent = | ||||||
|                 MiniMessage.miniMessage().deserialize(subtitle.getComponent(this), replacements); |                 MiniMessage.miniMessage().deserialize(subtitle.getComponent(this), replacements); | ||||||
|         final Title.Times times = Title.Times.times( |         final Title.Times times = Title.Times.of( | ||||||
|                 Duration.of(Settings.Titles.TITLES_FADE_IN * 50L, ChronoUnit.MILLIS), |                 Duration.of(Settings.Titles.TITLES_FADE_IN * 50L, ChronoUnit.MILLIS), | ||||||
|                 Duration.of(Settings.Titles.TITLES_STAY * 50L, ChronoUnit.MILLIS), |                 Duration.of(Settings.Titles.TITLES_STAY * 50L, ChronoUnit.MILLIS), | ||||||
|                 Duration.of(Settings.Titles.TITLES_FADE_OUT * 50L, ChronoUnit.MILLIS) |                 Duration.of(Settings.Titles.TITLES_FADE_OUT * 50L, ChronoUnit.MILLIS) | ||||||
| @@ -954,54 +952,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Sends a message to the command caller, when the future is resolved |  | ||||||
|      * |  | ||||||
|      * @param caption          Caption to send |  | ||||||
|      * @param asyncReplacement Async variable replacement |  | ||||||
|      * @return A Future to be resolved, after the message was sent |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     public final CompletableFuture<Void> sendMessage( |  | ||||||
|             @NonNull Caption caption, |  | ||||||
|             CompletableFuture<@NonNull TagResolver> asyncReplacement |  | ||||||
|     ) { |  | ||||||
|         return sendMessage(caption, new CompletableFuture[]{asyncReplacement}); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Sends a message to the command caller, when all futures are resolved |  | ||||||
|      * |  | ||||||
|      * @param caption           Caption to send |  | ||||||
|      * @param asyncReplacements Async variable replacements |  | ||||||
|      * @param replacements      Sync variable replacements |  | ||||||
|      * @return A Future to be resolved, after the message was sent |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     public final CompletableFuture<Void> sendMessage( |  | ||||||
|             @NonNull Caption caption, |  | ||||||
|             CompletableFuture<@NonNull TagResolver>[] asyncReplacements, |  | ||||||
|             @NonNull TagResolver... replacements |  | ||||||
|     ) { |  | ||||||
|         return CompletableFuture.allOf(asyncReplacements).whenComplete((unused, throwable) -> { |  | ||||||
|             Set<TagResolver> resolvers = new HashSet<>(Arrays.asList(replacements)); |  | ||||||
|             if (throwable != null) { |  | ||||||
|                 sendMessage( |  | ||||||
|                         TranslatableCaption.of("errors.error"), |  | ||||||
|                         TagResolver.resolver("value", Tag.inserting( |  | ||||||
|                                 Component.text("Failed to resolve asynchronous caption replacements") |  | ||||||
|                         )) |  | ||||||
|                 ); |  | ||||||
|                 LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable); |  | ||||||
|             } else { |  | ||||||
|                 for (final CompletableFuture<TagResolver> asyncReplacement : asyncReplacements) { |  | ||||||
|                     resolvers.add(asyncReplacement.join()); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             sendMessage(caption, resolvers.toArray(TagResolver[]::new)); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Redefine from PermissionHolder as it's required from CommandCaller |     // Redefine from PermissionHolder as it's required from CommandCaller | ||||||
|     @Override |     @Override | ||||||
|     public boolean hasPermission(@NonNull String permission) { |     public boolean hasPermission(@NonNull String permission) { | ||||||
|   | |||||||
| @@ -29,7 +29,6 @@ import com.plotsquared.core.configuration.caption.CaptionUtility; | |||||||
| import com.plotsquared.core.configuration.caption.StaticCaption; | 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.database.DBFunc; | import com.plotsquared.core.database.DBFunc; | ||||||
| import com.plotsquared.core.events.PlayerTeleportToPlotEvent; |  | ||||||
| import com.plotsquared.core.events.Result; | import com.plotsquared.core.events.Result; | ||||||
| import com.plotsquared.core.events.TeleportCause; | import com.plotsquared.core.events.TeleportCause; | ||||||
| import com.plotsquared.core.generator.ClassicPlotWorld; | import com.plotsquared.core.generator.ClassicPlotWorld; | ||||||
| @@ -86,7 +85,6 @@ import java.util.ArrayDeque; | |||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.Deque; |  | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -2285,8 +2283,8 @@ public class Plot { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Gets a set of plots connected (and including) this plot. |      * Gets a set of plots connected (and including) this plot<br> | ||||||
|      * The returned set is immutable. |      * - This result is cached globally | ||||||
|      * |      * | ||||||
|      * @return a Set of Plots connected to this Plot |      * @return a Set of Plots connected to this Plot | ||||||
|      */ |      */ | ||||||
| @@ -2297,75 +2295,117 @@ public class Plot { | |||||||
|         if (!this.isMerged()) { |         if (!this.isMerged()) { | ||||||
|             return Collections.singleton(this); |             return Collections.singleton(this); | ||||||
|         } |         } | ||||||
|         Plot basePlot = getBasePlot(false); |  | ||||||
|         if (this.connectedCache == null && this != basePlot) { |  | ||||||
|             // share cache between connected plots |  | ||||||
|             Set<Plot> connectedPlots = basePlot.getConnectedPlots(); |  | ||||||
|             this.connectedCache = connectedPlots; |  | ||||||
|             return connectedPlots; |  | ||||||
|         } |  | ||||||
|         if (this.connectedCache != null && this.connectedCache.contains(this)) { |         if (this.connectedCache != null && this.connectedCache.contains(this)) { | ||||||
|             return this.connectedCache; |             return this.connectedCache; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Set<Plot> tmpSet = new HashSet<>(); |         HashSet<Plot> tmpSet = new HashSet<>(); | ||||||
|         tmpSet.add(this); |         tmpSet.add(this); | ||||||
|         HashSet<Plot> queueCache = new HashSet<>(); |         Plot tmp; | ||||||
|  |         HashSet<Object> queuecache = new HashSet<>(); | ||||||
|         ArrayDeque<Plot> frontier = new ArrayDeque<>(); |         ArrayDeque<Plot> frontier = new ArrayDeque<>(); | ||||||
|         computeDirectMerged(queueCache, frontier, Direction.NORTH); |         if (this.isMerged(Direction.NORTH)) { | ||||||
|         computeDirectMerged(queueCache, frontier, Direction.EAST); |             tmp = this.area.getPlotAbs(this.id.getRelative(Direction.NORTH)); | ||||||
|         computeDirectMerged(queueCache, frontier, Direction.SOUTH); |             if (!tmp.isMerged(Direction.SOUTH)) { | ||||||
|         computeDirectMerged(queueCache, frontier, Direction.WEST); |                 // invalid merge | ||||||
|  |                 if (tmp.isOwnerAbs(this.getOwnerAbs())) { | ||||||
|  |                     tmp.getSettings().setMerged(Direction.SOUTH, true); | ||||||
|  |                     DBFunc.setMerged(tmp, tmp.getSettings().getMerged()); | ||||||
|  |                 } else { | ||||||
|  |                     this.getSettings().setMerged(Direction.NORTH, false); | ||||||
|  |                     DBFunc.setMerged(this, this.getSettings().getMerged()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             queuecache.add(tmp); | ||||||
|  |             frontier.add(tmp); | ||||||
|  |         } | ||||||
|  |         if (this.isMerged(Direction.EAST)) { | ||||||
|  |             tmp = this.area.getPlotAbs(this.id.getRelative(Direction.EAST)); | ||||||
|  |             assert tmp != null; | ||||||
|  |             if (!tmp.isMerged(Direction.WEST)) { | ||||||
|  |                 // invalid merge | ||||||
|  |                 if (tmp.isOwnerAbs(this.getOwnerAbs())) { | ||||||
|  |                     tmp.getSettings().setMerged(Direction.WEST, true); | ||||||
|  |                     DBFunc.setMerged(tmp, tmp.getSettings().getMerged()); | ||||||
|  |                 } else { | ||||||
|  |                     this.getSettings().setMerged(Direction.EAST, false); | ||||||
|  |                     DBFunc.setMerged(this, this.getSettings().getMerged()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             queuecache.add(tmp); | ||||||
|  |             frontier.add(tmp); | ||||||
|  |         } | ||||||
|  |         if (this.isMerged(Direction.SOUTH)) { | ||||||
|  |             tmp = this.area.getPlotAbs(this.id.getRelative(Direction.SOUTH)); | ||||||
|  |             assert tmp != null; | ||||||
|  |             if (!tmp.isMerged(Direction.NORTH)) { | ||||||
|  |                 // invalid merge | ||||||
|  |                 if (tmp.isOwnerAbs(this.getOwnerAbs())) { | ||||||
|  |                     tmp.getSettings().setMerged(Direction.NORTH, true); | ||||||
|  |                     DBFunc.setMerged(tmp, tmp.getSettings().getMerged()); | ||||||
|  |                 } else { | ||||||
|  |                     this.getSettings().setMerged(Direction.SOUTH, false); | ||||||
|  |                     DBFunc.setMerged(this, this.getSettings().getMerged()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             queuecache.add(tmp); | ||||||
|  |             frontier.add(tmp); | ||||||
|  |         } | ||||||
|  |         if (this.isMerged(Direction.WEST)) { | ||||||
|  |             tmp = this.area.getPlotAbs(this.id.getRelative(Direction.WEST)); | ||||||
|  |             if (!tmp.isMerged(Direction.EAST)) { | ||||||
|  |                 // invalid merge | ||||||
|  |                 if (tmp.isOwnerAbs(this.getOwnerAbs())) { | ||||||
|  |                     tmp.getSettings().setMerged(Direction.EAST, true); | ||||||
|  |                     DBFunc.setMerged(tmp, tmp.getSettings().getMerged()); | ||||||
|  |                 } else { | ||||||
|  |                     this.getSettings().setMerged(Direction.WEST, false); | ||||||
|  |                     DBFunc.setMerged(this, this.getSettings().getMerged()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             queuecache.add(tmp); | ||||||
|  |             frontier.add(tmp); | ||||||
|  |         } | ||||||
|         Plot current; |         Plot current; | ||||||
|         while ((current = frontier.poll()) != null) { |         while ((current = frontier.poll()) != null) { | ||||||
|             if (!current.hasOwner() || current.settings == null) { |             if (!current.hasOwner() || current.settings == null) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             tmpSet.add(current); |             tmpSet.add(current); | ||||||
|             queueCache.remove(current); |             queuecache.remove(current); | ||||||
|             addIfIncluded(current, Direction.NORTH, queueCache, tmpSet, frontier); |             if (current.isMerged(Direction.NORTH)) { | ||||||
|             addIfIncluded(current, Direction.EAST, queueCache, tmpSet, frontier); |                 tmp = current.area.getPlotAbs(current.id.getRelative(Direction.NORTH)); | ||||||
|             addIfIncluded(current, Direction.SOUTH, queueCache, tmpSet, frontier); |                 if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) { | ||||||
|             addIfIncluded(current, Direction.WEST, queueCache, tmpSet, frontier); |                     queuecache.add(tmp); | ||||||
|  |                     frontier.add(tmp); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (current.isMerged(Direction.EAST)) { | ||||||
|  |                 tmp = current.area.getPlotAbs(current.id.getRelative(Direction.EAST)); | ||||||
|  |                 if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) { | ||||||
|  |                     queuecache.add(tmp); | ||||||
|  |                     frontier.add(tmp); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (current.isMerged(Direction.SOUTH)) { | ||||||
|  |                 tmp = current.area.getPlotAbs(current.id.getRelative(Direction.SOUTH)); | ||||||
|  |                 if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) { | ||||||
|  |                     queuecache.add(tmp); | ||||||
|  |                     frontier.add(tmp); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (current.isMerged(Direction.WEST)) { | ||||||
|  |                 tmp = current.area.getPlotAbs(current.id.getRelative(Direction.WEST)); | ||||||
|  |                 if (tmp != null && !queuecache.contains(tmp) && !tmpSet.contains(tmp)) { | ||||||
|  |                     queuecache.add(tmp); | ||||||
|  |                     frontier.add(tmp); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         tmpSet = Set.copyOf(tmpSet); |  | ||||||
|         this.connectedCache = tmpSet; |         this.connectedCache = tmpSet; | ||||||
|         return tmpSet; |         return tmpSet; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void computeDirectMerged(Set<Plot> queueCache, Deque<Plot> frontier, Direction direction) { |  | ||||||
|         if (this.isMerged(direction)) { |  | ||||||
|             Plot tmp = this.area.getPlotAbs(this.id.getRelative(direction)); |  | ||||||
|             assert tmp != null; |  | ||||||
|             if (!tmp.isMerged(direction.opposite())) { |  | ||||||
|                 // invalid merge |  | ||||||
|                 if (tmp.isOwnerAbs(this.getOwnerAbs())) { |  | ||||||
|                     tmp.getSettings().setMerged(direction.opposite(), true); |  | ||||||
|                     DBFunc.setMerged(tmp, tmp.getSettings().getMerged()); |  | ||||||
|                 } else { |  | ||||||
|                     this.getSettings().setMerged(direction, false); |  | ||||||
|                     DBFunc.setMerged(this, this.getSettings().getMerged()); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             queueCache.add(tmp); |  | ||||||
|             frontier.add(tmp); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void addIfIncluded( |  | ||||||
|             Plot current, Direction |  | ||||||
|             direction, Set<Plot> queueCache, Set<Plot> tmpSet, Deque<Plot> frontier |  | ||||||
|     ) { |  | ||||||
|         if (!current.isMerged(direction)) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         Plot tmp = current.area.getPlotAbs(current.id.getRelative(direction)); |  | ||||||
|         if (tmp != null && !queueCache.contains(tmp) && !tmpSet.contains(tmp)) { |  | ||||||
|             queueCache.add(tmp); |  | ||||||
|             frontier.add(tmp); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * This will combine each plot into effective rectangular regions<br> |      * This will combine each plot into effective rectangular regions<br> | ||||||
|      * - This result is cached globally<br> |      * - This result is cached globally<br> | ||||||
| @@ -2574,9 +2614,8 @@ 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); | ||||||
|  |         Result result = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause).getEventResult(); | ||||||
|         PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause); |         if (result == Result.DENY) { | ||||||
|         if (event.getEventResult() == Result.DENY) { |  | ||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
|                     TranslatableCaption.of("events.event_denied"), |                     TranslatableCaption.of("events.event_denied"), | ||||||
|                     TagResolver.resolver("value", Tag.inserting(Component.text("Teleport"))) |                     TagResolver.resolver("value", Tag.inserting(Component.text("Teleport"))) | ||||||
| @@ -2584,10 +2623,7 @@ public class Plot { | |||||||
|             resultConsumer.accept(false); |             resultConsumer.accept(false); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         final Consumer<Location> locationConsumer = location -> { | ||||||
|         final Consumer<Location> locationConsumer = calculatedLocation -> { |  | ||||||
|             Location location = event.getLocationTransformer() == null ? calculatedLocation : |  | ||||||
|                     Objects.requireNonNullElse(event.getLocationTransformer().apply(calculatedLocation), calculatedLocation); |  | ||||||
|             if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) { |             if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) { | ||||||
|                 player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot")); |                 player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot")); | ||||||
|                 player.teleport(location, cause); |                 player.teleport(location, cause); | ||||||
| @@ -2643,11 +2679,6 @@ public class Plot { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Get the maximum distance of the plot from x=0, z=0. |  | ||||||
|      * |  | ||||||
|      * @return max block distance from 0,0 |  | ||||||
|      */ |  | ||||||
|     public int getDistanceFromOrigin() { |     public int getDistanceFromOrigin() { | ||||||
|         Location bot = getManager().getPlotBottomLocAbs(id); |         Location bot = getManager().getPlotBottomLocAbs(id); | ||||||
|         Location top = getManager().getPlotTopLocAbs(id); |         Location top = getManager().getPlotTopLocAbs(id); | ||||||
| @@ -2661,7 +2692,7 @@ public class Plot { | |||||||
|      * Expands the world border to include this plot if it is beyond the current border. |      * Expands the world border to include this plot if it is beyond the current border. | ||||||
|      */ |      */ | ||||||
|     public void updateWorldBorder() { |     public void updateWorldBorder() { | ||||||
|         int border = this.area.getBorder(false); |         int border = this.area.getBorder(); | ||||||
|         if (border == Integer.MAX_VALUE) { |         if (border == Integer.MAX_VALUE) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -51,8 +51,6 @@ import com.plotsquared.core.util.MathMan; | |||||||
| import com.plotsquared.core.util.PlotExpression; | import com.plotsquared.core.util.PlotExpression; | ||||||
| import com.plotsquared.core.util.RegionUtil; | import com.plotsquared.core.util.RegionUtil; | ||||||
| import com.plotsquared.core.util.StringMan; | import com.plotsquared.core.util.StringMan; | ||||||
| import com.plotsquared.core.util.task.TaskManager; |  | ||||||
| import com.plotsquared.core.util.task.TaskTime; |  | ||||||
| import com.sk89q.worldedit.math.BlockVector2; | import com.sk89q.worldedit.math.BlockVector2; | ||||||
| import com.sk89q.worldedit.math.BlockVector3; | import com.sk89q.worldedit.math.BlockVector3; | ||||||
| import com.sk89q.worldedit.regions.CuboidRegion; | import com.sk89q.worldedit.regions.CuboidRegion; | ||||||
| @@ -147,7 +145,6 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|     private Map<String, PlotExpression> prices = new HashMap<>(); |     private Map<String, PlotExpression> prices = new HashMap<>(); | ||||||
|     private List<String> schematics = new ArrayList<>(); |     private List<String> schematics = new ArrayList<>(); | ||||||
|     private boolean worldBorder = false; |     private boolean worldBorder = false; | ||||||
|     private int borderSize = 1; |  | ||||||
|     private boolean useEconomy = false; |     private boolean useEconomy = false; | ||||||
|     private int hash; |     private int hash; | ||||||
|     private CuboidRegion region; |     private CuboidRegion region; | ||||||
| @@ -357,7 +354,6 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|         this.plotChat = config.getBoolean("chat.enabled"); |         this.plotChat = config.getBoolean("chat.enabled"); | ||||||
|         this.forcingPlotChat = config.getBoolean("chat.forced"); |         this.forcingPlotChat = config.getBoolean("chat.forced"); | ||||||
|         this.worldBorder = config.getBoolean("world.border"); |         this.worldBorder = config.getBoolean("world.border"); | ||||||
|         this.borderSize = config.getInt("world.border_size"); |  | ||||||
|         this.maxBuildHeight = config.getInt("world.max_height"); |         this.maxBuildHeight = config.getInt("world.max_height"); | ||||||
|         this.minBuildHeight = config.getInt("world.min_height"); |         this.minBuildHeight = config.getInt("world.min_height"); | ||||||
|         this.minGenHeight = config.getInt("world.min_gen_height"); |         this.minGenHeight = config.getInt("world.min_gen_height"); | ||||||
| @@ -395,28 +391,6 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this.spawnEggs = config.getBoolean("event.spawn.egg"); |  | ||||||
|         this.spawnCustom = config.getBoolean("event.spawn.custom"); |  | ||||||
|         this.spawnBreeding = config.getBoolean("event.spawn.breeding"); |  | ||||||
|  |  | ||||||
|         if (PlotSquared.get().isWeInitialised()) { |  | ||||||
|             loadFlags(config); |  | ||||||
|         } else { |  | ||||||
|             ConsolePlayer.getConsole().sendMessage( |  | ||||||
|                     TranslatableCaption.of("flags.delaying_loading_area_flags"), |  | ||||||
|                     TagResolver.resolver("area", Tag.inserting(Component.text(this.id == null ? this.worldName : this.id))) |  | ||||||
|             ); |  | ||||||
|             TaskManager.runTaskLater(() -> loadFlags(config), TaskTime.ticks(1)); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         loadConfiguration(config); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void loadFlags(ConfigurationSection config) { |  | ||||||
|         ConsolePlayer.getConsole().sendMessage( |  | ||||||
|                 TranslatableCaption.of("flags.loading_area_flags"), |  | ||||||
|                 TagResolver.resolver("area", Tag.inserting(Component.text(this.id == null ? this.worldName : this.id))) |  | ||||||
|         ); |  | ||||||
|         List<String> flags = config.getStringList("flags.default"); |         List<String> flags = config.getStringList("flags.default"); | ||||||
|         if (flags.isEmpty()) { |         if (flags.isEmpty()) { | ||||||
|             flags = config.getStringList("flags"); |             flags = config.getStringList("flags"); | ||||||
| @@ -437,6 +411,10 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|                 TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString()))) |                 TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString()))) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|  |         this.spawnEggs = config.getBoolean("event.spawn.egg"); | ||||||
|  |         this.spawnCustom = config.getBoolean("event.spawn.custom"); | ||||||
|  |         this.spawnBreeding = config.getBoolean("event.spawn.breeding"); | ||||||
|  |  | ||||||
|         List<String> roadflags = config.getStringList("road.flags"); |         List<String> roadflags = config.getStringList("road.flags"); | ||||||
|         if (roadflags.isEmpty()) { |         if (roadflags.isEmpty()) { | ||||||
|             roadflags = new ArrayList<>(); |             roadflags = new ArrayList<>(); | ||||||
| @@ -448,12 +426,14 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         this.roadFlags = !roadflags.isEmpty(); |         this.roadFlags = roadflags.size() > 0; | ||||||
|         parseFlags(this.getRoadFlagContainer(), roadflags); |         parseFlags(this.getRoadFlagContainer(), roadflags); | ||||||
|         ConsolePlayer.getConsole().sendMessage( |         ConsolePlayer.getConsole().sendMessage( | ||||||
|                 TranslatableCaption.of("flags.road_flags"), |                 TranslatableCaption.of("flags.road_flags"), | ||||||
|                 TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString()))) |                 TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString()))) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|  |         loadConfiguration(config); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public abstract void loadConfiguration(ConfigurationSection config); |     public abstract void loadConfiguration(ConfigurationSection config); | ||||||
| @@ -491,7 +471,6 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|         options.put("event.spawn.custom", this.isSpawnCustom()); |         options.put("event.spawn.custom", this.isSpawnCustom()); | ||||||
|         options.put("event.spawn.breeding", this.isSpawnBreeding()); |         options.put("event.spawn.breeding", this.isSpawnBreeding()); | ||||||
|         options.put("world.border", this.hasWorldBorder()); |         options.put("world.border", this.hasWorldBorder()); | ||||||
|         options.put("world.border_size", this.getBorderSize()); |  | ||||||
|         options.put("home.default", "side"); |         options.put("home.default", "side"); | ||||||
|         String position = config.getString( |         String position = config.getString( | ||||||
|                 "home.nonmembers", |                 "home.nonmembers", | ||||||
| @@ -940,9 +919,7 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|      * Get the plot border distance for a world<br> |      * Get the plot border distance for a world<br> | ||||||
|      * |      * | ||||||
|      * @return The border distance or Integer.MAX_VALUE if no border is set |      * @return The border distance or Integer.MAX_VALUE if no border is set | ||||||
|      * @deprecated Use {@link PlotArea#getBorder(boolean)} |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(forRemoval = true, since = "7.2.0") |  | ||||||
|     public int getBorder() { |     public int getBorder() { | ||||||
|         final Integer meta = (Integer) getMeta("worldBorder"); |         final Integer meta = (Integer) getMeta("worldBorder"); | ||||||
|         if (meta != null) { |         if (meta != null) { | ||||||
| @@ -956,27 +933,6 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|         return Integer.MAX_VALUE; |         return Integer.MAX_VALUE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Get the plot border distance for a world, specifying whether the returned value should include the world.border-size |  | ||||||
|      * value. This is a player-traversable area, where plots cannot be claimed |  | ||||||
|      * |  | ||||||
|      * @param getExtended If the extra border given by world.border-size should be included |  | ||||||
|      * @return Border distance of Integer.MAX_VALUE if no border is set |  | ||||||
|      * @since 7.2.0 |  | ||||||
|      */ |  | ||||||
|     public int getBorder(boolean getExtended) { |  | ||||||
|         final Integer meta = (Integer) getMeta("worldBorder"); |  | ||||||
|         if (meta != null) { |  | ||||||
|             int border = meta + 1; |  | ||||||
|             if (border == 0) { |  | ||||||
|                 return Integer.MAX_VALUE; |  | ||||||
|             } else { |  | ||||||
|                 return getExtended ? border + borderSize : border; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return Integer.MAX_VALUE; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Setup the plot border for a world (usually done when the world is created). |      * Setup the plot border for a world (usually done when the world is created). | ||||||
|      */ |      */ | ||||||
| @@ -1236,16 +1192,6 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|         return worldBorder; |         return worldBorder; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Get the "extra border" size of the plot area. |  | ||||||
|      * |  | ||||||
|      * @return Plot area extra border size |  | ||||||
|      * @since 7.2.0 |  | ||||||
|      */ |  | ||||||
|     public int getBorderSize() { |  | ||||||
|         return borderSize; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get whether plot signs are allowed or not. |      * Get whether plot signs are allowed or not. | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -26,8 +26,8 @@ import java.util.Iterator; | |||||||
| import java.util.NoSuchElementException; | import java.util.NoSuchElementException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The PlotId class represents a Plot's x and y coordinates within a {@link PlotArea}. PlotId x,y values do not correspond to Block locations. |  * Plot (X,Y) tuples for plot locations | ||||||
|  * A PlotId instance can be created using the {@link #of(int, int)} method or parsed from a string using the {@link #fromString(String)} method. |  * within a plot area | ||||||
|  */ |  */ | ||||||
| public final class PlotId { | public final class PlotId { | ||||||
|  |  | ||||||
| @@ -36,10 +36,10 @@ public final class PlotId { | |||||||
|     private final int hash; |     private final int hash; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Constructs a new PlotId with the given x and y coordinates. |      * PlotId class (PlotId x,y values do not correspond to Block locations) | ||||||
|      * |      * | ||||||
|      * @param x the x-coordinate of the plot |      * @param x The plot x coordinate | ||||||
|      * @param y the y-coordinate of the plot |      * @param y The plot y coordinate | ||||||
|      */ |      */ | ||||||
|     private PlotId(final int x, final int y) { |     private PlotId(final int x, final int y) { | ||||||
|         this.x = x; |         this.x = x; | ||||||
| @@ -48,11 +48,11 @@ public final class PlotId { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a new PlotId instance with the specified x and y coordinates. |      * Create a new plot ID instance | ||||||
|      * |      * | ||||||
|      * @param x the x-coordinate of the plot |      * @param x The plot x coordinate | ||||||
|      * @param y the y-coordinate of the plot |      * @param y The plot y coordinate | ||||||
|      * @return a new PlotId instance with the specified x and y coordinates |      * @return a new PlotId at x,y | ||||||
|      */ |      */ | ||||||
|     public static @NonNull PlotId of(final int x, final int y) { |     public static @NonNull PlotId of(final int x, final int y) { | ||||||
|         return new PlotId(x, y); |         return new PlotId(x, y); | ||||||
| @@ -74,13 +74,10 @@ public final class PlotId { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a PlotId object from the given string, or null if the string is invalid. |      * Attempt to parse a plot ID from a string | ||||||
|      * The string should be in the format "x;y" where x and y are integers. |  | ||||||
|      * The string can also contain any combination of the characters ";_,." |  | ||||||
|      * as delimiters. |  | ||||||
|      * |      * | ||||||
|      * @param string the string to parse |      * @param string ID string | ||||||
|      * @return a PlotId object parsed from the given string, or null if the string is invalid |      * @return Plot ID, or {@code null} if none could be parsed | ||||||
|      */ |      */ | ||||||
|     public static @Nullable PlotId fromStringOrNull(final @NonNull String string) { |     public static @Nullable PlotId fromStringOrNull(final @NonNull String string) { | ||||||
|         final String[] parts = string.split("[;_,.]"); |         final String[] parts = string.split("[;_,.]"); | ||||||
| @@ -98,39 +95,39 @@ public final class PlotId { | |||||||
|         return of(x, y); |         return of(x, y); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a new PlotId instance from the given hash. |      * Gets the PlotId from the HashCode<br> | ||||||
|  |      * Note: Only accurate for small x,z values (short) | ||||||
|      * |      * | ||||||
|      * @param hash the hash to unpair |      * @param hash ID hash | ||||||
|      * @return a new PlotId instance |      * @return Plot ID | ||||||
|      */ |      */ | ||||||
|     public static @NonNull PlotId unpair(final int hash) { |     public static @NonNull PlotId unpair(final int hash) { | ||||||
|         return PlotId.of(hash >> 16, hash & 0xFFFF); |         return PlotId.of(hash >> 16, hash & 0xFFFF); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the x-coordinate of this Plot ID. |      * Get the ID X component | ||||||
|      * |      * | ||||||
|      * @return the x-coordinate of this Plot ID |      * @return X component | ||||||
|      */ |      */ | ||||||
|     public int getX() { |     public int getX() { | ||||||
|         return this.x; |         return this.x; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the y-coordinate of this Plot ID. |      * Get the ID Y component | ||||||
|      * |      * | ||||||
|      * @return the y-coordinate of this Plot ID |      * @return Y component | ||||||
|      */ |      */ | ||||||
|     public int getY() { |     public int getY() { | ||||||
|         return this.y; |         return this.y; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the next Plot ID for claiming purposes based on the current Plot ID. |      * Get the next plot ID for claiming purposes | ||||||
|      * |      * | ||||||
|      * @return the next Plot ID |      * @return Next plot ID | ||||||
|      */ |      */ | ||||||
|     public @NonNull PlotId getNextId() { |     public @NonNull PlotId getNextId() { | ||||||
|         final int absX = Math.abs(x); |         final int absX = Math.abs(x); | ||||||
| @@ -162,11 +159,10 @@ public final class PlotId { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a new Plot ID in the specified relative direction based on the |      * Get the PlotId in a relative direction | ||||||
|      * current Plot ID. |  | ||||||
|      * |      * | ||||||
|      * @param direction the direction in which to get the relative Plot ID |      * @param direction Direction | ||||||
|      * @return the relative Plot ID |      * @return Relative plot ID | ||||||
|      */ |      */ | ||||||
|     public @NonNull PlotId getRelative(final @NonNull Direction direction) { |     public @NonNull PlotId getRelative(final @NonNull Direction direction) { | ||||||
|         return switch (direction) { |         return switch (direction) { | ||||||
| @@ -197,11 +193,10 @@ public final class PlotId { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a string representation of this Plot ID in the format "x;y". |      * Get a String representation of the plot ID where the | ||||||
|  |      * components are separated by ";" | ||||||
|      * |      * | ||||||
|      * <p> The format is {@code x + ";" + y} |      * @return {@code x + ";" + y} | ||||||
|      * |  | ||||||
|      * @return a string representation of this Plot ID |  | ||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull String toString() { |     public @NonNull String toString() { | ||||||
| @@ -209,40 +204,41 @@ public final class PlotId { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a string representation of this Plot ID with the specified separator. |      * Get a String representation of the plot ID where the | ||||||
|      * <p> |      * components are separated by a specified string | ||||||
|      * The format is {@code x + separator + y} |  | ||||||
|      * |      * | ||||||
|      * @param separator the separator to use between the X and Y coordinates |      * @param separator Separator | ||||||
|      * @return a string representation of this Plot ID with the specified separator |      * @return {@code x + separator + y} | ||||||
|      */ |      */ | ||||||
|     public @NonNull String toSeparatedString(String separator) { |     public @NonNull String toSeparatedString(String separator) { | ||||||
|         return this.getX() + separator + this.getY(); |         return this.getX() + separator + this.getY(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a string representation of this Plot ID in the format "x,y". |      * Get a String representation of the plot ID where the | ||||||
|  |      * components are separated by "," | ||||||
|      * |      * | ||||||
|      * @return a string representation of this Plot ID |      * @return {@code x + "," + y} | ||||||
|      */ |      */ | ||||||
|     public @NonNull String toCommaSeparatedString() { |     public @NonNull String toCommaSeparatedString() { | ||||||
|         return this.getX() + "," + this.getY(); |         return this.getX() + "," + this.getY(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a string representation of this Plot ID in the format "x_y". |      * Get a String representation of the plot ID where the | ||||||
|  |      * components are separated by "_" | ||||||
|      * |      * | ||||||
|      * @return a string representation of this Plot ID |      * @return {@code x + "_" + y} | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
|     public @NonNull String toUnderscoreSeparatedString() { |     public @NonNull String toUnderscoreSeparatedString() { | ||||||
|         return this.getX() + "_" + this.getY(); |         return this.getX() + "_" + this.getY(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns a string representation of this Plot ID in the format "x-y". |      * Get a String representation of the plot ID where the | ||||||
|  |      * components are separated by "-" | ||||||
|      * |      * | ||||||
|      * @return a string representation of this Plot ID |      * @return {@code x + "-" + y} | ||||||
|      */ |      */ | ||||||
|     public @NonNull String toDashSeparatedString() { |     public @NonNull String toDashSeparatedString() { | ||||||
|         return this.getX() + "-" + this.getY(); |         return this.getX() + "-" + this.getY(); | ||||||
| @@ -254,10 +250,6 @@ public final class PlotId { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * An iterator that iterates over a range of {@link PlotId}s. |  | ||||||
|      * The range is defined by a start and end {@link PlotId}. |  | ||||||
|      */ |  | ||||||
|     public static final class PlotRangeIterator implements Iterator<PlotId>, Iterable<PlotId> { |     public static final class PlotRangeIterator implements Iterator<PlotId>, Iterable<PlotId> { | ||||||
|  |  | ||||||
|         private final PlotId start; |         private final PlotId start; | ||||||
| @@ -273,13 +265,6 @@ public final class PlotId { | |||||||
|             this.y = this.start.getY(); |             this.y = this.start.getY(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * Returns a new {@link PlotRangeIterator} that iterates over the range of Plots between the specified start and end Plots (inclusive). |  | ||||||
|          * |  | ||||||
|          * @param start the starting Plot of the range |  | ||||||
|          * @param end the ending Plot of the range |  | ||||||
|          * @return a new {@link PlotRangeIterator} that iterates over the range of Plots between the specified start and end Plots (inclusive) |  | ||||||
|          */ |  | ||||||
|         public static PlotRangeIterator range(final @NonNull PlotId start, final @NonNull PlotId end) { |         public static PlotRangeIterator range(final @NonNull PlotId start, final @NonNull PlotId end) { | ||||||
|             return new PlotRangeIterator(start, end); |             return new PlotRangeIterator(start, end); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -67,25 +67,14 @@ public class PlotItemStack { | |||||||
|         return this.type; |         return this.type; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Returns the number of items in this stack. |  | ||||||
|      * Valid values range from 1-255. |  | ||||||
|      * |  | ||||||
|      * @return the amount of items in this stack |  | ||||||
|      */ |  | ||||||
|     public int getAmount() { |     public int getAmount() { | ||||||
|         return amount; |         return amount; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Returns the given name of this stack of items. The name is displayed when |  | ||||||
|      * hovering over the item. |  | ||||||
|      * |  | ||||||
|      * @return the given name of this stack of items |  | ||||||
|      */ |  | ||||||
|     public String getName() { |     public String getName() { | ||||||
|         return name; |         return name; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public String[] getLore() { |     public String[] getLore() { | ||||||
|         return lore; |         return lore; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ import com.plotsquared.core.location.Location; | |||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.flag.PlotFlag; | import com.plotsquared.core.plot.flag.PlotFlag; | ||||||
| import com.plotsquared.core.queue.QueueCoordinator; | import com.plotsquared.core.queue.QueueCoordinator; | ||||||
|  | import com.plotsquared.core.util.PlayerManager; | ||||||
| import com.plotsquared.core.util.task.TaskManager; | import com.plotsquared.core.util.task.TaskManager; | ||||||
| import com.plotsquared.core.util.task.TaskTime; | import com.plotsquared.core.util.task.TaskTime; | ||||||
| import com.sk89q.worldedit.function.pattern.Pattern; | import com.sk89q.worldedit.function.pattern.Pattern; | ||||||
| @@ -58,7 +59,6 @@ import java.util.ArrayList; | |||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.Iterator; | import java.util.Iterator; | ||||||
| import java.util.List; |  | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
| import java.util.concurrent.CompletableFuture; | import java.util.concurrent.CompletableFuture; | ||||||
| @@ -383,17 +383,13 @@ public final class PlotModificationManager { | |||||||
|         } |         } | ||||||
|         if (createSign) { |         if (createSign) { | ||||||
|             queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> { |             queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> { | ||||||
|                 List<CompletableFuture<Void>> tasks = plots.stream().map(current -> PlotSquared.platform().playerManager() |                 for (Plot current : plots) { | ||||||
|                                 .getUsernameCaption(current.getOwnerAbs()) |                     current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent( | ||||||
|                                 .thenAccept(caption -> current |                             LocaleHolder.console())); | ||||||
|                                         .getPlotModificationManager() |                 } | ||||||
|                                         .setSign(caption.getComponent(LocaleHolder.console())))) |  | ||||||
|                         .toList(); |  | ||||||
|                 CompletableFuture.allOf(tasks.toArray(CompletableFuture[]::new)).whenComplete((unused, throwable) -> { |  | ||||||
|                 if (whenDone != null) { |                 if (whenDone != null) { | ||||||
|                     TaskManager.runTask(whenDone); |                     TaskManager.runTask(whenDone); | ||||||
|                 } |                 } | ||||||
|                 }); |  | ||||||
|             })); |             })); | ||||||
|         } else if (whenDone != null) { |         } else if (whenDone != null) { | ||||||
|             queue.setCompleteTask(whenDone); |             queue.setCompleteTask(whenDone); | ||||||
|   | |||||||
| @@ -18,25 +18,9 @@ | |||||||
|  */ |  */ | ||||||
| package com.plotsquared.core.plot; | package com.plotsquared.core.plot; | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * The different types of weather that can be set for a Plot. |  | ||||||
|  */ |  | ||||||
| public enum PlotWeather { | public enum PlotWeather { | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Rainy weather conditions |  | ||||||
|      */ |  | ||||||
|     RAIN, |     RAIN, | ||||||
|     /** |  | ||||||
|      * Clear weather conditions |  | ||||||
|      */ |  | ||||||
|     CLEAR, |     CLEAR, | ||||||
|     /** |  | ||||||
|      * Use the weather of the world the plot is in |  | ||||||
|      */ |  | ||||||
|     WORLD, |     WORLD, | ||||||
|     /** |  | ||||||
|      * Turn off weather for the plot |  | ||||||
|      */ |  | ||||||
|     OFF |     OFF | ||||||
| } | } | ||||||
|   | |||||||
| @@ -29,7 +29,6 @@ import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag; | import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.BreakFlag; | import com.plotsquared.core.plot.flag.implementations.BreakFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ChatFlag; | import com.plotsquared.core.plot.flag.implementations.ChatFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ConcreteHardenFlag; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.CoralDryFlag; | import com.plotsquared.core.plot.flag.implementations.CoralDryFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.CropGrowFlag; | import com.plotsquared.core.plot.flag.implementations.CropGrowFlag; | ||||||
| @@ -42,7 +41,6 @@ import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag; | import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DoneFlag; | import com.plotsquared.core.plot.flag.implementations.DoneFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag; | import com.plotsquared.core.plot.flag.implementations.DropProtectionFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.EditSignFlag; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.EntityCapFlag; | import com.plotsquared.core.plot.flag.implementations.EntityCapFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag; | import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ExplosionFlag; | import com.plotsquared.core.plot.flag.implementations.ExplosionFlag; | ||||||
| @@ -144,7 +142,6 @@ public final class GlobalFlagContainer extends FlagContainer { | |||||||
|         this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE); |         this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE); | ||||||
|         this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE); |         this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE); | ||||||
|         this.addFlag(ChatFlag.CHAT_FLAG_TRUE); |         this.addFlag(ChatFlag.CHAT_FLAG_TRUE); | ||||||
|         this.addFlag(ConcreteHardenFlag.CONCRETE_HARDEN_TRUE); |  | ||||||
|         this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE); |         this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE); | ||||||
|         this.addFlag(CoralDryFlag.CORAL_DRY_FALSE); |         this.addFlag(CoralDryFlag.CORAL_DRY_FALSE); | ||||||
|         this.addFlag(CropGrowFlag.CROP_GROW_TRUE); |         this.addFlag(CropGrowFlag.CROP_GROW_TRUE); | ||||||
| @@ -154,7 +151,6 @@ public final class GlobalFlagContainer extends FlagContainer { | |||||||
|         this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE); |         this.addFlag(DeviceInteractFlag.DEVICE_INTERACT_FALSE); | ||||||
|         this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE); |         this.addFlag(DisablePhysicsFlag.DISABLE_PHYSICS_FALSE); | ||||||
|         this.addFlag(DropProtectionFlag.DROP_PROTECTION_FALSE); |         this.addFlag(DropProtectionFlag.DROP_PROTECTION_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(ForcefieldFlag.FORCEFIELD_FALSE); |         this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE); | ||||||
|   | |||||||
| @@ -1,39 +0,0 @@ | |||||||
| /* |  | ||||||
|  * PlotSquared, a land and world management plugin for Minecraft. |  | ||||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> |  | ||||||
|  * Copyright (C) IntellectualSites team and contributors |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| package com.plotsquared.core.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 ConcreteHardenFlag extends BooleanFlag<ConcreteHardenFlag> { |  | ||||||
|  |  | ||||||
|     public static final ConcreteHardenFlag CONCRETE_HARDEN_TRUE = new ConcreteHardenFlag(true); |  | ||||||
|     public static final ConcreteHardenFlag CONCRETE_HARDEN_FALSE = new ConcreteHardenFlag(false); |  | ||||||
|  |  | ||||||
|     private ConcreteHardenFlag(boolean value) { |  | ||||||
|         super(value, TranslatableCaption.of("flags.flag_description_concrete_harden")); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     protected ConcreteHardenFlag flagOf(@NonNull Boolean value) { |  | ||||||
|         return value ? CONCRETE_HARDEN_TRUE : CONCRETE_HARDEN_FALSE; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,41 +0,0 @@ | |||||||
| /* |  | ||||||
|  * PlotSquared, a land and world management plugin for Minecraft. |  | ||||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> |  | ||||||
|  * Copyright (C) IntellectualSites team and contributors |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  */ |  | ||||||
| package com.plotsquared.core.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 TODO |  | ||||||
|  */ |  | ||||||
| public class EditSignFlag extends BooleanFlag<EditSignFlag> { |  | ||||||
|     public static final EditSignFlag EDIT_SIGN_TRUE = new EditSignFlag(true); |  | ||||||
|     public static final EditSignFlag EDIT_SIGN_FALSE = new EditSignFlag(false); |  | ||||||
|  |  | ||||||
|     private EditSignFlag(final boolean value) { |  | ||||||
|         super(value, TranslatableCaption.of("flags.flag_description_edit_sign")); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     protected EditSignFlag flagOf(@NonNull final Boolean value) { |  | ||||||
|         return value ? EDIT_SIGN_TRUE : EDIT_SIGN_FALSE; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -183,7 +183,7 @@ public class ChunkCoordinatorBuilder { | |||||||
|      * Set whether the chunks should be allow to unload after being accessed. This should only be used where the chunks are read from |      * Set whether the chunks should be allow to unload after being accessed. This should only be used where the chunks are read from | ||||||
|      * and then written to from a separate queue where they're consequently unloaded. |      * and then written to from a separate queue where they're consequently unloaded. | ||||||
|      * |      * | ||||||
|      * @param unloadAfter if to unload chunks afterwards |      * @param unloadAfter if to unload chuns afterwards | ||||||
|      * @return this ChunkCoordinatorBuilder instance |      * @return this ChunkCoordinatorBuilder instance | ||||||
|      */ |      */ | ||||||
|     public @NonNull ChunkCoordinatorBuilder unloadAfter(final boolean unloadAfter) { |     public @NonNull ChunkCoordinatorBuilder unloadAfter(final boolean unloadAfter) { | ||||||
|   | |||||||
| @@ -42,14 +42,28 @@ public class EntityUtil { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static int capNumeral(final @NonNull String flagName) { |     private static int capNumeral(final @NonNull String flagName) { | ||||||
|         return switch (flagName) { |         int i; | ||||||
|             case "mob-cap" -> CAP_MOB; |         switch (flagName) { | ||||||
|             case "hostile-cap" -> CAP_MONSTER; |             case "mob-cap": | ||||||
|             case "animal-cap" -> CAP_ANIMAL; |                 i = CAP_MOB; | ||||||
|             case "vehicle-cap" -> CAP_VEHICLE; |                 break; | ||||||
|             case "misc-cap" -> CAP_MISC; |             case "hostile-cap": | ||||||
|             default -> CAP_ENTITY; |                 i = CAP_MONSTER; | ||||||
|         }; |                 break; | ||||||
|  |             case "animal-cap": | ||||||
|  |                 i = CAP_ANIMAL; | ||||||
|  |                 break; | ||||||
|  |             case "vehicle-cap": | ||||||
|  |                 i = CAP_VEHICLE; | ||||||
|  |                 break; | ||||||
|  |             case "misc-cap": | ||||||
|  |                 i = CAP_MISC; | ||||||
|  |                 break; | ||||||
|  |             case "entity-cap": | ||||||
|  |             default: | ||||||
|  |                 i = CAP_ENTITY; | ||||||
|  |         } | ||||||
|  |         return i; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @SuppressWarnings("unchecked") |     @SuppressWarnings("unchecked") | ||||||
|   | |||||||
| @@ -63,7 +63,6 @@ import com.plotsquared.core.plot.PlotId; | |||||||
| import com.plotsquared.core.plot.Rating; | import com.plotsquared.core.plot.Rating; | ||||||
| import com.plotsquared.core.plot.flag.PlotFlag; | import com.plotsquared.core.plot.flag.PlotFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag; | import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.EditSignFlag; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag; | import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.MobPlaceFlag; | import com.plotsquared.core.plot.flag.implementations.MobPlaceFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.PlaceFlag; | import com.plotsquared.core.plot.flag.implementations.PlaceFlag; | ||||||
| @@ -75,7 +74,6 @@ import com.plotsquared.core.util.task.TaskManager; | |||||||
| import com.sk89q.worldedit.WorldEdit; | import com.sk89q.worldedit.WorldEdit; | ||||||
| import com.sk89q.worldedit.entity.Entity; | import com.sk89q.worldedit.entity.Entity; | ||||||
| import com.sk89q.worldedit.function.pattern.Pattern; | import com.sk89q.worldedit.function.pattern.Pattern; | ||||||
| import com.sk89q.worldedit.world.block.BlockCategories; |  | ||||||
| import com.sk89q.worldedit.world.block.BlockType; | import com.sk89q.worldedit.world.block.BlockType; | ||||||
| import com.sk89q.worldedit.world.block.BlockTypes; | import com.sk89q.worldedit.world.block.BlockTypes; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| @@ -394,12 +392,6 @@ public class EventDispatcher { | |||||||
|                 if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(), false)) { |                 if (player.hasPermission(Permission.PERMISSION_ADMIN_INTERACT_OTHER.toString(), false)) { | ||||||
|                     return true; |                     return true; | ||||||
|                 } |                 } | ||||||
|                 // we check for the EditSignFlag in the PlayerSignOpenEvent again, but we must not cancel the interact event |  | ||||||
|                 // or send a message if the flag is true |  | ||||||
|                 if (BlockCategories.ALL_SIGNS != null && BlockCategories.ALL_SIGNS.contains(blockType) |  | ||||||
|                         && plot.getFlag(EditSignFlag.class)) { |  | ||||||
|                     return true; |  | ||||||
|                 } |  | ||||||
|                 if (notifyPerms) { |                 if (notifyPerms) { | ||||||
|                     player.sendMessage( |                     player.sendMessage( | ||||||
|                             TranslatableCaption.of("commandconfig.flag_tutorial_usage"), |                             TranslatableCaption.of("commandconfig.flag_tutorial_usage"), | ||||||
|   | |||||||
| @@ -28,7 +28,6 @@ import com.plotsquared.core.database.DBFunc; | |||||||
| import com.plotsquared.core.player.ConsolePlayer; | import com.plotsquared.core.player.ConsolePlayer; | ||||||
| import com.plotsquared.core.player.OfflinePlotPlayer; | import com.plotsquared.core.player.OfflinePlotPlayer; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.Plot; |  | ||||||
| import com.plotsquared.core.uuid.UUIDMapping; | import com.plotsquared.core.uuid.UUIDMapping; | ||||||
| import net.kyori.adventure.text.Component; | import net.kyori.adventure.text.Component; | ||||||
| import net.kyori.adventure.text.ComponentLike; | import net.kyori.adventure.text.ComponentLike; | ||||||
| @@ -38,7 +37,6 @@ 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.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; | ||||||
| import org.jetbrains.annotations.Contract; |  | ||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @@ -50,7 +48,6 @@ import java.util.List; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
| import java.util.concurrent.CompletableFuture; |  | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
| import java.util.function.BiConsumer; | import java.util.function.BiConsumer; | ||||||
|  |  | ||||||
| @@ -172,9 +169,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | |||||||
|      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} |      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} | ||||||
|      * @see #resolveName(UUID, boolean) |      * @see #resolveName(UUID, boolean) | ||||||
|      * @since 6.4.0 |      * @since 6.4.0 | ||||||
|      * @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)} |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(since = "7.1.0") |  | ||||||
|     public static @NonNull Caption resolveName(final @Nullable UUID owner) { |     public static @NonNull Caption resolveName(final @Nullable UUID owner) { | ||||||
|         return resolveName(owner, true); |         return resolveName(owner, true); | ||||||
|     } |     } | ||||||
| @@ -186,9 +181,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | |||||||
|      * @param blocking If the operation should block the current thread for {@link Settings.UUID#BLOCKING_TIMEOUT} milliseconds |      * @param blocking If the operation should block the current thread for {@link Settings.UUID#BLOCKING_TIMEOUT} milliseconds | ||||||
|      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} |      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} | ||||||
|      * @since 6.4.0 |      * @since 6.4.0 | ||||||
|      * @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)} |  | ||||||
|      */ |      */ | ||||||
|     @Deprecated(since = "7.1.0") |  | ||||||
|     public static @NonNull Caption resolveName(final @Nullable UUID owner, final boolean blocking) { |     public static @NonNull Caption resolveName(final @Nullable UUID owner, final boolean blocking) { | ||||||
|         if (owner == null) { |         if (owner == null) { | ||||||
|             return TranslatableCaption.of("info.none"); |             return TranslatableCaption.of("info.none"); | ||||||
| @@ -218,50 +211,6 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | |||||||
|         return StaticCaption.of(name); |         return StaticCaption.of(name); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Resolves a UUID to a formatted {@link Caption} representing the player behind the UUID. |  | ||||||
|      * Returns a {@link CompletableFuture} instead of a plain {@link UUID} as this method may query the |  | ||||||
|      * {@link com.plotsquared.core.uuid.UUIDPipeline ImpromptuUUIDPipeline}. |  | ||||||
|      * <br> |  | ||||||
|      * Special Cases: |  | ||||||
|      * <ul> |  | ||||||
|      *     <li>{@code null}: Resolves to a {@link TranslatableCaption} with the key {@code info.none}</li> |  | ||||||
|      *     <li>{@link DBFunc#EVERYONE}: Resolves to a {@link TranslatableCaption} with the key {@code info.everyone}</li> |  | ||||||
|      *     <li>{@link DBFunc#SERVER}: Resolves to a {@link TranslatableCaption} with the key {@code info.server}</li> |  | ||||||
|      * </ul> |  | ||||||
|      * <br> |  | ||||||
|      * Otherwise, if the UUID is a valid UUID and not reserved by PlotSquared itself, this method first attempts to query the |  | ||||||
|      * online players ({@link #getPlayerIfExists(UUID)}) for the specific UUID. |  | ||||||
|      * If no online player was found for that UUID, the {@link com.plotsquared.core.uuid.UUIDPipeline ImpromptuUUIDPipeline} is |  | ||||||
|      * queried to retrieve the known username |  | ||||||
|      * |  | ||||||
|      * @param uuid The UUID of the player (for example provided by {@link Plot#getOwner()} |  | ||||||
|      * @return A CompletableFuture resolving to a Caption representing the players name of the uuid |  | ||||||
|      * @since 7.1.0 |  | ||||||
|      */ |  | ||||||
|     @Contract("_->!null") |  | ||||||
|     public @NonNull CompletableFuture<Caption> getUsernameCaption(@Nullable UUID uuid) { |  | ||||||
|         if (uuid == null) { |  | ||||||
|             return CompletableFuture.completedFuture(TranslatableCaption.of("info.none")); |  | ||||||
|         } |  | ||||||
|         if (uuid.equals(DBFunc.EVERYONE)) { |  | ||||||
|             return CompletableFuture.completedFuture(TranslatableCaption.of("info.everyone")); |  | ||||||
|         } |  | ||||||
|         if (uuid.equals(DBFunc.SERVER)) { |  | ||||||
|             return CompletableFuture.completedFuture(TranslatableCaption.of("info.server")); |  | ||||||
|         } |  | ||||||
|         P player = getPlayerIfExists(uuid); |  | ||||||
|         if (player != null) { |  | ||||||
|             return CompletableFuture.completedFuture(StaticCaption.of(player.getName())); |  | ||||||
|         } |  | ||||||
|         return PlotSquared.get().getImpromptuUUIDPipeline().getNames(Collections.singleton(uuid)).thenApply(mapping -> { |  | ||||||
|             if (mapping.isEmpty()) { |  | ||||||
|                 return TranslatableCaption.of("info.unknown"); |  | ||||||
|             } |  | ||||||
|             return StaticCaption.of(mapping.get(0).username()); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Remove a player from the player map |      * Remove a player from the player map | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -83,7 +83,6 @@ import java.io.OutputStreamWriter; | |||||||
| import java.io.PrintWriter; | import java.io.PrintWriter; | ||||||
| import java.net.HttpURLConnection; | import java.net.HttpURLConnection; | ||||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||||
| import java.net.URI; |  | ||||||
| import java.net.URL; | import java.net.URL; | ||||||
| import java.net.URLConnection; | import java.net.URLConnection; | ||||||
| import java.nio.channels.Channels; | import java.nio.channels.Channels; | ||||||
| @@ -145,7 +144,7 @@ public abstract class SchematicHandler { | |||||||
|         } |         } | ||||||
|         final URL url; |         final URL url; | ||||||
|         try { |         try { | ||||||
|             url = URI.create(Settings.Web.URL + "?key=" + uuid + "&type=" + extension).toURL(); |             url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension); | ||||||
|         } catch (MalformedURLException e) { |         } catch (MalformedURLException e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|             whenDone.run(); |             whenDone.run(); | ||||||
| @@ -154,7 +153,7 @@ public abstract class SchematicHandler { | |||||||
|         TaskManager.runTaskAsync(() -> { |         TaskManager.runTaskAsync(() -> { | ||||||
|             try { |             try { | ||||||
|                 String boundary = Long.toHexString(System.currentTimeMillis()); |                 String boundary = Long.toHexString(System.currentTimeMillis()); | ||||||
|                 URLConnection con = URI.create(website).toURL().openConnection(); |                 URLConnection con = new URL(website).openConnection(); | ||||||
|                 con.setDoOutput(true); |                 con.setDoOutput(true); | ||||||
|                 con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); |                 con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); | ||||||
|                 try (OutputStream output = con.getOutputStream(); |                 try (OutputStream output = con.getOutputStream(); | ||||||
| @@ -499,10 +498,9 @@ public abstract class SchematicHandler { | |||||||
|     public List<String> getSaves(UUID uuid) { |     public List<String> getSaves(UUID uuid) { | ||||||
|         String rawJSON; |         String rawJSON; | ||||||
|         try { |         try { | ||||||
|             URLConnection connection = URI.create( |             String website = Settings.Web.URL + "list.php?" + uuid.toString(); | ||||||
|                     Settings.Web.URL + "list.php?" + uuid.toString()) |             URL url = new URL(website); | ||||||
|                     .toURL() |             URLConnection connection = new URL(url.toString()).openConnection(); | ||||||
|                     .openConnection(); |  | ||||||
|             connection.setRequestProperty("User-Agent", "Mozilla/5.0"); |             connection.setRequestProperty("User-Agent", "Mozilla/5.0"); | ||||||
|             try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { |             try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { | ||||||
|                 rawJSON = reader.lines().collect(Collectors.joining()); |                 rawJSON = reader.lines().collect(Collectors.joining()); | ||||||
|   | |||||||
| @@ -173,7 +173,7 @@ public final class TabCompletions { | |||||||
|             return Collections.emptyList(); |             return Collections.emptyList(); | ||||||
|         } |         } | ||||||
|         final List<String> commands = new ArrayList<>(); |         final List<String> commands = new ArrayList<>(); | ||||||
|         for (int i = offset; i <= highestLimit && (offset - i + amountLimit) > 0; i++) { |         for (int i = offset; i < highestLimit && (offset - i + amountLimit) > 0; i++) { | ||||||
|             commands.add(String.valueOf(i)); |             commands.add(String.valueOf(i)); | ||||||
|         } |         } | ||||||
|         return asCompletions(commands.toArray(new String[0])); |         return asCompletions(commands.toArray(new String[0])); | ||||||
|   | |||||||
| @@ -47,7 +47,6 @@ import java.util.Locale; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.TimeZone; | import java.util.TimeZone; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
| import java.util.concurrent.TimeUnit; |  | ||||||
| import java.util.function.BiFunction; | import java.util.function.BiFunction; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -110,9 +109,9 @@ public final class PlaceholderRegistry { | |||||||
|             if (plotOwner == null) { |             if (plotOwner == null) { | ||||||
|                 return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player); |                 return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             try { |             try { | ||||||
|                 return PlotSquared.platform().playerManager().getUsernameCaption(plotOwner) |                 return PlayerManager.resolveName(plotOwner, false).getComponent(player); | ||||||
|                         .get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS).getComponent(player); |  | ||||||
|             } catch (final Exception ignored) { |             } catch (final Exception ignored) { | ||||||
|             } |             } | ||||||
|             return legacyComponent(TranslatableCaption.of("info.unknown"), player); |             return legacyComponent(TranslatableCaption.of("info.unknown"), player); | ||||||
| @@ -188,7 +187,6 @@ 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())); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -551,11 +551,9 @@ | |||||||
|   "flags.flag_description_block_burn": "<gray>Set to `true` to allow blocks to burn within the plot.</gray>", |   "flags.flag_description_block_burn": "<gray>Set to `true` to allow blocks to burn within the plot.</gray>", | ||||||
|   "flags.flag_description_block_ignition": "<gray>Set to `false` to prevent blocks from igniting within the plot.</gray>", |   "flags.flag_description_block_ignition": "<gray>Set to `false` to prevent blocks from igniting within the plot.</gray>", | ||||||
|   "flags.flag_description_break": "<gray>Define a list of materials players should be able to break even when they aren't added to the plot.</gray>", |   "flags.flag_description_break": "<gray>Define a list of materials players should be able to break even when they aren't added to the plot.</gray>", | ||||||
|   "flags.flag_description_concrete_harden": "<gray>Set to `false` to disable concrete powder forming to concrete with water.</gray>", |  | ||||||
|   "flags.flag_description_device_interact": "<gray>Set to `true` to allow devices to be interacted with in the plot.</gray>", |   "flags.flag_description_device_interact": "<gray>Set to `true` to allow devices to be interacted with in the plot.</gray>", | ||||||
|   "flags.flag_description_disable_physics": "<gray>Set to `true` to disable block physics in the plot.</gray>", |   "flags.flag_description_disable_physics": "<gray>Set to `true` to disable block physics in 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_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_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_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>", | ||||||
| @@ -633,8 +631,6 @@ | |||||||
|   "flags.flag_error_double": "Flag value must be a decimal number.", |   "flags.flag_error_double": "Flag value must be a decimal number.", | ||||||
|   "flags.flag_error_music": "Flag value must be a valid music disc ID.", |   "flags.flag_error_music": "Flag value must be a valid music disc ID.", | ||||||
|   "flags.flag_error_title": "Flag value must be in the format </red><grey>\"A title\" \"The subtitle\"</grey><red>.", |   "flags.flag_error_title": "Flag value must be in the format </red><grey>\"A title\" \"The subtitle\"</grey><red>.", | ||||||
|   "flags.delaying_loading_area_flags": "<prefix><gray>Delaying loading flags for area `</gray><dark_aqua><area></dark_aqua><gray>` as WorldEdit is not initialised yet.</gray>", |  | ||||||
|   "flags.loading_area_flags": "<prefix><gray>Loading flags for area: </gray><dark_aqua><area></dark_aqua>", |  | ||||||
|   "flags.area_flags": "<prefix><gray>Area flags: </gray><dark_aqua><flags></dark_aqua>", |   "flags.area_flags": "<prefix><gray>Area flags: </gray><dark_aqua><flags></dark_aqua>", | ||||||
|   "flags.road_flags": "<prefix><gray>Road flags: </gray><dark_aqua><flags></dark_aqua>", |   "flags.road_flags": "<prefix><gray>Road flags: </gray><dark_aqua><flags></dark_aqua>", | ||||||
|   "commands.description.add": "<gray>Allow a user to build in a plot while the plot owner is online.</gray>", |   "commands.description.add": "<gray>Allow a user to build in a plot while the plot owner is online.</gray>", | ||||||
|   | |||||||
| @@ -1,8 +1,7 @@ | |||||||
| import com.diffplug.gradle.spotless.SpotlessPlugin | import com.diffplug.gradle.spotless.SpotlessPlugin | ||||||
| import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin | import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin | ||||||
| import groovy.json.JsonSlurper |  | ||||||
| import xyz.jpenilla.runpaper.task.RunServer |  | ||||||
| import java.net.URI | import java.net.URI | ||||||
|  | import xyz.jpenilla.runpaper.task.RunServer | ||||||
|  |  | ||||||
| plugins { | plugins { | ||||||
|     java |     java | ||||||
| @@ -22,7 +21,7 @@ plugins { | |||||||
| } | } | ||||||
|  |  | ||||||
| group = "com.intellectualsites.plotsquared" | group = "com.intellectualsites.plotsquared" | ||||||
| version = "7.2.1-SNAPSHOT" | version = "7.0.1-SNAPSHOT" | ||||||
|  |  | ||||||
| if (!File("$rootDir/.git").exists()) { | if (!File("$rootDir/.git").exists()) { | ||||||
|     logger.lifecycle(""" |     logger.lifecycle(""" | ||||||
| @@ -79,8 +78,7 @@ subprojects { | |||||||
|  |  | ||||||
|     dependencies { |     dependencies { | ||||||
|         // Tests |         // Tests | ||||||
|         testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") |         testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") | ||||||
|         testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.1") |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     plugins.withId("java") { |     plugins.withId("java") { | ||||||
| @@ -151,34 +149,29 @@ subprojects { | |||||||
|                             id.set("Sauilitired") |                             id.set("Sauilitired") | ||||||
|                             name.set("Alexander Söderberg") |                             name.set("Alexander Söderberg") | ||||||
|                             organization.set("IntellectualSites") |                             organization.set("IntellectualSites") | ||||||
|                             organizationUrl.set("https://github.com/IntellectualSites") |  | ||||||
|                         } |                         } | ||||||
|                         developer { |                         developer { | ||||||
|                             id.set("NotMyFault") |                             id.set("NotMyFault") | ||||||
|                             name.set("Alexander Brandes") |                             name.set("Alexander Brandes") | ||||||
|                             organization.set("IntellectualSites") |                             organization.set("IntellectualSites") | ||||||
|                             organizationUrl.set("https://github.com/IntellectualSites") |  | ||||||
|                             email.set("contact(at)notmyfault.dev") |                             email.set("contact(at)notmyfault.dev") | ||||||
|                         } |                         } | ||||||
|                         developer { |                         developer { | ||||||
|                             id.set("SirYwell") |                             id.set("SirYwell") | ||||||
|                             name.set("Hannes Greule") |                             name.set("Hannes Greule") | ||||||
|                             organization.set("IntellectualSites") |                             organization.set("IntellectualSites") | ||||||
|                             organizationUrl.set("https://github.com/IntellectualSites") |  | ||||||
|                         } |                         } | ||||||
|                         developer { |                         developer { | ||||||
|                             id.set("dordsor21") |                             id.set("dordsor21") | ||||||
|                             name.set("dordsor21") |                             name.set("dordsor21") | ||||||
|                             organization.set("IntellectualSites") |                             organization.set("IntellectualSites") | ||||||
|                             organizationUrl.set("https://github.com/IntellectualSites") |  | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     scm { |                     scm { | ||||||
|                         url.set("https://github.com/IntellectualSites/PlotSquared") |                         url.set("https://github.com/IntellectualSites/PlotSquared") | ||||||
|                         connection.set("scm:git:https://github.com/IntellectualSites/PlotSquared.git") |                         connection.set("scm:https://IntellectualSites@github.com/IntellectualSites/PlotSquared.git") | ||||||
|                         developerConnection.set("scm:git:git@github.com:IntellectualSites/PlotSquared.git") |                         developerConnection.set("scm:git://github.com/IntellectualSites/PlotSquared.git") | ||||||
|                         tag.set("${project.version}") |  | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     issueManagement { |                     issueManagement { | ||||||
| @@ -225,28 +218,14 @@ 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.2") | val supportedVersions = listOf("1.16.5", "1.17", "1.17.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", "1.20") | ||||||
| tasks { | tasks { | ||||||
|     register("cacheLatestFaweArtifact") { |  | ||||||
|         val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL() |  | ||||||
|         val artifact = ((JsonSlurper().parse(lastSuccessfulBuildUrl) as Map<*, *>)["artifacts"] as List<*>) |  | ||||||
|                 .map { it as Map<*, *> } |  | ||||||
|                 .map { it["fileName"] as String } |  | ||||||
|                 .first { it -> it.contains("Bukkit") } |  | ||||||
|         project.ext["faweArtifact"] = artifact |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     supportedVersions.forEach { |     supportedVersions.forEach { | ||||||
|         register<RunServer>("runServer-$it") { |         register<RunServer>("runServer-$it") { | ||||||
|             dependsOn(getByName("cacheLatestFaweArtifact")) |  | ||||||
|             minecraftVersion(it) |             minecraftVersion(it) | ||||||
|             pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false) |             pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false).map { (it as Jar).archiveFile } | ||||||
|                     .map { task -> (task as Jar).archiveFile } |  | ||||||
|                     .toTypedArray()) |                     .toTypedArray()) | ||||||
|             jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true") |             jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true") | ||||||
|             downloadPlugins { |  | ||||||
|                 url("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/artifact/artifacts/${project.ext["faweArtifact"]}") |  | ||||||
|             } |  | ||||||
|             group = "run paper" |             group = "run paper" | ||||||
|             runDirectory.set(file("run-$it")) |             runDirectory.set(file("run-$it")) | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1,20 +1,20 @@ | |||||||
| [versions] | [versions] | ||||||
| # Platform expectations | # Platform expectations | ||||||
| paper = "1.20.2-R0.1-SNAPSHOT" | paper = "1.20.1-R0.1-SNAPSHOT" | ||||||
| guice = "7.0.0" | guice = "7.0.0" | ||||||
| spotbugs = "4.8.2" | spotbugs = "4.7.3" | ||||||
| checkerqual = "3.40.0" | checkerqual = "3.37.0" | ||||||
| gson = "2.10" | gson = "2.10" | ||||||
| guava = "31.1-jre" | guava = "31.1-jre" | ||||||
| snakeyaml = "2.0" | snakeyaml = "2.0" | ||||||
| adventure = "4.14.0" | adventure = "4.14.0" | ||||||
| adventure-bukkit = "4.3.1" | adventure-bukkit = "4.3.0" | ||||||
| log4j = "2.19.0" | log4j = "2.19.0" | ||||||
|  |  | ||||||
| # Plugins | # Plugins | ||||||
| worldedit = "7.2.17" | worldedit = "7.2.15" | ||||||
| fawe = "2.8.2" | fawe = "2.7.0" | ||||||
| placeholderapi = "2.11.5" | placeholderapi = "2.11.3" | ||||||
| luckperms = "5.4" | luckperms = "5.4" | ||||||
| essentialsx = "2.20.1" | essentialsx = "2.20.1" | ||||||
| mvdwapi = "3.1.1" | mvdwapi = "3.1.1" | ||||||
| @@ -22,22 +22,22 @@ mvdwapi = "3.1.1" | |||||||
| # Third party | # Third party | ||||||
| prtree = "2.0.1" | prtree = "2.0.1" | ||||||
| aopalliance = "1.0" | aopalliance = "1.0" | ||||||
| cloud-services = "1.8.4" | cloud-services = "1.8.3" | ||||||
| arkitektonika = "2.1.2" | arkitektonika = "2.1.2" | ||||||
| squirrelid = "0.3.2" | squirrelid = "0.3.2" | ||||||
| paster = "1.1.5" | paster = "1.1.5" | ||||||
| bstats = "3.0.2" | bstats = "3.0.2" | ||||||
| paperlib = "1.0.8" | paperlib = "1.0.8" | ||||||
| informative-annotations = "1.4" | informative-annotations = "1.3" | ||||||
| vault = "1.7.1" | vault = "1.7.1" | ||||||
| serverlib = "2.3.4" | serverlib = "2.3.4" | ||||||
|  |  | ||||||
| # Gradle plugins | # Gradle plugins | ||||||
| shadow = "8.1.1" | shadow = "8.1.1" | ||||||
| grgit = "4.1.1" | grgit = "4.1.1" | ||||||
| spotless = "6.23.2" | spotless = "6.20.0" | ||||||
| nexus = "1.3.0" | nexus = "1.3.0" | ||||||
| runPaper = "2.2.2" | runPaper = "2.1.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.5-bin.zip | distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip | ||||||
| networkTimeout=10000 | networkTimeout=10000 | ||||||
| validateDistributionUrl=true | validateDistributionUrl=true | ||||||
| zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -145,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | |||||||
|     case $MAX_FD in #( |     case $MAX_FD in #( | ||||||
|       max*) |       max*) | ||||||
|         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. |         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | ||||||
|         # shellcheck disable=SC2039,SC3045 |         # shellcheck disable=SC3045 | ||||||
|         MAX_FD=$( ulimit -H -n ) || |         MAX_FD=$( ulimit -H -n ) || | ||||||
|             warn "Could not query maximum file descriptor limit" |             warn "Could not query maximum file descriptor limit" | ||||||
|     esac |     esac | ||||||
| @@ -153,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | |||||||
|       '' | soft) :;; #( |       '' | soft) :;; #( | ||||||
|       *) |       *) | ||||||
|         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. |         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | ||||||
|         # shellcheck disable=SC2039,SC3045 |         # shellcheck disable=SC3045 | ||||||
|         ulimit -n "$MAX_FD" || |         ulimit -n "$MAX_FD" || | ||||||
|             warn "Could not set maximum file descriptor limit to $MAX_FD" |             warn "Could not set maximum file descriptor limit to $MAX_FD" | ||||||
|     esac |     esac | ||||||
| @@ -202,11 +202,11 @@ fi | |||||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||||
|  |  | ||||||
| # Collect all arguments for the java command: | # Collect all arguments for the java command; | ||||||
| #   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, | #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of | ||||||
| #     and any embedded shellness will be escaped. | #     shell script including quotes and variable substitutions, so put them in | ||||||
| #   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be | #     double quotes to make sure that they get re-expanded; and | ||||||
| #     treated as '${Hostname}' itself on the command line. | #   * put everything else in single quotes, so that it's not re-expanded. | ||||||
|  |  | ||||||
| set -- \ | set -- \ | ||||||
|         "-Dorg.gradle.appname=$APP_BASE_NAME" \ |         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user