From 1c18834b7d25fdd79ff8481da94437b4073400e0 Mon Sep 17 00:00:00 2001 From: Travis Watkins Date: Thu, 11 Apr 2013 18:28:15 -0500 Subject: [PATCH] Use wall time instead of ticks for several things. Fixes BUKKIT-4059 Currently furnace smelting and the item pickup delay timer use wall time (aka actual time passed) to emulate a constant tick rate so run at the same speed regardless of the server's actual tick rate. There are several other places this makes sense so this commit converts them. The item despawn timer is converted so now always takes 5 minutes. Users know this 5 minute number well so keeping this constant helps to avoid confusion. This also helps alleviate lag because if a large number of item drops is the reason your server is running slowly having them stay around longer just means your server is slow longer. Potion brewing and the zombie villager conversion timer are now constant. These match the furnace criteria of being useful for hiding lag and not having a detrimental effect on gameplay. Potion effects are now also using wall time. The client is told about effect times in ticks and displays this information to the user as minutes and seconds assuming a solid 20 ticks per second. The server does have code for updating the client with the current time remaining to help avoid skew due to differing tick rates but making this a constant makes sense due to this display. --- src/main/java/net/minecraft/server/EntityItem.java | 13 +++++++------ .../java/net/minecraft/server/EntityZombie.java | 7 +++++++ .../java/net/minecraft/server/MinecraftServer.java | 2 +- src/main/java/net/minecraft/server/MobEffect.java | 9 ++++++++- .../net/minecraft/server/PlayerInteractManager.java | 4 ++-- .../minecraft/server/TileEntityBrewingStand.java | 10 ++++++++-- .../net/minecraft/server/TileEntityFurnace.java | 9 ++++----- 7 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java index ee775bf740..a28d233d49 100644 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ b/src/main/java/net/minecraft/server/EntityItem.java @@ -10,7 +10,7 @@ public class EntityItem extends Entity { public int pickupDelay; private int d; public float c; - private int lastTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + private int lastTick = MinecraftServer.currentTick; // CraftBukkit public EntityItem(World world, double d0, double d1, double d2) { super(world); @@ -55,10 +55,11 @@ public class EntityItem extends Entity { public void l_() { super.l_(); - // CraftBukkit start - int currentTick = (int) (System.currentTimeMillis() / 50); - this.pickupDelay -= (currentTick - this.lastTick); - this.lastTick = currentTick; + // CraftBukkit start - Use wall time for pickup and despawn timers + int elapsedTicks = Math.max(1, MinecraftServer.currentTick - this.lastTick); + this.pickupDelay -= elapsedTicks; + this.age += elapsedTicks; + this.lastTick = MinecraftServer.currentTick; // CraftBukkit end this.lastX = this.locX; @@ -100,7 +101,7 @@ public class EntityItem extends Entity { this.motY *= -0.5D; } - ++this.age; + // ++this.age; // CraftBukkit - Moved up if (!this.world.isStatic && this.age >= 6000) { // CraftBukkit start if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java index b8a7c07ef2..0da473ba81 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -10,6 +10,7 @@ import org.bukkit.event.entity.EntityCombustEvent; public class EntityZombie extends EntityMonster { private int d = 0; + private int lastTick = MinecraftServer.currentTick; // CraftBukkit public EntityZombie(World world) { super(world); @@ -119,6 +120,12 @@ public class EntityZombie extends EntityMonster { if (!this.world.isStatic && this.o()) { int i = this.q(); + // CraftBukkit start - Use wall time instead of ticks for villager conversion + int elapsedTicks = Math.max(1, MinecraftServer.currentTick - this.lastTick); + this.lastTick = MinecraftServer.currentTick; + i *= elapsedTicks; + // CraftBukkit end + this.d -= i; if (this.d <= 0) { this.p(); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 64d588257d..3ee8ddc9ab 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -78,7 +78,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo public org.bukkit.command.ConsoleCommandSender console; public org.bukkit.command.RemoteConsoleCommandSender remoteConsole; public ConsoleReader reader; - public static int currentTick; + public static int currentTick = (int) (System.currentTimeMillis() / 50); public final Thread primaryThread; public java.util.Queue processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; diff --git a/src/main/java/net/minecraft/server/MobEffect.java b/src/main/java/net/minecraft/server/MobEffect.java index 726a447a69..2ba51cfebe 100644 --- a/src/main/java/net/minecraft/server/MobEffect.java +++ b/src/main/java/net/minecraft/server/MobEffect.java @@ -7,6 +7,7 @@ public class MobEffect { private int amplification; private boolean splash; private boolean ambient; + private int lastTick = MinecraftServer.currentTick; // CraftBukkit public MobEffect(int i, int j) { this(i, j, 0); @@ -81,7 +82,13 @@ public class MobEffect { } private int h() { - return --this.duration; + // CraftBukkit start - Use wall time instead of ticks for potion effects + int elapsedTicks = Math.max(1, MinecraftServer.currentTick - this.lastTick); + this.lastTick = MinecraftServer.currentTick; + this.duration -= elapsedTicks; + + return this.duration; + // CraftBukkit end } public void b(EntityLiving entityliving) { diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java index 91bed162c9..d03174b386 100644 --- a/src/main/java/net/minecraft/server/PlayerInteractManager.java +++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java @@ -55,7 +55,7 @@ public class PlayerInteractManager { } public void a() { - this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + this.currentTick = MinecraftServer.currentTick; // CraftBukkit int i; float f; int j; @@ -189,7 +189,7 @@ public class PlayerInteractManager { public void a(int i, int j, int k) { if (i == this.f && j == this.g && k == this.h) { - this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + this.currentTick = MinecraftServer.currentTick; // CraftBukkit int l = this.currentTick - this.lastDigTick; int i1 = this.world.getTypeId(i, j, k); diff --git a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java index be1145f7fe..e362c26d01 100644 --- a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java +++ b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java @@ -17,6 +17,7 @@ public class TileEntityBrewingStand extends TileEntity implements IWorldInventor private int e; private int f; private String g; + private int lastTick = MinecraftServer.currentTick; // CraftBukkit public TileEntityBrewingStand() {} @@ -62,9 +63,14 @@ public class TileEntityBrewingStand extends TileEntity implements IWorldInventor } public void h() { + // CraftBukkit start - Use wall time instead of ticks for brewing + int elapsedTicks = Math.max(1, MinecraftServer.currentTick - this.lastTick); + this.lastTick = MinecraftServer.currentTick; + if (this.brewTime > 0) { - --this.brewTime; - if (this.brewTime == 0) { + this.brewTime -= elapsedTicks; + if (this.brewTime <= 0) { // == -> <= + // CraftBukkit end this.u(); this.update(); } else if (!this.l()) { diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java index e6cd7f9e8b..05a07b93d4 100644 --- a/src/main/java/net/minecraft/server/TileEntityFurnace.java +++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java @@ -22,7 +22,7 @@ public class TileEntityFurnace extends TileEntity implements IWorldInventory { private String h; // CraftBukkit start - private int lastTick = (int) (System.currentTimeMillis() / 50); + private int lastTick = MinecraftServer.currentTick; private int maxStack = MAX_STACK; public List transaction = new java.util.ArrayList(); @@ -165,10 +165,9 @@ public class TileEntityFurnace extends TileEntity implements IWorldInventory { boolean flag = this.burnTime > 0; boolean flag1 = false; - // CraftBukkit start - int currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - int elapsedTicks = currentTick - this.lastTick; - this.lastTick = currentTick; + // CraftBukkit start - Use wall time instead of ticks for cooking + int elapsedTicks = Math.max(1, MinecraftServer.currentTick - this.lastTick); + this.lastTick = MinecraftServer.currentTick; // CraftBukkit - moved from below if (this.isBurning() && this.canBurn()) {