From 32d36b28fa672f2a13d921634a3b15c56e6407a5 Mon Sep 17 00:00:00 2001 From: Maurice Date: Tue, 19 Nov 2024 16:48:03 +0100 Subject: [PATCH] feat: add InteractionInteractFlag (#4538) --- .../bukkit/listener/PlayerEventListener.java | 6 +++ .../plotsquared/bukkit/util/BukkitUtil.java | 9 ++++- .../core/plot/flag/GlobalFlagContainer.java | 2 + .../InteractionInteractFlag.java | 39 +++++++++++++++++++ .../core/util/entity/EntityCategories.java | 1 + Core/src/main/resources/lang/messages_en.json | 1 + 6 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 Core/src/main/java/com/plotsquared/core/plot/flag/implementations/InteractionInteractFlag.java 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 45e5a3b2c..a10fc01e8 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.EditSignFlag; 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 class PlayerEventListener implements Listener { 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 124e766e9..d588a66a4 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.FallingBlock; 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; @@ -432,6 +433,7 @@ public class BukkitUtil extends WorldUtil { @Override public @NonNull Set getTypesInCategory(final @NonNull String category) { final Collection> allowedInterfaces = new HashSet<>(); + final int[] version = PlotSquared.platform().serverVersion(); switch (category) { case "animal" -> { allowedInterfaces.add(IronGolem.class); @@ -439,7 +441,7 @@ public class BukkitUtil extends WorldUtil { allowedInterfaces.add(Animals.class); allowedInterfaces.add(WaterMob.class); allowedInterfaces.add(Ambient.class); - if (PlotSquared.platform().serverVersion()[1] >= 19) { + if (version[1] >= 19) { allowedInterfaces.add(Allay.class); } } @@ -470,6 +472,11 @@ public class BukkitUtil extends WorldUtil { allowedInterfaces.add(Firework.class); } case "player" -> allowedInterfaces.add(Player.class); + case "interaction" -> { + if ((version[1] > 19) || (version[1] == 19 && version[2] >= 4)) { + 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 3e704a021..0780493ab 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.HostileInteractFlag; 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 @@ public final class GlobalFlagContainer extends FlagContainer { 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 000000000..b11bcd7e7 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/InteractionInteractFlag.java @@ -0,0 +1,39 @@ +/* + * PlotSquared, a land and world management plugin for Minecraft. + * Copyright (C) IntellectualSites + * 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 . + */ +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 686048133..d4125cd06 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 53e42cbad..b081e554a 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.",