From fdbb5258709690ff634035c3b6381b52a9c6339a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Mon, 7 Apr 2025 16:19:44 +0200 Subject: [PATCH 1/2] added forbiddenItems appliance with material detection --- .../forbiddenItems/ForbiddenItems.java | 60 +++++++++++++++++++ .../ForbiddenMaterialListener.java | 45 ++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java new file mode 100644 index 0000000..14d13b5 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java @@ -0,0 +1,60 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.core.appliance.Appliance; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Villager; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Set; +import java.util.function.Function; + +public class ForbiddenItems extends Appliance { + Set> forbiddenMaterials = Set.of( + (material) -> material.name().startsWith("NETHERITE"), + (material) -> material.equals(Material.TOTEM_OF_UNDYING), + (material) -> material.equals(Material.END_CRYSTAL), + (material) -> material.equals(Material.MACE), + (material) -> material.equals(Material.ENCHANTED_GOLDEN_APPLE) + ); + + Set> forbiddenEntities = Set.of( + (entity) -> { + if(!(entity instanceof Villager villager)) return false; + return List.of( + Villager.Profession.LIBRARIAN, + Villager.Profession.ARMORER + ).contains(villager.getProfession()); + } + ); + + Set> forbiddenPotions = Set.of( + (potion) -> !potion.getType().equals(PotionEffectType.INSTANT_HEALTH) && potion.getAmplifier() >= 2 + ); + + public boolean isForbidden(Material material) { + return this.forbiddenMaterials.stream() + .anyMatch(test -> test.apply(material)); + } + + public boolean isForbidden(Entity entity) { + return this.forbiddenEntities.stream() + .anyMatch(test -> test.apply(entity)); + } + + public boolean isForbidden(PotionEffect potionEffect) { + return this.forbiddenPotions.stream() + .anyMatch(test -> test.apply(potionEffect)); + } + + @Override + protected @NotNull List listeners() { + return List.of( + new ForbiddenMaterialListener() + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java new file mode 100644 index 0000000..8e2c361 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java @@ -0,0 +1,45 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; + +class ForbiddenMaterialListener extends ApplianceListener { + @EventHandler + public void onPickup(EntityPickupItemEvent event) { + this.testAndCancel(event, event.getItem().getItemStack().getType(), event.getEntity()); + } + + @EventHandler + public void onInventoryInteraction(InventoryClickEvent event) { + if(event.getCurrentItem() == null) return; + if(List.of(ClickType.DROP, ClickType.CONTROL_DROP).contains(event.getClick())) return; + this.testAndCancel(event, event.getCurrentItem().getType(), event.getWhoClicked()); + } + + private void testAndCancel(Cancellable event, Material material, Entity entity) { + if(!this.getAppliance().isForbidden(material)) return; + event.setCancelled(true); + + if(entity instanceof Player p) { + Component itemName = material.getItemTranslationKey() != null + ? Component.translatable(material.getItemTranslationKey()) + : Component.text(material.name()); + + p.sendActionBar( + Component.text() + .append(itemName) + .append(Component.text(" ist ein verbotener Gegenstand!")) + ); + } + } +} From 153a9687761756cdf62b40912f6b308121095f6e Mon Sep 17 00:00:00 2001 From: lars Date: Mon, 7 Apr 2025 17:52:48 +0200 Subject: [PATCH 2/2] added entity and potion listeners --- .../ForbiddenEntityListener.java | 27 ++++++++++ .../forbiddenItems/ForbiddenGroup.java | 17 ++++++ .../forbiddenItems/ForbiddenItems.java | 34 ++++-------- .../ForbiddenMaterialListener.java | 2 +- .../ForbiddenPotionsListener.java | 54 +++++++++++++++++++ 5 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java new file mode 100644 index 0000000..09d7375 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java @@ -0,0 +1,27 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +class ForbiddenEntityListener extends ApplianceListener { + @EventHandler + public void onEntitySpawn(EntitySpawnEvent event) { + if(!this.getAppliance().forbiddenEntities.isForbidden(event.getEntity())) return; + event.setCancelled(true); + } + + @EventHandler + public void onEntityInteraction(PlayerInteractEntityEvent event) { + if(!this.getAppliance().forbiddenEntities.isForbidden(event.getRightClicked())) return; + event.setCancelled(true); + + event.getPlayer().sendActionBar( + Component.text() + .append(Component.text(event.getRightClicked().getName())) + .append(Component.text(" ist eine verbotene Entität!")) + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java new file mode 100644 index 0000000..9b1b11e --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java @@ -0,0 +1,17 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import java.util.Set; +import java.util.function.Function; + +public class ForbiddenGroup { + private final Set> forbiddenT; + + public ForbiddenGroup(Set> forbiddenT) { + this.forbiddenT = forbiddenT; + } + + public boolean isForbidden(TType value) { + return this.forbiddenT.stream() + .anyMatch(test -> test.apply(value)); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java index 14d13b5..41203ef 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java @@ -11,18 +11,17 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Set; -import java.util.function.Function; public class ForbiddenItems extends Appliance { - Set> forbiddenMaterials = Set.of( + public ForbiddenGroup forbiddenMaterials = new ForbiddenGroup<>(Set.of( (material) -> material.name().startsWith("NETHERITE"), (material) -> material.equals(Material.TOTEM_OF_UNDYING), (material) -> material.equals(Material.END_CRYSTAL), (material) -> material.equals(Material.MACE), (material) -> material.equals(Material.ENCHANTED_GOLDEN_APPLE) - ); + )); - Set> forbiddenEntities = Set.of( + public ForbiddenGroup forbiddenEntities = new ForbiddenGroup<>(Set.of( (entity) -> { if(!(entity instanceof Villager villager)) return false; return List.of( @@ -30,31 +29,18 @@ public class ForbiddenItems extends Appliance { Villager.Profession.ARMORER ).contains(villager.getProfession()); } - ); + )); - Set> forbiddenPotions = Set.of( - (potion) -> !potion.getType().equals(PotionEffectType.INSTANT_HEALTH) && potion.getAmplifier() >= 2 - ); - - public boolean isForbidden(Material material) { - return this.forbiddenMaterials.stream() - .anyMatch(test -> test.apply(material)); - } - - public boolean isForbidden(Entity entity) { - return this.forbiddenEntities.stream() - .anyMatch(test -> test.apply(entity)); - } - - public boolean isForbidden(PotionEffect potionEffect) { - return this.forbiddenPotions.stream() - .anyMatch(test -> test.apply(potionEffect)); - } + public ForbiddenGroup forbiddenPotions = new ForbiddenGroup<>(Set.of( + (potion) -> !potion.getType().equals(PotionEffectType.INSTANT_HEALTH) && potion.getAmplifier() >= 1 // Amplifier starts at 0 + )); @Override protected @NotNull List listeners() { return List.of( - new ForbiddenMaterialListener() + new ForbiddenMaterialListener(), + new ForbiddenEntityListener(), + new ForbiddenPotionsListener() ); } } diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java index 8e2c361..8373a89 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java @@ -27,7 +27,7 @@ class ForbiddenMaterialListener extends ApplianceListener { } private void testAndCancel(Cancellable event, Material material, Entity entity) { - if(!this.getAppliance().isForbidden(material)) return; + if(!this.getAppliance().forbiddenMaterials.isForbidden(material)) return; event.setCancelled(true); if(entity instanceof Player p) { diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java new file mode 100644 index 0000000..9b2c265 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java @@ -0,0 +1,54 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.LingeringPotionSplashEvent; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; + +import javax.annotation.Nullable; +import java.util.Collection; + +class ForbiddenPotionsListener extends ApplianceListener { + @EventHandler + public void onPotionSplash(PotionSplashEvent event) { + Collection effects = event.getPotion().getEffects(); + + this.testAndCancel(event, effects, null); + } + + @EventHandler + public void onPotionConsume(PlayerItemConsumeEvent event) { + if(!(event.getItem().getItemMeta() instanceof PotionMeta meta)) return; + if(meta.getBasePotionType() == null) return; + Collection effects = meta.getBasePotionType().getPotionEffects(); + + this.testAndCancel(event, effects, event.getPlayer()); + } + + @EventHandler + public void onLingeringPotionSplash(LingeringPotionSplashEvent event) { + if(event.getAreaEffectCloud().getBasePotionType() == null) return; + Collection effects = event.getAreaEffectCloud().getBasePotionType().getPotionEffects(); + + this.testAndCancel(event, effects, null); + } + + private void testAndCancel(Cancellable event, Collection effects, @Nullable Player player) { + if(effects.stream().noneMatch(potionEffect -> this.getAppliance().forbiddenPotions.isForbidden(potionEffect))) return; + + event.setCancelled(true); + + if(player == null) return; + + player.sendActionBar( + Component.text() + .append(Component.text("Das ist ein verbotener Trank!")) + ); + } +}