From a482064e509f6ae5202178d1abb953f34f63adf1 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Wed, 24 May 2023 03:03:10 +0200 Subject: [PATCH 1/6] Testing blocking spawning for afk players --- build.gradle.kts | 2 +- .../com/alttd/afkdectector/AFKCheckTimer.java | 4 ++++ .../com/alttd/afkdectector/AFKDetector.java | 21 +++++++++++++++++-- .../afkdectector/afkplayer/AFKPlayer.java | 18 +++++++++++++++- .../afkdectector/afkplayer/AFKPlayers.java | 21 +++++++++++++++++++ .../com/alttd/afkdectector/config/Config.java | 8 ++++--- 6 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java diff --git a/build.gradle.kts b/build.gradle.kts index 29d8dfa..8579a7f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,5 +43,5 @@ tasks { } dependencies { - implementation("com.alttd:Galaxy-API:1.19-R0.1-SNAPSHOT") + implementation("com.alttd:Galaxy-API:1.19.4-R0.1-SNAPSHOT") } \ No newline at end of file diff --git a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java index 8f95259..1b21c07 100755 --- a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java +++ b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java @@ -47,6 +47,9 @@ public class AFKCheckTimer extends BukkitRunnable { } 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); } @@ -65,6 +68,7 @@ public class AFKCheckTimer extends BukkitRunnable { private void resetAFKPlayer(Location pastLocation, Player player, AFKPlayer afkPlayer) { afkPlayer.setPlayerToSphereCenter(pastLocation); afkPlayer.setStandingTime(System.currentTimeMillis()); + afkPlayer.unWarnPlayer(player); player.setSleepingIgnored(false); plugin.AFKPlayers.removeEntry(player.getName()); afkPlayer.ResetAFK(); diff --git a/src/main/java/com/alttd/afkdectector/AFKDetector.java b/src/main/java/com/alttd/afkdectector/AFKDetector.java index c4cb014..977d884 100755 --- a/src/main/java/com/alttd/afkdectector/AFKDetector.java +++ b/src/main/java/com/alttd/afkdectector/AFKDetector.java @@ -1,6 +1,7 @@ package com.alttd.afkdectector; import com.alttd.afkdectector.afkplayer.AFKPlayer; +import com.alttd.afkdectector.afkplayer.AFKPlayers; import com.alttd.afkdectector.command.AFKCheckCommand; import com.alttd.afkdectector.command.AFKListCommand; import com.alttd.afkdectector.command.ReloadCommand; @@ -18,9 +19,11 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -32,8 +35,10 @@ import org.bukkit.scoreboard.Team; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; public class AFKDetector extends JavaPlugin implements Listener { @@ -50,6 +55,7 @@ public class AFKDetector extends JavaPlugin implements Listener { * AFK players need to be added to a team. */ Team AFKPlayers; + private final AFKPlayers afkPlayers = new AFKPlayers(); @Override public void onEnable() { @@ -83,7 +89,7 @@ public class AFKDetector extends JavaPlugin implements Listener { public AFKPlayer getPlayer(Player player) { if (!players.containsKey(player.getUniqueId())) { - players.put(player.getUniqueId(), new AFKPlayer(player, this)); + players.put(player.getUniqueId(), new AFKPlayer(player, this, afkPlayers)); } return players.get(player.getUniqueId()); } @@ -129,7 +135,7 @@ public class AFKDetector extends JavaPlugin implements Listener { Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); PlayerAfkTime.put(uuid, getPlayerAFKTime(player)); - players.put(uuid, new AFKPlayer(player, this)); + players.put(uuid, new AFKPlayer(player, this, afkPlayers)); if (Bukkit.getOnlinePlayers().size() >= Config.PLAYER_LIMIT && !Config.SERVER_FULL) { fullOverride = true; } @@ -214,6 +220,17 @@ public class AFKDetector extends JavaPlugin implements Listener { } }*/ + @EventHandler + public void onMobSpawn(CreatureSpawnEvent event) { + if (!event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.NATURAL)) + return; + List players = event.getEntity().getLocation().getNearbyPlayers(96).stream().map(Player::getUniqueId).collect(Collectors.toList()); //assuming 6 render distance + if (afkPlayers.containsNonAfkPlayer(players)) { + return; + } + event.setCancelled(true); + } + public static AFKDetector getInstance() { return instance; } diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java index 020f9e0..f3bbad1 100755 --- a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java +++ b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java @@ -20,14 +20,17 @@ public class AFKPlayer { private long standingTime; private final int afkTime; private boolean isAFK; + private boolean isWarned; + private final AFKPlayers afkPlayers; - public AFKPlayer(Player player, AFKDetector plugin) { + public AFKPlayer(Player player, AFKDetector plugin, AFKPlayers afkPlayers) { this.playerName = player.getName(); this.uuid = player.getUniqueId(); this.playerToSphereCenter = player.getLocation(); this.standingTime = System.currentTimeMillis(); this.afkTime = plugin.getAllowedAFKTime(player); this.isAFK = false; + this.afkPlayers = afkPlayers; } public String getPlayerName() { @@ -68,6 +71,7 @@ public class AFKPlayer { public void setAFK(boolean bool) { isAFK = bool; + afkPlayers.addAFKPlayer(uuid); } public boolean isAFK() { @@ -86,6 +90,18 @@ public class AFKPlayer { Player player = Bukkit.getPlayer(getPlayerUuid()); playerToSphereCenter = (player == null) ? null : player.getLocation(); isAFK = false; + afkPlayers.removeAFKPlayer(uuid); } + public void warnPlayer(Player player) { + if (isWarned) + return; + player.sendMessage("You will go afk in a bit (placeholder message)"); + isWarned = true; + } + + public void unWarnPlayer(Player player) { + player.sendMessage("You won't be going afk for another 7 min (placeholder message)"); + isWarned = false; + } } diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java new file mode 100644 index 0000000..d3a5eb8 --- /dev/null +++ b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java @@ -0,0 +1,21 @@ +package com.alttd.afkdectector.afkplayer; + +import java.util.HashSet; +import java.util.List; +import java.util.UUID; + +public class AFKPlayers { + private final HashSet afkPlayers = new HashSet<>(); + + public synchronized boolean containsNonAfkPlayer(List uuids) { + return uuids.stream().anyMatch(uuid -> !afkPlayers.contains(uuid)); + } + + public synchronized void addAFKPlayer(UUID uuid) { + afkPlayers.add(uuid); + } + + public synchronized void removeAFKPlayer(UUID uuid) { + afkPlayers.remove(uuid); + } +} diff --git a/src/main/java/com/alttd/afkdectector/config/Config.java b/src/main/java/com/alttd/afkdectector/config/Config.java index 497a4e2..7a31c52 100644 --- a/src/main/java/com/alttd/afkdectector/config/Config.java +++ b/src/main/java/com/alttd/afkdectector/config/Config.java @@ -35,9 +35,10 @@ public class Config extends AbstractConfiguration { public static boolean SLEEP_IGNORE = false; public static int RADIUS = 4; - public static int TOGGLE_TIME = 4; - public static int DEFAULT_AFK_TIME = 5; - public static int MAX_AFK_TIME = 5; + public static int WARNING_TIME = 5; + public static int TOGGLE_TIME = 7; + public static int DEFAULT_AFK_TIME = 30; + public static int MAX_AFK_TIME = 60; public static boolean SERVER_FULL = false; public static int PLAYER_LIMIT = Math.round(Bukkit.getMaxPlayers() * 90 / 100); public static int COMMAND_COOL_DOWN = 60; @@ -48,6 +49,7 @@ public class Config extends AbstractConfiguration { private static void playerSettings() { SLEEP_IGNORE = config.getBoolean("player.sleep", SLEEP_IGNORE); RADIUS = config.getInt("player.radius", RADIUS); + WARNING_TIME = config.getInt("player.warning-time", WARNING_TIME); TOGGLE_TIME = config.getInt("player.toggle-time", TOGGLE_TIME); DEFAULT_AFK_TIME = config.getInt("player.afk-time", 5); MAX_AFK_TIME = config.getInt("player.maxafk-time", 5); From 9bbc4882a0c48d65de18400c25db77b5aa770b3d Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Thu, 25 May 2023 23:15:57 +0200 Subject: [PATCH 2/6] Added boss bar and blocked more spawning --- settings.gradle.kts | 2 +- .../com/alttd/afkdectector/AFKCheckTimer.java | 6 +-- .../com/alttd/afkdectector/AFKDetector.java | 11 +++-- .../afkdectector/afkplayer/AFKPlayer.java | 40 +++++++++++++++---- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index eb96a77..0bf4d08 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ rootProject.name = "AFKDetector" dependencyResolutionManagement { repositories { mavenCentral() - maven("https://repo.destro.xyz/snapshots") // Altitude - Galaxy + maven("https://dev.alttd.com/snapshots") // Altitude - Galaxy } repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) } diff --git a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java index 1b21c07..a070bb7 100755 --- a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java +++ b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java @@ -68,10 +68,10 @@ public class AFKCheckTimer extends BukkitRunnable { private void resetAFKPlayer(Location pastLocation, Player player, AFKPlayer afkPlayer) { afkPlayer.setPlayerToSphereCenter(pastLocation); afkPlayer.setStandingTime(System.currentTimeMillis()); - afkPlayer.unWarnPlayer(player); + afkPlayer.unWarnPlayer(); player.setSleepingIgnored(false); plugin.AFKPlayers.removeEntry(player.getName()); - afkPlayer.ResetAFK(); + afkPlayer.ResetAFK(player); MessageTimer currentTimer = plugin.messageTimers.get(player.getUniqueId()); if (currentTimer != null) { @@ -80,7 +80,7 @@ public class AFKCheckTimer extends BukkitRunnable { } private void setPlayerAFK(AFKPlayer afkPlayer, Player player) { - afkPlayer.setAFK(true); + afkPlayer.setAFK(player); player.setSleepingIgnored(true); //player.setCanPickupItems(false); plugin.AFKPlayers.addEntry(player.getName()); diff --git a/src/main/java/com/alttd/afkdectector/AFKDetector.java b/src/main/java/com/alttd/afkdectector/AFKDetector.java index 977d884..8bb6bb0 100755 --- a/src/main/java/com/alttd/afkdectector/AFKDetector.java +++ b/src/main/java/com/alttd/afkdectector/AFKDetector.java @@ -180,7 +180,7 @@ public class AFKDetector extends JavaPlugin implements Listener { } Player player = event.getPlayer(); - getPlayer(player).ResetAFK(); + getPlayer(player).ResetAFK(player); messageHistory.addEntry(uuid, message); } @@ -200,7 +200,7 @@ public class AFKDetector extends JavaPlugin implements Listener { } Player player = event.getPlayer(); - getPlayer(player).ResetAFK(); + getPlayer(player).ResetAFK(player); commandHistory.addEntry(uuid, command); } @@ -222,7 +222,12 @@ public class AFKDetector extends JavaPlugin implements Listener { @EventHandler public void onMobSpawn(CreatureSpawnEvent event) { - if (!event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.NATURAL)) + CreatureSpawnEvent.SpawnReason spawnReason = event.getSpawnReason(); + if (!spawnReason.equals(CreatureSpawnEvent.SpawnReason.NATURAL) + && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.RAID) + && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.SPAWNER) + && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE) + && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION)) return; List players = event.getEntity().getLocation().getNearbyPlayers(96).stream().map(Player::getUniqueId).collect(Collectors.toList()); //assuming 6 render distance if (afkPlayers.containsNonAfkPlayer(players)) { diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java index f3bbad1..7666ad3 100755 --- a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java +++ b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java @@ -4,13 +4,19 @@ import com.alttd.afkdectector.AFKDetector; import com.alttd.afkdectector.config.Config; import com.alttd.afkdectector.config.Messages; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; import org.bukkit.entity.Player; import java.util.UUID; +import java.util.concurrent.TimeUnit; public class AFKPlayer { @@ -22,6 +28,7 @@ public class AFKPlayer { private boolean isAFK; private boolean isWarned; private final AFKPlayers afkPlayers; + private final BossBar bossBar; public AFKPlayer(Player player, AFKDetector plugin, AFKPlayers afkPlayers) { this.playerName = player.getName(); @@ -31,6 +38,7 @@ public class AFKPlayer { this.afkTime = plugin.getAllowedAFKTime(player); this.isAFK = false; this.afkPlayers = afkPlayers; + this.bossBar = Bukkit.createBossBar("Time until AFK", BarColor.PURPLE, BarStyle.SOLID); } public String getPlayerName() { @@ -69,8 +77,10 @@ public class AFKPlayer { return x < Config.SPAWN_MAX_X && x > Config.SPAWN_MIN_X && z < Config.SPAWN_MAX_Z && z > Config.SPAWN_MIN_Z; } - public void setAFK(boolean bool) { - isAFK = bool; + public void setAFK(Player player) { + bossBar.setTitle("§cAFK"); +// player.setAfk(true); + isAFK = true; afkPlayers.addAFKPlayer(uuid); } @@ -78,7 +88,7 @@ public class AFKPlayer { return isAFK; } - public void ResetAFK() { + public void ResetAFK(Player player) { if (isAFK && Config.AFK_TOGGLE_MESSAGES) { TagResolver placeholders = TagResolver.resolver( Placeholder.parsed("player", playerName) @@ -87,21 +97,35 @@ public class AFKPlayer { Bukkit.broadcast(component, "afkdetector.notify"); } standingTime = System.currentTimeMillis(); - Player player = Bukkit.getPlayer(getPlayerUuid()); - playerToSphereCenter = (player == null) ? null : player.getLocation(); +// player.setAfk(false); + playerToSphereCenter = player.getLocation(); isAFK = false; + bossBar.removeAll(); afkPlayers.removeAFKPlayer(uuid); } public void warnPlayer(Player player) { + updateBossBar(); if (isWarned) return; - player.sendMessage("You will go afk in a bit (placeholder message)"); + Component deserialize = MiniMessage.miniMessage().deserialize("Time until AFK."); + String text = LegacyComponentSerializer.builder().build().serialize(deserialize); + bossBar.setTitle(text); + bossBar.addPlayer(player); isWarned = true; } - public void unWarnPlayer(Player player) { - player.sendMessage("You won't be going afk for another 7 min (placeholder message)"); + public void updateBossBar() { + double afkSeconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getStandingTime()); + double toggleSeconds = TimeUnit.MINUTES.toSeconds(Config.TOGGLE_TIME); + double percentageAFK = Math.min(afkSeconds / toggleSeconds, 1); + bossBar.setProgress(percentageAFK); + } + + public void unWarnPlayer() { + if (!isWarned) + return; + bossBar.removeAll(); isWarned = false; } } From 647922cfc52be7c3f6bed6ac6d216e25550e2ed2 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Fri, 26 May 2023 01:44:06 +0200 Subject: [PATCH 3/6] Switched to using galaxy's build in afk system for preventing mob spawning/ticking Moved some displayed text to message config --- .../com/alttd/afkdectector/AFKCheckTimer.java | 3 +- .../com/alttd/afkdectector/AFKDetector.java | 48 ++------------ .../afkdectector/afkplayer/AFKPlayer.java | 64 +++++++++---------- .../afkdectector/afkplayer/AFKPlayers.java | 21 ------ .../alttd/afkdectector/config/Messages.java | 4 +- 5 files changed, 40 insertions(+), 100 deletions(-) delete mode 100644 src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java diff --git a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java index a070bb7..e5551ad 100755 --- a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java +++ b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java @@ -68,10 +68,9 @@ public class AFKCheckTimer extends BukkitRunnable { private void resetAFKPlayer(Location pastLocation, Player player, AFKPlayer afkPlayer) { afkPlayer.setPlayerToSphereCenter(pastLocation); afkPlayer.setStandingTime(System.currentTimeMillis()); - afkPlayer.unWarnPlayer(); player.setSleepingIgnored(false); plugin.AFKPlayers.removeEntry(player.getName()); - afkPlayer.ResetAFK(player); + afkPlayer.resetAFK(player); MessageTimer currentTimer = plugin.messageTimers.get(player.getUniqueId()); if (currentTimer != null) { diff --git a/src/main/java/com/alttd/afkdectector/AFKDetector.java b/src/main/java/com/alttd/afkdectector/AFKDetector.java index 8bb6bb0..c4bf156 100755 --- a/src/main/java/com/alttd/afkdectector/AFKDetector.java +++ b/src/main/java/com/alttd/afkdectector/AFKDetector.java @@ -1,7 +1,6 @@ package com.alttd.afkdectector; import com.alttd.afkdectector.afkplayer.AFKPlayer; -import com.alttd.afkdectector.afkplayer.AFKPlayers; import com.alttd.afkdectector.command.AFKCheckCommand; import com.alttd.afkdectector.command.AFKListCommand; import com.alttd.afkdectector.command.ReloadCommand; @@ -19,11 +18,9 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -35,10 +32,8 @@ import org.bukkit.scoreboard.Team; import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; public class AFKDetector extends JavaPlugin implements Listener { @@ -55,7 +50,6 @@ public class AFKDetector extends JavaPlugin implements Listener { * AFK players need to be added to a team. */ Team AFKPlayers; - private final AFKPlayers afkPlayers = new AFKPlayers(); @Override public void onEnable() { @@ -89,7 +83,7 @@ public class AFKDetector extends JavaPlugin implements Listener { public AFKPlayer getPlayer(Player player) { if (!players.containsKey(player.getUniqueId())) { - players.put(player.getUniqueId(), new AFKPlayer(player, this, afkPlayers)); + players.put(player.getUniqueId(), new AFKPlayer(player, this)); } return players.get(player.getUniqueId()); } @@ -135,7 +129,7 @@ public class AFKDetector extends JavaPlugin implements Listener { Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); PlayerAfkTime.put(uuid, getPlayerAFKTime(player)); - players.put(uuid, new AFKPlayer(player, this, afkPlayers)); + players.put(uuid, new AFKPlayer(player, this)); if (Bukkit.getOnlinePlayers().size() >= Config.PLAYER_LIMIT && !Config.SERVER_FULL) { fullOverride = true; } @@ -180,7 +174,7 @@ public class AFKDetector extends JavaPlugin implements Listener { } Player player = event.getPlayer(); - getPlayer(player).ResetAFK(player); + getPlayer(player).resetAFK(player); messageHistory.addEntry(uuid, message); } @@ -200,42 +194,10 @@ public class AFKDetector extends JavaPlugin implements Listener { } Player player = event.getPlayer(); - getPlayer(player).ResetAFK(player); + getPlayer(player).resetAFK(player); commandHistory.addEntry(uuid, command); } - /* @EventHandler - public void onPlayerMove(PlayerMoveEvent event) { - Player player = event.getPlayer(); - if (player != null) { - if (!player.hasPermission("afkdetect.bypass")) { - if(!player.isInsideVehicle()) { - float yawDif = Math.abs(event.getFrom().getYaw() - event.getTo().getYaw()); - float pitchDif = Math.abs(event.getFrom().getPitch() - event.getTo().getPitch()); - if (yawDif != 0.0F || pitchDif != 0.0F) { - //getPlayer(player).ResetAFK(); - } - } - } - } - }*/ - - @EventHandler - public void onMobSpawn(CreatureSpawnEvent event) { - CreatureSpawnEvent.SpawnReason spawnReason = event.getSpawnReason(); - if (!spawnReason.equals(CreatureSpawnEvent.SpawnReason.NATURAL) - && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.RAID) - && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.SPAWNER) - && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE) - && !spawnReason.equals(CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION)) - return; - List players = event.getEntity().getLocation().getNearbyPlayers(96).stream().map(Player::getUniqueId).collect(Collectors.toList()); //assuming 6 render distance - if (afkPlayers.containsNonAfkPlayer(players)) { - return; - } - event.setCancelled(true); - } - public static AFKDetector getInstance() { return instance; } @@ -244,7 +206,7 @@ public class AFKDetector extends JavaPlugin implements Listener { Config.reload(); MessagesConfig.reload(); if (sender != null) { - sender.sendMessage("Configuration reloaded"); + sender.sendMiniMessage("Configuration reloaded", null); } } } diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java index 7666ad3..c220e68 100755 --- a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java +++ b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java @@ -27,18 +27,21 @@ public class AFKPlayer { private final int afkTime; private boolean isAFK; private boolean isWarned; - private final AFKPlayers afkPlayers; private final BossBar bossBar; + private final String afkSoon; + private final String afkNow; - public AFKPlayer(Player player, AFKDetector plugin, AFKPlayers afkPlayers) { + public AFKPlayer(Player player, AFKDetector plugin) { this.playerName = player.getName(); this.uuid = player.getUniqueId(); this.playerToSphereCenter = player.getLocation(); this.standingTime = System.currentTimeMillis(); this.afkTime = plugin.getAllowedAFKTime(player); this.isAFK = false; - this.afkPlayers = afkPlayers; this.bossBar = Bukkit.createBossBar("Time until AFK", BarColor.PURPLE, BarStyle.SOLID); + MiniMessage miniMessage = MiniMessage.miniMessage(); + this.afkSoon = LegacyComponentSerializer.builder().build().serialize(miniMessage.deserialize(Messages.AFK_SOON_BOSS_BAR.getMessage())); + this.afkNow = LegacyComponentSerializer.builder().build().serialize(miniMessage.deserialize(Messages.AFK_NOW_BOSS_BAR.getMessage())); } public String getPlayerName() { @@ -77,18 +80,7 @@ public class AFKPlayer { return x < Config.SPAWN_MAX_X && x > Config.SPAWN_MIN_X && z < Config.SPAWN_MAX_Z && z > Config.SPAWN_MIN_Z; } - public void setAFK(Player player) { - bossBar.setTitle("§cAFK"); -// player.setAfk(true); - isAFK = true; - afkPlayers.addAFKPlayer(uuid); - } - - public boolean isAFK() { - return isAFK; - } - - public void ResetAFK(Player player) { + public void resetAFK(Player player) { if (isAFK && Config.AFK_TOGGLE_MESSAGES) { TagResolver placeholders = TagResolver.resolver( Placeholder.parsed("player", playerName) @@ -97,35 +89,41 @@ public class AFKPlayer { Bukkit.broadcast(component, "afkdetector.notify"); } standingTime = System.currentTimeMillis(); -// player.setAfk(false); + player.setAfk(false); playerToSphereCenter = player.getLocation(); isAFK = false; - bossBar.removeAll(); - afkPlayers.removeAFKPlayer(uuid); + unWarnPlayer(); } - public void warnPlayer(Player player) { - updateBossBar(); - if (isWarned) - return; - Component deserialize = MiniMessage.miniMessage().deserialize("Time until AFK."); - String text = LegacyComponentSerializer.builder().build().serialize(deserialize); - bossBar.setTitle(text); - bossBar.addPlayer(player); - isWarned = true; + public void setAFK(Player player) { + bossBar.setTitle(afkNow); + player.setAfk(true); + isAFK = true; } - public void updateBossBar() { - double afkSeconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getStandingTime()); - double toggleSeconds = TimeUnit.MINUTES.toSeconds(Config.TOGGLE_TIME); - double percentageAFK = Math.min(afkSeconds / toggleSeconds, 1); - bossBar.setProgress(percentageAFK); + public boolean isAFK() { + return isAFK; } - public void unWarnPlayer() { + private void unWarnPlayer() { if (!isWarned) return; bossBar.removeAll(); isWarned = false; } + + public void warnPlayer(Player player) { + updateBossBarProgress(); + if (isWarned) + return; + bossBar.setTitle(afkSoon); + bossBar.addPlayer(player); + isWarned = true; + } + + public void updateBossBarProgress() { + double afkSeconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getStandingTime()); + double toggleSeconds = TimeUnit.MINUTES.toSeconds(Config.TOGGLE_TIME); + bossBar.setProgress(Math.min(afkSeconds / toggleSeconds, 1)); + } } diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java deleted file mode 100644 index d3a5eb8..0000000 --- a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayers.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.alttd.afkdectector.afkplayer; - -import java.util.HashSet; -import java.util.List; -import java.util.UUID; - -public class AFKPlayers { - private final HashSet afkPlayers = new HashSet<>(); - - public synchronized boolean containsNonAfkPlayer(List uuids) { - return uuids.stream().anyMatch(uuid -> !afkPlayers.contains(uuid)); - } - - public synchronized void addAFKPlayer(UUID uuid) { - afkPlayers.add(uuid); - } - - public synchronized void removeAFKPlayer(UUID uuid) { - afkPlayers.remove(uuid); - } -} diff --git a/src/main/java/com/alttd/afkdectector/config/Messages.java b/src/main/java/com/alttd/afkdectector/config/Messages.java index 4fa79c1..a252653 100644 --- a/src/main/java/com/alttd/afkdectector/config/Messages.java +++ b/src/main/java/com/alttd/afkdectector/config/Messages.java @@ -20,7 +20,9 @@ public enum Messages { AFK_CHECK_SUBTITLE("afkcheck-subtitle", "Please respond to the dm from staff!"), AFK_CHECK_MESSAGE("afkcheck-message", "Hey, since you're near a farm and not moving. I'm making sure you aren't afk. Please respond to me if you're not AFK."), AFK_KICK_STAFF_MESSAGE("afkkick-staff-messsge", " got afk kicked after being afk for minutes."), - SUSPICIOUS_KICK_COUNT("afkkick-suspicious-message", " has had suspicious AFK kicks since last reboot."); + SUSPICIOUS_KICK_COUNT("afkkick-suspicious-message", " has had suspicious AFK kicks since last reboot."), + AFK_SOON_BOSS_BAR("afk-soon-boss-bar", "Time until AFK."), + AFK_NOW_BOSS_BAR("afk-now-boss-bar", "AFK"); private final String key; private String message; From baad49a608847ea16a5a2d3c6dc75ac683549801 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Mon, 19 Jun 2023 22:59:48 +0200 Subject: [PATCH 4/6] Made afk check not consider y for distance to ensure acrobatic grinders don't bypass the check --- settings.gradle.kts | 2 +- .../com/alttd/afkdectector/AFKCheckTimer.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 0bf4d08..eb96a77 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ rootProject.name = "AFKDetector" dependencyResolutionManagement { repositories { mavenCentral() - maven("https://dev.alttd.com/snapshots") // Altitude - Galaxy + maven("https://repo.destro.xyz/snapshots") // Altitude - Galaxy } repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) } diff --git a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java index e5551ad..bc2b195 100755 --- a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java +++ b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java @@ -10,6 +10,8 @@ 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; @@ -58,7 +60,21 @@ public class AFKCheckTimer extends BukkitRunnable { } private boolean playerMovedOutOfSphere(Player player, Location pastLocation) { - return player.getLocation().distanceSquared(pastLocation) > Config.RADIUS * Config.RADIUS; + 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) { From e9ed40848952a3cca0b78f0e7369117726835010 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Wed, 21 Jun 2023 23:14:55 +0200 Subject: [PATCH 5/6] Changed afk now bar to be afk kick soon --- .../com/alttd/afkdectector/AFKCheckTimer.java | 5 ++++- .../alttd/afkdectector/afkplayer/AFKPlayer.java | 16 +++++++++------- .../com/alttd/afkdectector/config/Messages.java | 1 + 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java index bc2b195..9337289 100755 --- a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java +++ b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java @@ -55,6 +55,9 @@ public class AFKCheckTimer extends BukkitRunnable { if (!afkPlayer.isAFK() && System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(Config.TOGGLE_TIME)) { setPlayerAFK(afkPlayer, player); } + if (afkPlayer.isAFK()) { + afkPlayer.updateBossBarProgress((int) TimeUnit.MINUTES.toSeconds(afkPlayer.getAfkTimeMinutes())); + } runMessageTimerCheck(afkPlayer, uuid, standingTime); } } @@ -109,7 +112,7 @@ public class AFKCheckTimer extends BukkitRunnable { } private void runMessageTimerCheck(AFKPlayer afkPlayer, UUID uuid, long standingTime) { - if (System.currentTimeMillis() - standingTime > TimeUnit.MINUTES.toMillis(afkPlayer.getAfkTime())) { + 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); diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java index c220e68..59f94db 100755 --- a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java +++ b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java @@ -29,7 +29,7 @@ public class AFKPlayer { private boolean isWarned; private final BossBar bossBar; private final String afkSoon; - private final String afkNow; + private final String afkKickSoon; public AFKPlayer(Player player, AFKDetector plugin) { this.playerName = player.getName(); @@ -41,7 +41,7 @@ public class AFKPlayer { this.bossBar = Bukkit.createBossBar("Time until AFK", BarColor.PURPLE, BarStyle.SOLID); MiniMessage miniMessage = MiniMessage.miniMessage(); this.afkSoon = LegacyComponentSerializer.builder().build().serialize(miniMessage.deserialize(Messages.AFK_SOON_BOSS_BAR.getMessage())); - this.afkNow = LegacyComponentSerializer.builder().build().serialize(miniMessage.deserialize(Messages.AFK_NOW_BOSS_BAR.getMessage())); + this.afkKickSoon = LegacyComponentSerializer.builder().build().serialize(miniMessage.deserialize(Messages.AFK_KICK_SOON_BOSS_BAR.getMessage())); } public String getPlayerName() { @@ -68,7 +68,7 @@ public class AFKPlayer { standingTime = Time; } - public int getAfkTime() { + public int getAfkTimeMinutes() { if (isInSpawn()) return this.afkTime + Config.EXTRA_MIN_IN_SPAWN; return this.afkTime; @@ -96,7 +96,8 @@ public class AFKPlayer { } public void setAFK(Player player) { - bossBar.setTitle(afkNow); + bossBar.setTitle(afkKickSoon); + bossBar.setColor(BarColor.RED); player.setAfk(true); isAFK = true; } @@ -113,17 +114,18 @@ public class AFKPlayer { } public void warnPlayer(Player player) { - updateBossBarProgress(); + updateBossBarProgress(Config.TOGGLE_TIME); if (isWarned) return; + bossBar.setColor(BarColor.PURPLE); bossBar.setTitle(afkSoon); bossBar.addPlayer(player); isWarned = true; } - public void updateBossBarProgress() { + public void updateBossBarProgress(int totalAllowedSeconds) { double afkSeconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getStandingTime()); - double toggleSeconds = TimeUnit.MINUTES.toSeconds(Config.TOGGLE_TIME); + double toggleSeconds = TimeUnit.MINUTES.toSeconds(totalAllowedSeconds); bossBar.setProgress(Math.min(afkSeconds / toggleSeconds, 1)); } } diff --git a/src/main/java/com/alttd/afkdectector/config/Messages.java b/src/main/java/com/alttd/afkdectector/config/Messages.java index a252653..6ce7890 100644 --- a/src/main/java/com/alttd/afkdectector/config/Messages.java +++ b/src/main/java/com/alttd/afkdectector/config/Messages.java @@ -22,6 +22,7 @@ public enum Messages { AFK_KICK_STAFF_MESSAGE("afkkick-staff-messsge", " got afk kicked after being afk for minutes."), SUSPICIOUS_KICK_COUNT("afkkick-suspicious-message", " has had suspicious AFK kicks since last reboot."), AFK_SOON_BOSS_BAR("afk-soon-boss-bar", "Time until AFK."), + AFK_KICK_SOON_BOSS_BAR("afk-kick-soon-boss-bar", "Time until AFK kick."), AFK_NOW_BOSS_BAR("afk-now-boss-bar", "AFK"); private final String key; From 399ee1394bb6623961bb1cd1709b2f82f6d3f132 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Fri, 23 Jun 2023 00:22:16 +0200 Subject: [PATCH 6/6] Fix afk kick bar timer not progressing --- src/main/java/com/alttd/afkdectector/AFKCheckTimer.java | 2 +- src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java index 9337289..ee48cb7 100755 --- a/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java +++ b/src/main/java/com/alttd/afkdectector/AFKCheckTimer.java @@ -56,7 +56,7 @@ public class AFKCheckTimer extends BukkitRunnable { setPlayerAFK(afkPlayer, player); } if (afkPlayer.isAFK()) { - afkPlayer.updateBossBarProgress((int) TimeUnit.MINUTES.toSeconds(afkPlayer.getAfkTimeMinutes())); + afkPlayer.updateBossBarProgress(afkPlayer.getAfkTimeMinutes()); } runMessageTimerCheck(afkPlayer, uuid, standingTime); } diff --git a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java index 59f94db..fcab086 100755 --- a/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java +++ b/src/main/java/com/alttd/afkdectector/afkplayer/AFKPlayer.java @@ -123,9 +123,9 @@ public class AFKPlayer { isWarned = true; } - public void updateBossBarProgress(int totalAllowedSeconds) { + public void updateBossBarProgress(int totalAllowedMinutes) { double afkSeconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getStandingTime()); - double toggleSeconds = TimeUnit.MINUTES.toSeconds(totalAllowedSeconds); + double toggleSeconds = TimeUnit.MINUTES.toSeconds(totalAllowedMinutes); bossBar.setProgress(Math.min(afkSeconds / toggleSeconds, 1)); } }