package me.willgames_.watched2;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityToggleGlideEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.event.player.PlayerToggleSprintEvent;
import org.bukkit.event.player.PlayerVelocityEvent;
import org.bukkit.util.Vector;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class AntiCheatListener implements Listener {
private static final String ALERT_PREFIX = ChatColor.BLUE + "Watched " + ChatColor.RESET;
private final Map<Player, Long> lastSprintTimestamp = new HashMap<>();
private final Map<Player, Long> lastSneakTimestamp = new HashMap<>();
private final Map<Player, Vector> playerLocations = new HashMap<>();
private final Map<Player, Integer> violations = new HashMap<>();
private final Map<Player, Long> lastAimCheck = new HashMap<>();
private final Map<Player, Integer> velocityChanges = new HashMap<>();
private Watched2 plugin;
public AntiCheatListener(Watched2 plugin) {
this.plugin = plugin;
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
// Acceleration Check
checkAcceleration(player, event.getFrom(), event.getTo());
// Update player location history
playerLocations.put(player, event.getTo().toVector());
}
@EventHandler
public void onPlayerToggleSprint(PlayerToggleSprintEvent event) {
if (event.isSprinting()) {
long currentTime = System.currentTimeMillis();
long sprintInterval = currentTime - lastSprintTimestamp.getOrDefault(event.getPlayer(), 0L);
// Sprint Timer Check
checkTimerViolation(event.getPlayer(), "SPRINT", sprintInterval, plugin.getConfig().getLong("detection.sprint-timer.min-timer-interval"));
lastSprintTimestamp.put(event.getPlayer(), currentTime);
}
}
@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent event) {
if (event.isSneaking()) {
long currentTime = System.currentTimeMillis();
long sneakInterval = currentTime - lastSneakTimestamp.getOrDefault(event.getPlayer(), 0L);
// Sneak Timer Check
checkTimerViolation(event.getPlayer(), "SNEAK", sneakInterval, plugin.getConfig().getLong("detection.sneak-timer.min-timer-interval"));
lastSneakTimestamp.put(event.getPlayer(), currentTime);
}
}
@EventHandler
public void onPlayerVelocity(PlayerVelocityEvent event) {
Player player = event.getPlayer();
// Velocity Change Check
checkVelocityChange(player, event.getVelocity());
}
@EventHandler
public void onEntityToggleGlide(EntityToggleGlideEvent event) {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
// Glide Check
if (event.isGliding()) {
handleViolation(player, "GLIDE");
}
}
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player && event.getCause() == DamageCause.FALL) {
Player player = (Player) event.getEntity();
// Fall Damage Check
if (event.getDamage() > 0) {
handleViolation(player, "FALL");
}
}
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
Player player = event.getPlayer();
// Scaffold Check on Block Place
checkScaffold(player, player.getLocation().add(0, -1, 0).toVector());
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
// Initialize player-specific data on join
lastSprintTimestamp.put(player, 0L);
lastSneakTimestamp.put(player, 0L);
lastAimCheck.put(player, 0L);
velocityChanges.put(player, 0);
}
private void checkAcceleration(Player player, Location from, Location to) {
if (!plugin.getConfig().getBoolean("detection.acceleration.enabled")) {
return;
}
double maxAcceleration = plugin.getConfig().getDouble("detection.acceleration.max-acceleration");
double deltaX = to.getX() - from.getX();
double deltaZ = to.getZ() - from.getZ();
double accelerationX = Math.abs(deltaX);
double accelerationZ = Math.abs(deltaZ);
if (accelerationX > maxAcceleration || accelerationZ > maxAcceleration) {
handleViolation(player, "MOVE");
}
}
private void checkScaffold(Player player, Vector location) {
if (!plugin.getConfig().getBoolean("detection.scaffold.enabled")) {
return;
}
double maxScaffoldSpeed = plugin.getConfig().getDouble("detection.scaffold.max-scaffold-speed");
if (isScaffoldSpeedInvalid(player, location, maxScaffoldSpeed)) {
handleViolation(player, "SCAFFOLD");
}
}
private void checkVelocityChange(Player player, Vector velocity) {
int changes = velocityChanges.getOrDefault(player, 0);
if (velocity.length() > 0 && changes > 0) {
velocityChanges.put(player, 0);
} else if (velocity.length() == 0) {
velocityChanges.put(player, changes + 1);
}
}
private boolean isScaffoldSpeedInvalid(Player player, Vector location, double maxScaffoldSpeed) {
Vector[] locations = new Vector[]{playerLocations.get(player)};
if (locations == null || locations[0] == null) {
return false;
}
double distance = location.distance(locations[0]);
double expectedDistance = maxScaffoldSpeed * player.getWalkSpeed();
return distance > expectedDistance;
}
private void checkTimerViolation(Player player, String type, long interval, long minTimerInterval) {
if (interval < minTimerInterval) {
handleViolation(player, "TIMER (" + type + ")");
}
}
private void handleViolation(Player player, String violation) {
for (Player alertPlayer : Bukkit.getOnlinePlayers()) {
if (alertPlayer.hasPermission(Objects.requireNonNull(plugin.getConfig().getString("detection.alerts-permission")))) {
String alertMessage = ALERT_PREFIX + ChatColor.GRAY + "Player " + player.getName() +
ChatColor.BLUE + " failed " + ChatColor.GRAY + violation;
alertPlayer.sendMessage(alertMessage);
}
}
}}
can someone explain why it dosent work lol
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityToggleGlideEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.event.player.PlayerToggleSprintEvent;
import org.bukkit.event.player.PlayerVelocityEvent;
import org.bukkit.util.Vector;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class AntiCheatListener implements Listener {
private static final String ALERT_PREFIX = ChatColor.BLUE + "Watched " + ChatColor.RESET;
private final Map<Player, Long> lastSprintTimestamp = new HashMap<>();
private final Map<Player, Long> lastSneakTimestamp = new HashMap<>();
private final Map<Player, Vector> playerLocations = new HashMap<>();
private final Map<Player, Integer> violations = new HashMap<>();
private final Map<Player, Long> lastAimCheck = new HashMap<>();
private final Map<Player, Integer> velocityChanges = new HashMap<>();
private Watched2 plugin;
public AntiCheatListener(Watched2 plugin) {
this.plugin = plugin;
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
// Acceleration Check
checkAcceleration(player, event.getFrom(), event.getTo());
// Update player location history
playerLocations.put(player, event.getTo().toVector());
}
@EventHandler
public void onPlayerToggleSprint(PlayerToggleSprintEvent event) {
if (event.isSprinting()) {
long currentTime = System.currentTimeMillis();
long sprintInterval = currentTime - lastSprintTimestamp.getOrDefault(event.getPlayer(), 0L);
// Sprint Timer Check
checkTimerViolation(event.getPlayer(), "SPRINT", sprintInterval, plugin.getConfig().getLong("detection.sprint-timer.min-timer-interval"));
lastSprintTimestamp.put(event.getPlayer(), currentTime);
}
}
@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent event) {
if (event.isSneaking()) {
long currentTime = System.currentTimeMillis();
long sneakInterval = currentTime - lastSneakTimestamp.getOrDefault(event.getPlayer(), 0L);
// Sneak Timer Check
checkTimerViolation(event.getPlayer(), "SNEAK", sneakInterval, plugin.getConfig().getLong("detection.sneak-timer.min-timer-interval"));
lastSneakTimestamp.put(event.getPlayer(), currentTime);
}
}
@EventHandler
public void onPlayerVelocity(PlayerVelocityEvent event) {
Player player = event.getPlayer();
// Velocity Change Check
checkVelocityChange(player, event.getVelocity());
}
@EventHandler
public void onEntityToggleGlide(EntityToggleGlideEvent event) {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
// Glide Check
if (event.isGliding()) {
handleViolation(player, "GLIDE");
}
}
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player && event.getCause() == DamageCause.FALL) {
Player player = (Player) event.getEntity();
// Fall Damage Check
if (event.getDamage() > 0) {
handleViolation(player, "FALL");
}
}
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
Player player = event.getPlayer();
// Scaffold Check on Block Place
checkScaffold(player, player.getLocation().add(0, -1, 0).toVector());
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
// Initialize player-specific data on join
lastSprintTimestamp.put(player, 0L);
lastSneakTimestamp.put(player, 0L);
lastAimCheck.put(player, 0L);
velocityChanges.put(player, 0);
}
private void checkAcceleration(Player player, Location from, Location to) {
if (!plugin.getConfig().getBoolean("detection.acceleration.enabled")) {
return;
}
double maxAcceleration = plugin.getConfig().getDouble("detection.acceleration.max-acceleration");
double deltaX = to.getX() - from.getX();
double deltaZ = to.getZ() - from.getZ();
double accelerationX = Math.abs(deltaX);
double accelerationZ = Math.abs(deltaZ);
if (accelerationX > maxAcceleration || accelerationZ > maxAcceleration) {
handleViolation(player, "MOVE");
}
}
private void checkScaffold(Player player, Vector location) {
if (!plugin.getConfig().getBoolean("detection.scaffold.enabled")) {
return;
}
double maxScaffoldSpeed = plugin.getConfig().getDouble("detection.scaffold.max-scaffold-speed");
if (isScaffoldSpeedInvalid(player, location, maxScaffoldSpeed)) {
handleViolation(player, "SCAFFOLD");
}
}
private void checkVelocityChange(Player player, Vector velocity) {
int changes = velocityChanges.getOrDefault(player, 0);
if (velocity.length() > 0 && changes > 0) {
velocityChanges.put(player, 0);
} else if (velocity.length() == 0) {
velocityChanges.put(player, changes + 1);
}
}
private boolean isScaffoldSpeedInvalid(Player player, Vector location, double maxScaffoldSpeed) {
Vector[] locations = new Vector[]{playerLocations.get(player)};
if (locations == null || locations[0] == null) {
return false;
}
double distance = location.distance(locations[0]);
double expectedDistance = maxScaffoldSpeed * player.getWalkSpeed();
return distance > expectedDistance;
}
private void checkTimerViolation(Player player, String type, long interval, long minTimerInterval) {
if (interval < minTimerInterval) {
handleViolation(player, "TIMER (" + type + ")");
}
}
private void handleViolation(Player player, String violation) {
for (Player alertPlayer : Bukkit.getOnlinePlayers()) {
if (alertPlayer.hasPermission(Objects.requireNonNull(plugin.getConfig().getString("detection.alerts-permission")))) {
String alertMessage = ALERT_PREFIX + ChatColor.GRAY + "Player " + player.getName() +
ChatColor.BLUE + " failed " + ChatColor.GRAY + violation;
alertPlayer.sendMessage(alertMessage);
}
}
}}
can someone explain why it dosent work lol