mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-30 17:13:43 +01:00 
			
		
		
		
	Compare commits
	
		
			37 Commits
		
	
	
		
			remove-coc
			...
			ammend-40c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 90598938dd | ||
|   | bb4bde5211 | ||
|   | 40c70aa98d | ||
|   | 0d2b36bac8 | ||
|   | d7e5bcdaa5 | ||
|   | fc783574a3 | ||
|   | 5f7bb784f0 | ||
|   | 26c55a318f | ||
|   | ee68bc3d9e | ||
|   | a3bc3968a5 | ||
|   | 79454da1a6 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 12a4c92ad9 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 167692d464 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ae26e8155c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 286ea62a21 | ||
|   | d95c74d8c9 | ||
|   | c1555ddbc7 | ||
|   | 4fe0c586d9 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | aae6ea4fee | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 385d018504 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | f4def082c1 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 69c9f1df83 | ||
|   | e138dc0267 | ||
|   | ca50b53f94 | ||
|   | f705487055 | ||
|   | b7c9453a1a | ||
|   | 1aa370d562 | ||
|   | d3dab0d736 | ||
|   | 764156b267 | ||
|   | 665f5251bf | ||
|   | 7c328095d7 | ||
|   | 7884c91d52 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | e9a19e0821 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 022847fc4b | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 1ee673be58 | ||
|   | 3c2aa99e86 | ||
|   | 11fac3f060 | 
							
								
								
									
										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. | ||||
|       multiple: false | ||||
|       options: | ||||
|         - '1.20.1' | ||||
|         - '1.20.2' | ||||
|         - '1.20' | ||||
|         - '1.19.4' | ||||
|         - '1.19.3' | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,7 +9,7 @@ jobs: | ||||
|         os: [ ubuntu-latest, windows-latest, macos-latest ] | ||||
|     steps: | ||||
|       - name: Checkout Repository | ||||
|         uses: actions/checkout@v3 | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Validate Gradle Wrapper | ||||
|         uses: gradle/wrapper-validation-action@v1 | ||||
|       - name: Setup Java | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,7 +9,7 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout Repository | ||||
|         uses: actions/checkout@v3 | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Validate Gradle Wrapper | ||||
|         uses: gradle/wrapper-validation-action@v1 | ||||
|       - name: Setup Java | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							| @@ -20,7 +20,7 @@ jobs: | ||||
|         language: [ 'java' ] | ||||
|     steps: | ||||
|       - name: Checkout repository | ||||
|         uses: actions/checkout@v3 | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Setup Java | ||||
|         uses: actions/setup-java@v3 | ||||
|         with: | ||||
|   | ||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -138,6 +138,5 @@ build/ | ||||
|  | ||||
| .DS_Store | ||||
| # Ignore run folders | ||||
| run-[0-0].[0-9]/ | ||||
| run-[0-0].[0-9].[0-9]/ | ||||
|  | ||||
| run-[0-9].[0-9][0-9]/ | ||||
| run-[0-9].[0-9][0-9].[0-9]/ | ||||
|   | ||||
| @@ -100,7 +100,7 @@ tasks { | ||||
|     withType<Javadoc> { | ||||
|         val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString() | ||||
|         val opt = options as StandardJavadocDocletOptions | ||||
|         opt.links("https://jd.papermc.io/paper/1.19/") | ||||
|         opt.links("https://jd.papermc.io/paper/1.20/") | ||||
|         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://jd.advntr.dev/api/4.14.0/") | ||||
|   | ||||
| @@ -252,6 +252,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     public void onEnable() { | ||||
|         this.pluginName = getDescription().getName(); | ||||
|  | ||||
| @@ -550,7 +551,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|         this.startMetrics(); | ||||
|  | ||||
|         if (Settings.Enabled_Components.WORLDS) { | ||||
|             TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L)); | ||||
|             TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L)); | ||||
|             try { | ||||
|                 singleWorldListener = injector().getInstance(SingleWorldListener.class); | ||||
|                 Bukkit.getPluginManager().registerEvents(singleWorldListener, this); | ||||
| @@ -1160,6 +1161,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|         return new BukkitPlotGenerator(world, generator, this.plotAreaManager); | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     @Override | ||||
|     public @NonNull String pluginsFormatted() { | ||||
|         StringBuilder msg = new StringBuilder(); | ||||
| @@ -1181,7 +1183,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @SuppressWarnings("ConstantConditions") | ||||
|     @SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation | ||||
|     public @NonNull String worldEditImplementations() { | ||||
|         StringBuilder msg = new StringBuilder(); | ||||
|         if (Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null) { | ||||
|   | ||||
| @@ -74,6 +74,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { | ||||
|     private HorseStats horse; | ||||
|     private boolean noGravity; | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Deprecation exists since 1.20, while we support 1.16 onwards | ||||
|     public ReplicatingEntityWrapper(Entity entity, short depth) { | ||||
|         super(entity); | ||||
|  | ||||
|   | ||||
| @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.PlotArea; | ||||
| import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag; | ||||
| 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.CropGrowFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag; | ||||
| @@ -586,6 +587,12 @@ public class BlockEventListener implements Listener { | ||||
|                 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) | ||||
|   | ||||
| @@ -369,6 +369,7 @@ public class PlayerEventListener implements Listener { | ||||
|     } | ||||
|  | ||||
|     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     public void onConnect(PlayerJoinEvent event) { | ||||
|         final Player player = event.getPlayer(); | ||||
|         PlotSquared.platform().playerManager().removePlayer(player.getUniqueId()); | ||||
| @@ -733,6 +734,7 @@ public class PlayerEventListener implements Listener { | ||||
|     } | ||||
|  | ||||
|     @EventHandler(priority = EventPriority.LOW) | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     public void onChat(AsyncPlayerChatEvent event) { | ||||
|         if (event.isCancelled()) { | ||||
|             return; | ||||
| @@ -1063,6 +1065,7 @@ public class PlayerEventListener implements Listener { | ||||
|     } | ||||
|  | ||||
|     @EventHandler(priority = EventPriority.LOW) | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     public void onCancelledInteract(PlayerInteractEvent event) { | ||||
|         if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) { | ||||
|             Player player = event.getPlayer(); | ||||
|   | ||||
| @@ -44,6 +44,7 @@ import java.util.stream.IntStream; | ||||
| @Singleton | ||||
| public class BukkitInventoryUtil extends InventoryUtil { | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     private static @Nullable ItemStack getItem(PlotItemStack item) { | ||||
|         if (item == null) { | ||||
|             return null; | ||||
|   | ||||
| @@ -67,6 +67,7 @@ public class BukkitSetupUtils extends SetupUtils { | ||||
|         this.worldFile = worldFile; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("deprecation") // Paper deprecation | ||||
|     @Override | ||||
|     public void updateGenerators(final boolean force) { | ||||
|         if (loaded && !SetupUtils.generators.isEmpty() && !force) { | ||||
|   | ||||
| @@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask; | ||||
| import javax.net.ssl.HttpsURLConnection; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.net.URL; | ||||
| import java.net.URI; | ||||
|  | ||||
| public class UpdateUtility implements Listener { | ||||
|  | ||||
| @@ -59,8 +59,9 @@ public class UpdateUtility implements Listener { | ||||
|     public void updateChecker() { | ||||
|         task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> { | ||||
|             try { | ||||
|                 HttpsURLConnection connection = (HttpsURLConnection) new URL( | ||||
|                         "https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506") | ||||
|                 HttpsURLConnection connection = (HttpsURLConnection) URI.create( | ||||
|                         "https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506") | ||||
|                         .toURL() | ||||
|                         .openConnection(); | ||||
|                 connection.setRequestMethod("GET"); | ||||
|                 JsonObject result = new JsonParser() | ||||
|   | ||||
| @@ -1,76 +0,0 @@ | ||||
| # Contributor Covenant Code of Conduct | ||||
|  | ||||
| ## Our Pledge | ||||
|  | ||||
| In the interest of fostering an open and welcoming environment, we as | ||||
| contributors and maintainers pledge to making participation in our project and | ||||
| our community a harassment-free experience for everyone, regardless of age, body | ||||
| size, disability, ethnicity, sex characteristics, gender identity and expression, | ||||
| level of experience, education, socio-economic status, nationality, personal | ||||
| appearance, race, religion, or sexual identity and orientation. | ||||
|  | ||||
| ## Our Standards | ||||
|  | ||||
| Examples of behavior that contributes to creating a positive environment | ||||
| include: | ||||
|  | ||||
| * Using welcoming and inclusive language | ||||
| * Being respectful of differing viewpoints and experiences | ||||
| * Gracefully accepting constructive criticism | ||||
| * Focusing on what is best for the community | ||||
| * Showing empathy towards other community members | ||||
|  | ||||
| Examples of unacceptable behavior by participants include: | ||||
|  | ||||
| * The use of sexualized language or imagery and unwelcome sexual attention or | ||||
|   advances | ||||
| * Trolling, insulting/derogatory comments, and personal or political attacks | ||||
| * Public or private harassment | ||||
| * Publishing others' private information, such as a physical or electronic | ||||
|   address, without explicit permission | ||||
| * Other conduct which could reasonably be considered inappropriate in a | ||||
|   professional setting | ||||
|  | ||||
| ## Our Responsibilities | ||||
|  | ||||
| Project maintainers are responsible for clarifying the standards of acceptable | ||||
| behavior and are expected to take appropriate and fair corrective action in | ||||
| response to any instances of unacceptable behavior. | ||||
|  | ||||
| Project maintainers have the right and responsibility to remove, edit, or | ||||
| reject comments, commits, code, wiki edits, issues, and other contributions | ||||
| that are not aligned to this Code of Conduct, or to ban temporarily or | ||||
| permanently any contributor for other behaviors that they deem inappropriate, | ||||
| threatening, offensive, or harmful. | ||||
|  | ||||
| ## Scope | ||||
|  | ||||
| This Code of Conduct applies both within project spaces and in public spaces | ||||
| when an individual is representing the project or its community. Examples of | ||||
| representing a project or community include using an official project e-mail | ||||
| address, posting via an official social media account, or acting as an appointed | ||||
| representative at an online or offline event. Representation of a project may be | ||||
| further defined and clarified by project maintainers. | ||||
|  | ||||
| ## Enforcement | ||||
|  | ||||
| Instances of abusive, harassing, or otherwise unacceptable behavior may be | ||||
| reported by contacting the project team at contact<at>intellectualsites.com. All | ||||
| complaints will be reviewed and investigated and will result in a response that | ||||
| is deemed necessary and appropriate to the circumstances. The project team is | ||||
| obligated to maintain confidentiality with regard to the reporter of an incident. | ||||
| Further details of specific enforcement policies may be posted separately. | ||||
|  | ||||
| Project maintainers who do not follow or enforce the Code of Conduct in good | ||||
| faith may face temporary or permanent repercussions as determined by other | ||||
| members of the project's leadership. | ||||
|  | ||||
| ## Attribution | ||||
|  | ||||
| This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, | ||||
| available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html | ||||
|  | ||||
| [homepage]: https://www.contributor-covenant.org | ||||
|  | ||||
| For answers to common questions about this code of conduct, see | ||||
| https://www.contributor-covenant.org/faq | ||||
| @@ -57,8 +57,8 @@ tasks.processResources { | ||||
|  | ||||
|     doLast { | ||||
|         copy { | ||||
|             from(File("$rootDir/LICENSE")) | ||||
|             into("$buildDir/resources/main/") | ||||
|             from(layout.buildDirectory.file("$rootDir/LICENSE")) | ||||
|             into(layout.buildDirectory.dir("resources/main")) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -72,7 +72,7 @@ tasks { | ||||
|         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://checkerframework.org/api/") | ||||
|         opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/") | ||||
|         opt.links("https://javadocs.dev/com.intellectualsites.informative-annotations/informative-annotations/latest") | ||||
|         opt.isLinkSource = true | ||||
|         opt.bottom(File("$rootDir/javadocfooter.html").readText()) | ||||
|         opt.isUse = true | ||||
|   | ||||
| @@ -84,7 +84,7 @@ import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.ObjectInputStream; | ||||
| import java.io.ObjectOutputStream; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URI; | ||||
| import java.net.URISyntaxException; | ||||
| import java.net.URL; | ||||
| import java.nio.file.Files; | ||||
| @@ -210,9 +210,10 @@ public class PlotSquared { | ||||
|             try { | ||||
|                 URL logurl = PlotSquared.class.getProtectionDomain().getCodeSource().getLocation(); | ||||
|                 this.jarFile = new File( | ||||
|                         new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file")) | ||||
|                                 .toURI().getPath()); | ||||
|             } catch (MalformedURLException | URISyntaxException | SecurityException e) { | ||||
|                         URI.create( | ||||
|                                 logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file")) | ||||
|                                 .getPath()); | ||||
|             } catch (URISyntaxException | SecurityException e) { | ||||
|                 e.printStackTrace(); | ||||
|                 this.jarFile = new File(this.platform.getDirectory().getParentFile(), "PlotSquared.jar"); | ||||
|                 if (!this.jarFile.exists()) { | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
| package com.plotsquared.core.command; | ||||
|  | ||||
| import com.google.inject.Inject; | ||||
| import com.plotsquared.core.PlotSquared; | ||||
| import com.plotsquared.core.configuration.Settings; | ||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.database.DBFunc; | ||||
| @@ -101,9 +102,14 @@ public class Add extends Command { | ||||
|                                 Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { | ||||
|                             player.sendMessage( | ||||
|                                     TranslatableCaption.of("errors.invalid_player"), | ||||
|                                     TagResolver.resolver("value", Tag.inserting( | ||||
|                                             PlayerManager.resolveName(uuid).toComponent(player) | ||||
|                                     )) | ||||
|                                     PlotSquared | ||||
|                                             .platform() | ||||
|                                             .playerManager() | ||||
|                                             .getUsernameCaption(uuid) | ||||
|                                             .thenApply(caption -> TagResolver.resolver( | ||||
|                                                     "value", | ||||
|                                                     Tag.inserting(caption.toComponent(player)) | ||||
|                                             )) | ||||
|                             ); | ||||
|                             iterator.remove(); | ||||
|                             continue; | ||||
| @@ -111,9 +117,11 @@ public class Add extends Command { | ||||
|                         if (plot.isOwner(uuid)) { | ||||
|                             player.sendMessage( | ||||
|                                     TranslatableCaption.of("member.already_added"), | ||||
|                                     TagResolver.resolver("player", Tag.inserting( | ||||
|                                             PlayerManager.resolveName(uuid).toComponent(player) | ||||
|                                     )) | ||||
|                                     PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                             .thenApply(caption -> TagResolver.resolver( | ||||
|                                                     "player", | ||||
|                                                     Tag.inserting(caption.toComponent(player)) | ||||
|                                             )) | ||||
|                             ); | ||||
|                             iterator.remove(); | ||||
|                             continue; | ||||
| @@ -121,9 +129,11 @@ public class Add extends Command { | ||||
|                         if (plot.getMembers().contains(uuid)) { | ||||
|                             player.sendMessage( | ||||
|                                     TranslatableCaption.of("member.already_added"), | ||||
|                                     TagResolver.resolver("player", Tag.inserting( | ||||
|                                             PlayerManager.resolveName(uuid).toComponent(player) | ||||
|                                     )) | ||||
|                                     PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                             .thenApply(caption -> TagResolver.resolver( | ||||
|                                                     "player", | ||||
|                                                     Tag.inserting(caption.toComponent(player)) | ||||
|                                             )) | ||||
|                             ); | ||||
|                             iterator.remove(); | ||||
|                             continue; | ||||
|   | ||||
| @@ -25,6 +25,7 @@ import com.plotsquared.core.player.PlotPlayer; | ||||
| import net.kyori.adventure.text.Component; | ||||
| import net.kyori.adventure.text.minimessage.MiniMessage; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
|  | ||||
| /** | ||||
|  * CommandCategory. | ||||
| @@ -82,7 +83,7 @@ public enum CommandCategory implements Caption { | ||||
|     // TODO this method shouldn't be invoked | ||||
|     @Deprecated | ||||
|     @Override | ||||
|     public String toString() { | ||||
|     public @NotNull String toString() { | ||||
|         return this.caption.getComponent(LocaleHolder.console()); | ||||
|     } | ||||
|  | ||||
| @@ -108,4 +109,5 @@ public enum CommandCategory implements Caption { | ||||
|         return !MainCommand.getInstance().getCommands(this, player).isEmpty(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -117,10 +117,11 @@ public class Deny extends SubCommand { | ||||
|                     } else if (plot.getDenied().contains(uuid)) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("member.already_added"), | ||||
|                                 TagResolver.resolver( | ||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                         .thenApply(caption -> TagResolver.resolver( | ||||
|                                         "player", | ||||
|                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||
|                                 ) | ||||
|                                         Tag.inserting(caption.toComponent(player)) | ||||
|                                 )) | ||||
|                         ); | ||||
|                         return; | ||||
|                     } else { | ||||
|   | ||||
| @@ -517,6 +517,7 @@ public class ListCmd extends SubCommand { | ||||
|                     } | ||||
|                 } | ||||
|                 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.setTagResolvers(finalResolver.build()); | ||||
|             } | ||||
|   | ||||
| @@ -41,6 +41,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URI; | ||||
| import java.net.URL; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| @@ -116,7 +117,7 @@ public class Load extends SubCommand { | ||||
|                     } | ||||
|                     final URL url; | ||||
|                     try { | ||||
|                         url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic); | ||||
|                         url = URI.create(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic).toURL(); | ||||
|                     } catch (MalformedURLException e) { | ||||
|                         e.printStackTrace(); | ||||
|                         player.sendMessage(TranslatableCaption.of("web.load_failed")); | ||||
|   | ||||
| @@ -31,7 +31,6 @@ import com.plotsquared.core.player.PlayerMetaDataKeys; | ||||
| import com.plotsquared.core.player.PlotPlayer; | ||||
| import com.plotsquared.core.plot.Plot; | ||||
| import com.plotsquared.core.util.EventDispatcher; | ||||
| import com.plotsquared.core.util.PlayerManager; | ||||
| import com.plotsquared.core.util.TabCompletions; | ||||
| import com.plotsquared.core.util.task.TaskManager; | ||||
| import net.kyori.adventure.text.Component; | ||||
| @@ -136,10 +135,11 @@ public class Owner extends SetCommand { | ||||
|             if (plot.isOwner(uuid)) { | ||||
|                 player.sendMessage( | ||||
|                         TranslatableCaption.of("member.already_owner"), | ||||
|                         TagResolver.resolver( | ||||
|                         PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                 .thenApply(caption -> TagResolver.resolver( | ||||
|                                 "player", | ||||
|                                 Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player)) | ||||
|                         ) | ||||
|                                 Tag.inserting(caption.toComponent(player)) | ||||
|                         )) | ||||
|                 ); | ||||
|                 return; | ||||
|             } | ||||
| @@ -147,10 +147,11 @@ public class Owner extends SetCommand { | ||||
|                 if (other == null) { | ||||
|                     player.sendMessage( | ||||
|                             TranslatableCaption.of("errors.invalid_player_offline"), | ||||
|                             TagResolver.resolver( | ||||
|                             PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                     .thenApply(caption -> TagResolver.resolver( | ||||
|                                     "player", | ||||
|                                     Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||
|                             ) | ||||
|                                     Tag.inserting(caption.toComponent(player)) | ||||
|                             )) | ||||
|                     ); | ||||
|                     return; | ||||
|                 } | ||||
|   | ||||
| @@ -40,6 +40,7 @@ import net.kyori.adventure.text.minimessage.tag.Tag; | ||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| import java.net.URI; | ||||
| import java.net.URL; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| @@ -130,8 +131,7 @@ public class SchematicCmd extends SubCommand { | ||||
|                     if (location.startsWith("url:")) { | ||||
|                         try { | ||||
|                             UUID uuid = UUID.fromString(location.substring(4)); | ||||
|                             URL base = new URL(Settings.Web.URL); | ||||
|                             URL url = new URL(base, "uploads/" + uuid + ".schematic"); | ||||
|                             URL url = URI.create(Settings.Web.URL + "uploads/" + uuid + ".schematic").toURL(); | ||||
|                             schematic = this.schematicHandler.getSchematic(url); | ||||
|                         } catch (Exception e) { | ||||
|                             e.printStackTrace(); | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
| package com.plotsquared.core.command; | ||||
|  | ||||
| import com.google.inject.Inject; | ||||
| import com.plotsquared.core.PlotSquared; | ||||
| import com.plotsquared.core.configuration.Settings; | ||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.database.DBFunc; | ||||
| @@ -103,10 +104,11 @@ public class Trust extends Command { | ||||
|                             player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("errors.invalid_player"), | ||||
|                                 TagResolver.resolver( | ||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                         .thenApply(caption -> TagResolver.resolver( | ||||
|                                         "value", | ||||
|                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||
|                                 ) | ||||
|                                         Tag.inserting(caption.toComponent(player)) | ||||
|                                 )) | ||||
|                         ); | ||||
|                         iterator.remove(); | ||||
|                         continue; | ||||
| @@ -114,10 +116,11 @@ public class Trust extends Command { | ||||
|                     if (currentPlot.isOwner(uuid)) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("member.already_added"), | ||||
|                                 TagResolver.resolver( | ||||
|                                         "value", | ||||
|                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||
|                                 ) | ||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                         .thenApply(caption -> TagResolver.resolver( | ||||
|                                         "player", | ||||
|                                         Tag.inserting(caption.toComponent(player)) | ||||
|                                 )) | ||||
|                         ); | ||||
|                         iterator.remove(); | ||||
|                         continue; | ||||
| @@ -125,10 +128,11 @@ public class Trust extends Command { | ||||
|                     if (currentPlot.getTrusted().contains(uuid)) { | ||||
|                         player.sendMessage( | ||||
|                                 TranslatableCaption.of("member.already_added"), | ||||
|                                 TagResolver.resolver( | ||||
|                                         "value", | ||||
|                                         Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player)) | ||||
|                                 ) | ||||
|                                 PlotSquared.platform().playerManager().getUsernameCaption(uuid) | ||||
|                                         .thenApply(caption -> TagResolver.resolver( | ||||
|                                         "player", | ||||
|                                         Tag.inserting(caption.toComponent(player)) | ||||
|                                 )) | ||||
|                         ); | ||||
|                         iterator.remove(); | ||||
|                         continue; | ||||
|   | ||||
| @@ -44,4 +44,6 @@ public interface Caption { | ||||
|      */ | ||||
|     @NonNull Component toComponent(@NonNull LocaleHolder localeHolder); | ||||
|  | ||||
|     @NonNull String toString(); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -51,4 +51,9 @@ public final class StaticCaption implements Caption { | ||||
|         return MiniMessage.miniMessage().deserialize(this.value); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public @NonNull String toString() { | ||||
|         return "StaticCaption(" + value + ")"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -25,6 +25,7 @@ import net.kyori.adventure.text.minimessage.MiniMessage; | ||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | ||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
|  | ||||
| import java.util.Locale; | ||||
| import java.util.regex.Pattern; | ||||
| @@ -132,4 +133,9 @@ public final class TranslatableCaption implements NamespacedCaption { | ||||
|         return Objects.hashCode(this.getNamespace(), this.getKey()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public @NotNull String toString() { | ||||
|         return "TranslatableCaption(" + getNamespace() + ":" + getKey() + ")"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -189,7 +189,7 @@ public class HybridPlotWorld extends ClassicPlotWorld { | ||||
|                 } | ||||
|                 Object value; | ||||
|                 try { | ||||
|                     final boolean accessible = field.isAccessible(); | ||||
|                     final boolean accessible = field.canAccess(this); | ||||
|                     field.setAccessible(true); | ||||
|                     value = field.get(this); | ||||
|                     field.setAccessible(accessible); | ||||
|   | ||||
| @@ -55,7 +55,6 @@ import com.plotsquared.core.plot.flag.implementations.TitlesFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.WeatherFlag; | ||||
| import com.plotsquared.core.plot.flag.types.TimedFlag; | ||||
| 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.TaskTime; | ||||
| import com.sk89q.worldedit.world.gamemode.GameMode; | ||||
| @@ -63,7 +62,6 @@ import com.sk89q.worldedit.world.gamemode.GameModes; | ||||
| import com.sk89q.worldedit.world.item.ItemType; | ||||
| import com.sk89q.worldedit.world.item.ItemTypes; | ||||
| 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.tag.Tag; | ||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||
| @@ -77,6 +75,7 @@ import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.CompletableFuture; | ||||
|  | ||||
| public class PlotListener { | ||||
|  | ||||
| @@ -321,22 +320,27 @@ public class PlotListener { | ||||
|                         } | ||||
|                         if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) { | ||||
|                             final UUID plotOwner = plot.getOwnerAbs(); | ||||
|                             ComponentLike owner = PlayerManager.resolveName(plotOwner, true).toComponent(player); | ||||
|                             Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" + | ||||
|                                     ".title_entered_plot"); | ||||
|                             Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" + | ||||
|                                     ".title_entered_plot_sub"); | ||||
|                             TagResolver resolver = TagResolver.builder() | ||||
|                                     .tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString()))) | ||||
|                                     .tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName()))) | ||||
|                                     .tag("owner", Tag.inserting(owner)) | ||||
|                                     .tag("alias", Tag.inserting(Component.text(plot.getAlias()))) | ||||
|                                     .build(); | ||||
|                             if (Settings.Titles.TITLES_AS_ACTIONBAR) { | ||||
|                                 player.sendActionBar(header, resolver); | ||||
|                             } else { | ||||
|                                 player.sendTitle(header, subHeader, resolver); | ||||
|                             } | ||||
|  | ||||
|                             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("world", Tag.inserting(Component.text(player.getLocation().getWorldName()))) | ||||
|                                             .tag("alias", Tag.inserting(Component.text(plot.getAlias()))) | ||||
|                                             .build() | ||||
|                                     ); | ||||
|  | ||||
|                             future.whenComplete((tagResolver, throwable) -> { | ||||
|                                 if (Settings.Titles.TITLES_AS_ACTIONBAR) { | ||||
|                                     player.sendActionBar(header, tagResolver); | ||||
|                                 } else { | ||||
|                                     player.sendTitle(header, subHeader, tagResolver); | ||||
|                                 } | ||||
|                             }); | ||||
|                         } | ||||
|                     }, TaskTime.seconds(1L)); | ||||
|                 } | ||||
|   | ||||
| @@ -25,9 +25,9 @@ import java.util.UUID; | ||||
| public interface OfflinePlotPlayer extends PermissionHolder { | ||||
|  | ||||
|     /** | ||||
|      * Gets the {@code UUID} of this player | ||||
|      * Returns the UUID of the player. | ||||
|      * | ||||
|      * @return the player {@link UUID} | ||||
|      * @return the UUID of the player | ||||
|      */ | ||||
|     UUID getUUID(); | ||||
|  | ||||
| @@ -39,9 +39,9 @@ public interface OfflinePlotPlayer extends PermissionHolder { | ||||
|     long getLastPlayed(); | ||||
|  | ||||
|     /** | ||||
|      * Gets the name of this player. | ||||
|      * Returns the name of the player. | ||||
|      * | ||||
|      * @return the player name | ||||
|      * @return the name of the player | ||||
|      */ | ||||
|     String getName(); | ||||
|  | ||||
|   | ||||
| @@ -80,6 +80,7 @@ import java.util.Map; | ||||
| import java.util.Queue; | ||||
| import java.util.Set; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.CompletableFuture; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
|  | ||||
| @@ -273,8 +274,9 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | ||||
|         return this.meta == null ? null : this.meta.remove(key); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * This player's name. | ||||
|      * Returns the name of the player. | ||||
|      * | ||||
|      * @return the name of the player | ||||
|      */ | ||||
| @@ -952,6 +954,54 @@ 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 TODO | ||||
|      */ | ||||
|     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 TODO | ||||
|      */ | ||||
|     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 | ||||
|     @Override | ||||
|     public boolean hasPermission(@NonNull String permission) { | ||||
|   | ||||
| @@ -26,8 +26,8 @@ import java.util.Iterator; | ||||
| import java.util.NoSuchElementException; | ||||
|  | ||||
| /** | ||||
|  * Plot (X,Y) tuples for plot locations | ||||
|  * within a plot area | ||||
|  * 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. | ||||
|  * A PlotId instance can be created using the {@link #of(int, int)} method or parsed from a string using the {@link #fromString(String)} method. | ||||
|  */ | ||||
| public final class PlotId { | ||||
|  | ||||
| @@ -36,10 +36,10 @@ public final class PlotId { | ||||
|     private final int hash; | ||||
|  | ||||
|     /** | ||||
|      * PlotId class (PlotId x,y values do not correspond to Block locations) | ||||
|      * Constructs a new PlotId with the given x and y coordinates. | ||||
|      * | ||||
|      * @param x The plot x coordinate | ||||
|      * @param y The plot y coordinate | ||||
|      * @param x the x-coordinate of the plot | ||||
|      * @param y the y-coordinate of the plot | ||||
|      */ | ||||
|     private PlotId(final int x, final int y) { | ||||
|         this.x = x; | ||||
| @@ -48,11 +48,11 @@ public final class PlotId { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Create a new plot ID instance | ||||
|      * Returns a new PlotId instance with the specified x and y coordinates. | ||||
|      * | ||||
|      * @param x The plot x coordinate | ||||
|      * @param y The plot y coordinate | ||||
|      * @return a new PlotId at x,y | ||||
|      * @param x the x-coordinate of the plot | ||||
|      * @param y the y-coordinate of the plot | ||||
|      * @return a new PlotId instance with the specified x and y coordinates | ||||
|      */ | ||||
|     public static @NonNull PlotId of(final int x, final int y) { | ||||
|         return new PlotId(x, y); | ||||
| @@ -74,10 +74,13 @@ public final class PlotId { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Attempt to parse a plot ID from a string | ||||
|      * Returns a PlotId object from the given string, or null if the string is invalid. | ||||
|      * 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 ID string | ||||
|      * @return Plot ID, or {@code null} if none could be parsed | ||||
|      * @param string the string to parse | ||||
|      * @return a PlotId object parsed from the given string, or null if the string is invalid | ||||
|      */ | ||||
|     public static @Nullable PlotId fromStringOrNull(final @NonNull String string) { | ||||
|         final String[] parts = string.split("[;_,.]"); | ||||
| @@ -95,39 +98,39 @@ public final class PlotId { | ||||
|         return of(x, y); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Gets the PlotId from the HashCode<br> | ||||
|      * Note: Only accurate for small x,z values (short) | ||||
|      * Returns a new PlotId instance from the given hash. | ||||
|      * | ||||
|      * @param hash ID hash | ||||
|      * @return Plot ID | ||||
|      * @param hash the hash to unpair | ||||
|      * @return a new PlotId instance | ||||
|      */ | ||||
|     public static @NonNull PlotId unpair(final int hash) { | ||||
|         return PlotId.of(hash >> 16, hash & 0xFFFF); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the ID X component | ||||
|      * Returns the x-coordinate of this Plot ID. | ||||
|      * | ||||
|      * @return X component | ||||
|      * @return the x-coordinate of this Plot ID | ||||
|      */ | ||||
|     public int getX() { | ||||
|         return this.x; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the ID Y component | ||||
|      * Returns the y-coordinate of this Plot ID. | ||||
|      * | ||||
|      * @return Y component | ||||
|      * @return the y-coordinate of this Plot ID | ||||
|      */ | ||||
|     public int getY() { | ||||
|         return this.y; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the next plot ID for claiming purposes | ||||
|      * Returns the next Plot ID for claiming purposes based on the current Plot ID. | ||||
|      * | ||||
|      * @return Next plot ID | ||||
|      * @return the next Plot ID | ||||
|      */ | ||||
|     public @NonNull PlotId getNextId() { | ||||
|         final int absX = Math.abs(x); | ||||
| @@ -159,10 +162,11 @@ public final class PlotId { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the PlotId in a relative direction | ||||
|      * Returns a new Plot ID in the specified relative direction based on the | ||||
|      * current Plot ID. | ||||
|      * | ||||
|      * @param direction Direction | ||||
|      * @return Relative plot ID | ||||
|      * @param direction the direction in which to get the relative Plot ID | ||||
|      * @return the relative Plot ID | ||||
|      */ | ||||
|     public @NonNull PlotId getRelative(final @NonNull Direction direction) { | ||||
|         return switch (direction) { | ||||
| @@ -193,10 +197,11 @@ public final class PlotId { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a String representation of the plot ID where the | ||||
|      * components are separated by ";" | ||||
|      * Returns a string representation of this Plot ID in the format "x;y". | ||||
|      * | ||||
|      * @return {@code x + ";" + y} | ||||
|      * <p> The format is {@code x + ";" + y} | ||||
|      * | ||||
|      * @return a string representation of this Plot ID | ||||
|      */ | ||||
|     @Override | ||||
|     public @NonNull String toString() { | ||||
| @@ -204,41 +209,40 @@ public final class PlotId { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a String representation of the plot ID where the | ||||
|      * components are separated by a specified string | ||||
|      * Returns a string representation of this Plot ID with the specified separator. | ||||
|      * <p> | ||||
|      * The format is {@code x + separator + y} | ||||
|      * | ||||
|      * @param separator Separator | ||||
|      * @return {@code x + separator + y} | ||||
|      * @param separator the separator to use between the X and Y coordinates | ||||
|      * @return a string representation of this Plot ID with the specified separator | ||||
|      */ | ||||
|     public @NonNull String toSeparatedString(String separator) { | ||||
|         return this.getX() + separator + this.getY(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a String representation of the plot ID where the | ||||
|      * components are separated by "," | ||||
|      * Returns a string representation of this Plot ID in the format "x,y". | ||||
|      * | ||||
|      * @return {@code x + "," + y} | ||||
|      * @return a string representation of this Plot ID | ||||
|      */ | ||||
|     public @NonNull String toCommaSeparatedString() { | ||||
|         return this.getX() + "," + this.getY(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a String representation of the plot ID where the | ||||
|      * components are separated by "_" | ||||
|      * Returns a string representation of this Plot ID in the format "x_y". | ||||
|      * | ||||
|      * @return {@code x + "_" + y} | ||||
|      * @return a string representation of this Plot ID | ||||
|      */ | ||||
|  | ||||
|     public @NonNull String toUnderscoreSeparatedString() { | ||||
|         return this.getX() + "_" + this.getY(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a String representation of the plot ID where the | ||||
|      * components are separated by "-" | ||||
|      * Returns a string representation of this Plot ID in the format "x-y". | ||||
|      * | ||||
|      * @return {@code x + "-" + y} | ||||
|      * @return a string representation of this Plot ID | ||||
|      */ | ||||
|     public @NonNull String toDashSeparatedString() { | ||||
|         return this.getX() + "-" + this.getY(); | ||||
| @@ -250,6 +254,10 @@ 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> { | ||||
|  | ||||
|         private final PlotId start; | ||||
| @@ -265,6 +273,13 @@ public final class PlotId { | ||||
|             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) { | ||||
|             return new PlotRangeIterator(start, end); | ||||
|         } | ||||
|   | ||||
| @@ -67,14 +67,25 @@ public class PlotItemStack { | ||||
|         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() { | ||||
|         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() { | ||||
|         return name; | ||||
|     } | ||||
|  | ||||
|     public String[] getLore() { | ||||
|         return lore; | ||||
|     } | ||||
|   | ||||
| @@ -38,7 +38,6 @@ import com.plotsquared.core.location.Location; | ||||
| import com.plotsquared.core.player.PlotPlayer; | ||||
| import com.plotsquared.core.plot.flag.PlotFlag; | ||||
| 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.TaskTime; | ||||
| import com.sk89q.worldedit.function.pattern.Pattern; | ||||
| @@ -59,6 +58,7 @@ import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.HashSet; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.CompletableFuture; | ||||
| @@ -383,13 +383,17 @@ public final class PlotModificationManager { | ||||
|         } | ||||
|         if (createSign) { | ||||
|             queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> { | ||||
|                 for (Plot current : plots) { | ||||
|                     current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent( | ||||
|                             LocaleHolder.console())); | ||||
|                 } | ||||
|                 if (whenDone != null) { | ||||
|                     TaskManager.runTask(whenDone); | ||||
|                 } | ||||
|                 List<CompletableFuture<Void>> tasks = plots.stream().map(current -> PlotSquared.platform().playerManager() | ||||
|                                 .getUsernameCaption(current.getOwnerAbs()) | ||||
|                                 .thenAccept(caption -> current | ||||
|                                         .getPlotModificationManager() | ||||
|                                         .setSign(caption.getComponent(LocaleHolder.console())))) | ||||
|                         .toList(); | ||||
|                 CompletableFuture.allOf(tasks.toArray(CompletableFuture[]::new)).whenComplete((unused, throwable) -> { | ||||
|                     if (whenDone != null) { | ||||
|                         TaskManager.runTask(whenDone); | ||||
|                     } | ||||
|                 }); | ||||
|             })); | ||||
|         } else if (whenDone != null) { | ||||
|             queue.setCompleteTask(whenDone); | ||||
| @@ -891,7 +895,6 @@ public final class PlotModificationManager { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * /** | ||||
|      * Sets components such as border, wall, floor. | ||||
|      * (components are generator specific) | ||||
|      * | ||||
|   | ||||
| @@ -18,9 +18,25 @@ | ||||
|  */ | ||||
| package com.plotsquared.core.plot; | ||||
|  | ||||
| /** | ||||
|  * The different types of weather that can be set for a Plot. | ||||
|  */ | ||||
| public enum PlotWeather { | ||||
|  | ||||
|     /** | ||||
|      * Rainy weather conditions | ||||
|      */ | ||||
|     RAIN, | ||||
|     /** | ||||
|      * Clear weather conditions | ||||
|      */ | ||||
|     CLEAR, | ||||
|     /** | ||||
|      * Use the weather of the world the plot is in | ||||
|      */ | ||||
|     WORLD, | ||||
|     /** | ||||
|      * Turn off weather for the plot | ||||
|      */ | ||||
|     OFF | ||||
| } | ||||
|   | ||||
| @@ -29,6 +29,7 @@ import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.BreakFlag; | ||||
| 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.CoralDryFlag; | ||||
| import com.plotsquared.core.plot.flag.implementations.CropGrowFlag; | ||||
| @@ -142,6 +143,7 @@ public final class GlobalFlagContainer extends FlagContainer { | ||||
|         this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE); | ||||
|         this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE); | ||||
|         this.addFlag(ChatFlag.CHAT_FLAG_TRUE); | ||||
|         this.addFlag(ConcreteHardenFlag.CONCRETE_HARDEN_TRUE); | ||||
|         this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE); | ||||
|         this.addFlag(CoralDryFlag.CORAL_DRY_FALSE); | ||||
|         this.addFlag(CropGrowFlag.CROP_GROW_TRUE); | ||||
|   | ||||
| @@ -0,0 +1,39 @@ | ||||
| /* | ||||
|  * PlotSquared, a land and world management plugin for Minecraft. | ||||
|  * Copyright (C) IntellectualSites <https://intellectualsites.com> | ||||
|  * Copyright (C) IntellectualSites team and contributors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| package com.plotsquared.core.plot.flag.implementations; | ||||
|  | ||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||
| import com.plotsquared.core.plot.flag.types.BooleanFlag; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
|  | ||||
| public class 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -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 | ||||
|      * and then written to from a separate queue where they're consequently unloaded. | ||||
|      * | ||||
|      * @param unloadAfter if to unload chuns afterwards | ||||
|      * @param unloadAfter if to unload chunks afterwards | ||||
|      * @return this ChunkCoordinatorBuilder instance | ||||
|      */ | ||||
|     public @NonNull ChunkCoordinatorBuilder unloadAfter(final boolean unloadAfter) { | ||||
|   | ||||
| @@ -42,28 +42,14 @@ public class EntityUtil { | ||||
|     } | ||||
|  | ||||
|     private static int capNumeral(final @NonNull String flagName) { | ||||
|         int i; | ||||
|         switch (flagName) { | ||||
|             case "mob-cap": | ||||
|                 i = CAP_MOB; | ||||
|                 break; | ||||
|             case "hostile-cap": | ||||
|                 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; | ||||
|         return switch (flagName) { | ||||
|             case "mob-cap" -> CAP_MOB; | ||||
|             case "hostile-cap" -> CAP_MONSTER; | ||||
|             case "animal-cap" -> CAP_ANIMAL; | ||||
|             case "vehicle-cap" -> CAP_VEHICLE; | ||||
|             case "misc-cap" -> CAP_MISC; | ||||
|             default -> CAP_ENTITY; | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|   | ||||
| @@ -28,6 +28,7 @@ import com.plotsquared.core.database.DBFunc; | ||||
| import com.plotsquared.core.player.ConsolePlayer; | ||||
| import com.plotsquared.core.player.OfflinePlotPlayer; | ||||
| import com.plotsquared.core.player.PlotPlayer; | ||||
| import com.plotsquared.core.plot.Plot; | ||||
| import com.plotsquared.core.uuid.UUIDMapping; | ||||
| import net.kyori.adventure.text.Component; | ||||
| import net.kyori.adventure.text.ComponentLike; | ||||
| @@ -37,6 +38,7 @@ import net.kyori.adventure.text.minimessage.tag.Tag; | ||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||
| import org.checkerframework.checker.nullness.qual.NonNull; | ||||
| import org.checkerframework.checker.nullness.qual.Nullable; | ||||
| import org.jetbrains.annotations.Contract; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| @@ -48,6 +50,7 @@ import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.CompletableFuture; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.function.BiConsumer; | ||||
|  | ||||
| @@ -169,7 +172,9 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | ||||
|      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} | ||||
|      * @see #resolveName(UUID, boolean) | ||||
|      * @since 6.4.0 | ||||
|      * @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)} | ||||
|      */ | ||||
|     @Deprecated(since = "TODO") | ||||
|     public static @NonNull Caption resolveName(final @Nullable UUID owner) { | ||||
|         return resolveName(owner, true); | ||||
|     } | ||||
| @@ -181,7 +186,9 @@ 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 | ||||
|      * @return A caption containing either the name, {@code None}, {@code Everyone} or {@code Unknown} | ||||
|      * @since 6.4.0 | ||||
|      * @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)} | ||||
|      */ | ||||
|     @Deprecated(since = "TODO") | ||||
|     public static @NonNull Caption resolveName(final @Nullable UUID owner, final boolean blocking) { | ||||
|         if (owner == null) { | ||||
|             return TranslatableCaption.of("info.none"); | ||||
| @@ -211,6 +218,50 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> { | ||||
|         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 TODO | ||||
|      */ | ||||
|     @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 | ||||
|      * | ||||
|   | ||||
| @@ -83,6 +83,7 @@ import java.io.OutputStreamWriter; | ||||
| import java.io.PrintWriter; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URI; | ||||
| import java.net.URL; | ||||
| import java.net.URLConnection; | ||||
| import java.nio.channels.Channels; | ||||
| @@ -144,7 +145,7 @@ public abstract class SchematicHandler { | ||||
|         } | ||||
|         final URL url; | ||||
|         try { | ||||
|             url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension); | ||||
|             url = URI.create(Settings.Web.URL + "?key=" + uuid + "&type=" + extension).toURL(); | ||||
|         } catch (MalformedURLException e) { | ||||
|             e.printStackTrace(); | ||||
|             whenDone.run(); | ||||
| @@ -153,7 +154,7 @@ public abstract class SchematicHandler { | ||||
|         TaskManager.runTaskAsync(() -> { | ||||
|             try { | ||||
|                 String boundary = Long.toHexString(System.currentTimeMillis()); | ||||
|                 URLConnection con = new URL(website).openConnection(); | ||||
|                 URLConnection con = URI.create(website).toURL().openConnection(); | ||||
|                 con.setDoOutput(true); | ||||
|                 con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); | ||||
|                 try (OutputStream output = con.getOutputStream(); | ||||
| @@ -498,9 +499,10 @@ public abstract class SchematicHandler { | ||||
|     public List<String> getSaves(UUID uuid) { | ||||
|         String rawJSON; | ||||
|         try { | ||||
|             String website = Settings.Web.URL + "list.php?" + uuid.toString(); | ||||
|             URL url = new URL(website); | ||||
|             URLConnection connection = new URL(url.toString()).openConnection(); | ||||
|             URLConnection connection = URI.create( | ||||
|                     Settings.Web.URL + "list.php?" + uuid.toString()) | ||||
|                     .toURL() | ||||
|                     .openConnection(); | ||||
|             connection.setRequestProperty("User-Agent", "Mozilla/5.0"); | ||||
|             try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { | ||||
|                 rawJSON = reader.lines().collect(Collectors.joining()); | ||||
|   | ||||
| @@ -47,6 +47,7 @@ import java.util.Locale; | ||||
| import java.util.Map; | ||||
| import java.util.TimeZone; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.function.BiFunction; | ||||
|  | ||||
| /** | ||||
| @@ -109,9 +110,9 @@ public final class PlaceholderRegistry { | ||||
|             if (plotOwner == null) { | ||||
|                 return legacyComponent(TranslatableCaption.of("generic.generic_unowned"), player); | ||||
|             } | ||||
|  | ||||
|             try { | ||||
|                 return PlayerManager.resolveName(plotOwner, false).getComponent(player); | ||||
|                 return PlotSquared.platform().playerManager().getUsernameCaption(plotOwner) | ||||
|                         .get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS).getComponent(player); | ||||
|             } catch (final Exception ignored) { | ||||
|             } | ||||
|             return legacyComponent(TranslatableCaption.of("info.unknown"), player); | ||||
| @@ -187,6 +188,7 @@ public final class PlaceholderRegistry { | ||||
|             } | ||||
|         }); | ||||
|         this.createPlaceholder("currentplot_biome", (player, plot) -> plot.getBiomeSynchronous().toString()); | ||||
|         this.createPlaceholder("currentplot_size", (player, plot) -> String.valueOf(plot.getConnectedPlots().size())); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -551,6 +551,7 @@ | ||||
|   "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_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_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>", | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| import com.diffplug.gradle.spotless.SpotlessPlugin | ||||
| import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin | ||||
| import groovy.json.JsonSlurper | ||||
| import java.net.URI | ||||
| import xyz.jpenilla.runpaper.task.RunServer | ||||
|  | ||||
| @@ -149,29 +150,34 @@ subprojects { | ||||
|                             id.set("Sauilitired") | ||||
|                             name.set("Alexander Söderberg") | ||||
|                             organization.set("IntellectualSites") | ||||
|                             organizationUrl.set("https://github.com/IntellectualSites") | ||||
|                         } | ||||
|                         developer { | ||||
|                             id.set("NotMyFault") | ||||
|                             name.set("Alexander Brandes") | ||||
|                             organization.set("IntellectualSites") | ||||
|                             organizationUrl.set("https://github.com/IntellectualSites") | ||||
|                             email.set("contact(at)notmyfault.dev") | ||||
|                         } | ||||
|                         developer { | ||||
|                             id.set("SirYwell") | ||||
|                             name.set("Hannes Greule") | ||||
|                             organization.set("IntellectualSites") | ||||
|                             organizationUrl.set("https://github.com/IntellectualSites") | ||||
|                         } | ||||
|                         developer { | ||||
|                             id.set("dordsor21") | ||||
|                             name.set("dordsor21") | ||||
|                             organization.set("IntellectualSites") | ||||
|                             organizationUrl.set("https://github.com/IntellectualSites") | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     scm { | ||||
|                         url.set("https://github.com/IntellectualSites/PlotSquared") | ||||
|                         connection.set("scm:https://IntellectualSites@github.com/IntellectualSites/PlotSquared.git") | ||||
|                         developerConnection.set("scm:git://github.com/IntellectualSites/PlotSquared.git") | ||||
|                         connection.set("scm:git:https://github.com/IntellectualSites/PlotSquared.git") | ||||
|                         developerConnection.set("scm:git:git@github.com:IntellectualSites/PlotSquared.git") | ||||
|                         tag.set("${project.version}") | ||||
|                     } | ||||
|  | ||||
|                     issueManagement { | ||||
| @@ -218,14 +224,23 @@ tasks.getByName<Jar>("jar") { | ||||
|     enabled = false | ||||
| } | ||||
|  | ||||
| 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") | ||||
| val supportedVersions = listOf("1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.1", "1.20.2") | ||||
| tasks { | ||||
|     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.contains("Bukkit") } | ||||
|  | ||||
|     supportedVersions.forEach { | ||||
|         register<RunServer>("runServer-$it") { | ||||
|             minecraftVersion(it) | ||||
|             pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false).map { (it as Jar).archiveFile } | ||||
|                     .toTypedArray()) | ||||
|             jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true") | ||||
|             downloadPlugins { | ||||
|                 url("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/artifact/artifacts/$artifact") | ||||
|             } | ||||
|             group = "run paper" | ||||
|             runDirectory.set(file("run-$it")) | ||||
|         } | ||||
|   | ||||
| @@ -1,20 +1,20 @@ | ||||
| [versions] | ||||
| # Platform expectations | ||||
| paper = "1.20.1-R0.1-SNAPSHOT" | ||||
| paper = "1.20.2-R0.1-SNAPSHOT" | ||||
| guice = "7.0.0" | ||||
| spotbugs = "4.7.3" | ||||
| checkerqual = "3.37.0" | ||||
| checkerqual = "3.38.0" | ||||
| gson = "2.10" | ||||
| guava = "31.1-jre" | ||||
| snakeyaml = "2.0" | ||||
| adventure = "4.14.0" | ||||
| adventure-bukkit = "4.3.0" | ||||
| adventure-bukkit = "4.3.1" | ||||
| log4j = "2.19.0" | ||||
|  | ||||
| # Plugins | ||||
| worldedit = "7.2.15" | ||||
| fawe = "2.7.0" | ||||
| placeholderapi = "2.11.3" | ||||
| worldedit = "7.2.16" | ||||
| fawe = "2.8.0" | ||||
| placeholderapi = "2.11.4" | ||||
| luckperms = "5.4" | ||||
| essentialsx = "2.20.1" | ||||
| mvdwapi = "3.1.1" | ||||
| @@ -22,7 +22,7 @@ mvdwapi = "3.1.1" | ||||
| # Third party | ||||
| prtree = "2.0.1" | ||||
| aopalliance = "1.0" | ||||
| cloud-services = "1.8.3" | ||||
| cloud-services = "1.8.4" | ||||
| arkitektonika = "2.1.2" | ||||
| squirrelid = "0.3.2" | ||||
| paster = "1.1.5" | ||||
| @@ -30,14 +30,14 @@ bstats = "3.0.2" | ||||
| paperlib = "1.0.8" | ||||
| informative-annotations = "1.3" | ||||
| vault = "1.7.1" | ||||
| serverlib = "2.3.1" | ||||
| serverlib = "2.3.4" | ||||
|  | ||||
| # Gradle plugins | ||||
| shadow = "8.1.1" | ||||
| grgit = "4.1.1" | ||||
| spotless = "6.20.0" | ||||
| spotless = "6.22.0" | ||||
| nexus = "1.3.0" | ||||
| runPaper = "2.1.0" | ||||
| runPaper = "2.2.0" | ||||
|  | ||||
| [libraries] | ||||
| # Platform expectations | ||||
|   | ||||
		Reference in New Issue
	
	Block a user