From 373cfa3b3a60489ebcae327ad723ad0849d5b553 Mon Sep 17 00:00:00 2001 From: zxq5 Date: Tue, 2 Sep 2025 18:21:34 +0100 Subject: [PATCH] added more features to heresy detector --- .../java/dev/zxq5/fantasysmp/Fantasysmp.java | 8 +- .../zxq5/fantasysmp/events/HeresyChecker.java | 148 ++++++++++++++++++ .../zxq5/fantasysmp/events/HereticWarner.java | 40 ----- .../fantasysmp/events/StevenKillCheck.java | 77 --------- 4 files changed, 153 insertions(+), 120 deletions(-) create mode 100644 src/main/java/dev/zxq5/fantasysmp/events/HeresyChecker.java delete mode 100644 src/main/java/dev/zxq5/fantasysmp/events/HereticWarner.java delete mode 100644 src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java diff --git a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java index 9165d25..a27d449 100644 --- a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java +++ b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java @@ -35,11 +35,13 @@ public final class Fantasysmp extends JavaPlugin { getServer().getPluginManager().registerEvents(new Chat(), this); - getServer().getPluginManager().registerEvents(new StevenKillCheck(), this); + HeresyChecker heresyChecker = new HeresyChecker(); + heresyChecker.scheduleHeresyChecker(); + getServer().getPluginManager().registerEvents(heresyChecker, this); + getServer().getPluginManager().registerEvents(new DeathMessageCustomiser(), this); - HereticWarner hereticWarner = new HereticWarner(); - hereticWarner.checkHereticInventory(); + XrayDetector xrayDetector = new XrayDetector(); getServer().getPluginManager().registerEvents(xrayDetector, this); diff --git a/src/main/java/dev/zxq5/fantasysmp/events/HeresyChecker.java b/src/main/java/dev/zxq5/fantasysmp/events/HeresyChecker.java new file mode 100644 index 0000000..93a48f0 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/events/HeresyChecker.java @@ -0,0 +1,148 @@ +package dev.zxq5.fantasysmp.events; + +import org.bukkit.*; +import org.bukkit.entity.Chicken; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashMap; +import java.util.Map; + +import static org.bukkit.Bukkit.*; + +public class HeresyChecker implements Listener { + private final HashMap heretics; + private final HashMap formerHeretics; + + public HeresyChecker() { + this.heretics = new HashMap<>(); + this.formerHeretics = new HashMap<>(); + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (event.getEntity() instanceof Chicken) { + event.setCancelled(true); + + if (event.getDamager() instanceof Player heretic) { + executeHeretic(heretic); + } + } + } + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if (event.getEntity() instanceof Chicken) { + event.setCancelled(true); + + if ( event.getDamageSource().getCausingEntity() instanceof Player heretic) { + executeHeretic(heretic); + } + } + } + + @EventHandler + public void onProjectileHit(ProjectileHitEvent event) { + if (event.getHitEntity() instanceof Chicken && event.getEntity().getShooter() instanceof Player heretic) { + if (event.getEntity().getType() == EntityType.EGG) return; + if (event.getEntity().getType() == EntityType.SNOWBALL) return; + + event.setCancelled(true); + executeHeretic(heretic); + } + } + + @EventHandler + public void onEntitySpawn(org.bukkit.event.entity.EntitySpawnEvent event) { + if (event.getEntity() instanceof Chicken steven) { + steven.setCustomName("Steven"); + } + } + + @EventHandler + public void onPlayerEatChicken(PlayerItemConsumeEvent event) { + Material type = event.getItem().getType(); + + if (type == Material.COOKED_CHICKEN || type == Material.CHICKEN) { + this.executeHeretic(event.getPlayer()); + } + } + + public void scheduleHeresyChecker() { + Bukkit.getScheduler().scheduleSyncRepeatingTask(getPluginManager().getPlugin("fantasysmp"), this::checkHeretics, 0, 20); + Bukkit.getScheduler().scheduleSyncRepeatingTask(getPluginManager().getPlugin("fantasysmp"), () -> { + for (Player heretic : this.formerHeretics.keySet() ) { + this.formerHeretics.put(heretic, this.formerHeretics.get(heretic) - 1); + } + }, 0, 200); + } + + public void checkHeretics() { + for ( Player player : Bukkit.getServer().getOnlinePlayers() ) { + if (player.getInventory().contains(Material.CHICKEN) || player.getInventory().contains(Material.COOKED_CHICKEN)) { + if (!this.heretics.containsKey(player)) { + this.heretics.put(player, this.formerHeretics.getOrDefault(player, 0)); + } + } else if (this.heretics.containsKey(player)) { + this.formerHeretics.put(player, this.heretics.get(player)); + this.heretics.remove(player); + } + } + + for (Map.Entry entry : this.heretics.entrySet() ) { + entry.setValue(entry.getValue() + 1); + warnHeretic(entry.getKey()); + if ( entry.getValue() >= 5 ) { + punishHeretic(entry.getKey()); + } + } + } + + public void punishHeretic(Player heretic) { + heretic.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 20 * 2, 0)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 20 * 2, 0)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.MINING_FATIGUE, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.DARKNESS, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.NAUSEA, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.HUNGER, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 20 * 2, 3)); + heretic.addPotionEffect(new PotionEffect(PotionEffectType.INSTANT_DAMAGE, 20 * 2, 0)); + } + + public void warnHeretic(Player heretic) { + heretic.sendTitle(ChatColor.DARK_RED + "HOLDING CHICKEN IS HERESY!", ChatColor.YELLOW + "DROP IT IMMEDIATELY!", 5, 10, 5); + } + + public void executeHeretic(Player heretic) { + Location coords = heretic.getLocation(); + World world = coords.getWorld(); + Plugin plugin = getPluginManager().getPlugin("fantasysmp"); + + heretic.sendTitle(ChatColor.DARK_RED + "HERESY!", ChatColor.YELLOW + "YOU SHALL PAY FOR YOUR CRIMES.", 5, 10, 5); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 0); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 1); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 2); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 3); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 4); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 5); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 6); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 7); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 8); + Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 9); + Bukkit.getScheduler().runTaskLater(plugin, () -> heretic.setHealth(0), 10); + } +} + diff --git a/src/main/java/dev/zxq5/fantasysmp/events/HereticWarner.java b/src/main/java/dev/zxq5/fantasysmp/events/HereticWarner.java deleted file mode 100644 index 5b4ac0f..0000000 --- a/src/main/java/dev/zxq5/fantasysmp/events/HereticWarner.java +++ /dev/null @@ -1,40 +0,0 @@ -package dev.zxq5.fantasysmp.events; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import static org.bukkit.Bukkit.getPluginManager; - -public class HereticWarner { - int task; - - public void checkHereticInventory() { - Bukkit.getScheduler().scheduleSyncRepeatingTask(getPluginManager().getPlugin("fantasysmp"), () -> { - for ( Player heretic : Bukkit.getServer().getOnlinePlayers() ) { - if (heretic.getInventory().contains(Material.CHICKEN) || heretic.getInventory().contains(Material.COOKED_CHICKEN)) { - warnHeretic(heretic); - } - } - }, 0, 20); - } - - public void warnHeretic(Player heretic) { - // apply poison to player - heretic.sendMessage(ChatColor.DARK_RED + "HOLDING CHICKEN IS HERESY!"); - heretic.sendMessage(ChatColor.DARK_RED + "DROP IT IMMEDIATELY!"); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 20 * 2, 10)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 20 * 2, 10)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.MINING_FATIGUE, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.DARKNESS, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.NAUSEA, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.HUNGER, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 20 * 2, 3)); - heretic.addPotionEffect(new PotionEffect(PotionEffectType.INSTANT_DAMAGE, 20 * 2, 0)); - } -} \ No newline at end of file diff --git a/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java b/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java deleted file mode 100644 index 6d7ed31..0000000 --- a/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java +++ /dev/null @@ -1,77 +0,0 @@ -package dev.zxq5.fantasysmp.events; - -import org.bukkit.*; -import org.bukkit.entity.Chicken; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.plugin.Plugin; - -import static org.bukkit.Bukkit.*; - -public class StevenKillCheck implements Listener { - - @EventHandler - public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { - if (event.getEntity() instanceof Chicken) { - event.setCancelled(true); - - if (event.getDamager() instanceof Player heretic) { - destroyHeretic(heretic); - } - } - } - - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (event.getEntity() instanceof Chicken) { - event.setCancelled(true); - - if ( event.getDamageSource().getCausingEntity() instanceof Player heretic) { - destroyHeretic(heretic); - } - } - } - - @EventHandler - public void onProjectileHit(ProjectileHitEvent event) { - if (event.getHitEntity() instanceof Chicken && event.getEntity().getShooter() instanceof Player heretic) { - if (event.getEntity().getType() == EntityType.EGG) return; - if (event.getEntity().getType() == EntityType.SNOWBALL) return; - - event.setCancelled(true); - destroyHeretic(heretic); - } - } - - @EventHandler - public void onEntitySpawn(org.bukkit.event.entity.EntitySpawnEvent event) { - if (event.getEntity() instanceof Chicken steven) { - steven.setCustomName("Steven"); - } - } - - public void destroyHeretic(Player heretic) { - Location coords = heretic.getLocation(); - World world = coords.getWorld(); - Plugin plugin = getPluginManager().getPlugin("fantasysmp"); - - broadcastMessage(ChatColor.DARK_RED + "HERESY!!!!"); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 0); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 1); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 2); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 3); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 4); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 5); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 6); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 7); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 8); - Bukkit.getScheduler().runTaskLater(plugin, () -> world.strikeLightning(coords), 9); - Bukkit.getScheduler().runTaskLater(plugin, () -> heretic.setHealth(0), 10); - } -} -