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 new file mode 100644 index 0000000..41203ef --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java @@ -0,0 +1,46 @@ +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; + +public class ForbiddenItems extends Appliance { + 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) + )); + + public ForbiddenGroup forbiddenEntities = new ForbiddenGroup<>(Set.of( + (entity) -> { + if(!(entity instanceof Villager villager)) return false; + return List.of( + Villager.Profession.LIBRARIAN, + Villager.Profession.ARMORER + ).contains(villager.getProfession()); + } + )); + + 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 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 new file mode 100644 index 0000000..8373a89 --- /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().forbiddenMaterials.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!")) + ); + } + } +} 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!")) + ); + } +}