2021-04-04 22:01:18 +00:00
|
|
|
package com.alttd.afkdectector;
|
|
|
|
|
|
|
|
|
|
import com.alttd.afkdectector.afkplayer.AFKPlayer;
|
2021-07-09 07:20:46 +00:00
|
|
|
import com.alttd.afkdectector.config.Config;
|
|
|
|
|
import com.alttd.afkdectector.config.Messages;
|
2022-03-14 21:16:15 +00:00
|
|
|
import net.kyori.adventure.text.Component;
|
2022-08-31 00:36:47 +00:00
|
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
|
|
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
2021-04-04 22:01:18 +00:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
|
import org.bukkit.Location;
|
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
import org.bukkit.scheduler.BukkitRunnable;
|
|
|
|
|
|
2023-03-30 00:24:56 +00:00
|
|
|
import java.util.UUID;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
public class AFKCheckTimer extends BukkitRunnable {
|
|
|
|
|
|
|
|
|
|
private final AFKDetector plugin;
|
2021-04-04 22:01:18 +00:00
|
|
|
|
|
|
|
|
public AFKCheckTimer(AFKDetector plugin) {
|
|
|
|
|
this.plugin = plugin;
|
|
|
|
|
}
|
2023-03-30 00:24:56 +00:00
|
|
|
|
2021-04-04 22:01:18 +00:00
|
|
|
public void init() {
|
2023-03-30 00:24:56 +00:00
|
|
|
runTaskTimer(plugin, 0, 20);
|
2021-04-04 22:01:18 +00:00
|
|
|
}
|
2023-03-30 00:24:56 +00:00
|
|
|
|
|
|
|
|
@Override
|
2021-04-04 22:01:18 +00:00
|
|
|
public void run() {
|
2023-03-30 00:24:56 +00:00
|
|
|
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();
|
2023-05-24 01:03:10 +00:00
|
|
|
if (!afkPlayer.isAFK() && System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(Config.WARNING_TIME)) {
|
|
|
|
|
afkPlayer.warnPlayer(player);
|
|
|
|
|
}
|
2023-03-30 00:24:56 +00:00
|
|
|
if (!afkPlayer.isAFK() && System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(Config.TOGGLE_TIME)) {
|
|
|
|
|
setPlayerAFK(afkPlayer, player);
|
|
|
|
|
}
|
|
|
|
|
runMessageTimerCheck(afkPlayer, uuid, standingTime);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-30 00:28:13 +00:00
|
|
|
private boolean playerMovedOutOfSphere(Player player, Location pastLocation) {
|
|
|
|
|
return player.getLocation().distanceSquared(pastLocation) > Config.RADIUS * Config.RADIUS;
|
|
|
|
|
}
|
2023-03-30 00:24:56 +00:00
|
|
|
|
2023-03-30 00:28:13 +00:00
|
|
|
private boolean playerHeadMoved(Location playerLocation, Location pastLocation) {
|
|
|
|
|
return playerLocation.getYaw() != pastLocation.getYaw() && playerLocation.getPitch() != pastLocation.getPitch();
|
|
|
|
|
}
|
2023-03-30 00:24:56 +00:00
|
|
|
|
|
|
|
|
private void resetAFKPlayer(Location pastLocation, Player player, AFKPlayer afkPlayer) {
|
|
|
|
|
afkPlayer.setPlayerToSphereCenter(pastLocation);
|
|
|
|
|
afkPlayer.setStandingTime(System.currentTimeMillis());
|
2023-05-24 01:03:10 +00:00
|
|
|
afkPlayer.unWarnPlayer(player);
|
2023-03-30 00:24:56 +00:00
|
|
|
player.setSleepingIgnored(false);
|
|
|
|
|
plugin.AFKPlayers.removeEntry(player.getName());
|
|
|
|
|
afkPlayer.ResetAFK();
|
|
|
|
|
|
|
|
|
|
MessageTimer currentTimer = plugin.messageTimers.get(player.getUniqueId());
|
|
|
|
|
if (currentTimer != null) {
|
|
|
|
|
plugin.messageTimers.remove(player.getUniqueId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void setPlayerAFK(AFKPlayer afkPlayer, Player player) {
|
|
|
|
|
afkPlayer.setAFK(true);
|
|
|
|
|
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.getAfkTime())) {
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-04 22:01:18 +00:00
|
|
|
}
|