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] 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!")) + ); + } + } +}