AFKDetector/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java

130 lines
5.4 KiB
Java
Executable File

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);
}
}
}
}