mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-04 11:13:45 +01:00 
			
		
		
		
	Compare commits
	
		
			39 Commits
		
	
	
		
			fix/missin
			...
			fix/v6/imp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					199bb1c9a2 | ||
| 
						 | 
					3446b913cd | ||
| 
						 | 
					8b8fd6aab7 | ||
| 
						 | 
					520bb64eca | ||
| 
						 | 
					60d266b2d7 | ||
| 
						 | 
					8deeef4f7d | ||
| 
						 | 
					9b0b071c0c | ||
| 
						 | 
					81a3f1098d | ||
| 
						 | 
					efc248dcdb | ||
| 
						 | 
					476f3d328d | ||
| 
						 | 
					69f5f88183 | ||
| 
						 | 
					6df63f7fc7 | ||
| 
						 | 
					295b8a0135 | ||
| 
						 | 
					fcc5bc5473 | ||
| 
						 | 
					408b834376 | ||
| 
						 | 
					986812b9e4 | ||
| 
						 | 
					8d4333ad9d | ||
| 
						 | 
					9ff9097ff9 | ||
| 
						 | 
					1ef424a2f1 | ||
| 
						 | 
					9fd96dbaa2 | ||
| 
						 | 
					b0a4e11c46 | ||
| 
						 | 
					77bce43ace | ||
| 
						 | 
					cba1927cc7 | ||
| 
						 | 
					3d19c5c2ad | ||
| 
						 | 
					e0eff15694 | ||
| 
						 | 
					0bdeeea83b | ||
| 
						 | 
					6f96daae56 | ||
| 
						 | 
					d1021d19da | ||
| 
						 | 
					ee589ac7f0 | ||
| 
						 | 
					3b747ffecf | ||
| 
						 | 
					4e5a2b9f96 | ||
| 
						 | 
					aeb4350ccb | ||
| 
						 | 
					9609990832 | ||
| 
						 | 
					0e4319b757 | ||
| 
						 | 
					c8f4907f77 | ||
| 
						 | 
					dcf98c2298 | ||
| 
						 | 
					ae59c7442f | ||
| 
						 | 
					98708118d8 | ||
| 
						 | 
					276d8f8e1e | 
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							@@ -27,10 +27,11 @@ body:
 | 
			
		||||
      description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
 | 
			
		||||
      multiple: false
 | 
			
		||||
      options:
 | 
			
		||||
        - '1.19.2'
 | 
			
		||||
        - '1.19.1'
 | 
			
		||||
        - '1.19'
 | 
			
		||||
        - '1.18.2'
 | 
			
		||||
        - '1.18.1'
 | 
			
		||||
        - '1.18'
 | 
			
		||||
        - '1.17.1'
 | 
			
		||||
        - '1.16.5'
 | 
			
		||||
    validations:
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,7 @@ import com.plotsquared.bukkit.listener.PlayerEventListener;
 | 
			
		||||
import com.plotsquared.bukkit.listener.ProjectileEventListener;
 | 
			
		||||
import com.plotsquared.bukkit.listener.ServerListener;
 | 
			
		||||
import com.plotsquared.bukkit.listener.SingleWorldListener;
 | 
			
		||||
import com.plotsquared.bukkit.listener.SpigotListener;
 | 
			
		||||
import com.plotsquared.bukkit.listener.WorldEvents;
 | 
			
		||||
import com.plotsquared.bukkit.placeholder.PAPIPlaceholders;
 | 
			
		||||
import com.plotsquared.bukkit.placeholder.PlaceholderFormatter;
 | 
			
		||||
@@ -360,6 +361,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
			
		||||
                } else {
 | 
			
		||||
                    getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
 | 
			
		||||
            }
 | 
			
		||||
            this.plotListener.startRunnable();
 | 
			
		||||
        }
 | 
			
		||||
@@ -656,20 +659,15 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
			
		||||
            final @NonNull SQLiteUUIDService sqLiteUUIDService,
 | 
			
		||||
            final @NonNull CacheUUIDService cacheUUIDService
 | 
			
		||||
    ) {
 | 
			
		||||
        // Load all uuids into a big chunky boi queue
 | 
			
		||||
        final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>();
 | 
			
		||||
        // Record all unique UUID's and put them into a queue
 | 
			
		||||
        final Set<UUID> uuidSet = new HashSet<>();
 | 
			
		||||
        PlotSquared.get().forEachPlotRaw(plot -> {
 | 
			
		||||
            final Set<UUID> uuids = new HashSet<>();
 | 
			
		||||
            uuids.add(plot.getOwnerAbs());
 | 
			
		||||
            uuids.addAll(plot.getMembers());
 | 
			
		||||
            uuids.addAll(plot.getTrusted());
 | 
			
		||||
            uuids.addAll(plot.getDenied());
 | 
			
		||||
            for (final UUID uuid : uuids) {
 | 
			
		||||
                if (!uuidQueue.contains(uuid)) {
 | 
			
		||||
                    uuidQueue.add(uuid);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            uuidSet.add(plot.getOwnerAbs());
 | 
			
		||||
            uuidSet.addAll(plot.getMembers());
 | 
			
		||||
            uuidSet.addAll(plot.getTrusted());
 | 
			
		||||
            uuidSet.addAll(plot.getDenied());
 | 
			
		||||
        });
 | 
			
		||||
        final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>(uuidSet);
 | 
			
		||||
 | 
			
		||||
        LOGGER.info("(UUID) {} UUIDs will be cached", uuidQueue.size());
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -109,6 +109,8 @@ import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.Stream;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("unused")
 | 
			
		||||
public class BlockEventListener implements Listener {
 | 
			
		||||
@@ -121,6 +123,11 @@ public class BlockEventListener implements Listener {
 | 
			
		||||
            Material.TURTLE_EGG,
 | 
			
		||||
            Material.TURTLE_SPAWN_EGG
 | 
			
		||||
    );
 | 
			
		||||
    private static final Set<Material> SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5
 | 
			
		||||
            .filter(material -> material.name().contains("SNOW"))
 | 
			
		||||
            .filter(Material::isBlock)
 | 
			
		||||
            .collect(Collectors.toUnmodifiableSet());
 | 
			
		||||
 | 
			
		||||
    private final PlotAreaManager plotAreaManager;
 | 
			
		||||
    private final WorldEdit worldEdit;
 | 
			
		||||
 | 
			
		||||
@@ -435,6 +442,7 @@ public class BlockEventListener implements Listener {
 | 
			
		||||
            case "TWISTING_VINES":
 | 
			
		||||
            case "CAVE_VINES":
 | 
			
		||||
            case "VINE":
 | 
			
		||||
            case "GLOW_BERRIES":
 | 
			
		||||
                if (!plot.getFlag(VineGrowFlag.class)) {
 | 
			
		||||
                    plot.debug("Vine could not grow because vine-grow = false");
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
@@ -529,7 +537,7 @@ public class BlockEventListener implements Listener {
 | 
			
		||||
            event.setCancelled(true);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (Tag.SNOW.isTagged(event.getNewState().getType())) {
 | 
			
		||||
        if (SNOW.contains(event.getNewState().getType())) {
 | 
			
		||||
            if (!plot.getFlag(SnowFormFlag.class)) {
 | 
			
		||||
                plot.debug("Snow could not form because snow-form = false");
 | 
			
		||||
                event.setCancelled(true);
 | 
			
		||||
@@ -561,7 +569,7 @@ public class BlockEventListener implements Listener {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        Class<? extends BooleanFlag<?>> flag;
 | 
			
		||||
        if (Tag.SNOW.isTagged(event.getNewState().getType())) {
 | 
			
		||||
        if (SNOW.contains(event.getNewState().getType())) {
 | 
			
		||||
            flag = SnowFormFlag.class;
 | 
			
		||||
        } else if (Tag.ICE.isTagged(event.getNewState().getType())) {
 | 
			
		||||
            flag = IceFormFlag.class;
 | 
			
		||||
@@ -678,7 +686,7 @@ public class BlockEventListener implements Listener {
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (Tag.SNOW.isTagged(blockType)) {
 | 
			
		||||
        if (SNOW.contains(blockType)) {
 | 
			
		||||
            if (!plot.getFlag(SnowMeltFlag.class)) {
 | 
			
		||||
                plot.debug("Snow could not melt because snow-melt = false");
 | 
			
		||||
                event.setCancelled(true);
 | 
			
		||||
@@ -692,7 +700,7 @@ public class BlockEventListener implements Listener {
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType)) {
 | 
			
		||||
        if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType) || Tag.WALL_CORALS.isTagged(blockType)) {
 | 
			
		||||
            if (!plot.getFlag(CoralDryFlag.class)) {
 | 
			
		||||
                plot.debug("Coral could not dry because coral-dry = false");
 | 
			
		||||
                event.setCancelled(true);
 | 
			
		||||
 
 | 
			
		||||
@@ -126,16 +126,16 @@ public class EntitySpawnListener implements Listener {
 | 
			
		||||
        Plot plot = location.getOwnedPlotAbs();
 | 
			
		||||
        EntityType type = entity.getType();
 | 
			
		||||
        if (plot == null) {
 | 
			
		||||
            if (type == EntityType.DROPPED_ITEM) {
 | 
			
		||||
                if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!area.isMobSpawning()) {
 | 
			
		||||
                if (type == EntityType.PLAYER) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (type == EntityType.DROPPED_ITEM) {
 | 
			
		||||
                    if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
 | 
			
		||||
                        event.setCancelled(true);
 | 
			
		||||
                    }
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (type.isAlive()) {
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package com.plotsquared.bukkit.listener;
 | 
			
		||||
 | 
			
		||||
import com.destroystokyo.paper.event.block.BeaconEffectEvent;
 | 
			
		||||
import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
 | 
			
		||||
import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
 | 
			
		||||
import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
 | 
			
		||||
@@ -36,8 +37,11 @@ import com.plotsquared.core.permissions.Permission;
 | 
			
		||||
import com.plotsquared.core.player.PlotPlayer;
 | 
			
		||||
import com.plotsquared.core.plot.Plot;
 | 
			
		||||
import com.plotsquared.core.plot.PlotArea;
 | 
			
		||||
import com.plotsquared.core.plot.flag.FlagContainer;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
 | 
			
		||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
			
		||||
import com.plotsquared.core.util.Permissions;
 | 
			
		||||
import net.kyori.adventure.text.minimessage.Template;
 | 
			
		||||
@@ -229,17 +233,17 @@ public class PaperListener implements Listener {
 | 
			
		||||
        Plot plot = location.getOwnedPlotAbs();
 | 
			
		||||
        if (plot == null) {
 | 
			
		||||
            EntityType type = event.getType();
 | 
			
		||||
            // PreCreatureSpawnEvent **should** not be called for DROPPED_ITEM, just for the sake of consistency
 | 
			
		||||
            if (type == EntityType.DROPPED_ITEM) {
 | 
			
		||||
                if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!area.isMobSpawning()) {
 | 
			
		||||
                if (type == EntityType.PLAYER) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (type == EntityType.DROPPED_ITEM) {
 | 
			
		||||
                    if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
 | 
			
		||||
                        event.setShouldAbortSpawn(true);
 | 
			
		||||
                        event.setCancelled(true);
 | 
			
		||||
                    }
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (type.isAlive()) {
 | 
			
		||||
                    event.setShouldAbortSpawn(true);
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
@@ -400,4 +404,50 @@ public class PaperListener implements Listener {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @EventHandler(ignoreCancelled = true)
 | 
			
		||||
    public void onBeaconEffect(final BeaconEffectEvent event) {
 | 
			
		||||
        Block block = event.getBlock();
 | 
			
		||||
        Location beaconLocation = BukkitUtil.adapt(block.getLocation());
 | 
			
		||||
        Plot beaconPlot = beaconLocation.getPlot();
 | 
			
		||||
 | 
			
		||||
        PlotArea area = beaconLocation.getPlotArea();
 | 
			
		||||
        if (area == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Player player = event.getPlayer();
 | 
			
		||||
        Location playerLocation = BukkitUtil.adapt(player.getLocation());
 | 
			
		||||
 | 
			
		||||
        PlotPlayer<Player> plotPlayer = BukkitUtil.adapt(player);
 | 
			
		||||
        Plot playerStandingPlot = playerLocation.getPlot();
 | 
			
		||||
        if (playerStandingPlot == null) {
 | 
			
		||||
            FlagContainer container = area.getRoadFlagContainer();
 | 
			
		||||
            if (!getBooleanFlagValue(container, BeaconEffectsFlag.class, true) ||
 | 
			
		||||
                    (beaconPlot != null && Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW)) {
 | 
			
		||||
                event.setCancelled(true);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        FlagContainer container = playerStandingPlot.getFlagContainer();
 | 
			
		||||
        boolean plotBeaconEffects = getBooleanFlagValue(container, BeaconEffectsFlag.class, true);
 | 
			
		||||
        if (playerStandingPlot.equals(beaconPlot)) {
 | 
			
		||||
            if (!plotBeaconEffects) {
 | 
			
		||||
                event.setCancelled(true);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!plotBeaconEffects || Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW) {
 | 
			
		||||
            event.setCancelled(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean getBooleanFlagValue(@NonNull FlagContainer container,
 | 
			
		||||
                                        @NonNull Class<? extends BooleanFlag<?>> flagClass,
 | 
			
		||||
                                        boolean defaultValue) {
 | 
			
		||||
        BooleanFlag<?> flag = container.getFlag(flagClass);
 | 
			
		||||
        return flag == null ? defaultValue : flag.getValue();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -106,6 +106,7 @@ import org.bukkit.event.Listener;
 | 
			
		||||
import org.bukkit.event.block.Action;
 | 
			
		||||
import org.bukkit.event.entity.EntityPickupItemEvent;
 | 
			
		||||
import org.bukkit.event.entity.EntityPlaceEvent;
 | 
			
		||||
import org.bukkit.event.entity.EntityPotionEffectEvent;
 | 
			
		||||
import org.bukkit.event.entity.PlayerDeathEvent;
 | 
			
		||||
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
 | 
			
		||||
import org.bukkit.event.hanging.HangingPlaceEvent;
 | 
			
		||||
@@ -142,6 +143,7 @@ import org.bukkit.inventory.meta.ItemMeta;
 | 
			
		||||
import org.bukkit.metadata.FixedMetadataValue;
 | 
			
		||||
import org.bukkit.metadata.MetadataValue;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
import org.bukkit.potion.PotionEffect;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
@@ -204,6 +206,29 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
        this.plotListener = plotListener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @EventHandler(ignoreCancelled = true)
 | 
			
		||||
    public void onEffect(@NonNull EntityPotionEffectEvent event) {
 | 
			
		||||
        if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||
 | 
			
		||||
                event.getCause() != EntityPotionEffectEvent.Cause.BEACON ||
 | 
			
		||||
                !(event.getEntity() instanceof Player player)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        UUID uuid = player.getUniqueId();
 | 
			
		||||
        PotionEffect effect = event.getNewEffect();
 | 
			
		||||
        if (effect == null) {
 | 
			
		||||
            PotionEffect oldEffect = event.getOldEffect();
 | 
			
		||||
            if (oldEffect != null) {
 | 
			
		||||
                String name = oldEffect.getType().getName();
 | 
			
		||||
                plotListener.addEffect(uuid, name, -1);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            long expiresAt = System.currentTimeMillis() + effect.getDuration() * 50L; //Convert ticks to milliseconds
 | 
			
		||||
            String name = effect.getType().getName();
 | 
			
		||||
            plotListener.addEffect(uuid, name, expiresAt);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @EventHandler
 | 
			
		||||
    public void onVehicleEntityCollision(VehicleEntityCollisionEvent e) {
 | 
			
		||||
        if (e.getVehicle().getType() == EntityType.BOAT) {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,57 @@
 | 
			
		||||
/*
 | 
			
		||||
 * PlotSquared, a land and world management plugin for Minecraft.
 | 
			
		||||
 * Copyright (C) IntellectualSites <https://intellectualsites.com>
 | 
			
		||||
 * Copyright (C) IntellectualSites team and contributors
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
package com.plotsquared.bukkit.listener;
 | 
			
		||||
 | 
			
		||||
import com.plotsquared.bukkit.util.BukkitUtil;
 | 
			
		||||
import com.plotsquared.core.location.Location;
 | 
			
		||||
import com.plotsquared.core.plot.Plot;
 | 
			
		||||
import com.plotsquared.core.plot.flag.FlagContainer;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.event.EventHandler;
 | 
			
		||||
import org.bukkit.event.Listener;
 | 
			
		||||
import org.bukkit.event.entity.EntityPotionEffectEvent;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fallback listener for paper events on spigot
 | 
			
		||||
 */
 | 
			
		||||
public class SpigotListener implements Listener {
 | 
			
		||||
 | 
			
		||||
    @EventHandler(ignoreCancelled = true)
 | 
			
		||||
    public void onEffect(@NonNull EntityPotionEffectEvent event) {
 | 
			
		||||
        if (event.getCause() != EntityPotionEffectEvent.Cause.BEACON) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Entity entity = event.getEntity();
 | 
			
		||||
        Location location = BukkitUtil.adapt(entity.getLocation());
 | 
			
		||||
        Plot plot = location.getPlot();
 | 
			
		||||
        if (plot == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        FlagContainer container = plot.getFlagContainer();
 | 
			
		||||
        BeaconEffectsFlag effectsEnabled = container.getFlag(BeaconEffectsFlag.class);
 | 
			
		||||
        if (effectsEnabled != null && !effectsEnabled.getValue()) {
 | 
			
		||||
            event.setCancelled(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -47,13 +47,13 @@ import org.bukkit.event.EventException;
 | 
			
		||||
import org.bukkit.event.player.PlayerTeleportEvent;
 | 
			
		||||
import org.bukkit.permissions.PermissionAttachmentInfo;
 | 
			
		||||
import org.bukkit.plugin.RegisteredListener;
 | 
			
		||||
import org.bukkit.potion.PotionEffectType;
 | 
			
		||||
import org.checkerframework.checker.index.qual.NonNegative;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import static com.sk89q.worldedit.world.gamemode.GameModes.ADVENTURE;
 | 
			
		||||
import static com.sk89q.worldedit.world.gamemode.GameModes.CREATIVE;
 | 
			
		||||
@@ -348,6 +348,14 @@ public class BukkitPlayer extends PlotPlayer<Player> {
 | 
			
		||||
        return BukkitUtil.BUKKIT_AUDIENCES.player(this.player);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removeEffect(@NonNull String name) {
 | 
			
		||||
        PotionEffectType type = PotionEffectType.getByName(name);
 | 
			
		||||
        if (type != null) {
 | 
			
		||||
            player.removePotionEffect(type);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean canSee(final PlotPlayer<?> other) {
 | 
			
		||||
        if (other instanceof ConsolePlayer) {
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,7 @@ import org.bukkit.block.BlockFace;
 | 
			
		||||
import org.bukkit.block.Sign;
 | 
			
		||||
import org.bukkit.block.data.Directional;
 | 
			
		||||
import org.bukkit.block.data.type.WallSign;
 | 
			
		||||
import org.bukkit.entity.Allay;
 | 
			
		||||
import org.bukkit.entity.Ambient;
 | 
			
		||||
import org.bukkit.entity.Animals;
 | 
			
		||||
import org.bukkit.entity.AreaEffectCloud;
 | 
			
		||||
@@ -437,6 +438,9 @@ public class BukkitUtil extends WorldUtil {
 | 
			
		||||
                allowedInterfaces.add(Animals.class);
 | 
			
		||||
                allowedInterfaces.add(WaterMob.class);
 | 
			
		||||
                allowedInterfaces.add(Ambient.class);
 | 
			
		||||
                if (PlotSquared.platform().serverVersion()[1] >= 19) {
 | 
			
		||||
                    allowedInterfaces.add(Allay.class);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            case "tameable" -> allowedInterfaces.add(Tameable.class);
 | 
			
		||||
            case "vehicle" -> allowedInterfaces.add(Vehicle.class);
 | 
			
		||||
 
 | 
			
		||||
@@ -251,6 +251,7 @@ public class Auto extends SubCommand {
 | 
			
		||||
                    TranslatableCaption.of("permission.no_permission"),
 | 
			
		||||
                    Template.of("node", String.valueOf(Permission.PERMISSION_AUTO_MEGA))
 | 
			
		||||
            );
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) {
 | 
			
		||||
            player.sendMessage(
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@ import com.plotsquared.core.util.TabCompletions;
 | 
			
		||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
			
		||||
import com.plotsquared.core.util.task.RunnableVal2;
 | 
			
		||||
import com.plotsquared.core.util.task.RunnableVal3;
 | 
			
		||||
import com.plotsquared.core.uuid.UUIDMapping;
 | 
			
		||||
import net.kyori.adventure.text.minimessage.Template;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
@@ -40,6 +39,7 @@ import java.util.Collections;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
import java.util.concurrent.TimeoutException;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
@@ -88,8 +88,8 @@ public class Grant extends Command {
 | 
			
		||||
                                Template.of("value", String.valueOf(uuids))
 | 
			
		||||
                        );
 | 
			
		||||
                    } else {
 | 
			
		||||
                        final UUIDMapping uuid = uuids.toArray(new UUIDMapping[0])[0];
 | 
			
		||||
                        PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid.getUuid());
 | 
			
		||||
                        final UUID uuid = uuids.iterator().next();
 | 
			
		||||
                        PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid);
 | 
			
		||||
                        if (pp != null) {
 | 
			
		||||
                            try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData(
 | 
			
		||||
                                    PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) {
 | 
			
		||||
@@ -103,7 +103,7 @@ public class Grant extends Command {
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            DBFunc.getPersistentMeta(uuid.getUuid(), new RunnableVal<>() {
 | 
			
		||||
                            DBFunc.getPersistentMeta(uuid, new RunnableVal<>() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void run(Map<String, byte[]> value) {
 | 
			
		||||
                                    final byte[] array = value.get("grantedPlots");
 | 
			
		||||
@@ -128,7 +128,7 @@ public class Grant extends Command {
 | 
			
		||||
                                        boolean replace = array != null;
 | 
			
		||||
                                        String key = "grantedPlots";
 | 
			
		||||
                                        byte[] rawData = Ints.toByteArray(amount);
 | 
			
		||||
                                        DBFunc.addPersistentMeta(uuid.getUuid(), key, rawData, replace);
 | 
			
		||||
                                        DBFunc.addPersistentMeta(uuid, key, rawData, replace);
 | 
			
		||||
                                        player.sendMessage(
 | 
			
		||||
                                                TranslatableCaption.of("grants.added"),
 | 
			
		||||
                                                Template.of("grants", String.valueOf(amount))
 | 
			
		||||
 
 | 
			
		||||
@@ -115,8 +115,8 @@ public class Remove extends SubCommand {
 | 
			
		||||
            }
 | 
			
		||||
            if (count == 0) {
 | 
			
		||||
                player.sendMessage(
 | 
			
		||||
                        TranslatableCaption.of("errors.invalid_player"),
 | 
			
		||||
                        Template.of("value", args[0])
 | 
			
		||||
                        TranslatableCaption.of("member.player_not_removed"),
 | 
			
		||||
                        Template.of("player", args[0])
 | 
			
		||||
                );
 | 
			
		||||
            } else {
 | 
			
		||||
                player.sendMessage(
 | 
			
		||||
 
 | 
			
		||||
@@ -808,6 +808,8 @@ public class Settings extends Config {
 | 
			
		||||
        );
 | 
			
		||||
        @Comment("Whether PlotSquared should hook into MvDWPlaceholderAPI or not")
 | 
			
		||||
        public static boolean USE_MVDWAPI = true;
 | 
			
		||||
        @Comment("Prevent cross plot beacon effects")
 | 
			
		||||
        public static boolean DISABLE_BEACON_EFFECT_OVERFLOW = true;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -174,7 +174,7 @@ public final class CaptionLoader {
 | 
			
		||||
    public @NonNull CaptionMap loadAll(final @NonNull Path directory) throws IOException {
 | 
			
		||||
        final Map<Locale, CaptionMap> localeMaps = new HashMap<>();
 | 
			
		||||
        try (final Stream<Path> files = Files.list(directory)) {
 | 
			
		||||
            final List<Path> captionFiles = files.filter(Files::isRegularFile).collect(Collectors.toList());
 | 
			
		||||
            final List<Path> captionFiles = files.filter(Files::isRegularFile).toList();
 | 
			
		||||
            for (Path file : captionFiles) {
 | 
			
		||||
                try {
 | 
			
		||||
                    final CaptionMap localeMap = loadSingle(file);
 | 
			
		||||
@@ -221,7 +221,7 @@ public final class CaptionLoader {
 | 
			
		||||
     * @throws IOException              if the file couldn't be accessed or read successfully.
 | 
			
		||||
     * @throws IllegalArgumentException if the file name doesn't match the specified format.
 | 
			
		||||
     * @see #loadSingle(Path)
 | 
			
		||||
     * @since TODO
 | 
			
		||||
     * @since 6.9.3
 | 
			
		||||
     */
 | 
			
		||||
    public @NonNull CaptionMap loadOrCreateSingle(final @NonNull Path file) throws IOException {
 | 
			
		||||
        final Locale locale = this.localeExtractor.apply(file);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,13 +28,17 @@ import com.plotsquared.core.inject.annotations.WorldConfig;
 | 
			
		||||
import com.plotsquared.core.plot.BlockBucket;
 | 
			
		||||
import com.plotsquared.core.plot.PlotId;
 | 
			
		||||
import com.plotsquared.core.queue.GlobalBlockQueue;
 | 
			
		||||
import com.sk89q.worldedit.function.pattern.Pattern;
 | 
			
		||||
import com.sk89q.worldedit.world.block.BlockTypes;
 | 
			
		||||
import org.apache.logging.log4j.LogManager;
 | 
			
		||||
import org.apache.logging.log4j.Logger;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("WeakerAccess")
 | 
			
		||||
public abstract class ClassicPlotWorld extends SquarePlotWorld {
 | 
			
		||||
    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ClassicPlotWorld.class.getSimpleName());
 | 
			
		||||
 | 
			
		||||
    public int ROAD_HEIGHT = 62;
 | 
			
		||||
    public int PLOT_HEIGHT = 62;
 | 
			
		||||
@@ -121,15 +125,15 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
 | 
			
		||||
        super.loadConfiguration(config);
 | 
			
		||||
        this.PLOT_BEDROCK = config.getBoolean("plot.bedrock");
 | 
			
		||||
        this.PLOT_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("plot.height"));
 | 
			
		||||
        this.MAIN_BLOCK = new BlockBucket(config.getString("plot.filling"));
 | 
			
		||||
        this.TOP_BLOCK = new BlockBucket(config.getString("plot.floor"));
 | 
			
		||||
        this.WALL_BLOCK = new BlockBucket(config.getString("wall.block"));
 | 
			
		||||
        this.MAIN_BLOCK = createCheckedBlockBucket(config.getString("plot.filling"), MAIN_BLOCK);
 | 
			
		||||
        this.TOP_BLOCK = createCheckedBlockBucket(config.getString("plot.floor"), TOP_BLOCK);
 | 
			
		||||
        this.WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block"), WALL_BLOCK);
 | 
			
		||||
        this.ROAD_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("road.height"));
 | 
			
		||||
        this.ROAD_BLOCK = new BlockBucket(config.getString("road.block"));
 | 
			
		||||
        this.WALL_FILLING = new BlockBucket(config.getString("wall.filling"));
 | 
			
		||||
        this.ROAD_BLOCK = createCheckedBlockBucket(config.getString("road.block"), ROAD_BLOCK);
 | 
			
		||||
        this.WALL_FILLING = createCheckedBlockBucket(config.getString("wall.filling"), WALL_FILLING);
 | 
			
		||||
        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.CLAIMED_WALL_BLOCK = new BlockBucket(config.getString("wall.block_claimed"));
 | 
			
		||||
        this.CLAIMED_WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block_claimed"), CLAIMED_WALL_BLOCK);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int schematicStartHeight() {
 | 
			
		||||
@@ -140,4 +144,19 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
 | 
			
		||||
        return Math.min(WALL_HEIGHT, plotRoadMin);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static BlockBucket createCheckedBlockBucket(String input, BlockBucket def) {
 | 
			
		||||
        final BlockBucket bucket = new BlockBucket(input);
 | 
			
		||||
        Pattern pattern = null;
 | 
			
		||||
        try {
 | 
			
		||||
            pattern = bucket.toPattern();
 | 
			
		||||
        } catch (Exception ignore) {
 | 
			
		||||
        }
 | 
			
		||||
        if (pattern == null) {
 | 
			
		||||
            LOGGER.error("Failed to parse pattern '{}', check your worlds.yml", input);
 | 
			
		||||
            LOGGER.error("Falling back to {}", def);
 | 
			
		||||
            return def;
 | 
			
		||||
        }
 | 
			
		||||
        return bucket;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -67,10 +67,13 @@ import com.sk89q.worldedit.world.item.ItemType;
 | 
			
		||||
import com.sk89q.worldedit.world.item.ItemTypes;
 | 
			
		||||
import net.kyori.adventure.text.minimessage.MiniMessage;
 | 
			
		||||
import net.kyori.adventure.text.minimessage.Template;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
@@ -82,6 +85,7 @@ public class PlotListener {
 | 
			
		||||
 | 
			
		||||
    private final HashMap<UUID, Interval> feedRunnable = new HashMap<>();
 | 
			
		||||
    private final HashMap<UUID, Interval> healRunnable = new HashMap<>();
 | 
			
		||||
    private final Map<UUID, List<StatusEffect>> playerEffects = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    private final EventDispatcher eventDispatcher;
 | 
			
		||||
 | 
			
		||||
@@ -131,6 +135,17 @@ public class PlotListener {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!playerEffects.isEmpty()) {
 | 
			
		||||
                long currentTime = System.currentTimeMillis();
 | 
			
		||||
                for (Iterator<Map.Entry<UUID, List<StatusEffect>>> iterator =
 | 
			
		||||
                     playerEffects.entrySet().iterator(); iterator.hasNext(); ) {
 | 
			
		||||
                    Map.Entry<UUID, List<StatusEffect>> entry = iterator.next();
 | 
			
		||||
                    List<StatusEffect> effects = entry.getValue();
 | 
			
		||||
                    effects.removeIf(effect -> currentTime > effect.expiresAt);
 | 
			
		||||
                    if (effects.isEmpty()) iterator.remove();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }, TaskTime.seconds(1L));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -360,6 +375,17 @@ public class PlotListener {
 | 
			
		||||
        try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
 | 
			
		||||
            final Plot previous = lastPlot.remove();
 | 
			
		||||
            this.eventDispatcher.callLeave(player, plot);
 | 
			
		||||
 | 
			
		||||
            List<StatusEffect> effects = playerEffects.remove(player.getUUID());
 | 
			
		||||
            if (effects != null) {
 | 
			
		||||
                long currentTime = System.currentTimeMillis();
 | 
			
		||||
                effects.forEach(effect -> {
 | 
			
		||||
                    if (currentTime <= effect.expiresAt) {
 | 
			
		||||
                        player.removeEffect(effect.name);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (plot.hasOwner()) {
 | 
			
		||||
                PlotArea pw = plot.getArea();
 | 
			
		||||
                if (pw == null) {
 | 
			
		||||
@@ -468,6 +494,23 @@ public class PlotListener {
 | 
			
		||||
    public void logout(UUID uuid) {
 | 
			
		||||
        feedRunnable.remove(uuid);
 | 
			
		||||
        healRunnable.remove(uuid);
 | 
			
		||||
        playerEffects.remove(uuid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Marks an effect as a status effect that will be removed on leaving a plot
 | 
			
		||||
     * @param uuid The uuid of the player the effect belongs to
 | 
			
		||||
     * @param name The name of the status effect
 | 
			
		||||
     * @param expiresAt The time when the effect expires
 | 
			
		||||
     * @since 6.10.0
 | 
			
		||||
     */
 | 
			
		||||
    public void addEffect(@NonNull UUID uuid, @NonNull String name, long expiresAt) {
 | 
			
		||||
        List<StatusEffect> effects = playerEffects.getOrDefault(uuid, new ArrayList<>());
 | 
			
		||||
        effects.removeIf(effect -> effect.name.equals(name));
 | 
			
		||||
        if (expiresAt != -1) {
 | 
			
		||||
            effects.add(new StatusEffect(name, expiresAt));
 | 
			
		||||
        }
 | 
			
		||||
        playerEffects.put(uuid, effects);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class Interval {
 | 
			
		||||
@@ -485,4 +528,13 @@ public class PlotListener {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private record StatusEffect(@NonNull String name, long expiresAt) {
 | 
			
		||||
 | 
			
		||||
        private StatusEffect(@NonNull String name, long expiresAt) {
 | 
			
		||||
                this.name = name;
 | 
			
		||||
                this.expiresAt = expiresAt;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -246,6 +246,10 @@ public class ConsolePlayer extends PlotPlayer<Actor> {
 | 
			
		||||
        return PlotSquared.platform().consoleAudience();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removeEffect(@NonNull String name) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean canSee(final PlotPlayer<?> other) {
 | 
			
		||||
        return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1016,6 +1016,14 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
 | 
			
		||||
        return this.lockRepository;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes any effects present of the given type.
 | 
			
		||||
     *
 | 
			
		||||
     * @param name the name of the type to remove
 | 
			
		||||
     * @since 6.10.0
 | 
			
		||||
     */
 | 
			
		||||
    public abstract void removeEffect(@NonNull String name);
 | 
			
		||||
 | 
			
		||||
    @FunctionalInterface
 | 
			
		||||
    public interface PlotPlayerConverter<BaseObject> {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import com.plotsquared.core.plot.flag.implementations.AnalysisFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.AnimalAttackFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.AnimalCapFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.AnimalInteractFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
 | 
			
		||||
import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag;
 | 
			
		||||
@@ -137,6 +138,7 @@ public final class GlobalFlagContainer extends FlagContainer {
 | 
			
		||||
        this.addFlag(AnimalAttackFlag.ANIMAL_ATTACK_FALSE);
 | 
			
		||||
        this.addFlag(AnimalInteractFlag.ANIMAL_INTERACT_FALSE);
 | 
			
		||||
        this.addFlag(BlockBurnFlag.BLOCK_BURN_FALSE);
 | 
			
		||||
        this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE);
 | 
			
		||||
        this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
 | 
			
		||||
        this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
 | 
			
		||||
        this.addFlag(CopperOxideFlag.COPPER_OXIDE_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 BeaconEffectsFlag extends BooleanFlag<BeaconEffectsFlag> {
 | 
			
		||||
 | 
			
		||||
    public static final BeaconEffectsFlag BEACON_EFFECT_TRUE = new BeaconEffectsFlag(true);
 | 
			
		||||
    public static final BeaconEffectsFlag BEACON_EFFECT_FALSE = new BeaconEffectsFlag(false);
 | 
			
		||||
 | 
			
		||||
    private BeaconEffectsFlag(boolean value){
 | 
			
		||||
        super(value, TranslatableCaption.of("flags.flag_description_beacon_effect"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected BeaconEffectsFlag flagOf(@NonNull final Boolean value) {
 | 
			
		||||
        return value ? BEACON_EFFECT_TRUE : BEACON_EFFECT_FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -30,9 +30,18 @@ import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 * The Permissions class handles checking user permissions.<br>
 | 
			
		||||
 * - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br>
 | 
			
		||||
 * - Checking the PlotPlayer class directly will not take the above into account<br>
 | 
			
		||||
 *
 | 
			
		||||
 * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
 * classes
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
public class Permissions {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) {
 | 
			
		||||
        return hasPermission(player, permission.toString(), notify);
 | 
			
		||||
    }
 | 
			
		||||
@@ -43,18 +52,25 @@ public class Permissions {
 | 
			
		||||
     * @param caller     permission holder
 | 
			
		||||
     * @param permission Permission
 | 
			
		||||
     * @return {@code true} if the owner has the given permission, else {@code false}
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) {
 | 
			
		||||
        return caller.hasPermission(permission.toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if the owner of the profile has a given (global) permission
 | 
			
		||||
     * Check if the owner of the profile has a given (global) permission. There is no guarantee that per-world permissions will
 | 
			
		||||
     * be checked because unmaintained crap plugins like PEX exist.
 | 
			
		||||
     *
 | 
			
		||||
     * @param caller     permission holder
 | 
			
		||||
     * @param permission Permission
 | 
			
		||||
     * @return {@code true} if the owner has the given permission, else {@code false}
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) {
 | 
			
		||||
        return caller.hasPermission(permission);
 | 
			
		||||
    }
 | 
			
		||||
@@ -68,7 +84,10 @@ public class Permissions {
 | 
			
		||||
     * @param key        Permission "key"
 | 
			
		||||
     * @return {@code true} if the owner has the given permission, else {@code false}
 | 
			
		||||
     * @since 6.0.10
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static boolean hasKeyedPermission(
 | 
			
		||||
            final @NonNull PermissionHolder caller, final @NonNull String permission,
 | 
			
		||||
            final @NonNull String key
 | 
			
		||||
@@ -83,7 +102,10 @@ public class Permissions {
 | 
			
		||||
     * @param permission permission
 | 
			
		||||
     * @param notify     if to notify the permission holder
 | 
			
		||||
     * @return if permission is had
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) {
 | 
			
		||||
        if (!hasPermission(player, permission)) {
 | 
			
		||||
            if (notify) {
 | 
			
		||||
@@ -97,6 +119,11 @@ public class Permissions {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) {
 | 
			
		||||
        return hasPermissionRange(player, Permission.toString(), range);
 | 
			
		||||
    }
 | 
			
		||||
@@ -110,7 +137,10 @@ public class Permissions {
 | 
			
		||||
     * @param stub   The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot`
 | 
			
		||||
     * @param range  The range to check
 | 
			
		||||
     * @return The highest permission they have within that range
 | 
			
		||||
     * @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
 | 
			
		||||
     * classes
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "6.9.3")
 | 
			
		||||
    public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) {
 | 
			
		||||
        return player.hasPermissionRange(stub, range);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -164,7 +164,7 @@ public final class PlaceholderRegistry {
 | 
			
		||||
                    PlayerManager.getPlayerList(plot.getDenied(), player));
 | 
			
		||||
        });
 | 
			
		||||
        this.createPlaceholder("currentplot_creationdate", (player, plot) -> {
 | 
			
		||||
            if (plot.getTimestamp() == 0) {
 | 
			
		||||
            if (plot.getTimestamp() == 0 || !plot.hasOwner()) {
 | 
			
		||||
                return legacyComponent(TranslatableCaption.of("info.unknown"), player);
 | 
			
		||||
            }
 | 
			
		||||
            long creationDate = plot.getTimestamp();
 | 
			
		||||
 
 | 
			
		||||
@@ -414,6 +414,7 @@
 | 
			
		||||
  "kick.you_got_kicked": "<prefix><dark_aqua>You got kicked from the plot!</dark_aqua>",
 | 
			
		||||
  "trusted.trusted_added": "<prefix><dark_aqua>You successfully trusted a user to the plot.</dark_aqua>",
 | 
			
		||||
  "trusted.plot_removed_user": "<prefix><red>Plot <plot> of which you were added to has been deleted due to owner inactivity.</red>",
 | 
			
		||||
  "member.player_not_removed": "<prefix><gray><player></gray><red> is neither added, trusted or denied on the plot, thus doesn't need to be removed.</red>",
 | 
			
		||||
  "member.removed_players": "<prefix><gray>Removed <amount> player(s) from this plot.</gray>",
 | 
			
		||||
  "member.plot_left": "<prefix><gray><player> left the plot.</gray>",
 | 
			
		||||
  "member.plot_cant_leave_owner": "<prefix><red>You are the plot owner. You cannot leave this plot.</red>",
 | 
			
		||||
@@ -617,6 +618,7 @@
 | 
			
		||||
  "flags.flag_description_prevent_creative_copy": "<gray>Prevents people from copying item NBT data in the plot unless they're added as members.</gray>",
 | 
			
		||||
  "flags.flag_description_leaf_decay": "<gray>Set to `false` to prevent leaves from decaying.",
 | 
			
		||||
  "flags.flag_description_projectiles": "<gray>Prevents guests from shooting projectiles on the plot when set to false.</gray>",
 | 
			
		||||
  "flags.flag_description_beacon_effect": "<gray>Enables beacon effects on the plot.</gray>",
 | 
			
		||||
  "flags.flag_error_boolean": "Flag value must be a boolean (true | false).",
 | 
			
		||||
  "flags.flag_error_enum": "Must be one of: <list>",
 | 
			
		||||
  "flags.flag_error_integer": "Flag value must be a whole positive number.",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ plugins {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
group = "com.plotsquared"
 | 
			
		||||
version = "6.9.3-SNAPSHOT"
 | 
			
		||||
version = "6.10.1-SNAPSHOT"
 | 
			
		||||
 | 
			
		||||
subprojects {
 | 
			
		||||
    group = rootProject.group
 | 
			
		||||
@@ -65,12 +65,12 @@ subprojects {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dependencies {
 | 
			
		||||
        implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.11"))
 | 
			
		||||
        implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.15"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dependencies {
 | 
			
		||||
        // Tests
 | 
			
		||||
        testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
 | 
			
		||||
        testImplementation("org.junit.jupiter:junit-jupiter:5.9.1")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    plugins.withId("java") {
 | 
			
		||||
@@ -174,10 +174,7 @@ subprojects {
 | 
			
		||||
    tasks {
 | 
			
		||||
 | 
			
		||||
        compileJava {
 | 
			
		||||
            options.compilerArgs.addAll(arrayOf("-Xmaxerrs", "1000"))
 | 
			
		||||
            options.compilerArgs.add("-Xlint:all")
 | 
			
		||||
            for (disabledLint in arrayOf("processing", "path", "fallthrough", "serial"))
 | 
			
		||||
                options.compilerArgs.add("-Xlint:$disabledLint")
 | 
			
		||||
            options.compilerArgs.add("-parameters")
 | 
			
		||||
            options.isDeprecation = true
 | 
			
		||||
            options.encoding = "UTF-8"
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,19 +2,19 @@
 | 
			
		||||
# Platform expectations
 | 
			
		||||
paper = "1.18.1-R0.1-SNAPSHOT"
 | 
			
		||||
guice = "5.1.0"
 | 
			
		||||
spotbugs = "4.7.1"
 | 
			
		||||
spotbugs = "4.7.2"
 | 
			
		||||
 | 
			
		||||
# Plugins
 | 
			
		||||
worldedit = "7.2.10"
 | 
			
		||||
worldedit = "7.2.12"
 | 
			
		||||
placeholderapi = "2.11.2"
 | 
			
		||||
luckperms = "5.4"
 | 
			
		||||
essentialsx = "2.19.4"
 | 
			
		||||
essentialsx = "2.19.7"
 | 
			
		||||
mvdwapi = "3.1.1"
 | 
			
		||||
 | 
			
		||||
# Third party
 | 
			
		||||
prtree = "2.0.0"
 | 
			
		||||
aopalliance = "1.0"
 | 
			
		||||
cloud-services = "1.7.0"
 | 
			
		||||
cloud-services = "1.7.1"
 | 
			
		||||
arkitektonika = "2.1.1"
 | 
			
		||||
squirrelid = "0.3.1"
 | 
			
		||||
http4j = "1.3"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
distributionBase=GRADLE_USER_HOME
 | 
			
		||||
distributionPath=wrapper/dists
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
 | 
			
		||||
zipStoreBase=GRADLE_USER_HOME
 | 
			
		||||
zipStorePath=wrapper/dists
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
{
 | 
			
		||||
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
 | 
			
		||||
  "extends": [
 | 
			
		||||
    "config:base",
 | 
			
		||||
    ":disableDependencyDashboard"
 | 
			
		||||
    ":semanticCommitsDisabled"
 | 
			
		||||
  ],
 | 
			
		||||
  "labels": ["Renovate"],
 | 
			
		||||
  "commitMessagePrefix": "build: ",
 | 
			
		||||
  "rebaseWhen": "conflicted"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user