package com.alttd.afkdectector; import com.alttd.afkdectector.afkplayer.AFKPlayer; import com.alttd.afkdectector.config.Config; import com.alttd.afkdectector.config.Messages; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.NumberConversions; import org.jetbrains.annotations.NotNull; import java.util.UUID; import java.util.concurrent.TimeUnit; public class AFKCheckTimer extends BukkitRunnable { private final AFKDetector plugin; public AFKCheckTimer(AFKDetector plugin) { this.plugin = plugin; } public void init() { runTaskTimer(plugin, 0, 20); } @Override public void run() { for (UUID uuid : plugin.players.keySet()) { Player player = Bukkit.getPlayer(uuid); AFKPlayer afkPlayer = plugin.players.get(uuid); if (player == null || player.hasPermission("afkdetector.bypass")) { continue; } Location pastLocation = afkPlayer.getPlayerToSphereCenter(); if (pastLocation == null || !player.getLocation().getWorld().getName().equals(pastLocation.getWorld().getName())) { pastLocation = player.getLocation(); afkPlayer.setPlayerToSphereCenter(pastLocation); } if (playerMovedOutOfSphere(player, pastLocation) && playerHeadMoved(player.getLocation(), pastLocation)) { resetAFKPlayer(pastLocation, player, afkPlayer); continue; } long standingTime = afkPlayer.getStandingTime(); if (!afkPlayer.isAFK() && System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(Config.WARNING_TIME)) { afkPlayer.warnPlayer(player); } if (!afkPlayer.isAFK() && System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(Config.TOGGLE_TIME)) { setPlayerAFK(afkPlayer, player); } if (afkPlayer.isAFK()) { afkPlayer.updateBossBarProgress(afkPlayer.getAfkTimeMinutes()); } runMessageTimerCheck(afkPlayer, uuid, standingTime); } } private boolean playerMovedOutOfSphere(Player player, Location pastLocation) { return TwoDDistanceSquared(player.getLocation(), pastLocation) > Config.RADIUS * Config.RADIUS; // return player.getLocation().distanceSquared(pastLocation) > Config.RADIUS * Config.RADIUS; } private double TwoDDistanceSquared(@NotNull Location o1, @NotNull Location o2) { if (o2.getWorld() != null && o1.getWorld() != null) { if (o2.getWorld() != o1.getWorld()) { String var10002 = o1.getWorld().getName(); throw new IllegalArgumentException("Cannot measure distance between " + var10002 + " and " + o2.getWorld().getName()); } else { return NumberConversions.square(o1.getX() - o2.getX()) + NumberConversions.square(o1.getZ() - o2.getZ()); } } else { throw new IllegalArgumentException("Cannot measure distance to a null world"); } } private boolean playerHeadMoved(Location playerLocation, Location pastLocation) { return playerLocation.getYaw() != pastLocation.getYaw() && playerLocation.getPitch() != pastLocation.getPitch(); } private void resetAFKPlayer(Location pastLocation, Player player, AFKPlayer afkPlayer) { afkPlayer.setPlayerToSphereCenter(pastLocation); afkPlayer.setStandingTime(System.currentTimeMillis()); player.setSleepingIgnored(false); plugin.AFKPlayers.removeEntry(player.getName()); afkPlayer.resetAFK(player); MessageTimer currentTimer = plugin.messageTimers.get(player.getUniqueId()); if (currentTimer != null) { plugin.messageTimers.remove(player.getUniqueId()); } } private void setPlayerAFK(AFKPlayer afkPlayer, Player player) { afkPlayer.setAFK(player); player.setSleepingIgnored(true); //player.setCanPickupItems(false); plugin.AFKPlayers.addEntry(player.getName()); if (Config.AFK_TOGGLE_MESSAGES) { TagResolver placeholders = TagResolver.resolver( Placeholder.parsed("player", player.getName()) ); Component component = AFKDetector.miniMessage.deserialize(Messages.AFK_TOGGLE_ON.getMessage(), placeholders); Bukkit.broadcast(component, "afkdetector.notify"); } } private void runMessageTimerCheck(AFKPlayer afkPlayer, UUID uuid, long standingTime) { if (System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(afkPlayer.getAfkTimeMinutes())) { MessageTimer currentTimer = plugin.messageTimers.get(uuid); if (currentTimer == null) { currentTimer = new MessageTimer(plugin, afkPlayer, Config.MESSAGE_REPEATS); plugin.messageTimers.put(uuid, currentTimer); currentTimer.init(); } } else { MessageTimer currentTimer = plugin.messageTimers.get(uuid); if (currentTimer != null) { plugin.messageTimers.remove(uuid); } } } }