From 469cd19b55ffd54785768a7d91321c073ce75939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Mon, 27 Oct 2025 17:54:19 +0100 Subject: [PATCH] added AntiBoatFreecam to detect and notify admins of illegal boat yaw behavior --- .../antiBoatFreecam/AntiBoatFreecam.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/security/antiBoatFreecam/AntiBoatFreecam.java diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/security/antiBoatFreecam/AntiBoatFreecam.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/security/antiBoatFreecam/AntiBoatFreecam.java new file mode 100644 index 0000000..8313799 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/security/antiBoatFreecam/AntiBoatFreecam.java @@ -0,0 +1,51 @@ +package eu.mhsl.craftattack.spawn.common.appliances.security.antiBoatFreecam; + +import eu.mhsl.craftattack.spawn.common.appliances.tooling.acInform.AcInform; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.Bukkit; +import org.bukkit.entity.Boat; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("unused") +public class AntiBoatFreecam extends Appliance { + private static final float MAX_YAW_OFFSET = 106.0f; + private final Map violatedPlayers = new HashMap<>(); + + public AntiBoatFreecam() { + Bukkit.getScheduler().runTaskTimerAsynchronously( + Main.instance(), + () -> Bukkit.getOnlinePlayers().forEach(player -> { + if(!(player.getVehicle() instanceof Boat boat)) return; + if(!boat.getPassengers().getFirst().equals(player)) return; + float playerYaw = player.getYaw(); + float boatYaw = boat.getYaw(); + + float yawDelta = wrapDegrees(playerYaw - boatYaw); + if(Math.abs(yawDelta) <= MAX_YAW_OFFSET) return; + + this.violatedPlayers.merge(player, 1f, Float::sum); + float violationCount = this.violatedPlayers.get(player); + if(violationCount != 1 && violationCount % 100 != 0) return; + Main.instance().getAppliance(AcInform.class).notifyAdmins( + "internal", + player.getName(), + "illegalBoatLookYaw", + violationCount + ); + }), + 1L, + 1L + ); + } + + private static float wrapDegrees(float deg) { + deg = deg % 360f; + if (deg >= 180f) deg -= 360f; + if (deg < -180f) deg += 360f; + return deg; + } +}