Skip to content

Commit

Permalink
Merge pull request #13 from Project-Poseidon-Plugins/afk
Browse files Browse the repository at this point in the history
Rework /afk
  • Loading branch information
RitzKid76 authored Feb 28, 2025
2 parents 62d446f + b6fdb73 commit ee1c1ed
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,8 @@ public void onEnable() {
// Bukkit.getPluginCommand("heal").setExecutor(new CommandHeal());
Bukkit.getPluginCommand("home").setExecutor(new CommandHome(plugin));
Bukkit.getPluginCommand("homesearch").setExecutor(new CommandHomeSearch(plugin));
// Bukkit.getPluginCommand("afk").setExecutor(new CommandAFK());
Bukkit.getPluginCommand("afk").setExecutor(new CommandAFK());

Bukkit.getPluginCommand("hat").setExecutor(new CommandHat());
Bukkit.getPluginCommand("sethome").setExecutor(new CommandSetHome());
Bukkit.getPluginCommand("delhome").setExecutor(new CommandDelhome());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.johnymuffin.beta.fundamentals.commands;

import com.johnymuffin.beta.fundamentals.Fundamentals;
import com.johnymuffin.beta.fundamentals.FundamentalsPlayerMap;
import com.johnymuffin.beta.fundamentals.settings.FundamentalsLanguage;
import com.johnymuffin.beta.fundamentals.util.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
Expand Down Expand Up @@ -30,16 +34,86 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
return true;
}
FundamentalsPlayerMap.getInstance().getPlayer(player).toggleAFK();
if(!FundamentalsPlayerMap.getInstance().getPlayer(player).isAFK()){
FundamentalsPlayerMap.getInstance().getPlayer(player).updateActivity();
}
String message = FundamentalsLanguage.getInstance().getMessage("set_player_afk");
message = message.replace("%username%", player.getName());
commandSender.sendMessage(message);
return true;
} else if (!(commandSender instanceof Player)) {
commandSender.sendMessage( FundamentalsLanguage.getInstance().getMessage("unavailable_to_console"));
commandSender.sendMessage(FundamentalsLanguage.getInstance().getMessage("unavailable_to_console"));
return true;
}
Player player = (Player) commandSender;
FundamentalsPlayerMap.getInstance().getPlayer(player).toggleAFK();
if(FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).isRequestingAFK()){
player.sendMessage(FundamentalsLanguage.getInstance().getMessage("already_requesting_afk"));
return true;
}
if(!FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).isAFK()){
new ScheduleAFK(player);
}else{
FundamentalsPlayerMap.getInstance().getPlayer(player).updateActivity();
}
return true;
}

class ScheduleAFK implements Runnable{

private Player player;
private CheckConditions checker;
private int taskId = -1;

private ScheduleAFK(Player player){
this.player = player;
FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).setAFKRequestStatus(true);
player.sendMessage(FundamentalsLanguage.getInstance().getMessage("commencing_afk"));
taskId = Bukkit.getScheduler().scheduleSyncDelayedTask(Fundamentals.getPlugin(), this, 60);
checker = new CheckConditions(player, this);

}

@Override
public void run(){
if(!FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).isAFK()){
FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).toggleAFK();
}
FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).setAFKRequestStatus(false);
Bukkit.getScheduler().cancelTask(checker.taskId);
}
}

class CheckConditions implements Runnable{

private Player player;
private int health;
private double posX;
private double posY;
private double posZ;

private ScheduleAFK task;
private int taskId = -1;

private CheckConditions(Player player, ScheduleAFK task){
this.player = player;
health = player.getHealth();
Location location = player.getLocation();
posX = location.getBlockX();
posY = location.getBlockY();
posZ = location.getBlockZ();
this.task = task;
taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Fundamentals.getPlugin(), this, 0, 1);
}

@Override
public void run(){
if(player.getHealth() < health || player.getLocation().getBlockX() != posX
|| player.getLocation().getBlockY() != posY || player.getLocation().getBlockZ() != posZ){
FundamentalsPlayerMap.getInstance().getPlayer(player.getUniqueId()).setAFKRequestStatus(false);
Bukkit.getScheduler().cancelTask(task.taskId);
Bukkit.getScheduler().cancelTask(taskId);
player.sendMessage(FundamentalsLanguage.getInstance().getMessage("afk_cancelled"));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.johnymuffin.beta.fundamentals.listener;

import com.johnymuffin.beta.fundamentals.Fundamentals;
import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.*;

public class FundamentalsEntityListener implements Listener {
private Fundamentals plugin;
Expand All @@ -18,35 +18,65 @@ public FundamentalsEntityListener(Fundamentals plugin) {

@EventHandler
public void onEntityCombust(EntityCombustEvent event) {
if (event.getEntity() instanceof Player && plugin.getPlayerMap().getPlayer((Player) event.getEntity()).getFileGodModeStatus()) {
event.setCancelled(true);
if (event.getEntity() instanceof Player) {
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) event.getEntity());
if (fPlayer.isAFK() || fPlayer.getFileGodModeStatus()) {
event.setCancelled(true);
}
}
}

@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player && plugin.getPlayerMap().getPlayer((Player) event.getEntity()).getFileGodModeStatus()) {
final Player player = (Player) event.getEntity();
player.setFireTicks(0);
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(player);
if (fPlayer.isAFK() || fPlayer.getFileGodModeStatus()) {
player.setFireTicks(0);
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
return;
}
}

if (!(event instanceof EntityDamageByEntityEvent)) return;
EntityDamageByEntityEvent dmgEvent = (EntityDamageByEntityEvent) event;

switch (event.getCause()) {
case ENTITY_ATTACK: {
if (dmgEvent.getDamager() == null || !(dmgEvent.getDamager() instanceof Player)) return;
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) dmgEvent.getDamager());
if (fPlayer.isAFK()) event.setCancelled(true);
}
case PROJECTILE: {
LivingEntity shooter = ((Projectile) dmgEvent.getDamager()).getShooter();
if (!(shooter instanceof Player)) return;
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) shooter);
if (fPlayer.isAFK()) event.setCancelled(true);
}
}
}

@EventHandler
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player && plugin.getPlayerMap().getPlayer((Player) event.getEntity()).getFileGodModeStatus()) {
event.setCancelled(true);
if (event.getEntity() instanceof Player) {
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) event.getEntity());
if (fPlayer.isAFK() || fPlayer.getFileGodModeStatus()) {
event.setCancelled(true);
}
}
}

@EventHandler
public void onEntityTarget(EntityTargetEvent event) {
if (event.getTarget() instanceof Player) {
if (plugin.getPlayerMap().getPlayer((Player) event.getTarget()).isVanished()) {
if(plugin.getFundamentalConfig().getConfigBoolean("settings.vanish-hidden-from-mobs")) {
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) event.getTarget());
if (fPlayer.isVanished()) {
if (plugin.getFundamentalConfig().getConfigBoolean("settings.vanish-hidden-from-mobs")) {
event.setCancelled(true);
}
} else if (fPlayer.isAFK()) {
event.setCancelled(true);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,18 @@
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.*;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Level;

import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized;
import static com.johnymuffin.beta.fundamentals.util.Utils.*;

public class FundamentalsPlayerListener implements Listener {

private Fundamentals plugin;
private Set<UUID> afkMovingPlayers = new HashSet<>();

public FundamentalsPlayerListener(Fundamentals plugin) {
this.plugin = plugin;
Expand Down Expand Up @@ -173,10 +178,15 @@ public void onPlayerChat(final PlayerChatEvent event) {
@EventHandler(ignoreCancelled = true)
public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
String command = event.getMessage();
if (plugin.getPlayerMap().getPlayer(event.getPlayer()).isAFK() &&
(!command.equalsIgnoreCase("/afk") && !command.equalsIgnoreCase("/afk " + event.getPlayer().getName()))) {
plugin.getPlayerMap().getPlayer(event.getPlayer()).updateActivity();
}

UUID uuid = event.getPlayer().getUniqueId();

//Run nickname color check
if(command.toLowerCase().startsWith("/nick") || command.toLowerCase().startsWith("/nickname")) {
if (command.toLowerCase().startsWith("/nick") || command.toLowerCase().startsWith("/nickname")) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
Expand All @@ -191,8 +201,45 @@ public void run() {

@EventHandler(ignoreCancelled = true)
public void onPlayerMove(final PlayerMoveEvent event) {
if (!((event.getFrom().getBlockX() == event.getTo().getBlockX()) && (event.getFrom().getBlockZ() == event.getTo().getBlockZ()))) {
FundamentalsPlayerMap.getInstance().getPlayer(event.getPlayer()).updateActivity();
Player player = event.getPlayer();
FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(player);
Location from = event.getFrom();
Location to = event.getTo();
boolean playerMoved =
from.getBlockX() != to.getBlockX() ||
from.getBlockY() != to.getBlockY() ||
from.getBlockZ() != to.getBlockZ();

if (!fPlayer.isAFK()) {
if (playerMoved) fPlayer.updateActivity();
return;
}
if (!playerMoved) return;

// If player can't run /afk to unfreeze, let them move
if (!isPlayerAuthorized(player, "fundamentals.afk")) {
fPlayer.updateActivity();
return;
}

from.setPitch(to.getPitch());
from.setYaw(to.getYaw());
if (from.getY() > to.getY()) from.setY(to.getY());
event.setTo(from);

// Notify player to run /afk
if (!afkMovingPlayers.contains(player.getUniqueId())) {
afkMovingPlayers.add(player.getUniqueId());
player.sendMessage(FundamentalsLanguage.getInstance().getMessage("moving_while_afk"));
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () ->
afkMovingPlayers.remove(player.getUniqueId()), 100);
}
}

@EventHandler(ignoreCancelled = true)
public void onPlayerPickupItem(PlayerPickupItemEvent event) {
if (plugin.getPlayerMap().getPlayer(event.getPlayer()).isAFK()) {
event.setCancelled(true);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class FundamentalsPlayer extends FundamentalsPlayerFile {
private UUID uuid;
private long lastActivity = System.currentTimeMillis() / 1000l;
private boolean isAFK = false;
private boolean pendingAFKRequest = false;
private boolean isFirstJoin = false;
private long quitTime = 0L;
private boolean fakeQuit = false;
Expand Down Expand Up @@ -201,13 +202,22 @@ public void checkForAFK() {
}
}
}

public void setAFKRequestStatus(boolean status){
pendingAFKRequest = status;
}

public boolean isRequestingAFK(){
return pendingAFKRequest;
}
//AFK End

public void playerJoinUpdate(String username) {
this.playerFileJoin(username);
}

public void playerQuitUpdate() {
isAFK = false;
this.setLastSeen();
quitTime = System.currentTimeMillis() / 1000L;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ private void loadDefaults() {
map.put("afk_toggle_off", "%var1% is no longer afk");
map.put("afk_toggle_on", "%var1% is now afk");
map.put("afk_kick_message", "&4You have been kicked for inactivity");
map.put("commencing_afk", "&7You will be marked as AFK in 3 seconds. Do not move or take damage.");
map.put("afk_cancelled", "&cPending AFK request cancelled.");
map.put("already_requesting_afk", "&cSlow down, you are already requesting AFK!");
map.put("moving_while_afk", "&cPlease type /afk to un-AFK!");
//Hat
map.put("hat_air", "&cWhy would you want air on your head?");
map.put("hat_dropping", "Was unable to put the old hat away, dropping it at your feet");
Expand Down

0 comments on commit ee1c1ed

Please sign in to comment.