diff --git a/patches/server-unmapped/0008-AFK-API.patch b/patches/server-unmapped/0008-AFK-API.patch deleted file mode 100644 index 6b7c79d55..000000000 --- a/patches/server-unmapped/0008-AFK-API.patch +++ /dev/null @@ -1,302 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Thu, 8 Aug 2019 15:29:15 -0500 -Subject: [PATCH] AFK API - - -diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java -index 75bcfb3a2b4a104aeebb2fe3298714b2e5b569d2..0130b0329691f696107a4d1e6a01043b59077000 100644 ---- a/src/main/java/net/minecraft/server/level/EntityPlayer.java -+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java -@@ -1913,8 +1913,54 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - - public void resetIdleTimer() { - this.ca = SystemUtils.getMonotonicMillis(); -+ setAfk(false); // Purpur - } - -+ // Purpur start -+ private boolean isAfk = false; -+ -+ @Override -+ public void setAfk(boolean setAfk) { -+ if (this.isAfk == setAfk) { -+ return; -+ } -+ -+ String msg = setAfk ? net.pl3x.purpur.PurpurConfig.afkBroadcastAway : net.pl3x.purpur.PurpurConfig.afkBroadcastBack; -+ -+ net.pl3x.purpur.event.PlayerAFKEvent event = new net.pl3x.purpur.event.PlayerAFKEvent(getBukkitEntity(), setAfk, world.purpurConfig.idleTimeoutKick, msg, !Bukkit.isPrimaryThread()); -+ if (!event.callEvent() || event.shouldKick()) { -+ return; -+ } -+ -+ this.isAfk = setAfk; -+ -+ if (!setAfk) { -+ resetIdleTimer(); -+ } -+ -+ msg = event.getBroadcastMsg(); -+ if (msg != null && !msg.isEmpty()) { -+ server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromStringOrNull(String.format(msg, getProfile().getName()))); -+ } -+ -+ if (world.purpurConfig.idleTimeoutUpdateTabList) { -+ getBukkitEntity().setPlayerListName((setAfk ? net.pl3x.purpur.PurpurConfig.afkTabListPrefix : "") + getName()); -+ } -+ -+ ((WorldServer) world).everyoneSleeping(); -+ } -+ -+ @Override -+ public boolean isAfk() { -+ return isAfk; -+ } -+ -+ @Override -+ public boolean isCollidable() { -+ return !isAfk() && super.isCollidable(); -+ } -+ // Purpur end -+ - public ServerStatisticManager getStatisticManager() { - return this.serverStatisticManager; - } -diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java -index f68a252378a94c8fcab622d2d89d738aceab45a4..27c471c94312f10c4357ec87ccc96b5b2bca11f4 100644 ---- a/src/main/java/net/minecraft/server/level/WorldServer.java -+++ b/src/main/java/net/minecraft/server/level/WorldServer.java -@@ -546,7 +546,7 @@ public class WorldServer extends World implements GeneratorAccessSeed { - // CraftBukkit end - - if (this.everyoneSleeping && this.players.stream().noneMatch((entityplayer) -> { -- return !entityplayer.isSpectator() && !entityplayer.isDeeplySleeping() && !entityplayer.fauxSleeping; // CraftBukkit -+ return !entityplayer.isSpectator() && !entityplayer.isDeeplySleeping() && !entityplayer.fauxSleeping && !(purpurConfig.idleTimeoutCountAsSleeping && entityplayer.isAfk()); // CraftBukkit // Purpur - })) { - // CraftBukkit start - long l = this.worldData.getDayTime() + 24000L; -@@ -866,7 +866,7 @@ public class WorldServer extends World implements GeneratorAccessSeed { - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - -- if (entityplayer.isSpectator() || (entityplayer.fauxSleeping && !entityplayer.isSleeping())) { // CraftBukkit -+ if (entityplayer.isSpectator() || (entityplayer.fauxSleeping && !entityplayer.isSleeping()) || (purpurConfig.idleTimeoutCountAsSleeping && entityplayer.isAfk())) { // CraftBukkit // Purpur - ++i; - } else if (entityplayer.isSleeping()) { - ++j; -diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java -index 4001078e2a408dfd5a93c21f55a58c1fde32abbb..d228d07ee4febfdc931da5e142825f314f0a8848 100644 ---- a/src/main/java/net/minecraft/server/network/PlayerConnection.java -+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java -@@ -399,6 +399,12 @@ public class PlayerConnection implements PacketListenerPlayIn { - } - - if (this.player.F() > 0L && this.minecraftServer.getIdleTimeout() > 0 && SystemUtils.getMonotonicMillis() - this.player.F() > (long) (this.minecraftServer.getIdleTimeout() * 1000 * 60)) { -+ // Purpur start -+ this.player.setAfk(true); -+ if (!this.player.world.purpurConfig.idleTimeoutKick) { -+ return; -+ } -+ // Purpur end - this.player.resetIdleTimer(); // CraftBukkit - SPIGOT-854 - this.disconnect(new ChatMessage("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause - } -@@ -663,6 +669,8 @@ public class PlayerConnection implements PacketListenerPlayIn { - this.lastYaw = to.getYaw(); - this.lastPitch = to.getPitch(); - -+ if (!to.getWorld().getUID().equals(from.getWorld().getUID()) || to.getBlockX() != from.getBlockX() || to.getBlockY() != from.getBlockY() || to.getBlockZ() != from.getBlockZ() || to.getYaw() != from.getYaw() || to.getPitch() != from.getPitch()) this.player.resetIdleTimer(); // Purpur -+ - // Skip the first time we do this - if (true) { // Spigot - don't skip any move events - Location oldTo = to.clone(); -@@ -1378,7 +1386,7 @@ public class PlayerConnection implements PacketListenerPlayIn { - - if (!this.player.H() && d11 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.playerInteractManager.isCreative() && this.player.playerInteractManager.getGameMode() != EnumGamemode.SPECTATOR) { // Spigot - flag1 = true; -- PlayerConnection.LOGGER.warn("{} moved wrongly!", this.player.getDisplayName().getString()); -+ PlayerConnection.LOGGER.warn("{} moved wrongly! ({})", this.player.getDisplayName().getString(), d11); // Purpur - } - - this.player.setLocation(d4, d5, d6, f, f1); -@@ -1417,6 +1425,8 @@ public class PlayerConnection implements PacketListenerPlayIn { - this.lastYaw = to.getYaw(); - this.lastPitch = to.getPitch(); - -+ if (!to.getWorld().getUID().equals(from.getWorld().getUID()) || to.getBlockX() != from.getBlockX() || to.getBlockY() != from.getBlockY() || to.getBlockZ() != from.getBlockZ() || to.getYaw() != from.getYaw() || to.getPitch() != from.getPitch()) this.player.resetIdleTimer(); // Purpur -+ - // Skip the first time we do this - if (from.getX() != Double.MAX_VALUE) { - Location oldTo = to.clone(); -diff --git a/src/main/java/net/minecraft/world/entity/IEntitySelector.java b/src/main/java/net/minecraft/world/entity/IEntitySelector.java -index f5e32faeb6d937cf90b1f3ea251b5cfc91f2338d..f9908fb7cc27a8947030c2100dccf1dc1a4e24f7 100644 ---- a/src/main/java/net/minecraft/world/entity/IEntitySelector.java -+++ b/src/main/java/net/minecraft/world/entity/IEntitySelector.java -@@ -15,6 +15,7 @@ import net.minecraft.world.scores.ScoreboardTeamBase; - public final class IEntitySelector { - - public static final Predicate a = Entity::isAlive; -+ public static Predicate isLivingAlive() { return b; } // Purpur - OBFHELPER - public static final Predicate b = EntityLiving::isAlive; - public static final Predicate c = (entity) -> { - return entity.isAlive() && !entity.isVehicle() && !entity.isPassenger(); -@@ -35,6 +36,7 @@ public final class IEntitySelector { - return !entity.isSpectator(); - }; - public static Predicate isInsomniac = (player) -> MathHelper.clamp(((EntityPlayer) player).getStatisticManager().getStatisticValue(StatisticList.CUSTOM.get(StatisticList.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= 72000; // Paper -+ public static Predicate notAfk = (player) -> !player.isAfk(); // Purpur - - // Paper start - public static final Predicate affectsSpawning = (entity) -> { -diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java -index c39c50e53549e9cb9d3520bc7e8b7e89cfa20163..1d4021049bba4b8b23cf40d252ba2dd0b55c15ae 100644 ---- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java -+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java -@@ -181,6 +181,15 @@ public abstract class EntityHuman extends EntityLiving { - } - // CraftBukkit end - -+ // Purpur start -+ public void setAfk(boolean setAfk){ -+ } -+ -+ public boolean isAfk() { -+ return false; -+ } -+ // Purpur end -+ - public EntityHuman(World world, BlockPosition blockposition, float f, GameProfile gameprofile) { - super(EntityTypes.PLAYER, world); - this.bL = ItemStack.b; -diff --git a/src/main/java/net/minecraft/world/level/IEntityAccess.java b/src/main/java/net/minecraft/world/level/IEntityAccess.java -index 1ff9e771788a4ab52129070e355ca48df2949470..d7fc4756d14ed0360c6fb09048dc0052d1e61a1f 100644 ---- a/src/main/java/net/minecraft/world/level/IEntityAccess.java -+++ b/src/main/java/net/minecraft/world/level/IEntityAccess.java -@@ -173,28 +173,18 @@ public interface IEntityAccess { - } - // Paper end - -- default boolean isPlayerNearby(double d0, double d1, double d2, double d3) { -- Iterator iterator = this.getPlayers().iterator(); -- -- double d4; -- -- do { -- EntityHuman entityhuman; -- -- do { -- do { -- if (!iterator.hasNext()) { -- return false; -- } -- -- entityhuman = (EntityHuman) iterator.next(); -- } while (!IEntitySelector.g.test(entityhuman)); -- } while (!IEntitySelector.b.test(entityhuman)); -- -- d4 = entityhuman.h(d0, d1, d2); -- } while (d3 >= 0.0D && d4 >= d3 * d3); -- -- return true; -+ // Purpur start -+ default boolean isPlayerNearby(double x, double y, double z, double distance) { -+ double distanceSq = distance * distance; -+ for (EntityHuman player : getPlayers()) { -+ if (IEntitySelector.notSpectator().test(player) && IEntitySelector.isLivingAlive().test(player) && IEntitySelector.notAfk.test(player)) { -+ if (distance < 0.0D || player.getDistanceSquared(x, y, z) < distanceSq) { -+ return true; -+ } -+ } -+ } -+ return false; -+ // Purpur end - } - - @Nullable -diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 2f329bae9f09d0ed21a4538fba6b95919ec35887..95b55fb93049c6686e13aab78ba1ae2b2fd5785b 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -1,6 +1,7 @@ - package net.pl3x.purpur; - - import com.google.common.base.Throwables; -+import net.minecraft.locale.LocaleLanguage; - import net.minecraft.server.MinecraftServer; - import net.pl3x.purpur.command.PurpurCommand; - import org.bukkit.Bukkit; -@@ -129,6 +130,15 @@ public class PurpurConfig { - return config.getString(path, config.getString(path)); - } - -+ public static String afkBroadcastAway = "§e§o%s is now AFK"; -+ public static String afkBroadcastBack = "§e§o%s is no longer AFK"; -+ public static String afkTabListPrefix = "[AFK] "; -+ private static void messages() { -+ afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); -+ afkBroadcastBack = getString("settings.messages.afk-broadcast-back", afkBroadcastBack); -+ afkTabListPrefix = getString("settings.messages.afk-tab-list-prefix", afkTabListPrefix); -+ } -+ - public static String timingsUrl = "https://timings.pl3x.net"; - private static void timingsSettings() { - timingsUrl = getString("settings.timings.url", timingsUrl); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 361f7857e461578e90cb71e15027dadaf794cb69..2578a4677d1ee060f687be531e696b7c7be89e84 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -56,4 +56,15 @@ public class PurpurWorldConfig { - PurpurConfig.config.addDefault("world-settings.default." + path, def); - return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path)); - } -+ -+ public boolean idleTimeoutKick = true; -+ public boolean idleTimeoutTickNearbyEntities = true; -+ public boolean idleTimeoutCountAsSleeping = false; -+ public boolean idleTimeoutUpdateTabList = false; -+ private void playerIdleTimeoutSettings() { -+ idleTimeoutKick = getBoolean("gameplay-mechanics.player.idle-timeout.kick-if-idle", idleTimeoutKick); -+ idleTimeoutTickNearbyEntities = getBoolean("gameplay-mechanics.player.idle-timeout.tick-nearby-entities", idleTimeoutTickNearbyEntities); -+ idleTimeoutCountAsSleeping = getBoolean("gameplay-mechanics.player.idle-timeout.count-as-sleeping", idleTimeoutCountAsSleeping); -+ idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); -+ } - } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index cfe6898dc373fe55a08acf5c90e200061aa7d0fc..8e36d1dbde5128eea79d321496210065620acebd 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2444,4 +2444,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 5c2eaca0bc63c7880ee928aba6a24761737aa649..2bbbd4a7ae87c2ead3dc2fd5520adfaefe2776b8 100644 ---- a/src/main/java/org/spigotmc/ActivationRange.java -+++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -204,6 +204,7 @@ public class ActivationRange - { - - player.activatedTick = MinecraftServer.currentTick; -+ if (!player.world.purpurConfig.idleTimeoutTickNearbyEntities && player.isAfk()) continue; // Purpur - maxBB = player.getBoundingBox().grow( maxRange, 256, maxRange ); - ActivationType.MISC.boundingBox = player.getBoundingBox().grow( miscActivationRange, 256, miscActivationRange ); - ActivationType.RAIDER.boundingBox = player.getBoundingBox().grow( raiderActivationRange, 256, raiderActivationRange ); diff --git a/patches/server-unmapped/0009-Bring-back-server-name.patch b/patches/server-unmapped/0009-Bring-back-server-name.patch deleted file mode 100644 index a9aa2c383..000000000 --- a/patches/server-unmapped/0009-Bring-back-server-name.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 26 May 2019 15:19:14 -0500 -Subject: [PATCH] Bring back server name - - -diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -index 1fab9b9c7d41a0d2a551096c2c15f741a887fa2d..f33309f4c1ad92960d0634f3f5b8105c284f26a2 100644 ---- a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java -@@ -20,6 +20,7 @@ public class DedicatedServerProperties extends PropertyManager +Date: Thu, 8 Aug 2019 15:29:15 -0500 +Subject: [PATCH] AFK API + + +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index 9f218a4b253fe2ab0e70e871eeee05bb4f0b3fcf..2ddce62629be9fc1af38306ca50ad3e81150f94c 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -1904,8 +1904,54 @@ public class ServerPlayer extends Player { + + public void resetLastActionTime() { + this.lastActionTime = Util.getMillis(); ++ this.setAfk(false); // Purpur + } + ++ // Purpur Start ++ private boolean isAfk = false; ++ ++ @Override ++ public void setAfk(boolean afk) { ++ if (this.isAfk == afk) { ++ return; ++ } ++ ++ String msg = afk ? net.pl3x.purpur.PurpurConfig.afkBroadcastAway : net.pl3x.purpur.PurpurConfig.afkBroadcastBack; ++ ++ net.pl3x.purpur.event.PlayerAFKEvent event = new net.pl3x.purpur.event.PlayerAFKEvent(this.getBukkitEntity(), afk, level.purpurConfig.idleTimeoutKick, msg, !Bukkit.isPrimaryThread()); ++ if (!event.callEvent() || event.shouldKick()) { ++ return; ++ } ++ ++ this.isAfk = afk; ++ ++ if (!afk) { ++ resetLastActionTime(); ++ } ++ ++ msg = event.getBroadcastMsg(); ++ if (msg != null && !msg.isEmpty()) { ++ server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromString(String.format(msg, this.getGameProfile().getName()))); ++ } ++ ++ if (level.purpurConfig.idleTimeoutUpdateTabList) { ++ this.getBukkitEntity().setPlayerListName((afk ? net.pl3x.purpur.PurpurConfig.afkTabListPrefix : "") + this.getName()); ++ } ++ ++ ((ServerLevel) level).updateSleepingPlayerList(); ++ } ++ ++ @Override ++ public boolean isAfk() { ++ return this.isAfk; ++ } ++ ++ @Override ++ public boolean canBeCollidedWith() { ++ return !this.isAfk() && super.canBeCollidedWith(); ++ } ++ // Purpur End ++ + public ServerStatsCounter getStats() { + return this.stats; + } +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index f1ffabb1226e568b64e3aadd695197d0c9742de8..c2d4c8dc38f2bdf376a02b243e1b8fba8b133979 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -391,6 +391,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + } + + if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) (this.server.getPlayerIdleTimeout() * 1000 * 60)) { ++ // Purpur start ++ this.player.setAfk(true); ++ if (!this.player.level.purpurConfig.idleTimeoutKick) { ++ return; ++ } ++ // Purpur end + this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 + this.disconnect(new TranslatableComponent("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause + } +@@ -649,6 +655,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + this.lastYaw = to.getYaw(); + this.lastPitch = to.getPitch(); + ++ if (!to.getWorld().getUID().equals(from.getWorld().getUID()) || to.getBlockX() != from.getBlockX() || to.getBlockY() != from.getBlockY() || to.getBlockZ() != from.getBlockZ() || to.getYaw() != from.getYaw() || to.getPitch() != from.getPitch()) this.player.resetLastActionTime(); // Purpur ++ + // Skip the first time we do this + if (true) { // Spigot - don't skip any move events + Location oldTo = to.clone(); +@@ -1394,7 +1402,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + + if (!this.player.isChangingDimension() && d11 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot + flag1 = true; +- ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!", this.player.getName().getString()); ++ ServerGamePacketListenerImpl.LOGGER.warn("{} moved wrongly!, ({})", this.player.getName().getString(), d11); // Purpur + } + + this.player.absMoveTo(d0, d1, d2, f, f1); +@@ -1433,6 +1441,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + this.lastYaw = to.getYaw(); + this.lastPitch = to.getPitch(); + ++ if (!to.getWorld().getUID().equals(from.getWorld().getUID()) || to.getBlockX() != from.getBlockX() || to.getBlockY() != from.getBlockY() || to.getBlockZ() != from.getBlockZ() || to.getYaw() != from.getYaw() || to.getPitch() != from.getPitch()) this.player.resetLastActionTime(); // Purpur ++ + // Skip the first time we do this + if (from.getX() != Double.MAX_VALUE) { + Location oldTo = to.clone(); +diff --git a/src/main/java/net/minecraft/server/players/SleepStatus.java b/src/main/java/net/minecraft/server/players/SleepStatus.java +index 823efad652d8ff9e96b99375b102fef6f017716e..60f89d7c77a5e792e21e93e35ed1670bd565799a 100644 +--- a/src/main/java/net/minecraft/server/players/SleepStatus.java ++++ b/src/main/java/net/minecraft/server/players/SleepStatus.java +@@ -19,7 +19,7 @@ public class SleepStatus { + + public boolean areEnoughDeepSleeping(int percentage, List players) { + // CraftBukkit start +- int j = (int) players.stream().filter((eh) -> { return eh.isSleepingLongEnough() || eh.fauxSleeping; }).count(); ++ int j = (int) players.stream().filter((eh) -> { return eh.isSleepingLongEnough() || eh.fauxSleeping || (eh.level.purpurConfig.idleTimeoutCountAsSleeping && eh.isAfk()); }).count(); // Purpur + boolean anyDeepSleep = players.stream().anyMatch(Player::isSleepingLongEnough); + + return anyDeepSleep && j >= this.sleepersNeeded(percentage); +@@ -52,7 +52,7 @@ public class SleepStatus { + + if (!entityplayer.isSpectator()) { + ++this.activePlayers; +- if (entityplayer.isSleeping() || entityplayer.fauxSleeping) { // CraftBukkit ++ if ((entityplayer.isSleeping() || entityplayer.fauxSleeping) || (entityplayer.level.purpurConfig.idleTimeoutCountAsSleeping && entityplayer.isAfk())) { // CraftBukkit // Purpur + ++this.sleepingPlayers; + } + // CraftBukkit start +diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java +index a060cca08631fb42041e3a79a9abc422fe7757af..e7b11d1ba984ea14f0cdf8e84f9eaab46b3f1684 100644 +--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java ++++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java +@@ -27,6 +27,7 @@ public final class EntitySelector { + return !entity.isSpectator(); + }; + public static Predicate isInsomniac = (player) -> net.minecraft.util.Mth.clamp(((net.minecraft.server.level.ServerPlayer) player).getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= 72000; // Paper ++ public static Predicate notAfk = (player) -> !player.isAfk(); // Purpur + + private EntitySelector() {} + // Paper start +diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java +index 20b286fc905fa77f0d862305b73f3f74f73cfccd..1c99b930003dcf6e0b20a150dbb13f3391dd20c8 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Player.java ++++ b/src/main/java/net/minecraft/world/entity/player/Player.java +@@ -193,6 +193,15 @@ public abstract class Player extends LivingEntity { + } + // CraftBukkit end + ++ // Purpur start ++ public void setAfk(boolean afk) { ++ } ++ ++ public boolean isAfk() { ++ return false; ++ } ++ // Purpur end ++ + public Player(Level world, BlockPos pos, float yaw, GameProfile profile) { + super(EntityType.PLAYER, world); + this.lastItemInMainHand = ItemStack.EMPTY; +diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java +index b0cafe6e0bdb3f297c13f310fdbe9e3158a6715d..2d953133a7e15699952ec0f8a7dc00c91ed32e03 100644 +--- a/src/main/java/net/minecraft/world/level/EntityGetter.java ++++ b/src/main/java/net/minecraft/world/level/EntityGetter.java +@@ -146,7 +146,7 @@ public interface EntityGetter { + + default boolean hasNearbyAlivePlayer(double x, double y, double z, double range) { + for(Player player : this.players()) { +- if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) { ++ if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player) && EntitySelector.notAfk.test(player)) { + double d = player.distanceToSqr(x, y, z); + if (range < 0.0D || d < range * range) { + return true; +diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java +index 7e0c9505427f58df767ab44f18bec66212b7dd57..5842f8fad24c08cb001a192bf36de690fd14cd32 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java +@@ -128,6 +128,15 @@ public class PurpurConfig { + return config.getString(path, config.getString(path)); + } + ++ public static String afkBroadcastAway = "§e§o%s is now AFK"; ++ public static String afkBroadcastBack = "§e§o%s is no longer AFK"; ++ public static String afkTabListPrefix = "[AFK] "; ++ private static void messages() { ++ afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); ++ afkBroadcastBack = getString("settings.messages.afk-broadcast-back", afkBroadcastBack); ++ afkTabListPrefix = getString("settings.messages.afk-tab-list-prefix", afkTabListPrefix); ++ } ++ + public static String timingsUrl = "https://timings.pl3x.net"; + private static void timingsSettings() { + timingsUrl = getString("settings.timings.url", timingsUrl); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 361f7857e461578e90cb71e15027dadaf794cb69..2578a4677d1ee060f687be531e696b7c7be89e84 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -56,4 +56,15 @@ public class PurpurWorldConfig { + PurpurConfig.config.addDefault("world-settings.default." + path, def); + return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path)); + } ++ ++ public boolean idleTimeoutKick = true; ++ public boolean idleTimeoutTickNearbyEntities = true; ++ public boolean idleTimeoutCountAsSleeping = false; ++ public boolean idleTimeoutUpdateTabList = false; ++ private void playerIdleTimeoutSettings() { ++ idleTimeoutKick = getBoolean("gameplay-mechanics.player.idle-timeout.kick-if-idle", idleTimeoutKick); ++ idleTimeoutTickNearbyEntities = getBoolean("gameplay-mechanics.player.idle-timeout.tick-nearby-entities", idleTimeoutTickNearbyEntities); ++ idleTimeoutCountAsSleeping = getBoolean("gameplay-mechanics.player.idle-timeout.count-as-sleeping", idleTimeoutCountAsSleeping); ++ idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); ++ } + } +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index a210ce9438455e3bf15e189fb5aea8f23dc9aae0..391d7ebe71b7e741f058566cc5cdb9bb6a5a879a 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -2446,4 +2446,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + return this.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().resetLastActionTime(); ++ } ++ // Purpur end + } +diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java +index a08583863f9fa08016bdfc7949a273eaa4429927..f36c97529edbd3642d0ba37887a232226f766a35 100644 +--- a/src/main/java/org/spigotmc/ActivationRange.java ++++ b/src/main/java/org/spigotmc/ActivationRange.java +@@ -194,6 +194,7 @@ public class ActivationRange + { + + player.activatedTick = MinecraftServer.currentTick; ++ if (!player.level.purpurConfig.idleTimeoutTickNearbyEntities && player.isAfk()) continue; // Purpur + ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, 256, maxRange ); + ActivationType.MISC.boundingBox = player.getBoundingBox().inflate( miscActivationRange, 256, miscActivationRange ); + ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate( raiderActivationRange, 256, raiderActivationRange ); diff --git a/patches/server/0008-Bring-back-server-name.patch b/patches/server/0008-Bring-back-server-name.patch new file mode 100644 index 000000000..27e038571 --- /dev/null +++ b/patches/server/0008-Bring-back-server-name.patch @@ -0,0 +1,34 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 26 May 2019 15:19:14 -0500 +Subject: [PATCH] Bring back server name + + +diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java +index c9d80a5430cc66d6189bf337770af43121a5bfd5..329336d413317388455fbbf03036cee13186b00d 100644 +--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java ++++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServerProperties.java +@@ -18,6 +18,7 @@ public class DedicatedServerProperties extends Settings