From 86c467cb50c3fabf48838b0d5c213e277fc49a8d Mon Sep 17 00:00:00 2001 From: sk89q Date: Mon, 11 Apr 2011 11:48:31 -0700 Subject: [PATCH] Fixin' the problem of AFK people not in bed. --- .../net/minecraft/server/EntityHuman.java | 1 + src/main/java/net/minecraft/server/World.java | 28 +++++++++++++++++-- .../craftbukkit/entity/CraftPlayer.java | 9 ++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java index 84631ee276..50835358ff 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -37,6 +37,7 @@ public abstract class EntityHuman extends EntityLiving { public double y; // CraftBukkit start public boolean sleeping; + public boolean fauxSleeping; // CraftBukkit end private ChunkCoordinates b; // CraftBukkit start diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 7686f62b6a..28f24db1a7 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -1808,13 +1808,25 @@ public class World implements IBlockAccess { while (iterator.hasNext()) { EntityHuman entityhuman = (EntityHuman) iterator.next(); - if (!entityhuman.F()) { + // CraftBukkit start + if (!entityhuman.F() && !entityhuman.fauxSleeping) { + // CraftBukkit end this.A = false; break; } } } + // CraftBukkit start + // Calls the method that checks to see if players are sleeping + // Called by CraftPlayer.setPermanentSleeping() + public void checkSleepStatus() { + if (!isStatic) { + q(); + } + } + // CraftBukkit end + protected void r() { this.A = false; Iterator iterator = this.d.iterator(); @@ -1831,16 +1843,26 @@ public class World implements IBlockAccess { public boolean s() { if (this.A && !this.isStatic) { Iterator iterator = this.d.iterator(); + + // CraftBukkit start + boolean foundActualSleepers = false; + + // This allows us to assume that some people are in bed + // but not really, allowing time to pass in spite of AFKers EntityHuman entityhuman; do { if (!iterator.hasNext()) { - return true; + return foundActualSleepers; } entityhuman = (EntityHuman) iterator.next(); - } while (entityhuman.G()); + if (entityhuman.G()) { + foundActualSleepers = true; + } + } while (entityhuman.G() || entityhuman.fauxSleeping); + // CraftBukkit end return false; } else { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 276939ca3d..d66e4eb2d8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -212,4 +212,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void updateInventory() { getHandle().m(); } + + public void setSleepingIgnored(boolean isSleeping) { + getHandle().fauxSleeping = isSleeping; + ((CraftWorld)getWorld()).getHandle().checkSleepStatus(); + } + + public boolean isSleepingIgnored() { + return getHandle().fauxSleeping; + } }