mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-03 18:53:43 +01:00 
			
		
		
		
	Compare commits
	
		
			37 Commits
		
	
	
		
			fix/v7/def
			...
			feature/v7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7c911c919e | ||
| 
						 | 
					d95c74d8c9 | ||
| 
						 | 
					c1555ddbc7 | ||
| 
						 | 
					4fe0c586d9 | ||
| 
						 | 
					aae6ea4fee | ||
| 
						 | 
					385d018504 | ||
| 
						 | 
					f4def082c1 | ||
| 
						 | 
					69c9f1df83 | ||
| 
						 | 
					e138dc0267 | ||
| 
						 | 
					ca50b53f94 | ||
| 
						 | 
					f705487055 | ||
| 
						 | 
					b7c9453a1a | ||
| 
						 | 
					1aa370d562 | ||
| 
						 | 
					d3dab0d736 | ||
| 
						 | 
					764156b267 | ||
| 
						 | 
					665f5251bf | ||
| 
						 | 
					7c328095d7 | ||
| 
						 | 
					7884c91d52 | ||
| 
						 | 
					e9a19e0821 | ||
| 
						 | 
					022847fc4b | ||
| 
						 | 
					1ee673be58 | ||
| 
						 | 
					3c2aa99e86 | ||
| 
						 | 
					11fac3f060 | ||
| 
						 | 
					3e57e524b9 | ||
| 
						 | 
					f582ec03c5 | ||
| 
						 | 
					893be136f0 | ||
| 
						 | 
					b74ba30281 | ||
| 
						 | 
					ba9dab1f73 | ||
| 
						 | 
					8e60fdb477 | ||
| 
						 | 
					443fe8dd47 | ||
| 
						 | 
					e56e52ba4f | ||
| 
						 | 
					cd008bed9b | ||
| 
						 | 
					d4c90283d6 | ||
| 
						 | 
					dc04ec955a | ||
| 
						 | 
					72f511ce99 | ||
| 
						 | 
					0d63c2bdb6 | ||
| 
						 | 
					49e13384cf | 
							
								
								
									
										8
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							@@ -9,5 +9,11 @@
 | 
				
			|||||||
    "dependencies"
 | 
					    "dependencies"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "rebaseWhen": "conflicted",
 | 
					  "rebaseWhen": "conflicted",
 | 
				
			||||||
  "schedule": ["on the first day of the month"]
 | 
					  "schedule": ["on the first day of the month"],
 | 
				
			||||||
 | 
					  "ignoreDeps": [
 | 
				
			||||||
 | 
					    "com.google.code.gson:gson",
 | 
				
			||||||
 | 
					    "com.google.guava:guava",
 | 
				
			||||||
 | 
					    "org.yaml:snakeyaml",
 | 
				
			||||||
 | 
					    "org.apache.logging.log4j:log4j-api",
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -138,6 +138,5 @@ build/
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
# Ignore run folders
 | 
					# Ignore run folders
 | 
				
			||||||
run-[0-0].[0-9]/
 | 
					run-[0-9].[0-9][0-9]/
 | 
				
			||||||
run-[0-0].[0-9].[0-9]/
 | 
					run-[0-9].[0-9][0-9].[0-9]/
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,20 +21,20 @@ dependencies {
 | 
				
			|||||||
    api(projects.plotsquaredCore)
 | 
					    api(projects.plotsquaredCore)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Metrics
 | 
					    // Metrics
 | 
				
			||||||
    implementation("org.bstats:bstats-bukkit")
 | 
					    implementation(libs.bstatsBukkit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Paper
 | 
					    // Paper
 | 
				
			||||||
    compileOnly("io.papermc.paper:paper-api")
 | 
					    compileOnly(libs.paper)
 | 
				
			||||||
    implementation("io.papermc:paperlib")
 | 
					    implementation(libs.paperlib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Plugins
 | 
					    // Plugins
 | 
				
			||||||
    compileOnly(libs.worldeditBukkit) {
 | 
					    compileOnly(libs.worldeditBukkit) {
 | 
				
			||||||
        exclude(group = "org.bukkit")
 | 
					        exclude(group = "org.bukkit")
 | 
				
			||||||
        exclude(group = "org.spigotmc")
 | 
					        exclude(group = "org.spigotmc")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
 | 
					    compileOnly(libs.faweBukkit) { isTransitive = false }
 | 
				
			||||||
    testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
 | 
					    testImplementation(libs.faweBukkit) { isTransitive = false }
 | 
				
			||||||
    compileOnly("com.github.MilkBowl:VaultAPI") {
 | 
					    compileOnly(libs.vault) {
 | 
				
			||||||
        exclude(group = "org.bukkit")
 | 
					        exclude(group = "org.bukkit")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    compileOnly(libs.placeholderapi)
 | 
					    compileOnly(libs.placeholderapi)
 | 
				
			||||||
@@ -44,15 +44,15 @@ dependencies {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Other libraries
 | 
					    // Other libraries
 | 
				
			||||||
    implementation(libs.squirrelid) { isTransitive = false }
 | 
					    implementation(libs.squirrelid) { isTransitive = false }
 | 
				
			||||||
    implementation("dev.notmyfault.serverlib:ServerLib")
 | 
					    implementation(libs.serverlib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Our libraries
 | 
					    // Our libraries
 | 
				
			||||||
    implementation(libs.arkitektonika)
 | 
					    implementation(libs.arkitektonika)
 | 
				
			||||||
    implementation("com.intellectualsites.paster:Paster")
 | 
					    implementation(libs.paster)
 | 
				
			||||||
    implementation("com.intellectualsites.informative-annotations:informative-annotations")
 | 
					    implementation(libs.informativeAnnotations)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Adventure
 | 
					    // Adventure
 | 
				
			||||||
    implementation("net.kyori:adventure-platform-bukkit")
 | 
					    implementation(libs.adventureBukkit)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks.processResources {
 | 
					tasks.processResources {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,7 @@ import com.plotsquared.bukkit.util.BukkitUtil;
 | 
				
			|||||||
import com.plotsquared.bukkit.util.BukkitWorld;
 | 
					import com.plotsquared.bukkit.util.BukkitWorld;
 | 
				
			||||||
import com.plotsquared.bukkit.util.SetGenCB;
 | 
					import com.plotsquared.bukkit.util.SetGenCB;
 | 
				
			||||||
import com.plotsquared.bukkit.util.TranslationUpdateManager;
 | 
					import com.plotsquared.bukkit.util.TranslationUpdateManager;
 | 
				
			||||||
 | 
					import com.plotsquared.bukkit.util.UpdateUtility;
 | 
				
			||||||
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
 | 
					import com.plotsquared.bukkit.util.task.BukkitTaskManager;
 | 
				
			||||||
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
 | 
					import com.plotsquared.bukkit.util.task.PaperTimeConverter;
 | 
				
			||||||
import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
 | 
					import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
 | 
				
			||||||
@@ -251,6 +252,7 @@ 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();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -302,11 +304,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
 | 
					        this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* TODO Enable update checker before v7 is released to GA
 | 
					 | 
				
			||||||
        if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
 | 
					        if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
 | 
				
			||||||
            injector.getInstance(UpdateUtility.class).updateChecker();
 | 
					            injector.getInstance(UpdateUtility.class).updateChecker();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
         */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (PremiumVerification.isPremium()) {
 | 
					        if (PremiumVerification.isPremium()) {
 | 
				
			||||||
            LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
 | 
					            LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
 | 
				
			||||||
@@ -551,7 +551,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(1L));
 | 
					            TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(10L));
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                singleWorldListener = injector().getInstance(SingleWorldListener.class);
 | 
					                singleWorldListener = injector().getInstance(SingleWorldListener.class);
 | 
				
			||||||
                Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
 | 
					                Bukkit.getPluginManager().registerEvents(singleWorldListener, this);
 | 
				
			||||||
@@ -1161,6 +1161,7 @@ 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();
 | 
				
			||||||
@@ -1182,7 +1183,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    @SuppressWarnings("ConstantConditions")
 | 
					    @SuppressWarnings({"ConstantConditions", "deprecation"}) // Paper deprecation
 | 
				
			||||||
    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) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,6 +74,7 @@ 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,7 @@ import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
 | 
				
			|||||||
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;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
@@ -152,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", "DEFAULT",
 | 
					                    "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
 | 
				
			||||||
                    "DUPLICATION", "FROZEN", "SPELL" -> {
 | 
					                    "DUPLICATION", "FROZEN", "SPELL" -> {
 | 
				
			||||||
                if (!area.isMobSpawning()) {
 | 
					                if (!area.isMobSpawning()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
@@ -360,7 +361,7 @@ public class EntityEventListener implements Listener {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
					                if (plot.isAdded(pp.getUUID()) || plot.getFlag(ProjectileChangeBlockFlag.class) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                entity.remove();
 | 
					                entity.remove();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -369,6 +369,7 @@ 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());
 | 
				
			||||||
@@ -733,6 +734,7 @@ 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;
 | 
				
			||||||
@@ -1063,6 +1065,7 @@ 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();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@ 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,6 +67,7 @@ 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) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,10 @@ public class TranslationUpdateManager {
 | 
				
			|||||||
        String minheightReplacement = "minheight";
 | 
					        String minheightReplacement = "minheight";
 | 
				
			||||||
        String maxHeight = "maxHeight";
 | 
					        String maxHeight = "maxHeight";
 | 
				
			||||||
        String maxheightReplacement = "maxheight";
 | 
					        String maxheightReplacement = "maxheight";
 | 
				
			||||||
 | 
					        String usedGrants = "usedGrants";
 | 
				
			||||||
 | 
					        String usedGrantsReplacement = "used_grants";
 | 
				
			||||||
 | 
					        String remainingGrants = "remainingGrants";
 | 
				
			||||||
 | 
					        String rremainingGrantsReplacement = "remaining_grants";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
 | 
					        try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
 | 
				
			||||||
            paths
 | 
					            paths
 | 
				
			||||||
@@ -53,6 +57,8 @@ public class TranslationUpdateManager {
 | 
				
			|||||||
                        replaceInFile(p, suggestCommand, suggestCommandReplacement);
 | 
					                        replaceInFile(p, suggestCommand, suggestCommandReplacement);
 | 
				
			||||||
                        replaceInFile(p, minHeight, minheightReplacement);
 | 
					                        replaceInFile(p, minHeight, minheightReplacement);
 | 
				
			||||||
                        replaceInFile(p, maxHeight, maxheightReplacement);
 | 
					                        replaceInFile(p, maxHeight, maxheightReplacement);
 | 
				
			||||||
 | 
					                        replaceInFile(p, usedGrants, usedGrantsReplacement);
 | 
				
			||||||
 | 
					                        replaceInFile(p, remainingGrants, rremainingGrantsReplacement);
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.URL;
 | 
					import java.net.URI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class UpdateUtility implements Listener {
 | 
					public class UpdateUtility implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,8 +59,9 @@ 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) new URL(
 | 
					                HttpsURLConnection connection = (HttpsURLConnection) URI.create(
 | 
				
			||||||
                        "https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
 | 
					                        "https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=77506")
 | 
				
			||||||
 | 
					                        .toURL()
 | 
				
			||||||
                        .openConnection();
 | 
					                        .openConnection();
 | 
				
			||||||
                connection.setRequestMethod("GET");
 | 
					                connection.setRequestMethod("GET");
 | 
				
			||||||
                JsonObject result = new JsonParser()
 | 
					                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
 | 
					 | 
				
			||||||
@@ -2,18 +2,18 @@ import java.time.format.DateTimeFormatter
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
dependencies {
 | 
					dependencies {
 | 
				
			||||||
    // Expected everywhere.
 | 
					    // Expected everywhere.
 | 
				
			||||||
    compileOnlyApi("org.checkerframework:checker-qual")
 | 
					    compileOnlyApi(libs.checkerqual)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Minecraft expectations
 | 
					    // Minecraft expectations
 | 
				
			||||||
    compileOnlyApi("com.google.code.gson:gson")
 | 
					    compileOnlyApi(libs.gson)
 | 
				
			||||||
    compileOnly("com.google.guava:guava")
 | 
					    compileOnly(libs.guava)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Platform expectations
 | 
					    // Platform expectations
 | 
				
			||||||
    compileOnlyApi("org.yaml:snakeyaml")
 | 
					    compileOnlyApi(libs.snakeyaml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Adventure
 | 
					    // Adventure
 | 
				
			||||||
    api("net.kyori:adventure-api")
 | 
					    api(libs.adventureApi)
 | 
				
			||||||
    api("net.kyori:adventure-text-minimessage")
 | 
					    api(libs.adventureMiniMessage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Guice
 | 
					    // Guice
 | 
				
			||||||
    api(libs.guice) {
 | 
					    api(libs.guice) {
 | 
				
			||||||
@@ -31,19 +31,19 @@ dependencies {
 | 
				
			|||||||
        exclude(group = "dummypermscompat")
 | 
					        exclude(group = "dummypermscompat")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    testImplementation(libs.worldeditCore)
 | 
					    testImplementation(libs.worldeditCore)
 | 
				
			||||||
    compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
 | 
					    compileOnly(libs.faweBukkit) { isTransitive = false }
 | 
				
			||||||
    testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false }
 | 
					    testImplementation(libs.faweCore) { isTransitive = false }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Logging
 | 
					    // Logging
 | 
				
			||||||
    compileOnlyApi("org.apache.logging.log4j:log4j-api")
 | 
					    compileOnlyApi(libs.log4j)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Other libraries
 | 
					    // Other libraries
 | 
				
			||||||
    api(libs.prtree)
 | 
					    api(libs.prtree)
 | 
				
			||||||
    api(libs.aopalliance)
 | 
					    api(libs.aopalliance)
 | 
				
			||||||
    api(libs.cloudServices)
 | 
					    api(libs.cloudServices)
 | 
				
			||||||
    api(libs.arkitektonika)
 | 
					    api(libs.arkitektonika)
 | 
				
			||||||
    api("com.intellectualsites.paster:Paster")
 | 
					    api(libs.paster)
 | 
				
			||||||
    api("com.intellectualsites.informative-annotations:informative-annotations")
 | 
					    api(libs.informativeAnnotations)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks.processResources {
 | 
					tasks.processResources {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.MalformedURLException;
 | 
					import java.net.URI;
 | 
				
			||||||
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,9 +210,10 @@ 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(
 | 
				
			||||||
                        new URL(logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
 | 
					                        URI.create(
 | 
				
			||||||
                                .toURI().getPath());
 | 
					                                logurl.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file"))
 | 
				
			||||||
            } catch (MalformedURLException | URISyntaxException | SecurityException e) {
 | 
					                                .getPath());
 | 
				
			||||||
 | 
					            } 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()) {
 | 
				
			||||||
@@ -1281,7 +1282,7 @@ public class PlotSquared {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Setup the database connection.
 | 
					     * Set up the database connection.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void setupDatabase() {
 | 
					    public void setupDatabase() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -131,8 +131,8 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("economy.removed_granted_plot"),
 | 
					                                TranslatableCaption.of("economy.removed_granted_plot"),
 | 
				
			||||||
                                TagResolver.builder()
 | 
					                                TagResolver.builder()
 | 
				
			||||||
                                        .tag("usedGrants", Tag.inserting(Component.text(grantedPlots - left)))
 | 
					                                        .tag("used_grants", Tag.inserting(Component.text(grantedPlots - left)))
 | 
				
			||||||
                                        .tag("remainingGrants", Tag.inserting(Component.text(left)))
 | 
					                                        .tag("remaining_grants", Tag.inserting(Component.text(left)))
 | 
				
			||||||
                                        .build()
 | 
					                                        .build()
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -294,7 +294,7 @@ public class Auto extends SubCommand {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (this.econHandler != null && plotarea.useEconomy()) {
 | 
					        if (this.econHandler != null && plotarea.useEconomy() && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
            PlotExpression costExp = plotarea.getPrices().get("claim");
 | 
					            PlotExpression costExp = plotarea.getPrices().get("claim");
 | 
				
			||||||
            PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
 | 
					            PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
 | 
				
			||||||
            int size = sizeX * sizeZ;
 | 
					            int size = sizeX * sizeZ;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,7 +141,7 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this.econHandler.isEnabled(area) && !force) {
 | 
					            if (this.econHandler.isEnabled(area) && !force && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
                PlotExpression costExr = area.getPrices().get("claim");
 | 
					                PlotExpression costExr = area.getPrices().get("claim");
 | 
				
			||||||
                double cost = costExr.evaluate(currentPlots);
 | 
					                double cost = costExr.evaluate(currentPlots);
 | 
				
			||||||
                if (cost > 0d) {
 | 
					                if (cost > 0d) {
 | 
				
			||||||
@@ -186,8 +186,8 @@ public class Claim extends SubCommand {
 | 
				
			|||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("economy.removed_granted_plot"),
 | 
					                        TranslatableCaption.of("economy.removed_granted_plot"),
 | 
				
			||||||
                        TagResolver.builder()
 | 
					                        TagResolver.builder()
 | 
				
			||||||
                                .tag("usedGrants", Tag.inserting(Component.text(grants - 1)))
 | 
					                                .tag("used_grants", Tag.inserting(Component.text(grants - 1)))
 | 
				
			||||||
                                .tag("remainingGrants", Tag.inserting(Component.text(grants)))
 | 
					                                .tag("remaining_grants", Tag.inserting(Component.text(grants)))
 | 
				
			||||||
                                .build()
 | 
					                                .build()
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -96,6 +96,7 @@ public class DebugRoadRegen extends SubCommand {
 | 
				
			|||||||
        PlotArea area = location.getPlotArea();
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
        if (area == null) {
 | 
					        if (area == null) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
 | 
					            player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Plot plot = player.getCurrentPlot();
 | 
					        Plot plot = player.getCurrentPlot();
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,7 @@ 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;
 | 
				
			||||||
@@ -116,7 +117,7 @@ public class Load extends SubCommand {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    final URL url;
 | 
					                    final URL url;
 | 
				
			||||||
                    try {
 | 
					                    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) {
 | 
					                    } catch (MalformedURLException e) {
 | 
				
			||||||
                        e.printStackTrace();
 | 
					                        e.printStackTrace();
 | 
				
			||||||
                        player.sendMessage(TranslatableCaption.of("web.load_failed"));
 | 
					                        player.sendMessage(TranslatableCaption.of("web.load_failed"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -183,7 +183,7 @@ public class MainCommand extends Command {
 | 
				
			|||||||
                    if (cmd.hasConfirmation(player)) {
 | 
					                    if (cmd.hasConfirmation(player)) {
 | 
				
			||||||
                        CmdConfirm.addPending(player, cmd.getUsage(), () -> {
 | 
					                        CmdConfirm.addPending(player, cmd.getUsage(), () -> {
 | 
				
			||||||
                            PlotArea area = player.getApplicablePlotArea();
 | 
					                            PlotArea area = player.getApplicablePlotArea();
 | 
				
			||||||
                            if (area != null && econHandler.isEnabled(area)) {
 | 
					                            if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
                                PlotExpression priceEval =
 | 
					                                PlotExpression priceEval =
 | 
				
			||||||
                                        area.getPrices().get(cmd.getFullId());
 | 
					                                        area.getPrices().get(cmd.getFullId());
 | 
				
			||||||
                                double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
 | 
					                                double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
 | 
				
			||||||
@@ -201,7 +201,7 @@ public class MainCommand extends Command {
 | 
				
			|||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    PlotArea area = player.getApplicablePlotArea();
 | 
					                    PlotArea area = player.getApplicablePlotArea();
 | 
				
			||||||
                    if (area != null && econHandler.isEnabled(area)) {
 | 
					                    if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
                        PlotExpression priceEval = area.getPrices().get(cmd.getFullId());
 | 
					                        PlotExpression priceEval = area.getPrices().get(cmd.getFullId());
 | 
				
			||||||
                        double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
 | 
					                        double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
 | 
				
			||||||
                        if (price != 0d && econHandler.getMoney(player) < price) {
 | 
					                        if (price != 0d && econHandler.getMoney(player) < price) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -178,7 +178,7 @@ public class Merge extends SubCommand {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (plot.getPlotModificationManager().autoMerge(Direction.ALL, maxSize, uuid, player, terrain)) {
 | 
					            if (plot.getPlotModificationManager().autoMerge(Direction.ALL, maxSize, uuid, player, terrain)) {
 | 
				
			||||||
                if (this.econHandler.isEnabled(plotArea) && price > 0d) {
 | 
					                if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
 | 
				
			||||||
                    this.econHandler.withdrawMoney(player, price);
 | 
					                    this.econHandler.withdrawMoney(player, price);
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    player.sendMessage(
 | 
				
			||||||
                            TranslatableCaption.of("economy.removed_balance"),
 | 
					                            TranslatableCaption.of("economy.removed_balance"),
 | 
				
			||||||
@@ -196,8 +196,8 @@ public class Merge extends SubCommand {
 | 
				
			|||||||
            player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
 | 
					            player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!force && this.econHandler.isEnabled(plotArea) && price > 0d
 | 
					        if (!force && this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d && this.econHandler.getMoney(
 | 
				
			||||||
                && this.econHandler.getMoney(player) < price) {
 | 
					                player) < price) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("economy.cannot_afford_merge"),
 | 
					                    TranslatableCaption.of("economy.cannot_afford_merge"),
 | 
				
			||||||
                    TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
					                    TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
				
			||||||
@@ -218,7 +218,7 @@ public class Merge extends SubCommand {
 | 
				
			|||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuid, player, terrain)) {
 | 
					        if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuid, player, terrain)) {
 | 
				
			||||||
            if (this.econHandler.isEnabled(plotArea) && price > 0d) {
 | 
					            if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
 | 
				
			||||||
                this.econHandler.withdrawMoney(player, price);
 | 
					                this.econHandler.withdrawMoney(player, price);
 | 
				
			||||||
                player.sendMessage(
 | 
					                player.sendMessage(
 | 
				
			||||||
                        TranslatableCaption.of("economy.removed_balance"),
 | 
					                        TranslatableCaption.of("economy.removed_balance"),
 | 
				
			||||||
@@ -259,7 +259,7 @@ public class Merge extends SubCommand {
 | 
				
			|||||||
                    accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid"));
 | 
					                    accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid"));
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (this.econHandler.isEnabled(plotArea) && price > 0d) {
 | 
					                if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
 | 
				
			||||||
                    if (!force && this.econHandler.getMoney(player) < price) {
 | 
					                    if (!force && this.econHandler.getMoney(player) < price) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        player.sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("economy.cannot_afford_merge"),
 | 
					                                TranslatableCaption.of("economy.cannot_afford_merge"),
 | 
				
			||||||
@@ -303,7 +303,7 @@ public class Merge extends SubCommand {
 | 
				
			|||||||
                        player,
 | 
					                        player,
 | 
				
			||||||
                        terrain
 | 
					                        terrain
 | 
				
			||||||
                )) {
 | 
					                )) {
 | 
				
			||||||
                    if (this.econHandler.isEnabled(plotArea) && price > 0d) {
 | 
					                    if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
 | 
				
			||||||
                        if (!force && this.econHandler.getMoney(player) < price) {
 | 
					                        if (!force && this.econHandler.getMoney(player) < price) {
 | 
				
			||||||
                            player.sendMessage(
 | 
					                            player.sendMessage(
 | 
				
			||||||
                                    TranslatableCaption.of("economy.cannot_afford_merge"),
 | 
					                                    TranslatableCaption.of("economy.cannot_afford_merge"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,7 @@ 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;
 | 
				
			||||||
@@ -130,8 +131,7 @@ 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 base = new URL(Settings.Web.URL);
 | 
					                            URL url = URI.create(Settings.Web.URL + "uploads/" + uuid + ".schematic").toURL();
 | 
				
			||||||
                            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();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -206,7 +206,7 @@ public class ComponentPresetManager {
 | 
				
			|||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (componentPreset.cost() > 0.0D) {
 | 
					                if (componentPreset.cost() > 0.0D && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
 | 
				
			||||||
                    if (!econHandler.isEnabled(plot.getArea())) {
 | 
					                    if (!econHandler.isEnabled(plot.getArea())) {
 | 
				
			||||||
                        getPlayer().sendMessage(
 | 
					                        getPlayer().sendMessage(
 | 
				
			||||||
                                TranslatableCaption.of("preset.economy_disabled"),
 | 
					                                TranslatableCaption.of("preset.economy_disabled"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -189,7 +189,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                Object value;
 | 
					                Object value;
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    final boolean accessible = field.isAccessible();
 | 
					                    final boolean accessible = field.canAccess(this);
 | 
				
			||||||
                    field.setAccessible(true);
 | 
					                    field.setAccessible(true);
 | 
				
			||||||
                    value = field.get(this);
 | 
					                    value = field.get(this);
 | 
				
			||||||
                    field.setAccessible(accessible);
 | 
					                    field.setAccessible(accessible);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,6 +77,10 @@ public class HybridUtils {
 | 
				
			|||||||
    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
 | 
					    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
 | 
				
			||||||
    private static final BlockState AIR = BlockTypes.AIR.getDefaultState();
 | 
					    private static final BlockState AIR = BlockTypes.AIR.getDefaultState();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Deprecated and likely to be removed in a future release.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated(forRemoval = true, since = "7.0.0")
 | 
				
			||||||
    public static HybridUtils manager;
 | 
					    public static HybridUtils manager;
 | 
				
			||||||
    public static Set<BlockVector2> regions;
 | 
					    public static Set<BlockVector2> regions;
 | 
				
			||||||
    public static int height;
 | 
					    public static int height;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,7 +66,7 @@ public final class UncheckedWorldLocation extends Location {
 | 
				
			|||||||
     * @param world World
 | 
					     * @param world World
 | 
				
			||||||
     * @param loc   Coordinates
 | 
					     * @param loc   Coordinates
 | 
				
			||||||
     * @return New location
 | 
					     * @return New location
 | 
				
			||||||
     * @since TODO
 | 
					     * @since 7.0.0
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @DoNotUse
 | 
					    @DoNotUse
 | 
				
			||||||
    public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
 | 
					    public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -201,7 +201,8 @@ public enum Permission implements ComponentLike {
 | 
				
			|||||||
    PERMISSION_RATE("plots.rate"),
 | 
					    PERMISSION_RATE("plots.rate"),
 | 
				
			||||||
    PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
 | 
					    PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
 | 
				
			||||||
    PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
 | 
					    PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
 | 
				
			||||||
    PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass");
 | 
					    PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass"),
 | 
				
			||||||
 | 
					    PERMISSION_ADMIN_BYPASS_ECON("plots.admin.econ.bypass");
 | 
				
			||||||
    //</editor-fold>
 | 
					    //</editor-fold>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final String text;
 | 
					    private final String text;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,9 +25,9 @@ import java.util.UUID;
 | 
				
			|||||||
public interface OfflinePlotPlayer extends PermissionHolder {
 | 
					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();
 | 
					    UUID getUUID();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,9 +39,9 @@ public interface OfflinePlotPlayer extends PermissionHolder {
 | 
				
			|||||||
    long getLastPlayed();
 | 
					    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();
 | 
					    String getName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -273,8 +273,9 @@ 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);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * This player's name.
 | 
					     * Returns the name of the player.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return the name of the player
 | 
					     * @return the name of the player
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,8 +26,8 @@ import java.util.Iterator;
 | 
				
			|||||||
import java.util.NoSuchElementException;
 | 
					import java.util.NoSuchElementException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Plot (X,Y) tuples for plot locations
 | 
					 * 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.
 | 
				
			||||||
 * within a plot area
 | 
					 * 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 {
 | 
					public final class PlotId {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,10 +36,10 @@ public final class PlotId {
 | 
				
			|||||||
    private final int hash;
 | 
					    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 x the x-coordinate of the plot
 | 
				
			||||||
     * @param y The plot y coordinate
 | 
					     * @param y the y-coordinate of the plot
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    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 {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 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 x the x-coordinate of the plot
 | 
				
			||||||
     * @param y The plot y coordinate
 | 
					     * @param y the y-coordinate of the plot
 | 
				
			||||||
     * @return a new PlotId at x,y
 | 
					     * @return a new PlotId instance with the specified x and y coordinates
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    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,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
 | 
					     * @param string the string to parse
 | 
				
			||||||
     * @return Plot ID, or {@code null} if none could be parsed
 | 
					     * @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) {
 | 
					    public static @Nullable PlotId fromStringOrNull(final @NonNull String string) {
 | 
				
			||||||
        final String[] parts = string.split("[;_,.]");
 | 
					        final String[] parts = string.split("[;_,.]");
 | 
				
			||||||
@@ -95,39 +98,39 @@ public final class PlotId {
 | 
				
			|||||||
        return of(x, y);
 | 
					        return of(x, y);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Gets the PlotId from the HashCode<br>
 | 
					     * Returns a new PlotId instance from the given hash.
 | 
				
			||||||
     * Note: Only accurate for small x,z values (short)
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param hash ID hash
 | 
					     * @param hash the hash to unpair
 | 
				
			||||||
     * @return Plot ID
 | 
					     * @return a new PlotId instance
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    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);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 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() {
 | 
					    public int getX() {
 | 
				
			||||||
        return this.x;
 | 
					        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() {
 | 
					    public int getY() {
 | 
				
			||||||
        return this.y;
 | 
					        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() {
 | 
					    public @NonNull PlotId getNextId() {
 | 
				
			||||||
        final int absX = Math.abs(x);
 | 
					        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
 | 
					     * @param direction the direction in which to get the relative Plot ID
 | 
				
			||||||
     * @return Relative plot ID
 | 
					     * @return the 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) {
 | 
				
			||||||
@@ -193,10 +197,11 @@ public final class PlotId {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get a String representation of the plot ID where the
 | 
					     * Returns a string representation of this Plot ID in the format "x;y".
 | 
				
			||||||
     * components are separated by ";"
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return {@code x + ";" + y}
 | 
					     * <p> The format is {@code x + ";" + y}
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return a string representation of this Plot ID
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public @NonNull String toString() {
 | 
					    public @NonNull String toString() {
 | 
				
			||||||
@@ -204,41 +209,40 @@ public final class PlotId {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get a String representation of the plot ID where the
 | 
					     * Returns a string representation of this Plot ID with the specified separator.
 | 
				
			||||||
     * components are separated by a specified string
 | 
					     * <p>
 | 
				
			||||||
 | 
					     * The format is {@code x + separator + y}
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param separator Separator
 | 
					     * @param separator the separator to use between the X and Y coordinates
 | 
				
			||||||
     * @return {@code x + separator + y}
 | 
					     * @return a string representation of this Plot ID with the specified separator
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public @NonNull String toSeparatedString(String separator) {
 | 
					    public @NonNull String toSeparatedString(String separator) {
 | 
				
			||||||
        return this.getX() + separator + this.getY();
 | 
					        return this.getX() + separator + this.getY();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get a String representation of the plot ID where the
 | 
					     * Returns a string representation of this Plot ID in the format "x,y".
 | 
				
			||||||
     * components are separated by ","
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return {@code x + "," + y}
 | 
					     * @return a string representation of this Plot ID
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public @NonNull String toCommaSeparatedString() {
 | 
					    public @NonNull String toCommaSeparatedString() {
 | 
				
			||||||
        return this.getX() + "," + this.getY();
 | 
					        return this.getX() + "," + this.getY();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get a String representation of the plot ID where the
 | 
					     * Returns a string representation of this Plot ID in the format "x_y".
 | 
				
			||||||
     * components are separated by "_"
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return {@code x + "_" + y}
 | 
					     * @return a string representation of this Plot ID
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public @NonNull String toUnderscoreSeparatedString() {
 | 
					    public @NonNull String toUnderscoreSeparatedString() {
 | 
				
			||||||
        return this.getX() + "_" + this.getY();
 | 
					        return this.getX() + "_" + this.getY();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get a String representation of the plot ID where the
 | 
					     * Returns a string representation of this Plot ID in the format "x-y".
 | 
				
			||||||
     * components are separated by "-"
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return {@code x + "-" + y}
 | 
					     * @return a string representation of this Plot ID
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public @NonNull String toDashSeparatedString() {
 | 
					    public @NonNull String toDashSeparatedString() {
 | 
				
			||||||
        return this.getX() + "-" + this.getY();
 | 
					        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> {
 | 
					    public static final class PlotRangeIterator implements Iterator<PlotId>, Iterable<PlotId> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private final PlotId start;
 | 
					        private final PlotId start;
 | 
				
			||||||
@@ -265,6 +273,13 @@ 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,14 +67,25 @@ 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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -891,7 +891,6 @@ public final class PlotModificationManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * /**
 | 
					 | 
				
			||||||
     * Sets components such as border, wall, floor.
 | 
					     * Sets components such as border, wall, floor.
 | 
				
			||||||
     * (components are generator specific)
 | 
					     * (components are generator specific)
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,9 +18,25 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,6 +87,7 @@ import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PriceFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectileChangeBlockFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.PveFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PveFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PvpFlag;
 | 
				
			||||||
@@ -181,6 +182,7 @@ public final class GlobalFlagContainer extends FlagContainer {
 | 
				
			|||||||
        this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
 | 
					        this.addFlag(NoWorldeditFlag.NO_WORLDEDIT_FALSE);
 | 
				
			||||||
        this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
 | 
					        this.addFlag(PlayerInteractFlag.PLAYER_INTERACT_FALSE);
 | 
				
			||||||
        this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
 | 
					        this.addFlag(PreventCreativeCopyFlag.PREVENT_CREATIVE_COPY_FALSE);
 | 
				
			||||||
 | 
					        this.addFlag(ProjectileChangeBlockFlag.PROJECTILE_CHANGE_BLOCK_FALSE);
 | 
				
			||||||
        this.addFlag(PveFlag.PVE_FALSE);
 | 
					        this.addFlag(PveFlag.PVE_FALSE);
 | 
				
			||||||
        this.addFlag(PvpFlag.PVP_FALSE);
 | 
					        this.addFlag(PvpFlag.PVP_FALSE);
 | 
				
			||||||
        this.addFlag(RedstoneFlag.REDSTONE_TRUE);
 | 
					        this.addFlag(RedstoneFlag.REDSTONE_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 ProjectileChangeBlockFlag extends BooleanFlag<ProjectileChangeBlockFlag> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final ProjectileChangeBlockFlag PROJECTILE_CHANGE_BLOCK_TRUE = new ProjectileChangeBlockFlag(true);
 | 
				
			||||||
 | 
					    public static final ProjectileChangeBlockFlag PROJECTILE_CHANGE_BLOCK_FALSE = new ProjectileChangeBlockFlag(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private ProjectileChangeBlockFlag(boolean value) {
 | 
				
			||||||
 | 
					        super(value, TranslatableCaption.of("flags.flag_description_projectile_change_block"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected ProjectileChangeBlockFlag flagOf(@NonNull Boolean value) {
 | 
				
			||||||
 | 
					        return value ? PROJECTILE_CHANGE_BLOCK_TRUE : PROJECTILE_CHANGE_BLOCK_FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -83,6 +83,7 @@ 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;
 | 
				
			||||||
@@ -144,7 +145,7 @@ public abstract class SchematicHandler {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        final URL url;
 | 
					        final URL url;
 | 
				
			||||||
        try {
 | 
					        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) {
 | 
					        } catch (MalformedURLException e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            e.printStackTrace();
 | 
				
			||||||
            whenDone.run();
 | 
					            whenDone.run();
 | 
				
			||||||
@@ -153,7 +154,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 = new URL(website).openConnection();
 | 
					                URLConnection con = URI.create(website).toURL().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();
 | 
				
			||||||
@@ -498,9 +499,10 @@ public abstract class SchematicHandler {
 | 
				
			|||||||
    public List<String> getSaves(UUID uuid) {
 | 
					    public List<String> getSaves(UUID uuid) {
 | 
				
			||||||
        String rawJSON;
 | 
					        String rawJSON;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            String website = Settings.Web.URL + "list.php?" + uuid.toString();
 | 
					            URLConnection connection = URI.create(
 | 
				
			||||||
            URL url = new URL(website);
 | 
					                    Settings.Web.URL + "list.php?" + uuid.toString())
 | 
				
			||||||
            URLConnection connection = new URL(url.toString()).openConnection();
 | 
					                    .toURL()
 | 
				
			||||||
 | 
					                    .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());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -124,7 +124,7 @@
 | 
				
			|||||||
  "economy.cannot_afford_merge": "<prefix><red>You cannot afford to merge the plots. It costs <gold><money></gold>.</red>",
 | 
					  "economy.cannot_afford_merge": "<prefix><red>You cannot afford to merge the plots. It costs <gold><money></gold>.</red>",
 | 
				
			||||||
  "economy.added_balance": "<prefix><gold><money> </gold><gray>has been added to your balance.</gray>",
 | 
					  "economy.added_balance": "<prefix><gold><money> </gold><gray>has been added to your balance.</gray>",
 | 
				
			||||||
  "economy.removed_balance": "<prefix><gold><money> </gold><gray>has been taken from your balance.</gray>",
 | 
					  "economy.removed_balance": "<prefix><gold><money> </gold><gray>has been taken from your balance.</gray>",
 | 
				
			||||||
  "economy.removed_granted_plot": "<prefix><gray>You used <usedGrants> plot grant(s), you've got </gray><gold><remainingGrants></gold> <gray>left.</gray>",
 | 
					  "economy.removed_granted_plot": "<prefix><gray>You used <used_grants> plot grant(s), you've got </gray><gold><remaining_grants></gold> <gray>left.</gray>",
 | 
				
			||||||
  "setup.choose_generator": "<gold>What generator do you want?</gold>",
 | 
					  "setup.choose_generator": "<gold>What generator do you want?</gold>",
 | 
				
			||||||
  "setup.setup_not_started": "<prefix><gold>No setup started.</gold>",
 | 
					  "setup.setup_not_started": "<prefix><gold>No setup started.</gold>",
 | 
				
			||||||
  "setup.setup_init": "<prefix><gold>Usage: </gold><gray>/plot setup <value></gray>",
 | 
					  "setup.setup_init": "<prefix><gold>Usage: </gold><gray>/plot setup <value></gray>",
 | 
				
			||||||
@@ -587,6 +587,7 @@
 | 
				
			|||||||
  "flags.flag_description_place": "<gray>Define a list of materials players should be able to place in the plot.</gray>",
 | 
					  "flags.flag_description_place": "<gray>Define a list of materials players should be able to place in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_player_interact": "<gray>Set to `true` to allow guests to interact with players in the plot.</gray>",
 | 
					  "flags.flag_description_player_interact": "<gray>Set to `true` to allow guests to interact with players in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_price": "<gray>Set a price for a plot. Must be a positive decimal number.</gray>",
 | 
					  "flags.flag_description_price": "<gray>Set a price for a plot. Must be a positive decimal number.</gray>",
 | 
				
			||||||
 | 
					  "flags.flag_description_projectile_change_block": "<gray>Set to `true` to allow projectiles to change blocks (tnt, etc.) on the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_pve": "<gray>Set to `true` to enable PVE inside the plot.</gray>",
 | 
					  "flags.flag_description_pve": "<gray>Set to `true` to enable PVE inside the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_pvp": "<gray>Set to `true` to enable PVP inside the plot.</gray>",
 | 
					  "flags.flag_description_pvp": "<gray>Set to `true` to enable PVP inside the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_redstone": "<gray>Set to `false` to disable redstone in the plot.</gray>",
 | 
					  "flags.flag_description_redstone": "<gray>Set to `false` to disable redstone in the plot.</gray>",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
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 java.net.URI
 | 
					import java.net.URI
 | 
				
			||||||
import xyz.jpenilla.runpaper.task.RunServer
 | 
					import xyz.jpenilla.runpaper.task.RunServer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -17,11 +18,11 @@ plugins {
 | 
				
			|||||||
    eclipse
 | 
					    eclipse
 | 
				
			||||||
    idea
 | 
					    idea
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id("xyz.jpenilla.run-paper") version "2.1.0"
 | 
					    alias(libs.plugins.runPaper)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
group = "com.intellectualsites.plotsquared"
 | 
					group = "com.intellectualsites.plotsquared"
 | 
				
			||||||
version = "7.0.0-SNAPSHOT"
 | 
					version = "7.0.1-SNAPSHOT"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (!File("$rootDir/.git").exists()) {
 | 
					if (!File("$rootDir/.git").exists()) {
 | 
				
			||||||
    logger.lifecycle("""
 | 
					    logger.lifecycle("""
 | 
				
			||||||
@@ -76,10 +77,6 @@ subprojects {
 | 
				
			|||||||
        plugin<IdeaPlugin>()
 | 
					        plugin<IdeaPlugin>()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dependencies {
 | 
					 | 
				
			||||||
        implementation(platform("com.intellectualsites.bom:bom-newest:1.34"))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dependencies {
 | 
					    dependencies {
 | 
				
			||||||
        // Tests
 | 
					        // Tests
 | 
				
			||||||
        testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
 | 
					        testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
 | 
				
			||||||
@@ -174,8 +171,9 @@ subprojects {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    scm {
 | 
					                    scm {
 | 
				
			||||||
                        url.set("https://github.com/IntellectualSites/PlotSquared")
 | 
					                        url.set("https://github.com/IntellectualSites/PlotSquared")
 | 
				
			||||||
                        connection.set("scm:https://IntellectualSites@github.com/IntellectualSites/PlotSquared.git")
 | 
					                        connection.set("scm:git:https://github.com/IntellectualSites/PlotSquared.git")
 | 
				
			||||||
                        developerConnection.set("scm:git://github.com/IntellectualSites/PlotSquared.git")
 | 
					                        developerConnection.set("scm:git:git@github.com:IntellectualSites/PlotSquared.git")
 | 
				
			||||||
 | 
					                        tag.set("${project.version}")
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    issueManagement {
 | 
					                    issueManagement {
 | 
				
			||||||
@@ -222,14 +220,23 @@ tasks.getByName<Jar>("jar") {
 | 
				
			|||||||
    enabled = false
 | 
					    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")
 | 
				
			||||||
tasks {
 | 
					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 {
 | 
					    supportedVersions.forEach {
 | 
				
			||||||
        register<RunServer>("runServer-$it") {
 | 
					        register<RunServer>("runServer-$it") {
 | 
				
			||||||
            minecraftVersion(it)
 | 
					            minecraftVersion(it)
 | 
				
			||||||
            pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false).map { (it as Jar).archiveFile }
 | 
					            pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false).map { (it 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/$artifact")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            group = "run paper"
 | 
					            group = "run paper"
 | 
				
			||||||
            runDirectory.set(file("run-$it"))
 | 
					            runDirectory.set(file("run-$it"))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,33 +1,58 @@
 | 
				
			|||||||
[versions]
 | 
					[versions]
 | 
				
			||||||
# Platform expectations
 | 
					# Platform expectations
 | 
				
			||||||
 | 
					paper = "1.20.1-R0.1-SNAPSHOT"
 | 
				
			||||||
guice = "7.0.0"
 | 
					guice = "7.0.0"
 | 
				
			||||||
spotbugs = "4.7.3"
 | 
					spotbugs = "4.7.3"
 | 
				
			||||||
 | 
					checkerqual = "3.37.0"
 | 
				
			||||||
 | 
					gson = "2.10"
 | 
				
			||||||
 | 
					guava = "31.1-jre"
 | 
				
			||||||
 | 
					snakeyaml = "2.0"
 | 
				
			||||||
 | 
					adventure = "4.14.0"
 | 
				
			||||||
 | 
					adventure-bukkit = "4.3.1"
 | 
				
			||||||
 | 
					log4j = "2.19.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Plugins
 | 
					# Plugins
 | 
				
			||||||
worldedit = "7.2.15"
 | 
					worldedit = "7.2.16"
 | 
				
			||||||
placeholderapi = "2.11.3"
 | 
					fawe = "2.7.1"
 | 
				
			||||||
 | 
					placeholderapi = "2.11.4"
 | 
				
			||||||
luckperms = "5.4"
 | 
					luckperms = "5.4"
 | 
				
			||||||
essentialsx = "2.20.0"
 | 
					essentialsx = "2.20.1"
 | 
				
			||||||
mvdwapi = "3.1.1"
 | 
					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.3"
 | 
					cloud-services = "1.8.4"
 | 
				
			||||||
arkitektonika = "2.1.2"
 | 
					arkitektonika = "2.1.2"
 | 
				
			||||||
squirrelid = "0.3.2"
 | 
					squirrelid = "0.3.2"
 | 
				
			||||||
 | 
					paster = "1.1.5"
 | 
				
			||||||
 | 
					bstats = "3.0.2"
 | 
				
			||||||
 | 
					paperlib = "1.0.8"
 | 
				
			||||||
 | 
					informative-annotations = "1.3"
 | 
				
			||||||
 | 
					vault = "1.7.1"
 | 
				
			||||||
 | 
					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.20.0"
 | 
					spotless = "6.21.0"
 | 
				
			||||||
nexus = "1.3.0"
 | 
					nexus = "1.3.0"
 | 
				
			||||||
 | 
					runPaper = "2.2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[libraries]
 | 
					[libraries]
 | 
				
			||||||
# Platform expectations
 | 
					# Platform expectations
 | 
				
			||||||
 | 
					paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" }
 | 
				
			||||||
guice = { group = "com.google.inject", name = "guice", version.ref = "guice" }
 | 
					guice = { group = "com.google.inject", name = "guice", version.ref = "guice" }
 | 
				
			||||||
guiceassistedinject = { group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice" }
 | 
					guiceassistedinject = { group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice" }
 | 
				
			||||||
spotbugs = { group = "com.github.spotbugs", name = "spotbugs-annotations", version.ref = "spotbugs" }
 | 
					spotbugs = { group = "com.github.spotbugs", name = "spotbugs-annotations", version.ref = "spotbugs" }
 | 
				
			||||||
 | 
					checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checkerqual" }
 | 
				
			||||||
 | 
					gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
 | 
				
			||||||
 | 
					guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
 | 
				
			||||||
 | 
					snakeyaml = { group = "org.yaml", name = "snakeyaml", version.ref = "snakeyaml" }
 | 
				
			||||||
 | 
					adventureApi = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" }
 | 
				
			||||||
 | 
					adventureMiniMessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure" }
 | 
				
			||||||
 | 
					adventureBukkit = { group = "net.kyori", name = "adventure-platform-bukkit", version.ref = "adventure-bukkit" }
 | 
				
			||||||
 | 
					log4j = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j" }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Plugins
 | 
					# Plugins
 | 
				
			||||||
worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" }
 | 
					worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" }
 | 
				
			||||||
@@ -35,6 +60,8 @@ worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", ve
 | 
				
			|||||||
placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" }
 | 
					placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" }
 | 
				
			||||||
luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" }
 | 
					luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" }
 | 
				
			||||||
essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "essentialsx" }
 | 
					essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "essentialsx" }
 | 
				
			||||||
 | 
					faweCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" }
 | 
				
			||||||
 | 
					faweBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Third party
 | 
					# Third party
 | 
				
			||||||
prtree = { group = "com.intellectualsites.prtree", name = "PRTree", version.ref = "prtree" }
 | 
					prtree = { group = "com.intellectualsites.prtree", name = "PRTree", version.ref = "prtree" }
 | 
				
			||||||
@@ -43,9 +70,17 @@ cloudServices = { group = "cloud.commandframework", name = "cloud-services", ver
 | 
				
			|||||||
mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" }
 | 
					mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" }
 | 
				
			||||||
squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" }
 | 
					squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" }
 | 
				
			||||||
arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" }
 | 
					arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" }
 | 
				
			||||||
 | 
					paster = { group = "com.intellectualsites.paster", name = "Paster", version.ref = "paster" }
 | 
				
			||||||
 | 
					bstatsBase = { group = "org.bstats", name = "bstats-base", version.ref = "bstats" }
 | 
				
			||||||
 | 
					bstatsBukkit = { group = "org.bstats", name = "bstats-bukkit", version.ref = "bstats" }
 | 
				
			||||||
 | 
					informativeAnnotations = { group = "com.intellectualsites.informative-annotations", name = "informative-annotations", version.ref = "informative-annotations" }
 | 
				
			||||||
 | 
					paperlib = { group = "io.papermc", name = "paperlib", version.ref = "paperlib" }
 | 
				
			||||||
 | 
					vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }
 | 
				
			||||||
 | 
					serverlib = { group = "dev.notmyfault.serverlib", name = "ServerLib", version.ref = "serverlib" }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[plugins]
 | 
					[plugins]
 | 
				
			||||||
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }
 | 
					shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }
 | 
				
			||||||
grgit = { id = "org.ajoberstar.grgit", version.ref = "grgit" }
 | 
					grgit = { id = "org.ajoberstar.grgit", version.ref = "grgit" }
 | 
				
			||||||
spotless = { id = "com.diffplug.spotless", version.ref = "spotless" }
 | 
					spotless = { id = "com.diffplug.spotless", version.ref = "spotless" }
 | 
				
			||||||
nexus = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexus" }
 | 
					nexus = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexus" }
 | 
				
			||||||
 | 
					runPaper = { id = "xyz.jpenilla.run-paper", version.ref = "runPaper" }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											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.2.1-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
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							@@ -83,7 +83,8 @@ done
 | 
				
			|||||||
# This is normally unused
 | 
					# This is normally unused
 | 
				
			||||||
# shellcheck disable=SC2034
 | 
					# shellcheck disable=SC2034
 | 
				
			||||||
APP_BASE_NAME=${0##*/}
 | 
					APP_BASE_NAME=${0##*/}
 | 
				
			||||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
 | 
					# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
 | 
				
			||||||
 | 
					APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
					# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
				
			||||||
MAX_FD=maximum
 | 
					MAX_FD=maximum
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user