From 4e486f9be3ddebe662dbe7da75610d8a492f1a85 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Sat, 14 Jun 2025 13:55:31 +0100 Subject: [PATCH] fix: allow cauldron in use flag to behave as expected --- .../bukkit/listener/PlayerEventListener.java | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java index 161ff8a91..9bdee85ae 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java @@ -64,9 +64,11 @@ import com.plotsquared.core.plot.flag.implementations.PreventCreativeCopyFlag; 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.UseFlag; import com.plotsquared.core.plot.flag.implementations.VehicleBreakFlag; import com.plotsquared.core.plot.flag.implementations.VehicleUseFlag; import com.plotsquared.core.plot.flag.implementations.VillagerInteractFlag; +import com.plotsquared.core.plot.flag.types.BlockTypeWrapper; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MathMan; @@ -78,6 +80,7 @@ import com.plotsquared.core.util.task.TaskTime; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.block.BlockTypes; import io.papermc.lib.PaperLib; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -152,9 +155,11 @@ import org.bukkit.util.Vector; import org.checkerframework.checker.nullness.qual.NonNull; import java.lang.reflect.Field; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -179,6 +184,7 @@ public class PlayerEventListener implements Listener { Material.WRITTEN_BOOK ); private static final Set DYES; + static { Set mutableDyes = new HashSet<>(Set.of( "WHITE_DYE", @@ -213,7 +219,7 @@ public class PlayerEventListener implements Listener { // "temporary" fix for https://hub.spigotmc.org/jira/browse/SPIGOT-7813 // can (and should) be removed when 1.21 support is dropped // List of all interactable 1.21 materials - INTERACTABLE_MATERIALS = Material.CHEST.isInteractable() ? null : Set.of( + INTERACTABLE_MATERIALS = Material.CHEST.isInteractable() ? null : Set.of( "REDSTONE_ORE", "DEEPSLATE_REDSTONE_ORE", "CHISELED_BOOKSHELF", "DECORATED_POT", "CHEST", "CRAFTING_TABLE", "FURNACE", "JUKEBOX", "OAK_FENCE", "SPRUCE_FENCE", "BIRCH_FENCE", "JUNGLE_FENCE", "ACACIA_FENCE", "CHERRY_FENCE", "DARK_OAK_FENCE", "MANGROVE_FENCE", "BAMBOO_FENCE", "CRIMSON_FENCE", "WARPED_FENCE", "PUMPKIN", @@ -531,12 +537,14 @@ public class PlayerEventListener implements Listener { // Delayed // Async - TaskManager.runTaskLaterAsync(() -> { - if (!player.hasPlayedBefore() && player.isOnline()) { - player.saveData(); - } - this.eventDispatcher.doJoinTask(pp); - }, TaskTime.seconds(1L)); + TaskManager.runTaskLaterAsync( + () -> { + if (!player.hasPlayedBefore() && player.isOnline()) { + player.saveData(); + } + this.eventDispatcher.doJoinTask(pp); + }, TaskTime.seconds(1L) + ); if (pp.hasPermission(Permission.PERMISSION_ADMIN_UPDATE_NOTIFICATION.toString()) && Settings.Enabled_Components.UPDATE_NOTIFICATIONS && PremiumVerification.isPremium() && UpdateUtility.hasUpdate) { @@ -597,7 +605,9 @@ public class PlayerEventListener implements Listener { // to is identical to the plot's home location, and untrusted-visit is true // i.e. untrusted-visit can override deny-teleport // this is acceptable, because otherwise it wouldn't make sense to have both flags set - if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) { + if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot + .getHomeSynchronous() + .equals(BukkitUtil.adaptComplete(to)))) { // returns false if the player is not allowed to enter the plot (if they are denied, for example) // don't let the move event cancel the entry after teleport, but rather catch and cancel early (#4647) if (!plotListener.plotEntry(pp, plot)) { @@ -941,12 +951,15 @@ public class PlayerEventListener implements Listener { builder.tag("plot_id", Tag.inserting(Component.text(id.toString()))); builder.tag("sender", Tag.inserting(Component.text(sender))); if (plotPlayer.hasPermission("plots.chat.color")) { - builder.tag("msg", Tag.inserting(MiniMessage.miniMessage().deserialize( - message, - TagResolver.resolver(StandardTags.color(), StandardTags.gradient(), - StandardTags.rainbow(), StandardTags.decorations() - ) - ))); + builder.tag( + "msg", Tag.inserting(MiniMessage.miniMessage().deserialize( + message, + TagResolver.resolver( + StandardTags.color(), StandardTags.gradient(), + StandardTags.rainbow(), StandardTags.decorations() + ) + )) + ); } else { builder.tag("msg", Tag.inserting(Component.text(message))); } @@ -1255,7 +1268,9 @@ public class PlayerEventListener implements Listener { eventType = PlayerBlockEventType.INTERACT_BLOCK; blocktype1 = BukkitAdapter.asBlockType(block.getType()); - if (INTERACTABLE_MATERIALS != null ? INTERACTABLE_MATERIALS.contains(blockType.name()) : blockType.isInteractable()) { + if (INTERACTABLE_MATERIALS != null + ? INTERACTABLE_MATERIALS.contains(blockType.name()) + : blockType.isInteractable()) { if (!player.isSneaking()) { break; } @@ -1273,7 +1288,7 @@ public class PlayerEventListener implements Listener { // in the following, lb needs to have the material of the item in hand i.e. type switch (type.toString()) { case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS", - "SWEET_BERRIES", "GLOW_BERRIES" -> { + "SWEET_BERRIES", "GLOW_BERRIES" -> { return; } default -> { @@ -1380,6 +1395,16 @@ public class PlayerEventListener implements Listener { } BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); Plot plot = area.getPlot(location); + final List use = + Optional.ofNullable(plot).map(p -> p.getFlag(UseFlag.class)).orElse(area.isRoadFlags() ? + area.getFlag(UseFlag.class) : Collections.emptyList()); + BlockType type = BukkitAdapter.asBlockType(block.getType()); + for (final BlockTypeWrapper blockTypeWrapper : use) { + if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper + .accepts(type)) { + return; + } + } if (plot == null) { if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { return; @@ -1451,6 +1476,16 @@ public class PlayerEventListener implements Listener { Player player = event.getPlayer(); BukkitPlayer plotPlayer = BukkitUtil.adapt(player); Plot plot = area.getPlot(location); + final List use = + Optional.ofNullable(plot).map(p -> p.getFlag(UseFlag.class)).orElse(area.isRoadFlags() ? + area.getFlag(UseFlag.class) : Collections.emptyList()); + BlockType type = BukkitAdapter.asBlockType(blockClicked.getType()); + for (final BlockTypeWrapper blockTypeWrapper : use) { + if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper + .accepts(type)) { + return; + } + } if (plot == null) { if (plotPlayer.hasPermission(Permission.PERMISSION_ADMIN_BUILD_ROAD)) { return;