Cleaning up

This commit is contained in:
Ardakaz
2026-05-19 15:49:03 +03:00
parent f59c484d6b
commit 8e28ba0b87
3 changed files with 167 additions and 185 deletions

View File

@@ -1,6 +1,6 @@
name: GriefAlert
main: net.ardakaz.griefalert.GriefAlert
version: 0.5
version: 0.6
api-version: 1.21
depends: [CoreProtect]
softdepend: [DiscordSRV]

View File

@@ -3,8 +3,6 @@ package net.ardakaz.griefalert;
import net.coreprotect.CoreProtect;
import net.coreprotect.CoreProtectAPI;
import net.coreprotect.CoreProtectAPI.ParseResult;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@@ -12,52 +10,85 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.*;
import org.bukkit.event.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.bukkit.inventory.EntityEquipment;
public class GriefAlert extends JavaPlugin implements Listener {
private static CoreProtectAPI coreProtectAPI;
private final String DB_FILE = "ignored_locations.db";
private Integer identicalAlerts = 1;
private String lastAlert;
private Set<Material> EXCLUDED_BLOCKS;
private Set<InventoryType> VALID_CONTAINERS;
private Set<InventoryType> VALID_CONTAINERS;
private String MAP_LINK;
private Boolean ALLOW_STEALING;
private Connection connection;
private final String DB_FILE = "ignored_locations.db";
// Block inspector: only the most recent placement counts for ownership.
private static String inspectBlock(Block block, Player player) {
List<String[]> lookup = coreProtectAPI.blockLookup(block, 50000000);
if (lookup == null || lookup.isEmpty()) {
// Natural block
return null;
}
// Find the most recent placement event only
for (String[] result : lookup) {
ParseResult parseResult = coreProtectAPI.parseResult(result);
if (parseResult == null) continue;
if (parseResult.getActionId() == 1 && !parseResult.isRolledBack() && !parseResult.getPlayer().startsWith("#")) {
// If the current player placed it, it's theirs (no alert)
if (parseResult.getPlayer().equals(player.getName())) {
return null;
} else {
return parseResult.getPlayer();
}
}
// If we see a break before a placement, stop (block is gone)
if (parseResult.getActionId() == 0) {
break;
}
}
// No valid placement found
return null;
}
private static String getHumanWorldName(String worldName) {
String world = "";
if (worldName.endsWith("_nether")) {
world = " in the Nether";
} else if (worldName.endsWith("_the_end")) {
world = " in the End";
}
return world;
}
// Init GriefAlert
@Override
@@ -92,7 +123,10 @@ public class GriefAlert extends JavaPlugin implements Listener {
public void onDisable() {
getLogger().info("GriefAlert has been disabled.");
if (connection != null) {
try { connection.close(); } catch (SQLException ignored) {}
try {
connection.close();
} catch (SQLException ignored) {
}
}
}
@@ -157,13 +191,13 @@ public class GriefAlert extends JavaPlugin implements Listener {
}
}
@EventHandler (ignoreCancelled = true)
// Block break alerts
@EventHandler(ignoreCancelled = true)
// Block break alerts
public void onBlockBreak(BlockBreakEvent event) {
// Exclusion list
if (EXCLUDED_BLOCKS.contains(event.getBlock().getType())) {
return;
}
// Exclusion list
if (EXCLUDED_BLOCKS.contains(event.getBlock().getType())) {
return;
}
// Event parser
String playerName = event.getPlayer().getName();
@@ -182,45 +216,44 @@ public class GriefAlert extends JavaPlugin implements Listener {
}
// Stealing alerts
@EventHandler (ignoreCancelled = true)
@EventHandler(ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {
if (ALLOW_STEALING) {
return;
}
boolean stealing;
if (ALLOW_STEALING) {
return;
}
boolean stealing;
// Event parser for inv
if (!(event.getWhoClicked() instanceof Player)) return;
Player player = (Player) event.getWhoClicked();
// Event parser for inv
if (!(event.getWhoClicked() instanceof Player player)) return;
Inventory inventory = event.getInventory();
Inventory clickedInventory = event.getClickedInventory();
ItemStack item = event.getCurrentItem();
if (item == null || inventory.getLocation() == null || item.getType() == Material.AIR) {
return;
return;
}
// Exclusion list
if (!VALID_CONTAINERS.contains(inventory.getType())) {
return;
}
if (!VALID_CONTAINERS.contains(inventory.getType())) {
return;
}
// Inv actions (needs fixing)
InventoryAction action = event.getAction();
if ((action == InventoryAction.PICKUP_ALL || action == InventoryAction.PICKUP_HALF ||
action == InventoryAction.PICKUP_ONE || action == InventoryAction.PICKUP_SOME ||
action == InventoryAction.MOVE_TO_OTHER_INVENTORY) && clickedInventory == inventory) {
action == InventoryAction.PICKUP_ONE || action == InventoryAction.PICKUP_SOME ||
action == InventoryAction.MOVE_TO_OTHER_INVENTORY) && clickedInventory == inventory) {
stealing = true;
} else if (action == InventoryAction.PLACE_ALL || action == InventoryAction.PLACE_SOME || action == InventoryAction.PLACE_ONE || action == InventoryAction.MOVE_TO_OTHER_INVENTORY) {
stealing = false;
stealing = false;
} else {
return;
return;
}
// Event parser for container + check if grief
String target = inspectBlock(inventory.getLocation().getBlock(), player);
if (target != null) {
String playerName = player.getName();
String playerName = player.getName();
String itemName = item.getType().toString();
int amount = item.getAmount();
int x = inventory.getLocation().getBlockX();
@@ -291,11 +324,11 @@ public class GriefAlert extends JavaPlugin implements Listener {
String action;
//this works at the instance of interaction before items get moved around
if (handEmpty && !armorEmpty) {
action = "took " + armorItem.getType().toString();
action = "took " + armorItem.getType();
} else if (!handEmpty && armorEmpty) {
action = "added " + handItem.getType().toString();
action = "added " + handItem.getType();
} else if (!handEmpty) {
action = "swapped " + armorItem.getType().toString() + " with " + handItem.getType().toString();
action = "swapped " + armorItem.getType() + " with " + handItem.getType();
} else {
action = "interacted with";
}
@@ -303,10 +336,11 @@ public class GriefAlert extends JavaPlugin implements Listener {
alert(message, playerName, "[Map Link](" + MAP_LINK + "/?worldname=" + worldName + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", target, x, y, z, worldName);
}
}
//event handler for item frames
@EventHandler(ignoreCancelled = true)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event){
if(!(event.getRightClicked() instanceof ItemFrame frame)) return;
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
if (!(event.getRightClicked() instanceof ItemFrame frame)) return;
Player player = event.getPlayer();
int x = frame.getLocation().getBlockX();
@@ -318,31 +352,28 @@ public class GriefAlert extends JavaPlugin implements Listener {
return;
}
String target = inspectBlock(frame.getLocation().getBlock(), player);
if(target !=null){
if (target != null) {
ItemStack itemInFrame = frame.getItem();
ItemStack handItem = player.getInventory().getItemInMainHand();
boolean handEmpty = handItem ==null || handItem.getType() == Material.AIR;
boolean frameEmpty = itemInFrame ==null || itemInFrame.getType() == Material.AIR;
boolean handEmpty = handItem == null || handItem.getType() == Material.AIR;
boolean frameEmpty = itemInFrame == null || itemInFrame.getType() == Material.AIR;
String playerName = player.getName();
String action;
if (!handEmpty && frameEmpty) {
action = "added " + handItem.getType();
}
else {
return;
}
if (!handEmpty && frameEmpty) {
action = "added " + handItem.getType();
} else {
return;
}
String message = ChatColor.GRAY + playerName + " " + action + " an item to an item frame owned by " + target + " at " + x + " " + y + " " + z + getHumanWorldName(worldName);
alert(message, playerName, "[Map Link](" + MAP_LINK + "/?worldname=" + worldName + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", target, x, y, z, worldName);
String message = ChatColor.GRAY + playerName + " " + action + " an item to an item frame placed by " + target + " at " + x + " " + y + " " + z + getHumanWorldName(worldName);
alert(message, playerName, "[Map Link](" + MAP_LINK + "/?worldname=" + worldName + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", target, x, y, z, worldName);
}
}
// Breaking item frame item (uses a different event then placing an item)
@EventHandler (ignoreCancelled = true)
@EventHandler(ignoreCancelled = true)
public void onItemFrameDamage(EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof ItemFrame frame)) return;
if (!(event.getDamager() instanceof Player player)) return;
@@ -366,13 +397,12 @@ public class GriefAlert extends JavaPlugin implements Listener {
if (item.getType() == Material.AIR) return;
// At this point, the player is removing the item
String action = "took " + item.getType();
String message = ChatColor.GRAY + playerName + " " + action + " from item frame owned by " + target + " at " + x + " " + y + " " + z + getHumanWorldName(worldName);
String message = ChatColor.GRAY + playerName + " " + action + " from an item frame placed by " + target + " at " + x + " " + y + " " + z + getHumanWorldName(worldName);
alert(message, playerName, "[Map Link](" + MAP_LINK + "/?worldname=" + worldName + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", target, x, y, z, worldName);
}
@EventHandler(ignoreCancelled = true)
public void onItemFrameBreak(HangingBreakByEntityEvent event){
public void onItemFrameBreak(HangingBreakByEntityEvent event) {
if (!(event.getEntity() instanceof ItemFrame frame)) return;
if (!(event.getRemover() instanceof Player player)) return;
@@ -389,7 +419,7 @@ public class GriefAlert extends JavaPlugin implements Listener {
return;
}
String target = inspectBlock(loc.getBlock(), player);
if (target ==null || target.equals(player.getName())) return;
if (target == null || target.equals(player.getName())) return;
String action = "broke an item frame";
String message = ChatColor.GRAY + playerName + " " + action + " placed by " + target + " at " + x + " " + y + " " + z + getHumanWorldName(worldName);
@@ -397,9 +427,6 @@ public class GriefAlert extends JavaPlugin implements Listener {
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!command.getName().equalsIgnoreCase("griefalert")) return false;
@@ -418,7 +445,7 @@ public class GriefAlert extends JavaPlugin implements Listener {
sender.sendMessage(ChatColor.RED + "Only players can use this command without specifying a world.");
return true;
}
world = ((Player)sender).getWorld().getName();
world = ((Player) sender).getWorld().getName();
try {
x = Integer.parseInt(args[1]);
y = Integer.parseInt(args[2]);
@@ -462,7 +489,7 @@ public class GriefAlert extends JavaPlugin implements Listener {
sender.sendMessage(ChatColor.RED + "Only players can use this command without specifying a world.");
return true;
}
world = ((Player)sender).getWorld().getName();
world = ((Player) sender).getWorld().getName();
try {
x = Integer.parseInt(args[1]);
y = Integer.parseInt(args[2]);
@@ -503,7 +530,7 @@ public class GriefAlert extends JavaPlugin implements Listener {
sender.sendMessage(ChatColor.RED + "Only players can use this command without specifying a world.");
return true;
}
world = ((Player)sender).getWorld().getName();
world = ((Player) sender).getWorld().getName();
try {
x = Integer.parseInt(args[1]);
y = Integer.parseInt(args[2]);
@@ -597,7 +624,7 @@ public class GriefAlert extends JavaPlugin implements Listener {
}
// Send an event for external hooks
GriefAlertEvent griefalert_event;
if (MAP_LINK != null && !MAP_LINK.isEmpty() && mapLink != null) {
if (MAP_LINK != null && !MAP_LINK.isEmpty() && mapLink != null) {
griefalert_event = new GriefAlertEvent(message + " (" + mapLink + ")");
} else {
griefalert_event = new GriefAlertEvent(message);
@@ -612,42 +639,14 @@ public class GriefAlert extends JavaPlugin implements Listener {
lastAlert = realAlertMessage;
}
// Block inspector: only the most recent placement counts for ownership.
private static String inspectBlock(Block block, Player player) {
List<String[]> lookup = coreProtectAPI.blockLookup(block, 50000000);
if (lookup == null || lookup.isEmpty()) {
// Natural block
return null;
}
// Find the most recent placement event only
for (String[] result : lookup) {
ParseResult parseResult = coreProtectAPI.parseResult(result);
if (parseResult == null) continue;
if (parseResult.getActionId() == 1 && !parseResult.isRolledBack() && !parseResult.getPlayer().startsWith("#")) {
// If the current player placed it, it's theirs (no alert)
if (parseResult.getPlayer().equals(player.getName())) {
return null;
} else {
return parseResult.getPlayer();
}
}
// If we see a break before a placement, stop (block is gone)
if (parseResult.getActionId() == 0) {
break;
}
}
// No valid placement found
return null;
}
//pet alert(dog and cat only)
@EventHandler
public void onPetKill(EntityDeathEvent event){
public void onPetKill(EntityDeathEvent event) {
if (!(event.getEntity() instanceof Tameable tameable)) return;
if (!tameable.isTamed()) return;
//checks if wolf or cat or not
if (!(event.getEntity() instanceof Wolf) && !(event.getEntity()instanceof Cat)) return;
if (!(event.getEntity() instanceof Wolf) && !(event.getEntity() instanceof Cat)) return;
AnimalTamer Owner = tameable.getOwner();
@@ -662,19 +661,20 @@ public class GriefAlert extends JavaPlugin implements Listener {
String worldName = event.getEntity().getWorld().getName();
String pet = event.getEntity().getType().name();
String message = ChatColor.GRAY + killer.getName() + " killed" +" " + pet + " in " + Owner.getName() + "'s build at " + x + " " + y + " " + z + getHumanWorldName(worldName);
String message = ChatColor.GRAY + killer.getName() + " killed" + " " + pet + " in " + Owner.getName() + "'s build at " + x + " " + y + " " + z + getHumanWorldName(worldName);
alert(message, killer.getName(), "[Map Link](" + MAP_LINK + "/?worldname=" + worldName + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", Owner.getName(), x, y, z, worldName);
}
//farm animal handler
@EventHandler
public void onFarmAnimalDeath(EntityDeathEvent event){
if(!(event.getEntity().getKiller() instanceof Player killer)) return;
public void onFarmAnimalDeath(EntityDeathEvent event) {
if (!(event.getEntity().getKiller() instanceof Player killer)) return;
List<String> alertanimals = getConfig().getStringList("triggered-animals");
String typeName = event.getEntityType().name();
if(! alertanimals.contains(typeName)) return;
if (!alertanimals.contains(typeName)) return;
Block blockBelow = event.getEntity().getLocation().subtract(0, 1, 0).getBlock();
String animalOwner = inspectBlock(blockBelow, killer);
@@ -690,19 +690,20 @@ public class GriefAlert extends JavaPlugin implements Listener {
String worldName = event.getEntity().getWorld().getName();
String message = ChatColor.GRAY + killer.getName() + " killed" +" " + typeName + "in " + animalOwner + "'s build at " + x + " " + y + " " + z + getHumanWorldName(worldName);
String message = ChatColor.GRAY + killer.getName() + " killed" + " " + typeName + "in " + animalOwner + "'s build at " + x + " " + y + " " + z + getHumanWorldName(worldName);
alert(message, killer.getName(), "[Map Link](" + MAP_LINK + "/?worldname=" + worldName + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", animalOwner, x, y, z, worldName);
}
/*code i hope for copper waxing/unwaxing theres no proper onwax() or onUnWax()
so im kinda gonna try to just check a situation like, if ur holding an axe, left clicking a copper block
and its waxed, ill assume ur unwaxing, and therefor sending an alert
but some of this code was written at 1am so idk how and why im why and howing */
@EventHandler
public void onBlockClick(PlayerInteractEvent event) {
@EventHandler
public void onBlockClick(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
Player player = event.getPlayer();
@@ -720,22 +721,22 @@ public class GriefAlert extends JavaPlugin implements Listener {
String world = block.getWorld().getName();
if (isLocationIgnored(x, y, z, world)){
if (isLocationIgnored(x, y, z, world)) {
return;
}
boolean isCopper = before.name().contains("COPPER");
//if aint copper it can no copper and means no copper affected
if (!isCopper) return;
//for waxing logic might not even be needed
//for waxing logic might not even be needed
//boolean isHoneycomb = item.getType() == Material.HONEYCOMB;
//for unwax logic and also might not be needed
//boolean isAxe = item.getType().toString().endsWith("_AXE");
String target = inspectBlock(block, player);
if(target == player.getName()) return;
if(target == null) return;
String target = inspectBlock(block, player);
if (Objects.equals(target, player.getName())) return;
if (target == null) return;
Bukkit.getScheduler().runTaskLater(this, () -> {
String action;
@@ -746,36 +747,31 @@ public class GriefAlert extends JavaPlugin implements Listener {
boolean wasWaxed = before.name().startsWith("WAXED_");
boolean isWaxed = after.name().startsWith("WAXED_");
if(wasWaxed && !isWaxed){
if (wasWaxed && !isWaxed) {
action = "Unwaxed";
} else if(!wasWaxed && isWaxed) {
} else if (!wasWaxed && isWaxed) {
action = "Waxed";
} else if (item !=null && item.getType().name().endsWith("_AXE")) {
} else if (item != null && item.getType().name().endsWith("_AXE")) {
action = "undusted";
}else{
} else {
action = "error 404 check with kleedje30";
}
String message = ChatColor.GRAY + player.getName() + action + " Copper " + " at " + x + " " + y + " " + z + getHumanWorldName(world);
alert(message, player.getName(), "[Map Link](" + MAP_LINK + "/?worldname=" + world + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")",target, x, y, z, world);
String message = ChatColor.GRAY + player.getName() + action + " Copper " + " at " + x + " " + y + " " + z + getHumanWorldName(world);
alert(message, player.getName(), "[Map Link](" + MAP_LINK + "/?worldname=" + world + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", target, x, y, z, world);
}, 1L);
}
//stripping logs
@EventHandler
public void onLogStrip(PlayerInteractEvent event){
public void onLogStrip(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
Player player = event.getPlayer();
Block block = event.getClickedBlock();
ItemStack item = event.getItem();
ItemStack item = event.getItem();
if (block == null || item == null) return;
@@ -788,51 +784,37 @@ public class GriefAlert extends JavaPlugin implements Listener {
boolean isWood = before.name().contains("LOG");
if(!isWood) return;
if (!isWood) return;
if (isLocationIgnored(x, y, z, world)){
if (isLocationIgnored(x, y, z, world)) {
return;
}
String target = inspectBlock(block, player);
if(target == null) return;
if (target == null) return;
if(target == player.getName()) return;
if (target.equals(player.getName())) return;
Bukkit.getScheduler().runTaskLater(this, () -> {
String action;
Material after = block.getType();
if(before == after) return;
if (before == after) return;
if(!before.name().contains("STRIPPED") && after.name().contains("STRIPPED")){
if (!before.name().contains("STRIPPED") && after.name().contains("STRIPPED")) {
action = "Stripped";
} else{return;}
} else {
return;
}
String message = ChatColor.GRAY + player.getName() + action + " a(n) " + before + " at " + x + " " + y + " " + z + getHumanWorldName(world);
alert(message, player.getName(), "[Map Link](" + MAP_LINK + "/?worldname=" + world + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")",target, x, y, z, world);
String message = ChatColor.GRAY + player.getName() + action + " a(n) " + before + " at " + x + " " + y + " " + z + getHumanWorldName(world);
alert(message, player.getName(), "[Map Link](" + MAP_LINK + "/?worldname=" + world + "&zoom=7&x=" + x + "&y=" + y + "&z=" + z + ")", target, x, y, z, world);
}, 1L);
}
private static String getHumanWorldName(String worldName) {
String world = "";
if (worldName.endsWith("_nether")) {
world = " in the Nether";
}
else if (worldName.endsWith("_the_end")) {
world = " in the End";
}
return world;
}
private CoreProtectAPI getCoreProtect() {
Plugin plugin = getServer().getPluginManager().getPlugin("CoreProtect");

View File

@@ -6,14 +6,14 @@ import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class GriefAlertEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList();
private static final HandlerList HANDLERS = new HandlerList();
private String alert = "";
public GriefAlertEvent(String alert) {
this.alert = alert;
}
public static HandlerList getHandlerList() {
public static HandlerList getHandlerList() {
return HANDLERS;
}