diff --git a/patches/api/0014-Implement-AFK-API.patch b/patches/api/0014-Implement-AFK-API.patch new file mode 100644 index 000000000..fc04fada0 --- /dev/null +++ b/patches/api/0014-Implement-AFK-API.patch @@ -0,0 +1,120 @@ +From 4effdeda4f4b6828eaf78212a560842e43d7b323 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 10 Aug 2019 22:19:56 -0500 +Subject: [PATCH] Implement AFK API + +--- + .../net/pl3x/purpur/event/PlayerAFKEvent.java | 70 +++++++++++++++++++ + src/main/java/org/bukkit/entity/Player.java | 21 ++++++ + 2 files changed, 91 insertions(+) + create mode 100644 src/main/java/net/pl3x/purpur/event/PlayerAFKEvent.java + +diff --git a/src/main/java/net/pl3x/purpur/event/PlayerAFKEvent.java b/src/main/java/net/pl3x/purpur/event/PlayerAFKEvent.java +new file mode 100644 +index 00000000..4db33485 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/event/PlayerAFKEvent.java +@@ -0,0 +1,70 @@ ++package net.pl3x.purpur.event; ++ ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.player.PlayerEvent; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++public class PlayerAFKEvent extends PlayerEvent implements Cancellable { ++ private static final HandlerList handlers = new HandlerList(); ++ private final boolean setAfk; ++ private boolean shouldKick; ++ private String broadcast; ++ private boolean cancel; ++ ++ public PlayerAFKEvent(@NotNull Player player, boolean setAfk, boolean shouldKick, @Nullable String broadcast) { ++ super(player); ++ this.setAfk = setAfk; ++ this.shouldKick = shouldKick; ++ this.broadcast = broadcast; ++ } ++ ++ /** ++ * Whether player is going afk or coming back ++ * ++ * @return True if going afk. False is coming back ++ */ ++ public boolean isGoingAfk() { ++ return setAfk; ++ } ++ ++ public boolean shouldKick() { ++ return shouldKick; ++ } ++ ++ public void setShouldKick(boolean shouldKick) { ++ this.shouldKick = shouldKick; ++ } ++ ++ @Nullable ++ public String getBroadcastMsg() { ++ return broadcast; ++ } ++ ++ public void setBroadcastMsg(@Nullable String broadcast) { ++ this.broadcast = broadcast; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return cancel; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancel = cancel; ++ } ++ ++ @Override ++ @NotNull ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} +diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java +index 8d8d8957..d430ce0b 100644 +--- a/src/main/java/org/bukkit/entity/Player.java ++++ b/src/main/java/org/bukkit/entity/Player.java +@@ -2096,4 +2096,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM + @Override + Spigot spigot(); + // Spigot end ++ ++ // Purpur start ++ /** ++ * Check if player is AFK ++ * ++ * @return True if AFK ++ */ ++ boolean isAfk(); ++ ++ /** ++ * Set player as AFK ++ * ++ * @param setAfk Whether to set AFK or not ++ */ ++ void setAfk(boolean setAfk); ++ ++ /** ++ * Reset the idle timer back to 0 ++ */ ++ void resetIdleTimer(); ++ // Purpur end + } +-- +2.20.1 + diff --git a/patches/server/0057-Implement-AFK-options.patch b/patches/server/0057-Implement-AFK-API.patch similarity index 76% rename from patches/server/0057-Implement-AFK-options.patch rename to patches/server/0057-Implement-AFK-API.patch index 39bacba84..4aa812cd9 100644 --- a/patches/server/0057-Implement-AFK-options.patch +++ b/patches/server/0057-Implement-AFK-API.patch @@ -1,18 +1,19 @@ -From cd72403d3729650fddebbb1d9065c0eeb9ba2e1f Mon Sep 17 00:00:00 2001 +From 886c0f755d9420d7005f59640391e1799f94a68b Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 8 Aug 2019 15:29:15 -0500 -Subject: [PATCH] Implement AFK options +Subject: [PATCH] Implement AFK API --- .../java/net/minecraft/server/Entity.java | 1 + - .../net/minecraft/server/EntityHuman.java | 24 +++++++++++++ - .../net/minecraft/server/EntityPlayer.java | 1 + - .../net/minecraft/server/IEntityAccess.java | 34 +++++++------------ - .../net/minecraft/server/IEntitySelector.java | 2 ++ - .../minecraft/server/PlayerConnection.java | 10 ++++++ - .../net/pl3x/purpur/PurpurWorldConfig.java | 12 +++++++ + .../net/minecraft/server/EntityHuman.java | 9 +++++ + .../net/minecraft/server/EntityPlayer.java | 37 +++++++++++++++++++ + .../net/minecraft/server/IEntityAccess.java | 34 ++++++----------- + .../net/minecraft/server/IEntitySelector.java | 2 + + .../minecraft/server/PlayerConnection.java | 10 +++++ + .../net/pl3x/purpur/PurpurWorldConfig.java | 12 ++++++ + .../craftbukkit/entity/CraftPlayer.java | 17 +++++++++ .../java/org/spigotmc/ActivationRange.java | 1 + - 8 files changed, 63 insertions(+), 22 deletions(-) + 9 files changed, 101 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 770d21468..2ff5a12d8 100644 @@ -27,52 +28,75 @@ index 770d21468..2ff5a12d8 100644 double d3 = this.locX - d0; double d4 = this.locY - d1; diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 2a943f316..c396bf2e2 100644 +index 2a943f316..8ee2e6c7f 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java -@@ -75,6 +75,30 @@ public abstract class EntityHuman extends EntityLiving { - public boolean affectsSpawning = true; - // Paper end +@@ -86,6 +86,15 @@ public abstract class EntityHuman extends EntityLiving { + } + // CraftBukkit end + // Purpur start -+ private boolean isAfk = false; -+ -+ public void setAfk(boolean isAfk) { -+ if (!world.purpurConfig.idleTimeoutKick) { // do not broadcast if going to kick -+ if (!world.purpurConfig.idleTimeoutBroadcastAway.isEmpty() && !this.isAfk && isAfk) { -+ getMinecraftServer().server.broadcastMessage(world.purpurConfig.idleTimeoutBroadcastAway.replace("{player}", getName())); -+ } else if (!world.purpurConfig.idleTimeoutBroadcastBack.isEmpty() && this.isAfk && !isAfk) { -+ getMinecraftServer().server.broadcastMessage(world.purpurConfig.idleTimeoutBroadcastBack.replace("{player}", getName())); -+ } -+ } -+ this.isAfk = isAfk; ++ public void setAfk(boolean setAfk){ + } + + public boolean isAfk() { -+ return isAfk; -+ } -+ -+ @Override -+ public boolean isCollidable(boolean ignoreClimbing) { -+ return !isAfk && super.isCollidable(ignoreClimbing); ++ return false; + } + // Purpur end + - // CraftBukkit start - public boolean fauxSleeping; - public String spawnWorld = ""; + public EntityHuman(World world, GameProfile gameprofile) { + super(EntityTypes.PLAYER, world); + this.bY = ItemStack.a; diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index 622899d8f..f7694545e 100644 +index 622899d8f..1ca5da443 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java -@@ -1593,6 +1593,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { +@@ -1593,8 +1593,45 @@ public class EntityPlayer extends EntityHuman implements ICrafting { public void resetIdleTimer() { this.cm = SystemUtils.getMonotonicMillis(); + setAfk(false); // Purpur } ++ // Purpur start ++ private boolean isAfk = false; ++ ++ @Override ++ public void setAfk(boolean setAfk) { ++ if (this.isAfk == setAfk) { ++ return; ++ } ++ ++ net.pl3x.purpur.event.PlayerAFKEvent event = new net.pl3x.purpur.event.PlayerAFKEvent(getBukkitEntity(), false, world.purpurConfig.idleTimeoutKick, setAfk ? world.purpurConfig.idleTimeoutBroadcastAway : world.purpurConfig.idleTimeoutBroadcastBack); ++ if (!event.callEvent() || event.shouldKick()) { ++ return; ++ } ++ ++ this.isAfk = setAfk; ++ ++ if (!setAfk) { ++ resetIdleTimer(); ++ } ++ ++ if (event.getBroadcastMsg() != null && !event.getBroadcastMsg().isEmpty()) { ++ ((WorldServer) world).getMinecraftServer().server.broadcastMessage(event.getBroadcastMsg().replace("{player}", getName())); ++ } ++ } ++ ++ @Override ++ public boolean isAfk() { ++ return isAfk; ++ } ++ ++ @Override ++ public boolean isCollidable(boolean ignoreClimbing) { ++ return !isAfk() && super.isCollidable(ignoreClimbing); ++ } ++ // Purpur end ++ public ServerStatisticManager getStatisticManager() { + return this.serverStatisticManager; + } diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java index 9aaa75e95..70fe85279 100644 --- a/src/main/java/net/minecraft/server/IEntityAccess.java @@ -203,6 +227,32 @@ index b1dcb5f8d..69fac757d 100644 public int elytraDamagePerSecond = 1; public double elytraDamageMultiplyBySpeed = 0; public boolean elytraIgnoreUnbreaking = false; +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index e920545df..c098de315 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -2088,4 +2088,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + return spigot; + } + // Spigot end ++ ++ // Purpur start ++ @Override ++ public boolean isAfk() { ++ return getHandle().isAfk(); ++ } ++ ++ @Override ++ public void setAfk(boolean setAfk) { ++ getHandle().setAfk(setAfk); ++ } ++ ++ @Override ++ public void resetIdleTimer() { ++ getHandle().resetIdleTimer(); ++ } ++ // Purpur end + } diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java index 92601c581..185717c80 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java