From 092d33beb35f868c3b229621298f627580181700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 29 Mar 2025 22:03:12 +0100 Subject: [PATCH] prototype for grief detection --- .../tooling/antiGrief/AntiGrief.java | 49 ++++++++++++++++++ .../antiGrief/player/PlayerGriefListener.java | 51 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/AntiGrief.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/player/PlayerGriefListener.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/AntiGrief.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/AntiGrief.java new file mode 100644 index 0000000..5c4c911 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/AntiGrief.java @@ -0,0 +1,49 @@ +package eu.mhsl.craftattack.spawn.appliances.tooling.antiGrief; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliances.tooling.antiGrief.player.PlayerGriefListener; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.BlockDisplay; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Transformation; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class AntiGrief extends Appliance { + private final Map blockRegistry = new HashMap<>(); + + public void addTracking(Block block, UUID player) { + this.blockRegistry.put(block, player); + block.getLocation().getWorld().spawn(block.getLocation(), ItemDisplay.class, itemDisplay -> { + itemDisplay.setItemStack(ItemStack.of(Material.FIRE_CHARGE)); + itemDisplay.teleport(block.getLocation().add(0.5, 0.5, 0.5)); + }); + } + + public @Nullable UUID getTracked(Block block) { + return this.blockRegistry.get(block); + } + + public void addDestroyed(Block block, UUID player) { + block.getLocation().getWorld().spawn(block.getLocation().add(0.5, 0.5, 0.5), BlockDisplay.class, blockDisplay -> { + blockDisplay.setBlock(Material.GOLD_BLOCK.createBlockData()); + + Transformation transformation = blockDisplay.getTransformation(); + transformation.getScale().set(0.3); + blockDisplay.setTransformation(transformation); + }); + } + + @Override + protected @NotNull List listeners() { + return List.of(new PlayerGriefListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/player/PlayerGriefListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/player/PlayerGriefListener.java new file mode 100644 index 0000000..23052ca --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/antiGrief/player/PlayerGriefListener.java @@ -0,0 +1,51 @@ +package eu.mhsl.craftattack.spawn.appliances.tooling.antiGrief.player; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.appliances.tooling.antiGrief.AntiGrief; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockSpreadEvent; + +import java.util.UUID; + +public class PlayerGriefListener extends ApplianceListener { + @EventHandler + public void onIgnite(BlockIgniteEvent event) { + Bukkit.broadcast(Component.text(event.getCause().toString())); + switch(event.getCause()) { + case LAVA: + case SPREAD: + case EXPLOSION: + if(event.getIgnitingBlock() == null) return; + UUID ignitedBy = this.getAppliance().getTracked(event.getIgnitingBlock()); + this.getAppliance().addTracking(event.getBlock(), ignitedBy); + break; + + case FLINT_AND_STEEL: + case ENDER_CRYSTAL: + case ARROW: + case FIREBALL: + if(event.getPlayer() == null) return; + this.getAppliance().addTracking(event.getBlock(), event.getPlayer().getUniqueId()); + break; + } + } + + @EventHandler + public void onSpread(BlockSpreadEvent event) { + if(!event.getBlock().getType().equals(Material.FIRE)) return; + UUID ignitedBy = this.getAppliance().getTracked(event.getBlock()); + this.getAppliance().addTracking(event.getBlock(), ignitedBy); + } + + @EventHandler + public void onDestroy(BlockBurnEvent event) { + UUID ignitedBy = this.getAppliance().getTracked(event.getIgnitingBlock()); + if(ignitedBy == null) return; + this.getAppliance().addDestroyed(event.getBlock(), ignitedBy); + } +}