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 45e5a3b2c6..a10fc01e88 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java @@ -54,6 +54,7 @@ import com.plotsquared.core.plot.flag.implementations.HangingBreakFlag; import com.plotsquared.core.plot.flag.implementations.HangingPlaceFlag; import com.plotsquared.core.plot.flag.implementations.HostileInteractFlag; +import com.plotsquared.core.plot.flag.implementations.InteractionInteractFlag; import com.plotsquared.core.plot.flag.implementations.ItemDropFlag; import com.plotsquared.core.plot.flag.implementations.KeepInventoryFlag; import com.plotsquared.core.plot.flag.implementations.LecternReadBookFlag; @@ -1737,6 +1738,11 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { return; } + if (EntityCategories.INTERACTION.contains(entityType) && flagContainer + .getFlag(InteractionInteractFlag.class).getValue()) { + return; + } + if (EntityCategories.VILLAGER.contains(entityType) && flagContainer .getFlag(VillagerInteractFlag.class).getValue()) { return; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 124e766e9b..79ed1eaa0c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -75,6 +75,7 @@ import org.bukkit.entity.Firework; import org.bukkit.entity.Ghast; import org.bukkit.entity.Hanging; +import org.bukkit.entity.Interaction; import org.bukkit.entity.IronGolem; import org.bukkit.entity.Item; import org.bukkit.entity.LightningStrike; @@ -470,6 +471,7 @@ public void setFoodLevel(final @NonNull PlotPlayer player, @NonNegative final allowedInterfaces.add(Firework.class); } case "player" -> allowedInterfaces.add(Player.class); + case "interaction" -> allowedInterfaces.add(Interaction.class); default -> LOGGER.error("Unknown entity category requested: {}", category); } final Set types = new HashSet<>(); diff --git a/Core/src/main/java/com/plotsquared/core/plot/flag/GlobalFlagContainer.java b/Core/src/main/java/com/plotsquared/core/plot/flag/GlobalFlagContainer.java index 3e704a021a..0780493ab3 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/flag/GlobalFlagContainer.java +++ b/Core/src/main/java/com/plotsquared/core/plot/flag/GlobalFlagContainer.java @@ -65,6 +65,7 @@ import com.plotsquared.core.plot.flag.implementations.IceFormFlag; import com.plotsquared.core.plot.flag.implementations.IceMeltFlag; import com.plotsquared.core.plot.flag.implementations.InstabreakFlag; +import com.plotsquared.core.plot.flag.implementations.InteractionInteractFlag; import com.plotsquared.core.plot.flag.implementations.InvincibleFlag; import com.plotsquared.core.plot.flag.implementations.ItemDropFlag; import com.plotsquared.core.plot.flag.implementations.KeepFlag; @@ -172,6 +173,7 @@ private GlobalFlagContainer() { this.addFlag(IceFormFlag.ICE_FORM_FALSE); this.addFlag(IceMeltFlag.ICE_MELT_FALSE); this.addFlag(InstabreakFlag.INSTABREAK_FALSE); + this.addFlag(InteractionInteractFlag.INTERACTION_INTERACT_FALSE); this.addFlag(InvincibleFlag.INVINCIBLE_FALSE); this.addFlag(ItemDropFlag.ITEM_DROP_TRUE); this.addFlag(KeepInventoryFlag.KEEP_INVENTORY_FALSE); diff --git a/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/InteractionInteractFlag.java b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/InteractionInteractFlag.java new file mode 100644 index 0000000000..45c99f2519 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/InteractionInteractFlag.java @@ -0,0 +1,21 @@ +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 InteractionInteractFlag extends BooleanFlag { + + public static final InteractionInteractFlag INTERACTION_INTERACT_TRUE = new InteractionInteractFlag(true); + public static final InteractionInteractFlag INTERACTION_INTERACT_FALSE = new InteractionInteractFlag(false); + + private InteractionInteractFlag(boolean value) { + super(value, TranslatableCaption.of("flags.flag_description_interaction_interact")); + } + + @Override + protected InteractionInteractFlag flagOf(@NonNull Boolean value) { + return value ? INTERACTION_INTERACT_TRUE : INTERACTION_INTERACT_FALSE; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/entity/EntityCategories.java b/Core/src/main/java/com/plotsquared/core/util/entity/EntityCategories.java index 686048133f..d4125cd068 100644 --- a/Core/src/main/java/com/plotsquared/core/util/entity/EntityCategories.java +++ b/Core/src/main/java/com/plotsquared/core/util/entity/EntityCategories.java @@ -41,6 +41,7 @@ public class EntityCategories { public static final EntityCategory PROJECTILE = register("projectile"); public static final EntityCategory OTHER = register("other"); public static final EntityCategory PLAYER = register("player"); + public static final EntityCategory INTERACTION = register("interaction"); public static EntityCategory register(final String id) { final EntityCategory entityCategory = new EntityCategory(PlotSquared.platform().worldUtil(), id); diff --git a/Core/src/main/resources/lang/messages_en.json b/Core/src/main/resources/lang/messages_en.json index 53e42cbad0..b081e554af 100644 --- a/Core/src/main/resources/lang/messages_en.json +++ b/Core/src/main/resources/lang/messages_en.json @@ -572,6 +572,7 @@ "flags.flag_description_ice_form": "Set to `true` to allow ice to form in the plot.", "flags.flag_description_ice_melt": "Set to `false` to disable ice melting in the plot.", "flags.flag_description_instabreak": "Set to `true` to allow blocks to be instantaneously broken in survival mode.", + "flags.flag_description_interaction_interact": "Set to `true` to allow guests to interact with interaction entities in the plot.", "flags.flag_description_invincible": "Set to `true` to prevent players from taking damage inside the plot.", "flags.flag_description_item_drop": "Set to `false` to prevent items from being dropped inside the plot.", "flags.flag_description_kelp_grow": "Set to `false` to prevent kelp from growing in the plot.",