diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java index f376bdb8719..f4ab3819368 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java @@ -8,14 +8,17 @@ import net.ess3.api.TranslatableException; import org.bukkit.Server; import org.bukkit.World; +import org.bukkit.entity.Player; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.StringJoiner; import java.util.TreeSet; @@ -82,11 +85,26 @@ public void run(final Server server, final CommandSource sender, final String co final StringJoiner joiner = new StringJoiner(", "); for (final World world : worlds) { + // Capture intended visible time for players with relative ptime before world time changes + final Map ptimePlayers = new HashMap<>(); + for (final Player player : world.getPlayers()) { + if (player.getPlayerTimeOffset() != 0 && player.isPlayerTimeRelative()) { + ptimePlayers.put(player, player.getPlayerTime()); + } + } + long time = world.getTime(); if (!add) { time -= time % 24000; } world.setTime(time + (add ? 0 : 24000) + timeTick); + + // Re-apply ptime offsets so players maintain their intended visible time + final long newWorldTime = world.getTime(); + for (final Map.Entry entry : ptimePlayers.entrySet()) { + entry.getKey().setPlayerTime(entry.getValue() - newWorldTime, true); + } + joiner.add(world.getName()); }