Skip to content

Commit 00777fd

Browse files
committed
Fix per-player time
1 parent 697c8ac commit 00777fd

13 files changed

Lines changed: 98 additions & 102 deletions

File tree

paper-api/src/main/java/org/bukkit/World.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,10 +2091,8 @@ default boolean setSpawnLocation(int x, int y, int z) {
20912091
*
20922092
* @param time The new absolute time to set this world to
20932093
* @see #setTime(long) Sets the relative time of this world
2094-
* @deprecated all overworlds share the same world clock by default now
20952094
* @throws IllegalArgumentException if this world does not have a world clock (e.g. the nether)
20962095
*/
2097-
@Deprecated // TODO world clock API with links to it
20982096
public void setFullTime(long time);
20992097

21002098
// Paper start

paper-api/src/main/java/org/bukkit/event/world/ClockTimeSkipEvent.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* If the event is cancelled the time will not change.
1313
*/
1414
// TODO - snapshot - 26.1 clock
15+
@ApiStatus.Experimental
1516
public class ClockTimeSkipEvent extends Event implements Cancellable {
1617

1718
private static final HandlerList HANDLER_LIST = new HandlerList();

paper-api/src/main/java/org/bukkit/event/world/TimeSkipEvent.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* Called when the time skips in a world.
1010
* <p>
1111
* If the event is cancelled the time will not change.
12+
*
13+
* @see ClockTimeSkipEvent for changing of clocks that affect all worlds
1214
*/
1315
public class TimeSkipEvent extends ClockTimeSkipEvent {
1416

paper-server/patches/features/0001-Moonrise-optimisation-patches.patch

Lines changed: 32 additions & 32 deletions
Large diffs are not rendered by default.

paper-server/patches/features/0016-Add-Alternate-Current-redstone-implementation.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2326,18 +2326,18 @@ index 0000000000000000000000000000000000000000..298076a0db4e6ee6e4775ac43bf749d9
23262326
+ }
23272327
+}
23282328
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
2329-
index 3741607fa3ba755b3a9983ced08460053b75e17f..5a911cc98faeb2db6eaf0d48cc5ff3c1f68f0a84 100644
2329+
index f1341c78e90e0f7d6d2b27e6fff57bf6999f7176..12e6162e82dd639ac34da6466fc201623f4682c5 100644
23302330
--- a/net/minecraft/server/level/ServerLevel.java
23312331
+++ b/net/minecraft/server/level/ServerLevel.java
23322332
@@ -233,6 +233,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
2333-
private ServerClockManager clockManager;
2333+
private @Nullable ServerClockManager clockManager;
23342334
public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent
23352335
public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent
23362336
+ private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current)
23372337

23382338
@Override
23392339
public @Nullable LevelChunk getChunkIfLoaded(int x, int z) {
2340-
@@ -2773,6 +2774,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
2340+
@@ -2772,6 +2773,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
23412341
return this.debugSynchronizers;
23422342
}
23432343

paper-server/patches/features/0029-Optimize-Hoppers.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ index 0000000000000000000000000000000000000000..24a2090e068ad3c0d08705050944abdf
4848
+ }
4949
+}
5050
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
51-
index 789374f3fe5f3730ec5edac248ed7927f8f04abd..f094726677ccef9029680b9de208b71133bbb87d 100644
51+
index a6b3075a8ea38551dd60db363b154f5294b909a7..e07910865a7e1f7278aa924ba09699dceba5c99f 100644
5252
--- a/net/minecraft/server/MinecraftServer.java
5353
+++ b/net/minecraft/server/MinecraftServer.java
54-
@@ -1844,6 +1844,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
54+
@@ -1840,6 +1840,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
5555
level.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent
5656
level.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
5757
level.updateLagCompensationTick(); // Paper - lag compensation

paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,7 @@
10861086
ObjectArrayList<NameAndId> sample = new ObjectArrayList<>(sampleSize);
10871087
int offset = Mth.nextInt(this.random, 0, players.size() - sampleSize);
10881088

1089-
@@ -1104,25 +_,73 @@
1089+
@@ -1104,12 +_,46 @@
10901090
protected void tickChildren(final BooleanSupplier haveTime) {
10911091
ProfilerFiller profiler = Profiler.get();
10921092
this.getPlayerList().getPlayers().forEach(playerx -> playerx.connection.suspendFlushing());
@@ -1134,23 +1134,16 @@
11341134
profiler.pop();
11351135
}
11361136

1137-
if (this.tickCount % 20 == 0) {
1138-
profiler.push("timeSync");
1139-
- this.forceGameTimeSynchronization();
1140-
+ // Paper start - per-world game time
1141-
+ for (final ServerLevel level : this.getAllLevels()) {
1142-
+ this.playerList.broadcastAll(new ClientboundSetTimePacket(level.getGameTime(), Map.of()), level);
1143-
+ }
1144-
+ // Paper end - per-world game time
1137+
@@ -1119,10 +_,20 @@
11451138
profiler.pop();
1146-
+ }
1147-
+
1139+
}
1140+
11481141
+ // CraftBukkit start
11491142
+ // Run tasks that are waiting on processing
11501143
+ while (!this.processQueue.isEmpty()) {
11511144
+ this.processQueue.remove().run();
1152-
}
1153-
1145+
+ }
1146+
+
11541147
profiler.push("levels");
11551148
this.updateEffectiveRespawnData();
11561149

@@ -1187,14 +1180,16 @@
11871180
this.effectiveRespawnData = respawnLevel.getWorldBorderAdjustedRespawnData(respawnData);
11881181
}
11891182

1190-
@@ -1179,7 +_,9 @@
1183+
@@ -1179,7 +_,11 @@
11911184
public void forceGameTimeSynchronization() {
11921185
ProfilerFiller profiler = Profiler.get();
11931186
profiler.push("timeSync");
11941187
- this.playerList.broadcastAll(new ClientboundSetTimePacket(this.overworld().getGameTime(), Map.of()));
1188+
+ // Paper start - per-world time
11951189
+ for (ServerLevel level : this.getAllLevels()) {
11961190
+ this.playerList.broadcastAll(new ClientboundSetTimePacket(level.getGameTime(), Map.of()), level);
11971191
+ }
1192+
+ // Paper end - per-world time
11981193
profiler.pop();
11991194
}
12001195

@@ -1581,7 +1576,7 @@
15811576
+ level.setSpawnSettings(level.isSpawningMonsters()); // Paper - per-world game rules
15821577
} else if (rule == GameRules.ADVANCE_TIME) {
15831578
- this.getPlayerList().broadcastAll(this.clockManager().createFullSyncPacket());
1584-
+ this.getPlayerList().broadcastAll(level.clockManager().createFullSyncPacket(), level); // Paper - per-world time
1579+
+ level.players().forEach(player -> player.connection.send(level.clockManager().createFullSyncPacket(player))); // Paper - per-world time; per-player time
15851580
}
15861581
}
15871582

paper-server/patches/sources/net/minecraft/server/commands/TimeCommand.java.patch

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
long currentTicks = timeline.value().getCurrentTicks(clockManager);
2828
source.sendSuccess(() -> Component.translatable("commands.time.query.timeline", timeline.getRegisteredName(), currentTicks), false);
2929
return wrapTime(currentTicks);
30-
@@ -162,33 +_,47 @@
30+
@@ -162,33 +_,53 @@
3131
if (!clock.equals(timeline.value().clock())) {
3232
throw ERROR_WRONG_TIMELINE_FOR_CLOCK.create(clock.getRegisteredName(), timeline.getRegisteredName());
3333
} else {
@@ -43,14 +43,20 @@
4343
private static int setTotalTicks(final CommandSourceStack source, final Holder<WorldClock> clock, final int totalTicks) {
4444
- ServerClockManager clockManager = source.getServer().clockManager();
4545
- clockManager.setTotalTicks(clock, totalTicks);
46+
- source.sendSuccess(() -> Component.translatable("commands.time.set.absolute", clock.getRegisteredName(), totalTicks), true);
47+
- return totalTicks;
4648
+ ServerClockManager clockManager = source.getLevel().clockManager();
4749
+ long currentTotalTicks = clockManager.getTotalTicks(clock);
4850
+ org.bukkit.event.world.ClockTimeSkipEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callTimeSkipEvent(source, totalTicks - currentTotalTicks);
51+
+ final long newTotalTicks;
4952
+ if (event.callEvent()) {
50-
+ clockManager.setTotalTicks(clock, currentTotalTicks + event.getSkipAmount());
53+
+ newTotalTicks = currentTotalTicks + event.getSkipAmount();
54+
+ clockManager.setTotalTicks(clock, newTotalTicks);
55+
+ } else {
56+
+ newTotalTicks = totalTicks; // just pass it through
5157
+ }
52-
source.sendSuccess(() -> Component.translatable("commands.time.set.absolute", clock.getRegisteredName(), totalTicks), true);
53-
return totalTicks;
58+
+ source.sendSuccess(() -> Component.translatable("commands.time.set.absolute", clock.getRegisteredName(), newTotalTicks), true);
59+
+ return wrapTime(newTotalTicks);
5460
}
5561

5662
private static int addTime(final CommandSourceStack source, final Holder<WorldClock> clock, final int time) {
@@ -69,6 +75,7 @@
6975
private static int setTimeToTimeMarker(final CommandSourceStack source, final Holder<WorldClock> clock, final ResourceKey<ClockTimeMarker> timeMarkerId) throws CommandSyntaxException {
7076
- ServerClockManager clockManager = source.getServer().clockManager();
7177
- if (!clockManager.moveToTimeMarker(clock, timeMarkerId)) {
78+
+ // Paper start - per-world time
7279
+ ServerClockManager clockManager = source.getLevel().clockManager();
7380
+ java.util.OptionalLong targetTime = clockManager.getTotalTicksToTimeMarker(clock, timeMarkerId);
7481
+ if (targetTime.isEmpty()) {
@@ -79,26 +86,23 @@
7986
+ if (event.callEvent()) {
8087
+ clockManager.setTotalTicks(clock, currentTime + event.getSkipAmount());
8188
+ }
89+
+ // Paper end - per-world time
8290
source.sendSuccess(
8391
() -> Component.translatable("commands.time.set.time_marker", clock.getRegisteredName(), timeMarkerId.identifier().toString()), true
8492
);
85-
@@ -197,16 +_,17 @@
93+
@@ -197,13 +_,13 @@
8694
}
8795

8896
private static int setPaused(final CommandSourceStack source, final Holder<WorldClock> clock, final boolean paused) {
8997
- source.getServer().clockManager().setPaused(clock, paused);
90-
+ source.getLevel().clockManager().setPaused(clock, paused);
98+
+ source.getLevel().clockManager().setPaused(clock, paused); // Paper - per-world time
9199
source.sendSuccess(() -> Component.translatable(paused ? "commands.time.pause" : "commands.time.resume", clock.getRegisteredName()), true);
92100
return 1;
93101
}
94102

95103
private static int setRate(final CommandSourceStack source, final Holder<WorldClock> clock, final float rate) {
96104
- source.getServer().clockManager().setRate(clock, rate);
97-
+ source.getLevel().clockManager().setRate(clock, rate);
105+
+ source.getLevel().clockManager().setRate(clock, rate); // Paper - per-world time
98106
source.sendSuccess(() -> Component.translatable("commands.time.rate", clock.getRegisteredName(), rate), true);
99107
return 1;
100108
}
101-
+ // Paper end - per-world time
102-
103-
private static int wrapTime(final long ticks) {
104-
return Math.toIntExact(ticks % 2147483647L);

paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
+ private final WeatherData weatherData;
2323
+ public final net.minecraft.world.level.timers.TimerQueue<net.minecraft.server.MinecraftServer> scheduledEvents;
2424
+ public final WorldGenSettings worldGenSettings;
25-
+ private ServerClockManager clockManager;
25+
+ private @Nullable ServerClockManager clockManager;
2626
+ public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent
2727
+ public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent
2828
+

paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@
746746
WorldBorder worldBorder = level.getWorldBorder();
747747
player.connection.send(new ClientboundInitializeBorderPacket(worldBorder));
748748
- player.connection.send(this.server.clockManager().createFullSyncPacket());
749-
+ player.connection.send(level.clockManager().createFullSyncPacket()); // Paper - per-world time
749+
+ player.connection.send(level.clockManager().createFullSyncPacket(player)); // Paper - per-world time; per-player time
750750
player.connection.send(new ClientboundSetDefaultSpawnPositionPacket(level.getRespawnData()));
751751
+ // Paper start - view distances
752752
+ player.connection.send(new ClientboundSetChunkCacheRadiusPacket(io.papermc.paper.FeatureHooks.getViewDistance(level)));

0 commit comments

Comments
 (0)