mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-04 03:03:43 +01:00 
			
		
		
		
	Compare commits
	
		
			56 Commits
		
	
	
		
			fix/miniMe
			...
			fix/plotMu
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8607b9c49c | ||
| 
						 | 
					ce14036949 | ||
| 
						 | 
					2dbb6ee025 | ||
| 
						 | 
					0da1d9f17a | ||
| 
						 | 
					f1f41b0523 | ||
| 
						 | 
					fe324d3ea9 | ||
| 
						 | 
					ff83868cbc | ||
| 
						 | 
					111ea7029e | ||
| 
						 | 
					9be2eedf7f | ||
| 
						 | 
					82f868ae7d | ||
| 
						 | 
					e46dbd826c | ||
| 
						 | 
					809ddce2b3 | ||
| 
						 | 
					1b40cea51f | ||
| 
						 | 
					022e0fc224 | ||
| 
						 | 
					b32137a650 | ||
| 
						 | 
					17c41c0494 | ||
| 
						 | 
					1ee76bf2d9 | ||
| 
						 | 
					2321831044 | ||
| 
						 | 
					25e98618b9 | ||
| 
						 | 
					5344efd1b7 | ||
| 
						 | 
					68701b6201 | ||
| 
						 | 
					64c610ef37 | ||
| 
						 | 
					931bb90600 | ||
| 
						 | 
					1dfa3b4e66 | ||
| 
						 | 
					8f236a56a6 | ||
| 
						 | 
					e51121960d | ||
| 
						 | 
					cc011de032 | ||
| 
						 | 
					28298ffdd6 | ||
| 
						 | 
					499d3c39bc | ||
| 
						 | 
					3d56937f14 | ||
| 
						 | 
					0f1c2cb4e4 | ||
| 
						 | 
					7b233c944a | ||
| 
						 | 
					d9537ee9df | ||
| 
						 | 
					0de6887526 | ||
| 
						 | 
					a2e3274215 | ||
| 
						 | 
					b369683b9c | ||
| 
						 | 
					7f1f1e025e | ||
| 
						 | 
					59787fe7f3 | ||
| 
						 | 
					6783d5ece6 | ||
| 
						 | 
					d9aa2a496c | ||
| 
						 | 
					809ed6778c | ||
| 
						 | 
					2fe44053a2 | ||
| 
						 | 
					c36b87ca14 | ||
| 
						 | 
					5aec7653b6 | ||
| 
						 | 
					cc5d01e225 | ||
| 
						 | 
					448577774a | ||
| 
						 | 
					966c878a72 | ||
| 
						 | 
					5021f5b379 | ||
| 
						 | 
					76ea9e0d3c | ||
| 
						 | 
					951f08bc8b | ||
| 
						 | 
					ae941e67a4 | ||
| 
						 | 
					9566af5fda | ||
| 
						 | 
					fccc146053 | ||
| 
						 | 
					a1d94af242 | ||
| 
						 | 
					6371cd4c5a | ||
| 
						 | 
					e4613cfc62 | 
							
								
								
									
										7
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							@@ -30,14 +30,7 @@ body:
 | 
				
			|||||||
        - '1.20.4'
 | 
					        - '1.20.4'
 | 
				
			||||||
        - '1.20'
 | 
					        - '1.20'
 | 
				
			||||||
        - '1.19.4'
 | 
					        - '1.19.4'
 | 
				
			||||||
        - '1.19.3'
 | 
					 | 
				
			||||||
        - '1.19.2'
 | 
					 | 
				
			||||||
        - '1.19.1'
 | 
					 | 
				
			||||||
        - '1.19'
 | 
					 | 
				
			||||||
        - '1.18.2'
 | 
					        - '1.18.2'
 | 
				
			||||||
        - '1.18.1'
 | 
					 | 
				
			||||||
        - '1.17.1'
 | 
					 | 
				
			||||||
        - '1.16.5'
 | 
					 | 
				
			||||||
    validations:
 | 
					    validations:
 | 
				
			||||||
      required: true
 | 
					      required: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							@@ -9,7 +9,6 @@
 | 
				
			|||||||
    "dependencies"
 | 
					    "dependencies"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "rebaseWhen": "conflicted",
 | 
					  "rebaseWhen": "conflicted",
 | 
				
			||||||
  "schedule": ["on the first day of the month"],
 | 
					 | 
				
			||||||
  "ignoreDeps": [
 | 
					  "ignoreDeps": [
 | 
				
			||||||
    "com.google.code.gson:gson",
 | 
					    "com.google.code.gson:gson",
 | 
				
			||||||
    "com.google.guava:guava",
 | 
					    "com.google.guava:guava",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,7 +11,7 @@ jobs:
 | 
				
			|||||||
      - name: Checkout Repository
 | 
					      - name: Checkout Repository
 | 
				
			||||||
        uses: actions/checkout@v4
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
      - name: Validate Gradle Wrapper
 | 
					      - name: Validate Gradle Wrapper
 | 
				
			||||||
        uses: gradle/wrapper-validation-action@v1
 | 
					        uses: gradle/wrapper-validation-action@v2
 | 
				
			||||||
      - name: Setup Java
 | 
					      - name: Setup Java
 | 
				
			||||||
        uses: actions/setup-java@v4
 | 
					        uses: actions/setup-java@v4
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,7 +11,7 @@ jobs:
 | 
				
			|||||||
      - name: Checkout Repository
 | 
					      - name: Checkout Repository
 | 
				
			||||||
        uses: actions/checkout@v4
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
      - name: Validate Gradle Wrapper
 | 
					      - name: Validate Gradle Wrapper
 | 
				
			||||||
        uses: gradle/wrapper-validation-action@v1
 | 
					        uses: gradle/wrapper-validation-action@v2
 | 
				
			||||||
      - name: Setup Java
 | 
					      - name: Setup Java
 | 
				
			||||||
        uses: actions/setup-java@v4
 | 
					        uses: actions/setup-java@v4
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/label-merge-conflicts.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/label-merge-conflicts.yaml
									
									
									
									
										vendored
									
									
								
							@@ -15,7 +15,7 @@ jobs:
 | 
				
			|||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Label conflicting PRs
 | 
					      - name: Label conflicting PRs
 | 
				
			||||||
        uses: eps1lon/actions-label-merge-conflict@v2.1.0
 | 
					        uses: eps1lon/actions-label-merge-conflict@v3.0.0
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          dirtyLabel: "unresolved-merge-conflict"
 | 
					          dirtyLabel: "unresolved-merge-conflict"
 | 
				
			||||||
          repoToken: "${{ secrets.GITHUB_TOKEN }}"
 | 
					          repoToken: "${{ secrets.GITHUB_TOKEN }}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							@@ -12,6 +12,6 @@ jobs:
 | 
				
			|||||||
    if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
 | 
					    if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: release-drafter/release-drafter@v5
 | 
					      - uses: release-drafter/release-drafter@v6
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -779,6 +779,14 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                Iterator<Entity> iterator = entities.iterator();
 | 
					                Iterator<Entity> iterator = entities.iterator();
 | 
				
			||||||
                while (iterator.hasNext()) {
 | 
					                while (iterator.hasNext()) {
 | 
				
			||||||
                    Entity entity = iterator.next();
 | 
					                    Entity entity = iterator.next();
 | 
				
			||||||
 | 
					                    //noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol.
 | 
				
			||||||
 | 
					                    if (PaperLib.isPaper() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) {
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    // Fallback for Spigot not having Entity#getEntitySpawnReason
 | 
				
			||||||
 | 
					                    if (entity.getMetadata("ps_custom_spawned").stream().anyMatch(MetadataValue::asBoolean)) {
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    switch (entity.getType().toString()) {
 | 
					                    switch (entity.getType().toString()) {
 | 
				
			||||||
                        case "EGG":
 | 
					                        case "EGG":
 | 
				
			||||||
                        case "FISHING_HOOK":
 | 
					                        case "FISHING_HOOK":
 | 
				
			||||||
@@ -867,8 +875,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
				
			|||||||
                                    if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) {
 | 
					                                    if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) {
 | 
				
			||||||
                                        continue;
 | 
					                                        continue;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    List<MetadataValue> keep = entity.getMetadata("keep");
 | 
					                                    if (entity.hasMetadata("keep")) {
 | 
				
			||||||
                                    if (!keep.isEmpty()) {
 | 
					 | 
				
			||||||
                                        continue;
 | 
					                                        continue;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -670,7 +670,11 @@ public class BlockEventListener implements Listener {
 | 
				
			|||||||
                BlockBreakEvent call = new BlockBreakEvent(block, player);
 | 
					                BlockBreakEvent call = new BlockBreakEvent(block, player);
 | 
				
			||||||
                Bukkit.getServer().getPluginManager().callEvent(call);
 | 
					                Bukkit.getServer().getPluginManager().callEvent(call);
 | 
				
			||||||
                if (!call.isCancelled()) {
 | 
					                if (!call.isCancelled()) {
 | 
				
			||||||
                    event.getBlock().breakNaturally();
 | 
					                    if (Settings.Flags.INSTABREAK_CONSIDER_TOOL) {
 | 
				
			||||||
 | 
					                        block.breakNaturally(event.getItemInHand());
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        block.breakNaturally();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // == rather than <= as we only care about the "ground level" not being destroyed
 | 
					            // == rather than <= as we only care about the "ground level" not being destroyed
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@
 | 
				
			|||||||
package com.plotsquared.bukkit.listener;
 | 
					package com.plotsquared.bukkit.listener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.inject.Inject;
 | 
					import com.google.inject.Inject;
 | 
				
			||||||
 | 
					import com.plotsquared.bukkit.BukkitPlatform;
 | 
				
			||||||
import com.plotsquared.bukkit.player.BukkitPlayer;
 | 
					import com.plotsquared.bukkit.player.BukkitPlayer;
 | 
				
			||||||
import com.plotsquared.bukkit.util.BukkitEntityUtil;
 | 
					import com.plotsquared.bukkit.util.BukkitEntityUtil;
 | 
				
			||||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
					import com.plotsquared.bukkit.util.BukkitUtil;
 | 
				
			||||||
@@ -41,6 +42,7 @@ import com.plotsquared.core.util.EventDispatcher;
 | 
				
			|||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import com.sk89q.worldedit.world.block.BlockType;
 | 
					import com.sk89q.worldedit.world.block.BlockType;
 | 
				
			||||||
 | 
					import io.papermc.lib.PaperLib;
 | 
				
			||||||
import org.bukkit.Material;
 | 
					import org.bukkit.Material;
 | 
				
			||||||
import org.bukkit.Particle;
 | 
					import org.bukkit.Particle;
 | 
				
			||||||
import org.bukkit.World;
 | 
					import org.bukkit.World;
 | 
				
			||||||
@@ -54,6 +56,7 @@ import org.bukkit.entity.Player;
 | 
				
			|||||||
import org.bukkit.entity.Projectile;
 | 
					import org.bukkit.entity.Projectile;
 | 
				
			||||||
import org.bukkit.entity.TNTPrimed;
 | 
					import org.bukkit.entity.TNTPrimed;
 | 
				
			||||||
import org.bukkit.entity.Vehicle;
 | 
					import org.bukkit.entity.Vehicle;
 | 
				
			||||||
 | 
					import org.bukkit.event.Cancellable;
 | 
				
			||||||
import org.bukkit.event.EventHandler;
 | 
					import org.bukkit.event.EventHandler;
 | 
				
			||||||
import org.bukkit.event.EventPriority;
 | 
					import org.bukkit.event.EventPriority;
 | 
				
			||||||
import org.bukkit.event.Listener;
 | 
					import org.bukkit.event.Listener;
 | 
				
			||||||
@@ -78,52 +81,43 @@ import java.util.List;
 | 
				
			|||||||
@SuppressWarnings("unused")
 | 
					@SuppressWarnings("unused")
 | 
				
			||||||
public class EntityEventListener implements Listener {
 | 
					public class EntityEventListener implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final BukkitPlatform platform;
 | 
				
			||||||
    private final PlotAreaManager plotAreaManager;
 | 
					    private final PlotAreaManager plotAreaManager;
 | 
				
			||||||
    private final EventDispatcher eventDispatcher;
 | 
					    private final EventDispatcher eventDispatcher;
 | 
				
			||||||
    private float lastRadius;
 | 
					    private float lastRadius;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Inject
 | 
					    @Inject
 | 
				
			||||||
    public EntityEventListener(
 | 
					    public EntityEventListener(
 | 
				
			||||||
 | 
					            final @NonNull BukkitPlatform platform,
 | 
				
			||||||
            final @NonNull PlotAreaManager plotAreaManager,
 | 
					            final @NonNull PlotAreaManager plotAreaManager,
 | 
				
			||||||
            final @NonNull EventDispatcher eventDispatcher
 | 
					            final @NonNull EventDispatcher eventDispatcher
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
 | 
					        this.platform = platform;
 | 
				
			||||||
        this.plotAreaManager = plotAreaManager;
 | 
					        this.plotAreaManager = plotAreaManager;
 | 
				
			||||||
        this.eventDispatcher = eventDispatcher;
 | 
					        this.eventDispatcher = eventDispatcher;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.HIGHEST)
 | 
					    @EventHandler(priority = EventPriority.HIGHEST)
 | 
				
			||||||
    public void onEntityCombustByEntity(EntityCombustByEntityEvent event) {
 | 
					    public void onEntityCombustByEntity(EntityCombustByEntityEvent event) {
 | 
				
			||||||
        EntityDamageByEntityEvent eventChange =
 | 
					        onEntityDamageByEntityCommon(event.getCombuster(), event.getEntity(), EntityDamageEvent.DamageCause.FIRE_TICK, event);
 | 
				
			||||||
                new EntityDamageByEntityEvent(
 | 
					 | 
				
			||||||
                        event.getCombuster(),
 | 
					 | 
				
			||||||
                        event.getEntity(),
 | 
					 | 
				
			||||||
                        EntityDamageEvent.DamageCause.FIRE_TICK,
 | 
					 | 
				
			||||||
                        event.getDuration()
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
        onEntityDamageByEntityEvent(eventChange);
 | 
					 | 
				
			||||||
        if (eventChange.isCancelled()) {
 | 
					 | 
				
			||||||
            event.setCancelled(true);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.HIGHEST)
 | 
					    @EventHandler(priority = EventPriority.HIGHEST)
 | 
				
			||||||
    public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
 | 
					    public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
 | 
				
			||||||
        Entity damager = event.getDamager();
 | 
					        onEntityDamageByEntityCommon(event.getDamager(), event.getEntity(), event.getCause(), event);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void onEntityDamageByEntityCommon(
 | 
				
			||||||
 | 
					            final Entity damager,
 | 
				
			||||||
 | 
					            final Entity victim,
 | 
				
			||||||
 | 
					            final EntityDamageEvent.DamageCause cause,
 | 
				
			||||||
 | 
					            final Cancellable event
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
        Location location = BukkitUtil.adapt(damager.getLocation());
 | 
					        Location location = BukkitUtil.adapt(damager.getLocation());
 | 
				
			||||||
        if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
 | 
					        if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Entity victim = event.getEntity();
 | 
					        if (!BukkitEntityUtil.entityDamage(damager, victim, cause)) {
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
        if (victim.getType().equals(EntityType.ITEM_FRAME)) {
 | 
					 | 
				
			||||||
            Plot plot = BukkitUtil.getLocation(victim).getPlot();
 | 
					 | 
				
			||||||
            if (plot != null && !plot.isAdded(damager.getUniqueId())) {
 | 
					 | 
				
			||||||
                event.setCancelled(true);
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
        if (!BukkitEntityUtil.entityDamage(damager, victim, event.getCause())) {
 | 
					 | 
				
			||||||
            if (event.isCancelled()) {
 | 
					            if (event.isCancelled()) {
 | 
				
			||||||
                if (victim instanceof Ageable ageable) {
 | 
					                if (victim instanceof Ageable ageable) {
 | 
				
			||||||
                    if (ageable.getAge() == -24000) {
 | 
					                    if (ageable.getAge() == -24000) {
 | 
				
			||||||
@@ -158,19 +152,30 @@ public class EntityEventListener implements Listener {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
 | 
					            case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
 | 
				
			||||||
                    "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
 | 
					                    "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
 | 
				
			||||||
                    "DUPLICATION", "FROZEN", "SPELL", "DEFAULT" -> {
 | 
					                    "FROZEN", "SPELL", "DEFAULT" -> {
 | 
				
			||||||
                if (!area.isMobSpawning()) {
 | 
					                if (!area.isMobSpawning()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "BREEDING" -> {
 | 
					            case "BREEDING", "DUPLICATION" -> {
 | 
				
			||||||
                if (!area.isSpawnBreeding()) {
 | 
					                if (!area.isSpawnBreeding()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
 | 
					            case "CUSTOM" -> {
 | 
				
			||||||
 | 
					                if (!area.isSpawnCustom()) {
 | 
				
			||||||
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                // No need to clutter metadata if running paper
 | 
				
			||||||
 | 
					                if (!PaperLib.isPaper()) {
 | 
				
			||||||
 | 
					                    entity.setMetadata("ps_custom_spawned", new FixedMetadataValue(this.platform, true));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return; // Don't cancel if mob spawning is disabled
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER" -> {
 | 
				
			||||||
                if (!area.isSpawnCustom()) {
 | 
					                if (!area.isSpawnCustom()) {
 | 
				
			||||||
                    event.setCancelled(true);
 | 
					                    event.setCancelled(true);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,9 +120,15 @@ public class EntitySpawnListener implements Listener {
 | 
				
			|||||||
        Entity entity = event.getEntity();
 | 
					        Entity entity = event.getEntity();
 | 
				
			||||||
        Location location = BukkitUtil.adapt(entity.getLocation());
 | 
					        Location location = BukkitUtil.adapt(entity.getLocation());
 | 
				
			||||||
        PlotArea area = location.getPlotArea();
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
        if (!location.isPlotArea()) {
 | 
					        if (!location.isPlotArea() || area == null) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (PaperLib.isPaper()) {
 | 
				
			||||||
 | 
					            //noinspection ConstantValue - getEntitySpawnReason annotated as NotNull, but is not NotNull. lol.
 | 
				
			||||||
 | 
					            if (area.isSpawnCustom() && entity.getEntitySpawnReason() != null && "CUSTOM".equals(entity.getEntitySpawnReason().name())) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        Plot plot = location.getOwnedPlotAbs();
 | 
					        Plot plot = location.getOwnedPlotAbs();
 | 
				
			||||||
        EntityType type = entity.getType();
 | 
					        EntityType type = entity.getType();
 | 
				
			||||||
        if (plot == null) {
 | 
					        if (plot == null) {
 | 
				
			||||||
@@ -148,7 +154,7 @@ public class EntitySpawnListener implements Listener {
 | 
				
			|||||||
        if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
					        if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
 | 
				
			||||||
            event.setCancelled(true);
 | 
					            event.setCancelled(true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (type == EntityType.ENDER_CRYSTAL) {
 | 
					        if (type == EntityType.ENDER_CRYSTAL || type == EntityType.ARMOR_STAND) {
 | 
				
			||||||
            if (BukkitEntityUtil.checkEntity(entity, plot)) {
 | 
					            if (BukkitEntityUtil.checkEntity(entity, plot)) {
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@
 | 
				
			|||||||
package com.plotsquared.bukkit.listener;
 | 
					package com.plotsquared.bukkit.listener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.destroystokyo.paper.event.block.BeaconEffectEvent;
 | 
					import com.destroystokyo.paper.event.block.BeaconEffectEvent;
 | 
				
			||||||
 | 
					import com.destroystokyo.paper.event.block.BlockDestroyEvent;
 | 
				
			||||||
import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
 | 
					import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
 | 
				
			||||||
import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
 | 
					import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
 | 
				
			||||||
import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
 | 
					import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
 | 
				
			||||||
@@ -40,7 +41,9 @@ import com.plotsquared.core.plot.PlotArea;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.FlagContainer;
 | 
					import com.plotsquared.core.plot.flag.FlagContainer;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.FishingFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
					import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
@@ -83,6 +86,19 @@ public class PaperListener implements Listener {
 | 
				
			|||||||
        this.plotAreaManager = plotAreaManager;
 | 
					        this.plotAreaManager = plotAreaManager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
 | 
				
			||||||
 | 
					    public void onBlockDestroy(final BlockDestroyEvent event) {
 | 
				
			||||||
 | 
					        Location location = BukkitUtil.adapt(event.getBlock().getLocation());
 | 
				
			||||||
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
 | 
					        if (area == null) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Plot plot = area.getPlot(location);
 | 
				
			||||||
 | 
					        if (plot != null) {
 | 
				
			||||||
 | 
					            event.setWillDrop(plot.getFlag(TileDropFlag.class));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler
 | 
					    @EventHandler
 | 
				
			||||||
    public void onEntityPathfind(EntityPathfindEvent event) {
 | 
					    public void onEntityPathfind(EntityPathfindEvent event) {
 | 
				
			||||||
        if (!Settings.Paper_Components.ENTITY_PATHING) {
 | 
					        if (!Settings.Paper_Components.ENTITY_PATHING) {
 | 
				
			||||||
@@ -348,6 +364,11 @@ public class PaperListener implements Listener {
 | 
				
			|||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.isAdded(pp.getUUID())) {
 | 
					        } else if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
 | 
					            if (entity.getType().equals(EntityType.FISHING_HOOK)) {
 | 
				
			||||||
 | 
					                if (plot.getFlag(FishingFlag.class)) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
					            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
				
			||||||
                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,6 +61,7 @@ import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PlayerInteractFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag;
 | 
				
			||||||
@@ -107,6 +108,7 @@ import org.bukkit.event.EventHandler;
 | 
				
			|||||||
import org.bukkit.event.EventPriority;
 | 
					import org.bukkit.event.EventPriority;
 | 
				
			||||||
import org.bukkit.event.Listener;
 | 
					import org.bukkit.event.Listener;
 | 
				
			||||||
import org.bukkit.event.block.Action;
 | 
					import org.bukkit.event.block.Action;
 | 
				
			||||||
 | 
					import org.bukkit.event.block.BlockBreakEvent;
 | 
				
			||||||
import org.bukkit.event.entity.EntityPickupItemEvent;
 | 
					import org.bukkit.event.entity.EntityPickupItemEvent;
 | 
				
			||||||
import org.bukkit.event.entity.EntityPlaceEvent;
 | 
					import org.bukkit.event.entity.EntityPlaceEvent;
 | 
				
			||||||
import org.bukkit.event.entity.EntityPotionEffectEvent;
 | 
					import org.bukkit.event.entity.EntityPotionEffectEvent;
 | 
				
			||||||
@@ -236,6 +238,19 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
        this.plotListener = plotListener;
 | 
					        this.plotListener = plotListener;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
 | 
				
			||||||
 | 
					    public void onBlockBreak(final BlockBreakEvent event) {
 | 
				
			||||||
 | 
					        Location location = BukkitUtil.adapt(event.getBlock().getLocation());
 | 
				
			||||||
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
 | 
					        if (area == null) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Plot plot = area.getPlot(location);
 | 
				
			||||||
 | 
					        if (plot != null) {
 | 
				
			||||||
 | 
					            event.setDropItems(plot.getFlag(TileDropFlag.class));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
					    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 | 
				
			||||||
    public void onPlayerDyeSign(PlayerInteractEvent event) {
 | 
					    public void onPlayerDyeSign(PlayerInteractEvent event) {
 | 
				
			||||||
        ItemStack itemStack = event.getItem();
 | 
					        ItemStack itemStack = event.getItem();
 | 
				
			||||||
@@ -1921,7 +1936,9 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @EventHandler
 | 
					    @EventHandler
 | 
				
			||||||
    public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) {
 | 
					    public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) {
 | 
				
			||||||
        Location location = BukkitUtil.adapt(event.getPlayer().getLocation());
 | 
					        Player player = event.getPlayer();
 | 
				
			||||||
 | 
					        BukkitPlayer pp = BukkitUtil.adapt(player);
 | 
				
			||||||
 | 
					        Location location = pp.getLocation();
 | 
				
			||||||
        PlotArea area = location.getPlotArea();
 | 
					        PlotArea area = location.getPlotArea();
 | 
				
			||||||
        if (area == null) {
 | 
					        if (area == null) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -1933,10 +1950,12 @@ public class PlayerEventListener implements Listener {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
            if (plot.getFlag(LecternReadBookFlag.class)) {
 | 
					            if (plot.getFlag(LecternReadBookFlag.class)) {
 | 
				
			||||||
                plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
 | 
					                plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
 | 
				
			||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,12 +28,14 @@ import com.plotsquared.core.player.PlotPlayer;
 | 
				
			|||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotHandler;
 | 
					import com.plotsquared.core.plot.PlotHandler;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.FishingFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.PlotFlagUtil;
 | 
					import com.plotsquared.core.util.PlotFlagUtil;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
					import net.kyori.adventure.text.minimessage.tag.Tag;
 | 
				
			||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
					import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					import org.bukkit.entity.Entity;
 | 
				
			||||||
 | 
					import org.bukkit.entity.EntityType;
 | 
				
			||||||
import org.bukkit.entity.LivingEntity;
 | 
					import org.bukkit.entity.LivingEntity;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
import org.bukkit.entity.Projectile;
 | 
					import org.bukkit.entity.Projectile;
 | 
				
			||||||
@@ -132,6 +134,11 @@ public class ProjectileEventListener implements Listener {
 | 
				
			|||||||
                event.setCancelled(true);
 | 
					                event.setCancelled(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (!plot.isAdded(pp.getUUID())) {
 | 
					        } else if (!plot.isAdded(pp.getUUID())) {
 | 
				
			||||||
 | 
					            if (entity.getType().equals(EntityType.FISHING_HOOK)) {
 | 
				
			||||||
 | 
					                if (plot.getFlag(FishingFlag.class)) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
					            if (!plot.getFlag(ProjectilesFlag.class)) {
 | 
				
			||||||
                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
					                if (!pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER)) {
 | 
				
			||||||
                    pp.sendMessage(
 | 
					                    pp.sendMessage(
 | 
				
			||||||
@@ -187,7 +194,8 @@ public class ProjectileEventListener implements Listener {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
 | 
					            if (plot.isAdded(pp.getUUID()) || pp.hasPermission(Permission.PERMISSION_ADMIN_PROJECTILE_OTHER) || plot.getFlag(
 | 
				
			||||||
                    ProjectilesFlag.class)) {
 | 
					                    ProjectilesFlag.class) || (entity.getType().equals(EntityType.FISHING_HOOK) && plot.getFlag(
 | 
				
			||||||
 | 
					                    FishingFlag.class))) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            entity.remove();
 | 
					            entity.remove();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,8 @@ package com.plotsquared.bukkit.placeholder;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.plotsquared.core.PlotSquared;
 | 
					import com.plotsquared.core.PlotSquared;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import me.clip.placeholderapi.PlaceholderAPIPlugin;
 | 
					import me.clip.placeholderapi.PlaceholderAPIPlugin;
 | 
				
			||||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
 | 
					import me.clip.placeholderapi.expansion.PlaceholderExpansion;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
@@ -83,6 +85,20 @@ public class PAPIPlaceholders extends PlaceholderExpansion {
 | 
				
			|||||||
            return String.valueOf(pl.getPlotCount(identifier));
 | 
					            return String.valueOf(pl.getPlotCount(identifier));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (identifier.startsWith("base_plot_count_")) {
 | 
				
			||||||
 | 
					            identifier = identifier.substring("base_plot_count_".length());
 | 
				
			||||||
 | 
					            if (identifier.isEmpty()) {
 | 
				
			||||||
 | 
					                return "";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return String.valueOf(PlotQuery.newQuery()
 | 
				
			||||||
 | 
					                    .ownedBy(pl)
 | 
				
			||||||
 | 
					                    .inWorld(identifier)
 | 
				
			||||||
 | 
					                    .whereBasePlot()
 | 
				
			||||||
 | 
					                    .thatPasses(plot -> !DoneFlag.isDone(plot))
 | 
				
			||||||
 | 
					                    .count());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // PlotSquared placeholders
 | 
					        // PlotSquared placeholders
 | 
				
			||||||
        return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl);
 | 
					        return PlotSquared.platform().placeholderRegistry().getPlaceholderValue(identifier, pl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,7 @@ import com.plotsquared.core.plot.PlotWeather;
 | 
				
			|||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
					import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.MathMan;
 | 
					import com.plotsquared.core.util.MathMan;
 | 
				
			||||||
 | 
					import com.plotsquared.core.util.WorldUtil;
 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
					import com.sk89q.worldedit.bukkit.BukkitAdapter;
 | 
				
			||||||
import com.sk89q.worldedit.extension.platform.Actor;
 | 
					import com.sk89q.worldedit.extension.platform.Actor;
 | 
				
			||||||
import com.sk89q.worldedit.world.item.ItemType;
 | 
					import com.sk89q.worldedit.world.item.ItemType;
 | 
				
			||||||
@@ -40,6 +41,7 @@ import io.papermc.lib.PaperLib;
 | 
				
			|||||||
import net.kyori.adventure.audience.Audience;
 | 
					import net.kyori.adventure.audience.Audience;
 | 
				
			||||||
import org.bukkit.GameMode;
 | 
					import org.bukkit.GameMode;
 | 
				
			||||||
import org.bukkit.Sound;
 | 
					import org.bukkit.Sound;
 | 
				
			||||||
 | 
					import org.bukkit.SoundCategory;
 | 
				
			||||||
import org.bukkit.WeatherType;
 | 
					import org.bukkit.WeatherType;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					import org.bukkit.event.Event;
 | 
				
			||||||
@@ -51,7 +53,6 @@ import org.bukkit.potion.PotionEffectType;
 | 
				
			|||||||
import org.checkerframework.checker.index.qual.NonNegative;
 | 
					import org.checkerframework.checker.index.qual.NonNegative;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Arrays;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,6 +121,9 @@ public class BukkitPlayer extends PlotPlayer<Player> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean canTeleport(final @NonNull Location location) {
 | 
					    public boolean canTeleport(final @NonNull Location location) {
 | 
				
			||||||
 | 
					        if (!WorldUtil.isValidLocation(location)) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        final org.bukkit.Location to = BukkitUtil.adapt(location);
 | 
					        final org.bukkit.Location to = BukkitUtil.adapt(location);
 | 
				
			||||||
        final org.bukkit.Location from = player.getLocation();
 | 
					        final org.bukkit.Location from = player.getLocation();
 | 
				
			||||||
        PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to);
 | 
					        PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to);
 | 
				
			||||||
@@ -221,7 +225,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) {
 | 
					    public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) {
 | 
				
			||||||
        if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) {
 | 
					        if (!WorldUtil.isValidLocation(location)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        final org.bukkit.Location bukkitLocation =
 | 
					        final org.bukkit.Location bukkitLocation =
 | 
				
			||||||
@@ -309,19 +313,22 @@ public class BukkitPlayer extends PlotPlayer<Player> {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void playMusic(final @NonNull Location location, final @NonNull ItemType id) {
 | 
					    public void playMusic(final @NonNull Location location, final @NonNull ItemType id) {
 | 
				
			||||||
        if (id == ItemTypes.AIR) {
 | 
					        if (id == ItemTypes.AIR) {
 | 
				
			||||||
            // Let's just stop all the discs because why not?
 | 
					            if (PlotSquared.platform().serverVersion()[1] >= 19) {
 | 
				
			||||||
            for (final Sound sound : Arrays.stream(Sound.values())
 | 
					                player.stopSound(SoundCategory.MUSIC);
 | 
				
			||||||
                    .filter(sound -> sound.name().contains("DISC")).toList()) {
 | 
					                return;
 | 
				
			||||||
                player.stopSound(sound);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR);
 | 
					            // 1.18 and downwards require a specific Sound to stop (even tho the packet does not??)
 | 
				
			||||||
        } else {
 | 
					            for (final Sound sound : Sound.values()) {
 | 
				
			||||||
            // this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, id.to(Material.class));
 | 
					                if (sound.name().startsWith("MUSIC_DISC")) {
 | 
				
			||||||
            this.player.playSound(BukkitUtil.adapt(location),
 | 
					                    this.player.stopSound(sound, SoundCategory.MUSIC);
 | 
				
			||||||
                    Sound.valueOf(BukkitAdapter.adapt(id).name()), Float.MAX_VALUE, 1f
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.player.playSound(BukkitUtil.adapt(location), Sound.valueOf(BukkitAdapter.adapt(id).name()),
 | 
				
			||||||
 | 
					                SoundCategory.MUSIC, Float.MAX_VALUE, 1f
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @SuppressWarnings("deprecation") // Needed for Spigot compatibility
 | 
					    @SuppressWarnings("deprecation") // Needed for Spigot compatibility
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,9 @@ import com.sk89q.worldedit.regions.CuboidRegion;
 | 
				
			|||||||
import com.sk89q.worldedit.world.biome.BiomeType;
 | 
					import com.sk89q.worldedit.world.biome.BiomeType;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Objects;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class FaweRegionManager extends BukkitRegionManager {
 | 
					public class FaweRegionManager extends BukkitRegionManager {
 | 
				
			||||||
@@ -59,7 +61,10 @@ public class FaweRegionManager extends BukkitRegionManager {
 | 
				
			|||||||
            @Nullable PlotPlayer<?> actor,
 | 
					            @Nullable PlotPlayer<?> actor,
 | 
				
			||||||
            @Nullable QueueCoordinator queue
 | 
					            @Nullable QueueCoordinator queue
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
        return delegate.setCuboids(area, regions, blocks, minY, maxY, queue.getCompleteTask());
 | 
					        return delegate.setCuboids(
 | 
				
			||||||
 | 
					                area, regions, blocks, minY, maxY,
 | 
				
			||||||
 | 
					                Objects.requireNonNullElseGet(queue, area::getQueue).getCompleteTask()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
@@ -111,7 +116,7 @@ public class FaweRegionManager extends BukkitRegionManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean regenerateRegion(final Location pos1, final Location pos2, boolean ignore, final Runnable whenDone) {
 | 
					    public boolean regenerateRegion(final @NotNull Location pos1, final @NotNull Location pos2, boolean ignore, final Runnable whenDone) {
 | 
				
			||||||
        return delegate.regenerateRegion(pos1, pos2, ignore, whenDone);
 | 
					        return delegate.regenerateRegion(pos1, pos2, ignore, whenDone);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,8 +21,9 @@ package com.plotsquared.core.command;
 | 
				
			|||||||
import com.google.inject.Inject;
 | 
					import com.google.inject.Inject;
 | 
				
			||||||
import com.plotsquared.core.PlotSquared;
 | 
					import com.plotsquared.core.PlotSquared;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.events.PlotFlagRemoveEvent;
 | 
					import com.plotsquared.core.events.PlayerBuyPlotEvent;
 | 
				
			||||||
import com.plotsquared.core.events.Result;
 | 
					import com.plotsquared.core.events.Result;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.OfflinePlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
@@ -88,22 +89,30 @@ public class Buy extends Command {
 | 
				
			|||||||
                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
					                TranslatableCaption.of("permission.cant_claim_more_plots"),
 | 
				
			||||||
                TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
					                TagResolver.resolver("amount", Tag.inserting(Component.text(player.getAllowedPlots())))
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        double price = plot.getFlag(PriceFlag.class);
 | 
					        double priceFlag = plot.getFlag(PriceFlag.class);
 | 
				
			||||||
        if (price <= 0) {
 | 
					        if (priceFlag <= 0) {
 | 
				
			||||||
            throw new CommandException(TranslatableCaption.of("economy.not_for_sale"));
 | 
					            throw new CommandException(TranslatableCaption.of("economy.not_for_sale"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        checkTrue(
 | 
					        checkTrue(
 | 
				
			||||||
                this.econHandler.isSupported(),
 | 
					                this.econHandler.isSupported(),
 | 
				
			||||||
                TranslatableCaption.of("economy.vault_or_consumer_null")
 | 
					                TranslatableCaption.of("economy.vault_or_consumer_null")
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        checkTrue(
 | 
					
 | 
				
			||||||
                this.econHandler.getMoney(player) >= price,
 | 
					        PlayerBuyPlotEvent event = this.eventDispatcher.callPlayerBuyPlot(player, plot, priceFlag);
 | 
				
			||||||
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
 | 
					            throw new CommandException(TranslatableCaption.of("economy.cannot_buy_blocked"));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        double price = event.getEventResult() == Result.FORCE ? 0 : event.price();
 | 
				
			||||||
 | 
					        if (this.econHandler.getMoney(player) < price) {
 | 
				
			||||||
 | 
					            throw new CommandException(
 | 
				
			||||||
                    TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
					                    TranslatableCaption.of("economy.cannot_afford_plot"),
 | 
				
			||||||
                    TagResolver.builder()
 | 
					                    TagResolver.builder()
 | 
				
			||||||
                            .tag("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
					                            .tag("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
				
			||||||
                            .tag("balance", Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))))
 | 
					                            .tag("balance", Tag.inserting(Component.text(this.econHandler.format(this.econHandler.getMoney(player)))))
 | 
				
			||||||
                            .build()
 | 
					                            .build()
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        this.econHandler.withdrawMoney(player, price);
 | 
					        this.econHandler.withdrawMoney(player, price);
 | 
				
			||||||
        // Failure
 | 
					        // Failure
 | 
				
			||||||
        // Success
 | 
					        // Success
 | 
				
			||||||
@@ -113,7 +122,8 @@ public class Buy extends Command {
 | 
				
			|||||||
                    TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
					                    TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.econHandler.depositMoney(PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs()), price);
 | 
					            OfflinePlotPlayer previousOwner = PlotSquared.platform().playerManager().getOfflinePlayer(plot.getOwnerAbs());
 | 
				
			||||||
 | 
					            this.econHandler.depositMoney(previousOwner, price);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs());
 | 
					            PlotPlayer<?> owner = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs());
 | 
				
			||||||
            if (owner != null) {
 | 
					            if (owner != null) {
 | 
				
			||||||
@@ -127,9 +137,8 @@ public class Buy extends Command {
 | 
				
			|||||||
                );
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
 | 
					            PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class);
 | 
				
			||||||
            PlotFlagRemoveEvent event = this.eventDispatcher.callFlagRemove(plotFlag, plot);
 | 
					            if (this.eventDispatcher.callFlagRemove(plotFlag, plot).getEventResult() != Result.DENY) {
 | 
				
			||||||
            if (event.getEventResult() != Result.DENY) {
 | 
					                plot.removeFlag(plotFlag);
 | 
				
			||||||
                plot.removeFlag(event.getFlag());
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            plot.setOwner(player.getUUID());
 | 
					            plot.setOwner(player.getUUID());
 | 
				
			||||||
            plot.getPlotModificationManager().setSign(player.getName());
 | 
					            plot.getPlotModificationManager().setSign(player.getName());
 | 
				
			||||||
@@ -137,6 +146,7 @@ public class Buy extends Command {
 | 
				
			|||||||
                    TranslatableCaption.of("working.claimed"),
 | 
					                    TranslatableCaption.of("working.claimed"),
 | 
				
			||||||
                    TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
					                    TagResolver.resolver("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					            this.eventDispatcher.callPostPlayerBuyPlot(player, previousOwner, plot, price);
 | 
				
			||||||
            whenDone.run(Buy.this, CommandResult.SUCCESS);
 | 
					            whenDone.run(Buy.this, CommandResult.SUCCESS);
 | 
				
			||||||
        }, () -> {
 | 
					        }, () -> {
 | 
				
			||||||
            this.econHandler.depositMoney(player, price);
 | 
					            this.econHandler.depositMoney(player, price);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -135,6 +135,7 @@ public class Clear extends Command {
 | 
				
			|||||||
                                    .tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
					                                    .tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
 | 
				
			||||||
                                    .build()
 | 
					                                    .build()
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
 | 
					                    this.eventDispatcher.callPostPlotClear(player, plot);
 | 
				
			||||||
                }));
 | 
					                }));
 | 
				
			||||||
                if (!result) {
 | 
					                if (!result) {
 | 
				
			||||||
                    player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
 | 
					                    player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ package com.plotsquared.core.command;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.google.inject.Inject;
 | 
					import com.google.inject.Inject;
 | 
				
			||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.StaticCaption;
 | 
					 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.permissions.Permission;
 | 
					import com.plotsquared.core.permissions.Permission;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
@@ -202,7 +201,6 @@ public class Download extends SubCommand {
 | 
				
			|||||||
                                                    .tag("delete", Tag.preProcessParsed("Not available"))
 | 
					                                                    .tag("delete", Tag.preProcessParsed("Not available"))
 | 
				
			||||||
                                                    .build()
 | 
					                                                    .build()
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    player.sendMessage(StaticCaption.of(value.toString()));
 | 
					 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                    ));
 | 
					                    ));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -268,6 +268,7 @@ public class MainCommand extends Command {
 | 
				
			|||||||
                    tp = true;
 | 
					                    tp = true;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    player.sendMessage(TranslatableCaption.of("border.denied"));
 | 
					                    player.sendMessage(TranslatableCaption.of("border.denied"));
 | 
				
			||||||
 | 
					                    return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                // Trim command
 | 
					                // Trim command
 | 
				
			||||||
                args = Arrays.copyOfRange(args, 1, args.length);
 | 
					                args = Arrays.copyOfRange(args, 1, args.length);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,6 +77,7 @@ public class Visit extends Command {
 | 
				
			|||||||
            query.whereBasePlot();
 | 
					            query.whereBasePlot();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // without specified argument
 | 
				
			||||||
        if (page == Integer.MIN_VALUE) {
 | 
					        if (page == Integer.MIN_VALUE) {
 | 
				
			||||||
            page = 1;
 | 
					            page = 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -94,10 +95,15 @@ public class Visit extends Command {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        final List<Plot> plots = query.asList();
 | 
					        final List<Plot> plots = query.asList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Conversion of reversed page argument
 | 
				
			||||||
 | 
					        if (page < 0) {
 | 
				
			||||||
 | 
					            page = (plots.size() + 1) + page;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (plots.isEmpty()) {
 | 
					        if (plots.isEmpty()) {
 | 
				
			||||||
            player.sendMessage(TranslatableCaption.of("invalid.found_no_plots"));
 | 
					            player.sendMessage(TranslatableCaption.of("invalid.found_no_plots"));
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        } else if (plots.size() < page || page < 1) {
 | 
					        } else if (page > plots.size() || page < 1) {
 | 
				
			||||||
            player.sendMessage(
 | 
					            player.sendMessage(
 | 
				
			||||||
                    TranslatableCaption.of("invalid.number_not_in_range"),
 | 
					                    TranslatableCaption.of("invalid.number_not_in_range"),
 | 
				
			||||||
                    TagResolver.builder()
 | 
					                    TagResolver.builder()
 | 
				
			||||||
@@ -188,34 +194,22 @@ public class Visit extends Command {
 | 
				
			|||||||
        int page = Integer.MIN_VALUE;
 | 
					        int page = Integer.MIN_VALUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        switch (args.length) {
 | 
					        switch (args.length) {
 | 
				
			||||||
            // /p v <user> <area> <page>
 | 
					            // /p v <player> <area> <page>
 | 
				
			||||||
            case 3:
 | 
					            case 3:
 | 
				
			||||||
                if (!MathMan.isInteger(args[2])) {
 | 
					                if (isInvalidPageNr(args[2])) {
 | 
				
			||||||
                    player.sendMessage(
 | 
					                    sendInvalidPageNrMsg(player);
 | 
				
			||||||
                            TranslatableCaption.of("invalid.not_valid_number"),
 | 
					 | 
				
			||||||
                            TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)")))
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                    player.sendMessage(
 | 
					 | 
				
			||||||
                            TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					 | 
				
			||||||
                            TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                    return CompletableFuture.completedFuture(false);
 | 
					                    return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                page = Integer.parseInt(args[2]);
 | 
					                page = getPageNr(args[2]);
 | 
				
			||||||
                // /p v <name> <area> [page]
 | 
					                // /p v <player> <area> [page]
 | 
				
			||||||
                // /p v <name> [page]
 | 
					                // /p v <player> [page]
 | 
				
			||||||
            case 2:
 | 
					            case 2:
 | 
				
			||||||
                if (page != Integer.MIN_VALUE || !MathMan.isInteger(args[1])) {
 | 
					                // If "case 3" is already through or the argument is not a page number:
 | 
				
			||||||
 | 
					                // -> /p v <player> <area> [page]
 | 
				
			||||||
 | 
					                if (page != Integer.MIN_VALUE || isInvalidPageNr(args[1])) {
 | 
				
			||||||
                    sortByArea = this.plotAreaManager.getPlotAreaByString(args[1]);
 | 
					                    sortByArea = this.plotAreaManager.getPlotAreaByString(args[1]);
 | 
				
			||||||
                    if (sortByArea == null) {
 | 
					                    if (sortByArea == null) {
 | 
				
			||||||
                        player.sendMessage(
 | 
					                        sendInvalidPageNrMsg(player);
 | 
				
			||||||
                                TranslatableCaption.of("invalid.not_valid_number"),
 | 
					 | 
				
			||||||
                                TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)")))
 | 
					 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
                        player.sendMessage(
 | 
					 | 
				
			||||||
                                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
					 | 
				
			||||||
                                TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
 | 
					 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
                        return CompletableFuture.completedFuture(false);
 | 
					                        return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -249,16 +243,13 @@ public class Visit extends Command {
 | 
				
			|||||||
                    });
 | 
					                    });
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                try {
 | 
					                // -> /p v <player> <page>
 | 
				
			||||||
                    page = Integer.parseInt(args[1]);
 | 
					                if (isInvalidPageNr(args[1])) {
 | 
				
			||||||
                } catch (NumberFormatException ignored) {
 | 
					                    sendInvalidPageNrMsg(player);
 | 
				
			||||||
                    player.sendMessage(
 | 
					 | 
				
			||||||
                            TranslatableCaption.of("invalid.not_a_number"),
 | 
					 | 
				
			||||||
                            TagResolver.resolver("value", Tag.inserting(Component.text(args[1])))
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                    return CompletableFuture.completedFuture(false);
 | 
					                    return CompletableFuture.completedFuture(false);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                // /p v <name> [page]
 | 
					                page = getPageNr(args[1]);
 | 
				
			||||||
 | 
					                // /p v <player> [page]
 | 
				
			||||||
                // /p v <uuid> [page]
 | 
					                // /p v <uuid> [page]
 | 
				
			||||||
                // /p v <plot> [page]
 | 
					                // /p v <plot> [page]
 | 
				
			||||||
                // /p v <alias>
 | 
					                // /p v <alias>
 | 
				
			||||||
@@ -326,6 +317,35 @@ public class Visit extends Command {
 | 
				
			|||||||
        return CompletableFuture.completedFuture(true);
 | 
					        return CompletableFuture.completedFuture(true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private boolean isInvalidPageNr(String arg) {
 | 
				
			||||||
 | 
					        if (MathMan.isInteger(arg)) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        } else if (arg.equals("last") || arg.equals("n")) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int getPageNr(String arg) {
 | 
				
			||||||
 | 
					        if (MathMan.isInteger(arg)) {
 | 
				
			||||||
 | 
					            return Integer.parseInt(arg);
 | 
				
			||||||
 | 
					        } else if (arg.equals("last") || arg.equals("n")) {
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return Integer.MIN_VALUE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void sendInvalidPageNrMsg(PlotPlayer<?> player) {
 | 
				
			||||||
 | 
					        player.sendMessage(
 | 
				
			||||||
 | 
					                TranslatableCaption.of("invalid.not_valid_number"),
 | 
				
			||||||
 | 
					                TagResolver.resolver("value", Tag.inserting(Component.text("(1, ∞)")))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        player.sendMessage(
 | 
				
			||||||
 | 
					                TranslatableCaption.of("commandconfig.command_syntax"),
 | 
				
			||||||
 | 
					                TagResolver.resolver("value", Tag.inserting(Component.text(getUsage())))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
					    public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
 | 
				
			||||||
        final List<Command> completions = new ArrayList<>();
 | 
					        final List<Command> completions = new ArrayList<>();
 | 
				
			||||||
@@ -334,6 +354,7 @@ public class Visit extends Command {
 | 
				
			|||||||
            case 1 -> {
 | 
					            case 1 -> {
 | 
				
			||||||
                completions.addAll(
 | 
					                completions.addAll(
 | 
				
			||||||
                        TabCompletions.completeAreas(args[1]));
 | 
					                        TabCompletions.completeAreas(args[1]));
 | 
				
			||||||
 | 
					                completions.addAll(TabCompletions.asCompletions("last"));
 | 
				
			||||||
                if (args[1].isEmpty()) {
 | 
					                if (args[1].isEmpty()) {
 | 
				
			||||||
                    // if no input is given, only suggest 1 - 3
 | 
					                    // if no input is given, only suggest 1 - 3
 | 
				
			||||||
                    completions.addAll(
 | 
					                    completions.addAll(
 | 
				
			||||||
@@ -344,6 +365,7 @@ public class Visit extends Command {
 | 
				
			|||||||
                        TabCompletions.completeNumbers(args[1], 10, 999));
 | 
					                        TabCompletions.completeNumbers(args[1], 10, 999));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case 2 -> {
 | 
					            case 2 -> {
 | 
				
			||||||
 | 
					                completions.addAll(TabCompletions.asCompletions("last"));
 | 
				
			||||||
                if (args[2].isEmpty()) {
 | 
					                if (args[2].isEmpty()) {
 | 
				
			||||||
                    // if no input is given, only suggest 1 - 3
 | 
					                    // if no input is given, only suggest 1 - 3
 | 
				
			||||||
                    completions.addAll(
 | 
					                    completions.addAll(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -723,6 +723,12 @@ public class Settings extends Config {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Comment("Settings related to flags")
 | 
				
			||||||
 | 
					    public static final class Flags {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Comment("If \"instabreak\" should consider the used tool.")
 | 
				
			||||||
 | 
					        public static boolean INSTABREAK_CONSIDER_TOOL = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Comment({"Enable or disable parts of the plugin",
 | 
					    @Comment({"Enable or disable parts of the plugin",
 | 
				
			||||||
            "Note: A cache will use some memory if enabled"})
 | 
					            "Note: A cache will use some memory if enabled"})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2401,7 +2401,8 @@ public class SQLManager implements AbstractDB {
 | 
				
			|||||||
        addPlotTask(plot, new UniqueStatement("setPosition") {
 | 
					        addPlotTask(plot, new UniqueStatement("setPosition") {
 | 
				
			||||||
            @Override
 | 
					            @Override
 | 
				
			||||||
            public void set(PreparedStatement statement) throws SQLException {
 | 
					            public void set(PreparedStatement statement) throws SQLException {
 | 
				
			||||||
                statement.setString(1, position == null ? "" : position);
 | 
					                // Please see the table creation statement. There is the default value of "default"
 | 
				
			||||||
 | 
					                statement.setString(1, position == null ? "DEFAULT" : position);
 | 
				
			||||||
                statement.setInt(2, getId(plot));
 | 
					                statement.setInt(2, getId(plot));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,17 +18,34 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package com.plotsquared.core.events;
 | 
					package com.plotsquared.core.events;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * PlotSquared event with {@link Result} to cancel, force, or allow.
 | 
					 * PlotSquared event with {@link Result} to cancel, force, or allow.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public interface CancellablePlotEvent {
 | 
					public interface CancellablePlotEvent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Result getEventResult();
 | 
					    /**
 | 
				
			||||||
 | 
					     * The currently set {@link Result} for this event (as set by potential previous event listeners).
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return the current result.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Nullable Result getEventResult();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void setEventResult(Result eventResult);
 | 
					    /**
 | 
				
			||||||
 | 
					     * Set the {@link Result} for this event.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param eventResult the new result.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setEventResult(@Nullable Result eventResult);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @deprecated No usage and not null-safe
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated(since = "7.3.2")
 | 
				
			||||||
    default int getEventResultRaw() {
 | 
					    default int getEventResultRaw() {
 | 
				
			||||||
        return getEventResult().getValue();
 | 
					        return getEventResult() != null ? getEventResult().getValue() : -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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.events;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
 | 
					import org.checkerframework.checker.index.qual.NonNegative;
 | 
				
			||||||
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Called when a user attempts to buy a plot.
 | 
				
			||||||
 | 
					 * <p>
 | 
				
			||||||
 | 
					 * Setting the {@link #setEventResult(Result) Result} to {@link Result#FORCE} ignores the price and players account balance and does not charge the
 | 
				
			||||||
 | 
					 * player anything. {@link Result#DENY} blocks the purchase completely, {@link Result#ACCEPT} and {@code null} do not modify
 | 
				
			||||||
 | 
					 * the behaviour.
 | 
				
			||||||
 | 
					 * <p>
 | 
				
			||||||
 | 
					 * Setting the {@link #setPrice(double) price} to {@code 0} makes the plot practically free.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @since 7.3.2
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class PlayerBuyPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Result result;
 | 
				
			||||||
 | 
					    private double price;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PlayerBuyPlotEvent(final PlotPlayer<?> plotPlayer, final Plot plot, @NonNegative final double price) {
 | 
				
			||||||
 | 
					        super(plotPlayer, plot);
 | 
				
			||||||
 | 
					        this.price = price;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Sets the price required to buy the plot.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param price the new price.
 | 
				
			||||||
 | 
					     * @since 7.3.2
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void setPrice(@NonNegative final double price) {
 | 
				
			||||||
 | 
					        //noinspection ConstantValue - the annotation does not ensure a non-negative runtime value
 | 
				
			||||||
 | 
					        if (price < 0) {
 | 
				
			||||||
 | 
					            throw new IllegalArgumentException("price must be non-negative");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.price = price;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the currently set price required to buy the plot.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return the price.
 | 
				
			||||||
 | 
					     * @since 7.3.2
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public @NonNegative double price() {
 | 
				
			||||||
 | 
					        return price;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * {@inheritDoc}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void setEventResult(@Nullable final Result eventResult) {
 | 
				
			||||||
 | 
					        this.result = eventResult;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * {@inheritDoc}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public @Nullable Result getEventResult() {
 | 
				
			||||||
 | 
					        return this.result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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.events.post;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.PlotPlayerEvent;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.OfflinePlotPlayer;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
 | 
					import org.checkerframework.checker.index.qual.NonNegative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Called after a player has successfully bought a plot.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @since 7.3.2
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class PostPlayerBuyPlotEvent extends PlotPlayerEvent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final OfflinePlotPlayer previousOwner;
 | 
				
			||||||
 | 
					    private final double price;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PostPlayerBuyPlotEvent(
 | 
				
			||||||
 | 
					            final PlotPlayer<?> plotPlayer, final OfflinePlotPlayer previousOwner, final Plot plot,
 | 
				
			||||||
 | 
					            @NonNegative final double price
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        super(plotPlayer, plot);
 | 
				
			||||||
 | 
					        this.previousOwner = previousOwner;
 | 
				
			||||||
 | 
					        this.price = price;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The previous owner of the bought plot.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return the previous owner.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public OfflinePlotPlayer previousOwner() {
 | 
				
			||||||
 | 
					        return previousOwner;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the price after potential modifications by {@link com.plotsquared.core.events.PlayerBuyPlotEvent}.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return the price the player had to pay to buy the plot.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public double price() {
 | 
				
			||||||
 | 
					        return price;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * PlotSquared, a land and world management plugin for Minecraft.
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites team and contributors
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					package com.plotsquared.core.events.post;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.PlotPlayerEvent;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Called after a {@link Plot} was cleared.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @since 7.3.2
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class PostPlotClearEvent extends PlotPlayerEvent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Instantiate a new PostPlotClearEvent.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param plotPlayer The {@link PlotPlayer} that initiated the clear.
 | 
				
			||||||
 | 
					     * @param plot       The clearing plot.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public PostPlotClearEvent(final PlotPlayer<?> plotPlayer, final Plot plot) {
 | 
				
			||||||
 | 
					        super(plotPlayer, plot);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -143,7 +143,7 @@ public class ClassicPlotManager extends SquarePlotManager {
 | 
				
			|||||||
                    classicPlotWorld,
 | 
					                    classicPlotWorld,
 | 
				
			||||||
                    plot.getRegions(),
 | 
					                    plot.getRegions(),
 | 
				
			||||||
                    blocks,
 | 
					                    blocks,
 | 
				
			||||||
                    classicPlotWorld.getMinBuildHeight(),
 | 
					                    classicPlotWorld.getMinComponentHeight(),
 | 
				
			||||||
                    classicPlotWorld.getMaxBuildHeight() - 1,
 | 
					                    classicPlotWorld.getMaxBuildHeight() - 1,
 | 
				
			||||||
                    actor,
 | 
					                    actor,
 | 
				
			||||||
                    queue
 | 
					                    queue
 | 
				
			||||||
@@ -204,7 +204,7 @@ public class ClassicPlotManager extends SquarePlotManager {
 | 
				
			|||||||
                    classicPlotWorld,
 | 
					                    classicPlotWorld,
 | 
				
			||||||
                    plot.getRegions(),
 | 
					                    plot.getRegions(),
 | 
				
			||||||
                    blocks,
 | 
					                    blocks,
 | 
				
			||||||
                    classicPlotWorld.getMinBuildHeight(),
 | 
					                    classicPlotWorld.getMinComponentHeight(),
 | 
				
			||||||
                    classicPlotWorld.PLOT_HEIGHT - 1,
 | 
					                    classicPlotWorld.PLOT_HEIGHT - 1,
 | 
				
			||||||
                    actor,
 | 
					                    actor,
 | 
				
			||||||
                    queue
 | 
					                    queue
 | 
				
			||||||
@@ -379,7 +379,7 @@ public class ClassicPlotManager extends SquarePlotManager {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int yStart = classicPlotWorld.getMinBuildHeight() + (classicPlotWorld.PLOT_BEDROCK ? 1 : 0);
 | 
					        int yStart = classicPlotWorld.getMinComponentHeight();
 | 
				
			||||||
        if (!plot.isMerged(Direction.NORTH)) {
 | 
					        if (!plot.isMerged(Direction.NORTH)) {
 | 
				
			||||||
            int z = bot.getZ();
 | 
					            int z = bot.getZ();
 | 
				
			||||||
            for (int x = bot.getX(); x < top.getX(); x++) {
 | 
					            for (int x = bot.getX(); x < top.getX(); x++) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,7 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
 | 
				
			|||||||
    public BlockBucket ROAD_BLOCK = new BlockBucket(BlockTypes.QUARTZ_BLOCK);
 | 
					    public BlockBucket ROAD_BLOCK = new BlockBucket(BlockTypes.QUARTZ_BLOCK);
 | 
				
			||||||
    public boolean PLOT_BEDROCK = true;
 | 
					    public boolean PLOT_BEDROCK = true;
 | 
				
			||||||
    public boolean PLACE_TOP_BLOCK = true;
 | 
					    public boolean PLACE_TOP_BLOCK = true;
 | 
				
			||||||
 | 
					    public boolean COMPONENT_BELOW_BEDROCK = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public ClassicPlotWorld(
 | 
					    public ClassicPlotWorld(
 | 
				
			||||||
            final @NonNull String worldName,
 | 
					            final @NonNull String worldName,
 | 
				
			||||||
@@ -129,6 +130,9 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
 | 
				
			|||||||
                ),
 | 
					                ),
 | 
				
			||||||
                new ConfigurationNode("plot.bedrock", this.PLOT_BEDROCK, TranslatableCaption.of("setup.bedrock_boolean"),
 | 
					                new ConfigurationNode("plot.bedrock", this.PLOT_BEDROCK, TranslatableCaption.of("setup.bedrock_boolean"),
 | 
				
			||||||
                        ConfigurationUtil.BOOLEAN
 | 
					                        ConfigurationUtil.BOOLEAN
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                new ConfigurationNode("world.component_below_bedrock", this.COMPONENT_BELOW_BEDROCK, TranslatableCaption.of(
 | 
				
			||||||
 | 
					                        "setup.component_below_bedrock_boolean"), ConfigurationUtil.BOOLEAN
 | 
				
			||||||
                )};
 | 
					                )};
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -150,6 +154,14 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
 | 
				
			|||||||
        this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
 | 
					        this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
 | 
				
			||||||
        this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
 | 
					        this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
 | 
				
			||||||
        this.CLAIMED_WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block_claimed"), CLAIMED_WALL_BLOCK);
 | 
					        this.CLAIMED_WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block_claimed"), CLAIMED_WALL_BLOCK);
 | 
				
			||||||
 | 
					        this.COMPONENT_BELOW_BEDROCK = config.getBoolean("world.component_below_bedrock");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int getMinComponentHeight() {
 | 
				
			||||||
 | 
					        return COMPONENT_BELOW_BEDROCK && getMinGenHeight() >= getMinBuildHeight()
 | 
				
			||||||
 | 
					                ? getMinGenHeight() + (PLOT_BEDROCK ? 1 : 0)
 | 
				
			||||||
 | 
					                : getMinBuildHeight();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int schematicStartHeight() {
 | 
					    int schematicStartHeight() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1483,7 +1483,7 @@ public class Plot {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public void setHome(BlockLoc location) {
 | 
					    public void setHome(BlockLoc location) {
 | 
				
			||||||
        Plot plot = this.getBasePlot(false);
 | 
					        Plot plot = this.getBasePlot(false);
 | 
				
			||||||
        if (BlockLoc.ZERO.equals(location) || BlockLoc.MINY.equals(location)) {
 | 
					        if (location != null && (BlockLoc.ZERO.equals(location) || BlockLoc.MINY.equals(location))) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        plot.getSettings().setPosition(location);
 | 
					        plot.getSettings().setPosition(location);
 | 
				
			||||||
@@ -2574,6 +2574,12 @@ public class Plot {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
 | 
					    public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
 | 
				
			||||||
        Plot plot = this.getBasePlot(false);
 | 
					        Plot plot = this.getBasePlot(false);
 | 
				
			||||||
 | 
					        if (!WorldUtil.isValidLocation(plot.getBottomAbs())) {
 | 
				
			||||||
 | 
					            // prevent from teleporting into unsafe regions
 | 
				
			||||||
 | 
					            player.sendMessage(TranslatableCaption.of("border.denied"));
 | 
				
			||||||
 | 
					            resultConsumer.accept(false);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause);
 | 
					        PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause);
 | 
				
			||||||
        if (event.getEventResult() == Result.DENY) {
 | 
					        if (event.getEventResult() == Result.DENY) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1452,6 +1452,24 @@ public abstract class PlotArea implements ComponentLike {
 | 
				
			|||||||
        this.defaultHome = defaultHome;
 | 
					        this.defaultHome = defaultHome;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the maximum height that changes to plot components (wall filling, air, all etc.) may operate to
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @since 7.3.4
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int getMaxComponentHeight() {
 | 
				
			||||||
 | 
					        return this.maxBuildHeight;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the minimum height that changes to plot components (wall filling, air, all etc.) may operate to
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @since 7.3.4
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int getMinComponentHeight() {
 | 
				
			||||||
 | 
					        return this.minBuildHeight;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get the maximum height players may build in. Exclusive.
 | 
					     * Get the maximum height players may build in. Exclusive.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,6 +48,7 @@ import com.plotsquared.core.plot.flag.implementations.EntityChangeBlockFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ExplosionFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.FarewellFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.FarewellFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.FeedFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.FeedFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.FishingFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.FlyFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.FlyFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ForcefieldFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.GamemodeFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.GamemodeFlag;
 | 
				
			||||||
@@ -101,6 +102,7 @@ import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
 | 
				
			|||||||
import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.TamedAttackFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.TamedInteractFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.TileDropFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.TimeFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.TimeFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.UntrustedVisitFlag;
 | 
				
			||||||
@@ -158,6 +160,7 @@ public final class GlobalFlagContainer extends FlagContainer {
 | 
				
			|||||||
        this.addFlag(EditSignFlag.EDIT_SIGN_FALSE);
 | 
					        this.addFlag(EditSignFlag.EDIT_SIGN_FALSE);
 | 
				
			||||||
        this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
 | 
					        this.addFlag(EntityChangeBlockFlag.ENTITY_CHANGE_BLOCK_FALSE);
 | 
				
			||||||
        this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
 | 
					        this.addFlag(ExplosionFlag.EXPLOSION_FALSE);
 | 
				
			||||||
 | 
					        this.addFlag(FishingFlag.FISHING_FALSE);
 | 
				
			||||||
        this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
 | 
					        this.addFlag(ForcefieldFlag.FORCEFIELD_FALSE);
 | 
				
			||||||
        this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE);
 | 
					        this.addFlag(GrassGrowFlag.GRASS_GROW_TRUE);
 | 
				
			||||||
        this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE);
 | 
					        this.addFlag(HangingBreakFlag.HANGING_BREAK_FALSE);
 | 
				
			||||||
@@ -196,6 +199,7 @@ public final class GlobalFlagContainer extends FlagContainer {
 | 
				
			|||||||
        this.addFlag(SoilDryFlag.SOIL_DRY_FALSE);
 | 
					        this.addFlag(SoilDryFlag.SOIL_DRY_FALSE);
 | 
				
			||||||
        this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE);
 | 
					        this.addFlag(TamedAttackFlag.TAMED_ATTACK_FALSE);
 | 
				
			||||||
        this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE);
 | 
					        this.addFlag(TamedInteractFlag.TAMED_INTERACT_FALSE);
 | 
				
			||||||
 | 
					        this.addFlag(TileDropFlag.TILE_DROP_TRUE);
 | 
				
			||||||
        this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE);
 | 
					        this.addFlag(UntrustedVisitFlag.UNTRUSTED_VISIT_FLAG_TRUE);
 | 
				
			||||||
        this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE);
 | 
					        this.addFlag(VehicleBreakFlag.VEHICLE_BREAK_FALSE);
 | 
				
			||||||
        this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE);
 | 
					        this.addFlag(VehiclePlaceFlag.VEHICLE_PLACE_FALSE);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * PlotSquared, a land and world management plugin for Minecraft.
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites team and contributors
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					package com.plotsquared.core.plot.flag.implementations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
				
			||||||
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class FishingFlag extends BooleanFlag<FishingFlag> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final FishingFlag FISHING_TRUE = new FishingFlag(true);
 | 
				
			||||||
 | 
					    public static final FishingFlag FISHING_FALSE = new FishingFlag(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private FishingFlag(boolean value) {
 | 
				
			||||||
 | 
					        super(value, TranslatableCaption.of("flags.flag_description_fishing"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected FishingFlag flagOf(@NonNull final Boolean value) {
 | 
				
			||||||
 | 
					        return value ? FISHING_TRUE : FISHING_FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * PlotSquared, a land and world management plugin for Minecraft.
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
				
			||||||
 | 
					 * Copyright (C) IntellectualSites team and contributors
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					package com.plotsquared.core.plot.flag.implementations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
				
			||||||
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @since 7.3.7
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class TileDropFlag extends BooleanFlag<TileDropFlag> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final TileDropFlag TILE_DROP_TRUE = new TileDropFlag(true);
 | 
				
			||||||
 | 
					    public static final TileDropFlag TILE_DROP_FALSE = new TileDropFlag(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private TileDropFlag(boolean value) {
 | 
				
			||||||
 | 
					        super(value, TranslatableCaption.of("flags.flag_description_tile_drop"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected TileDropFlag flagOf(@NonNull Boolean value) {
 | 
				
			||||||
 | 
					        return value ? TILE_DROP_TRUE : TILE_DROP_FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -25,6 +25,7 @@ import com.plotsquared.core.configuration.Settings;
 | 
				
			|||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
import com.plotsquared.core.events.PlayerAutoPlotEvent;
 | 
					import com.plotsquared.core.events.PlayerAutoPlotEvent;
 | 
				
			||||||
import com.plotsquared.core.events.PlayerAutoPlotsChosenEvent;
 | 
					import com.plotsquared.core.events.PlayerAutoPlotsChosenEvent;
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.PlayerBuyPlotEvent;
 | 
				
			||||||
import com.plotsquared.core.events.PlayerClaimPlotEvent;
 | 
					import com.plotsquared.core.events.PlayerClaimPlotEvent;
 | 
				
			||||||
import com.plotsquared.core.events.PlayerEnterPlotEvent;
 | 
					import com.plotsquared.core.events.PlayerEnterPlotEvent;
 | 
				
			||||||
import com.plotsquared.core.events.PlayerLeavePlotEvent;
 | 
					import com.plotsquared.core.events.PlayerLeavePlotEvent;
 | 
				
			||||||
@@ -49,7 +50,9 @@ import com.plotsquared.core.events.PlotUnlinkEvent;
 | 
				
			|||||||
import com.plotsquared.core.events.RemoveRoadEntityEvent;
 | 
					import com.plotsquared.core.events.RemoveRoadEntityEvent;
 | 
				
			||||||
import com.plotsquared.core.events.TeleportCause;
 | 
					import com.plotsquared.core.events.TeleportCause;
 | 
				
			||||||
import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
 | 
					import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.post.PostPlayerBuyPlotEvent;
 | 
				
			||||||
import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
 | 
					import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
 | 
				
			||||||
 | 
					import com.plotsquared.core.events.post.PostPlotClearEvent;
 | 
				
			||||||
import com.plotsquared.core.events.post.PostPlotDeleteEvent;
 | 
					import com.plotsquared.core.events.post.PostPlotDeleteEvent;
 | 
				
			||||||
import com.plotsquared.core.events.post.PostPlotMergeEvent;
 | 
					import com.plotsquared.core.events.post.PostPlotMergeEvent;
 | 
				
			||||||
import com.plotsquared.core.events.post.PostPlotUnlinkEvent;
 | 
					import com.plotsquared.core.events.post.PostPlotUnlinkEvent;
 | 
				
			||||||
@@ -57,6 +60,7 @@ import com.plotsquared.core.listener.PlayerBlockEventType;
 | 
				
			|||||||
import com.plotsquared.core.location.Direction;
 | 
					import com.plotsquared.core.location.Direction;
 | 
				
			||||||
import com.plotsquared.core.location.Location;
 | 
					import com.plotsquared.core.location.Location;
 | 
				
			||||||
import com.plotsquared.core.permissions.Permission;
 | 
					import com.plotsquared.core.permissions.Permission;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.OfflinePlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.PlotArea;
 | 
					import com.plotsquared.core.plot.PlotArea;
 | 
				
			||||||
@@ -179,6 +183,12 @@ public class EventDispatcher {
 | 
				
			|||||||
        return event;
 | 
					        return event;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PostPlotClearEvent callPostPlotClear(PlotPlayer<?> player, Plot plot) {
 | 
				
			||||||
 | 
					        PostPlotClearEvent event = new PostPlotClearEvent(player, plot);
 | 
				
			||||||
 | 
					        callEvent(event);
 | 
				
			||||||
 | 
					        return event;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public PlotDeleteEvent callDelete(Plot plot) {
 | 
					    public PlotDeleteEvent callDelete(Plot plot) {
 | 
				
			||||||
        PlotDeleteEvent event = new PlotDeleteEvent(plot);
 | 
					        PlotDeleteEvent event = new PlotDeleteEvent(plot);
 | 
				
			||||||
        callEvent(event);
 | 
					        callEvent(event);
 | 
				
			||||||
@@ -315,6 +325,17 @@ public class EventDispatcher {
 | 
				
			|||||||
        return event;
 | 
					        return event;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PlayerBuyPlotEvent callPlayerBuyPlot(PlotPlayer<?> player, Plot plot, double price) {
 | 
				
			||||||
 | 
					        PlayerBuyPlotEvent event = new PlayerBuyPlotEvent(player, plot, price);
 | 
				
			||||||
 | 
					        eventBus.post(event);
 | 
				
			||||||
 | 
					        return event;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void callPostPlayerBuyPlot(PlotPlayer<?> player, OfflinePlotPlayer previousOwner, Plot plot,
 | 
				
			||||||
 | 
					                                      double price) {
 | 
				
			||||||
 | 
					        eventBus.post(new PostPlayerBuyPlotEvent(player, previousOwner, plot, price));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void doJoinTask(final PlotPlayer<?> player) {
 | 
					    public void doJoinTask(final PlotPlayer<?> player) {
 | 
				
			||||||
        if (player == null) {
 | 
					        if (player == null) {
 | 
				
			||||||
            return; //possible future warning message to figure out where we are retrieving null
 | 
					            return; //possible future warning message to figure out where we are retrieving null
 | 
				
			||||||
@@ -530,6 +551,7 @@ public class EventDispatcher {
 | 
				
			|||||||
                            )
 | 
					                            )
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            default -> {
 | 
					            default -> {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,6 +62,15 @@ import java.util.zip.ZipOutputStream;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public abstract class WorldUtil {
 | 
					public abstract class WorldUtil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * {@return whether the given location is valid in the world}
 | 
				
			||||||
 | 
					     * @param location the location to check
 | 
				
			||||||
 | 
					     * @since 7.3.6
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static boolean isValidLocation(Location location) {
 | 
				
			||||||
 | 
					        return Math.abs(location.getX()) < 30000000 && Math.abs(location.getZ()) < 30000000;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Set the biome in a region
 | 
					     * Set the biome in a region
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,13 +27,17 @@ import com.plotsquared.core.PlotSquared;
 | 
				
			|||||||
import com.plotsquared.core.configuration.Settings;
 | 
					import com.plotsquared.core.configuration.Settings;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.LocaleHolder;
 | 
					import com.plotsquared.core.configuration.caption.LocaleHolder;
 | 
				
			||||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
					import com.plotsquared.core.configuration.caption.TranslatableCaption;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.MetaDataAccess;
 | 
				
			||||||
 | 
					import com.plotsquared.core.player.PlayerMetaDataKeys;
 | 
				
			||||||
import com.plotsquared.core.player.PlotPlayer;
 | 
					import com.plotsquared.core.player.PlotPlayer;
 | 
				
			||||||
import com.plotsquared.core.plot.Plot;
 | 
					import com.plotsquared.core.plot.Plot;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.GlobalFlagContainer;
 | 
					import com.plotsquared.core.plot.flag.GlobalFlagContainer;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.PlotFlag;
 | 
					import com.plotsquared.core.plot.flag.PlotFlag;
 | 
				
			||||||
 | 
					import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
				
			||||||
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
 | 
					import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
 | 
				
			||||||
import com.plotsquared.core.util.EventDispatcher;
 | 
					import com.plotsquared.core.util.EventDispatcher;
 | 
				
			||||||
import com.plotsquared.core.util.PlayerManager;
 | 
					import com.plotsquared.core.util.PlayerManager;
 | 
				
			||||||
 | 
					import com.plotsquared.core.util.query.PlotQuery;
 | 
				
			||||||
import net.kyori.adventure.text.Component;
 | 
					import net.kyori.adventure.text.Component;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
					import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
					import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
@@ -95,6 +99,12 @@ public final class PlaceholderRegistry {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return Integer.toString(player.getAllowedPlots());
 | 
					            return Integer.toString(player.getAllowedPlots());
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					        this.createPlaceholder("base_plot_count", player -> Integer.toString(PlotQuery.newQuery()
 | 
				
			||||||
 | 
					                .ownedBy(player)
 | 
				
			||||||
 | 
					                .whereBasePlot()
 | 
				
			||||||
 | 
					                .thatPasses(plot -> !DoneFlag.isDone(plot))
 | 
				
			||||||
 | 
					                .count())
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        this.createPlaceholder("plot_count", player -> Integer.toString(player.getPlotCount()));
 | 
					        this.createPlaceholder("plot_count", player -> Integer.toString(player.getPlotCount()));
 | 
				
			||||||
        this.createPlaceholder("currentplot_alias", (player, plot) -> {
 | 
					        this.createPlaceholder("currentplot_alias", (player, plot) -> {
 | 
				
			||||||
            if (plot.getAlias().isEmpty()) {
 | 
					            if (plot.getAlias().isEmpty()) {
 | 
				
			||||||
@@ -189,6 +199,11 @@ public final class PlaceholderRegistry {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
        this.createPlaceholder("currentplot_biome", (player, plot) -> plot.getBiomeSynchronous().toString());
 | 
					        this.createPlaceholder("currentplot_biome", (player, plot) -> plot.getBiomeSynchronous().toString());
 | 
				
			||||||
        this.createPlaceholder("currentplot_size", (player, plot) -> String.valueOf(plot.getConnectedPlots().size()));
 | 
					        this.createPlaceholder("currentplot_size", (player, plot) -> String.valueOf(plot.getConnectedPlots().size()));
 | 
				
			||||||
 | 
					        this.createPlaceholder("total_grants", player -> {
 | 
				
			||||||
 | 
					            try (final MetaDataAccess<Integer> metaDataAccess = player.accessPersistentMetaData(PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) {
 | 
				
			||||||
 | 
					                return Integer.toString(metaDataAccess.get().orElse(0));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,6 +125,7 @@
 | 
				
			|||||||
  "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 <used_grants> plot grant(s), you've got </gray><gold><remaining_grants></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>",
 | 
				
			||||||
 | 
					  "economy.cannot_buy_blocked":  "<prefix><red>You are not allowed to buy this plot.</red>",
 | 
				
			||||||
  "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>",
 | 
				
			||||||
@@ -165,6 +166,7 @@
 | 
				
			|||||||
  "setup.wall_height": "<gold>Wall height</gold>",
 | 
					  "setup.wall_height": "<gold>Wall height</gold>",
 | 
				
			||||||
  "setup.min_gen_height": "<gold>Minimum height from which to generate (for 1.18+ can be negative).</gold>",
 | 
					  "setup.min_gen_height": "<gold>Minimum height from which to generate (for 1.18+ can be negative).</gold>",
 | 
				
			||||||
  "setup.bedrock_boolean": "<gold>Whether a bedrock layer under the plot should be generated or not</gold>",
 | 
					  "setup.bedrock_boolean": "<gold>Whether a bedrock layer under the plot should be generated or not</gold>",
 | 
				
			||||||
 | 
					  "setup.component_below_bedrock_boolean": "<gold>Whether a component change e.g. /plot set walls should edit the bedrock layer or below</gold>",
 | 
				
			||||||
  "setup.singleplotarea_void_world": "<gold>Void world</gold>",
 | 
					  "setup.singleplotarea_void_world": "<gold>Void world</gold>",
 | 
				
			||||||
  "plotareatype.plot_area_type_normal": "<gray>Standard plot generation</gray>",
 | 
					  "plotareatype.plot_area_type_normal": "<gray>Standard plot generation</gray>",
 | 
				
			||||||
  "plotareatype.plot_area_type_augmented": "<gray>Plot generation with vanilla terrain</gray>",
 | 
					  "plotareatype.plot_area_type_augmented": "<gray>Plot generation with vanilla terrain</gray>",
 | 
				
			||||||
@@ -557,6 +559,7 @@
 | 
				
			|||||||
  "flags.flag_description_drop_protection": "<gray>Set to `true` to prevent dropped items from being picked up by non-members of the plot.</gray>",
 | 
					  "flags.flag_description_drop_protection": "<gray>Set to `true` to prevent dropped items from being picked up by non-members of the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_edit_sign": "<gray>Set to `true` to allow editing signs in the plot.</gray>",
 | 
					  "flags.flag_description_edit_sign": "<gray>Set to `true` to allow editing signs in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_feed": "<gray>Specify an interval in seconds and an optional amount by which the players will be fed (amount is 1 by default).</gray>",
 | 
					  "flags.flag_description_feed": "<gray>Specify an interval in seconds and an optional amount by which the players will be fed (amount is 1 by default).</gray>",
 | 
				
			||||||
 | 
					  "flags.flag_description_fishing": "<gray>Set to `true` to allow guests to use a fishing rod in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_forcefield": "<gray>Set to `true` to enable member forcefield in the plot.</gray>",
 | 
					  "flags.flag_description_forcefield": "<gray>Set to `true` to enable member forcefield in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_grass_grow": "<gray>Set to `false` to prevent grass from growing within the plot.</gray>",
 | 
					  "flags.flag_description_grass_grow": "<gray>Set to `false` to prevent grass from growing within the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_hanging_break": "<gray>Set to `true` to allow guests to break hanging objects in the plot.</gray>",
 | 
					  "flags.flag_description_hanging_break": "<gray>Set to `true` to allow guests to break hanging objects in the plot.</gray>",
 | 
				
			||||||
@@ -603,6 +606,7 @@
 | 
				
			|||||||
  "flags.flag_description_tamed_attack": "<gray>Set to `true` to allow guests to attack tamed animals in the plot.</gray>",
 | 
					  "flags.flag_description_tamed_attack": "<gray>Set to `true` to allow guests to attack tamed animals in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_tamed_interact": "<gray>Set to `true` to allow guests to interact with tamed animals in the plot.</gray>",
 | 
					  "flags.flag_description_tamed_interact": "<gray>Set to `true` to allow guests to interact with tamed animals in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_time": "<gray>Set the time in the plot to a fixed value.</gray>",
 | 
					  "flags.flag_description_time": "<gray>Set the time in the plot to a fixed value.</gray>",
 | 
				
			||||||
 | 
					  "flags.flag_description_tile_drop": "<gray>Set to `false` to prevent blocks from dropping items in the plot.</gray>",
 | 
				
			||||||
  "flags.flag_description_titles": "<gray>Set to `false` to disable plot titles. Can be set to: `none` (to inherit world settings), `true`, or `false`</gray>",
 | 
					  "flags.flag_description_titles": "<gray>Set to `false` to disable plot titles. Can be set to: `none` (to inherit world settings), `true`, or `false`</gray>",
 | 
				
			||||||
  "flags.flag_description_title": "<gray>Set the pop-up title's title and subtitle. Format: /plot flag set title \"A title\" \"The subtitle\"</gray>",
 | 
					  "flags.flag_description_title": "<gray>Set the pop-up title's title and subtitle. Format: /plot flag set title \"A title\" \"The subtitle\"</gray>",
 | 
				
			||||||
  "flags.flag_description_use": "<gray>Define a list of materials players should be able to interact with in the plot.</gray>",
 | 
					  "flags.flag_description_use": "<gray>Define a list of materials players should be able to interact with in the plot.</gray>",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ plugins {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
group = "com.intellectualsites.plotsquared"
 | 
					group = "com.intellectualsites.plotsquared"
 | 
				
			||||||
version = "7.3.2-SNAPSHOT"
 | 
					version = "7.3.8-SNAPSHOT"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (!File("$rootDir/.git").exists()) {
 | 
					if (!File("$rootDir/.git").exists()) {
 | 
				
			||||||
    logger.lifecycle("""
 | 
					    logger.lifecycle("""
 | 
				
			||||||
@@ -79,8 +79,8 @@ subprojects {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    dependencies {
 | 
					    dependencies {
 | 
				
			||||||
        // Tests
 | 
					        // Tests
 | 
				
			||||||
        testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")
 | 
					        testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
 | 
				
			||||||
        testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.1")
 | 
					        testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.2")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    plugins.withId("java") {
 | 
					    plugins.withId("java") {
 | 
				
			||||||
@@ -225,7 +225,7 @@ tasks.getByName<Jar>("jar") {
 | 
				
			|||||||
    enabled = false
 | 
					    enabled = false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
val supportedVersions = listOf("1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.1", "1.20.4")
 | 
					val supportedVersions = listOf("1.18.2", "1.19.4", "1.20.1", "1.20.4")
 | 
				
			||||||
tasks {
 | 
					tasks {
 | 
				
			||||||
    register("cacheLatestFaweArtifact") {
 | 
					    register("cacheLatestFaweArtifact") {
 | 
				
			||||||
        val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL()
 | 
					        val lastSuccessfulBuildUrl = uri("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/api/json").toURL()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,18 +2,18 @@
 | 
				
			|||||||
# Platform expectations
 | 
					# Platform expectations
 | 
				
			||||||
paper = "1.20.2-R0.1-SNAPSHOT"
 | 
					paper = "1.20.2-R0.1-SNAPSHOT"
 | 
				
			||||||
guice = "7.0.0"
 | 
					guice = "7.0.0"
 | 
				
			||||||
spotbugs = "4.8.3"
 | 
					spotbugs = "4.8.4"
 | 
				
			||||||
checkerqual = "3.42.0"
 | 
					checkerqual = "3.42.0"
 | 
				
			||||||
gson = "2.10"
 | 
					gson = "2.10"
 | 
				
			||||||
guava = "31.1-jre"
 | 
					guava = "31.1-jre"
 | 
				
			||||||
snakeyaml = "2.0"
 | 
					snakeyaml = "2.0"
 | 
				
			||||||
adventure = "4.15.0"
 | 
					adventure = "4.16.0"
 | 
				
			||||||
adventure-bukkit = "4.3.2"
 | 
					adventure-bukkit = "4.3.2"
 | 
				
			||||||
log4j = "2.19.0"
 | 
					log4j = "2.19.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Plugins
 | 
					# Plugins
 | 
				
			||||||
worldedit = "7.2.18"
 | 
					worldedit = "7.2.20"
 | 
				
			||||||
fawe = "2.8.3"
 | 
					fawe = "2.9.2"
 | 
				
			||||||
placeholderapi = "2.11.5"
 | 
					placeholderapi = "2.11.5"
 | 
				
			||||||
luckperms = "5.4"
 | 
					luckperms = "5.4"
 | 
				
			||||||
essentialsx = "2.20.1"
 | 
					essentialsx = "2.20.1"
 | 
				
			||||||
@@ -35,9 +35,9 @@ serverlib = "2.3.4"
 | 
				
			|||||||
# Gradle plugins
 | 
					# Gradle plugins
 | 
				
			||||||
shadow = "8.1.1"
 | 
					shadow = "8.1.1"
 | 
				
			||||||
grgit = "4.1.1"
 | 
					grgit = "4.1.1"
 | 
				
			||||||
spotless = "6.23.3"
 | 
					spotless = "6.25.0"
 | 
				
			||||||
nexus = "1.3.0"
 | 
					nexus = "2.0.0"
 | 
				
			||||||
runPaper = "2.2.2"
 | 
					runPaper = "2.2.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[libraries]
 | 
					[libraries]
 | 
				
			||||||
# Platform expectations
 | 
					# Platform expectations
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
distributionBase=GRADLE_USER_HOME
 | 
					distributionBase=GRADLE_USER_HOME
 | 
				
			||||||
distributionPath=wrapper/dists
 | 
					distributionPath=wrapper/dists
 | 
				
			||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
 | 
					distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
 | 
				
			||||||
networkTimeout=10000
 | 
					networkTimeout=10000
 | 
				
			||||||
validateDistributionUrl=true
 | 
					validateDistributionUrl=true
 | 
				
			||||||
zipStoreBase=GRADLE_USER_HOME
 | 
					zipStoreBase=GRADLE_USER_HOME
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							@@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
 | 
				
			|||||||
%JAVA_EXE% -version >NUL 2>&1
 | 
					%JAVA_EXE% -version >NUL 2>&1
 | 
				
			||||||
if %ERRORLEVEL% equ 0 goto execute
 | 
					if %ERRORLEVEL% equ 0 goto execute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
					echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
					echo Please set the JAVA_HOME variable in your environment to match the 1>&2
 | 
				
			||||||
echo location of your Java installation.
 | 
					echo location of your Java installation. 1>&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
goto fail
 | 
					goto fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if exist "%JAVA_EXE%" goto execute
 | 
					if exist "%JAVA_EXE%" goto execute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
 | 
					echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
					echo Please set the JAVA_HOME variable in your environment to match the 1>&2
 | 
				
			||||||
echo location of your Java installation.
 | 
					echo location of your Java installation. 1>&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
goto fail
 | 
					goto fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user