11package xyz .nucleoid .fantasy ;
22
33import com .google .common .collect .ImmutableList ;
4- import net .minecraft .core .Holder ;
5- import net .minecraft .core .Registry ;
6- import net .minecraft .core .registries .Registries ;
74import net .minecraft .resources .ResourceKey ;
85import net .minecraft .server .MinecraftServer ;
96import net .minecraft .server .level .ServerLevel ;
107import net .minecraft .util .ProgressListener ;
118import net .minecraft .util .Util ;
12- import net .minecraft .util .profiling .Profiler ;
13- import net .minecraft .world .clock .WorldClock ;
9+ import net .minecraft .world .clock .ServerClockManager ;
1410import net .minecraft .world .level .CustomSpawner ;
1511import net .minecraft .world .level .Level ;
1612import net .minecraft .world .level .biome .BiomeManager ;
17- import net .minecraft .world .level .dimension .DimensionType ;
1813import net .minecraft .world .level .dimension .LevelStem ;
1914import net .minecraft .world .level .gamerules .GameRules ;
2015import net .minecraft .world .level .storage .LevelStorageSource ;
2116import net .minecraft .world .level .storage .ServerLevelData ;
22- import net .minecraft .world .timeline .Timeline ;
23- import org .jetbrains .annotations .ApiStatus ;
2417import org .jetbrains .annotations .Nullable ;
2518import xyz .nucleoid .fantasy .mixin .MinecraftServerAccess ;
2619
2720import java .util .List ;
2821import java .util .concurrent .Executor ;
2922
30- import static xyz .nucleoid .fantasy .RuntimeServerClockManager .*;
31-
3223public class RuntimeLevel extends ServerLevel {
3324 final Style style ;
3425 private boolean flat ;
3526 @ Nullable
36- private GameRules rules ;
37- @ ApiStatus .Internal
38- public final Holder <WorldClock > worldClock ;
39- @ ApiStatus .Internal
40- public final Holder <Timeline > timeline ;
27+ private final GameRules rules ;
28+ @ Nullable
29+ private final ServerClockManager clockManager ;
4130
4231 protected RuntimeLevel (MinecraftServer server , ResourceKey <Level > dimension , RuntimeLevelConfig config , Style style ) {
43- Registry <WorldClock > worldClockRegistry = server .registryAccess ()
44- .lookupOrThrow (Registries .WORLD_CLOCK );
45- Registry <Timeline > timelineRegistry = server .registryAccess ()
46- .lookupOrThrow (Registries .TIMELINE );
47- Holder <WorldClock > worldClock ;
48- Holder <Timeline > timeline ;
49-
50- try (var _ = RemoveFromRegistry .thaw (worldClockRegistry ); var _ = RemoveFromRegistry .thaw (timelineRegistry )) {
51- if (worldClockRegistry .containsKey (dimension .identifier ())) {
52- worldClock = worldClockRegistry .getOrThrow (ResourceKey .create (Registries .WORLD_CLOCK , dimension .identifier ()));
53- } else {
54- worldClock = Registry .registerForHolder (
55- worldClockRegistry ,
56- dimension .identifier (),
57- new WorldClock ()
58- );
59- }
60-
61- if (timelineRegistry .containsKey (dimension .identifier ())) {
62- timeline = timelineRegistry .getOrThrow (ResourceKey .create (Registries .TIMELINE , dimension .identifier ()));
63- } else {
64- timeline = Registry .registerForHolder (
65- timelineRegistry ,
66- dimension .identifier (),
67- RuntimeServerClockManager .createDefaultTimeline (timelineRegistry , worldClock )
68- );
69- }
32+ LevelStem dimensionOptions = config .createDimensionOptions (server );
33+ GameRules gameRules = null ;
34+ if (!config .shouldMirrorOverworldGameRules ()) {
35+ gameRules = new GameRules (server .getWorldData ().enabledFeatures ());
36+ config .getGameRules ().applyTo (gameRules , null );
37+ } else {
38+ gameRules = null ;
7039 }
7140
72- LevelStem dimensionOptions = config .createDimensionOptions (server );
73- DimensionType dimensionType = dimensionOptions .type ().value ();
74- WORLD_CLOCKS .add (worldClock );
75- DIMENSION_TYPE_2_WORLD_CLOCKS .put (dimensionType , worldClock );
76- WORLD_CLOCKS_2_LEVEL .put (worldClock , dimension );
77- @ SuppressWarnings ("unchecked" ) // Always the same, correct type
78- Holder <Timeline >[] timelines = dimensionType .timelines ().stream ()
79- .map (holder -> {
80- if (holder .is (Fantasy .DEFAULT_TIMELINE )) {
81- return timeline ;
82- } else {
83- return holder ;
84- }
85- })
86- .toArray (Holder []::new );
87- DIMENSION_TYPE_2_TIMELINES .put (dimensionType , timelines );
41+ this .clockManager = config .getClockManager (server , gameRules != null ? gameRules : server .getGameRules ());
42+ this .style = style ;
43+
8844 super (
8945 server , Util .backgroundExecutor (), ((MinecraftServerAccess ) server ).getStorageSource (),
9046 new RuntimeLevelData (server .getWorldData (), config ),
@@ -95,29 +51,17 @@ protected RuntimeLevel(MinecraftServer server, ResourceKey<Level> dimension, Run
9551 ImmutableList .of (),
9652 config .shouldTickTime ()
9753 );
98- this .style = style ;
9954 this .flat = config .isFlat ().orElse (super .isFlat ());
100- this .worldClock = worldClock ;
101- this .timeline = timeline ;
102- this .clockManager ().registerClock (
103- this .worldClock ,
104- this .timeline ,
105- this .style .equals (Style .TEMPORARY )
106- );
107- this .clockManager ().unloadedClocks .remove (this .worldClock );
108- this .getRuntimeLevelData ().setGameTime (this .clockManager ().getTotalTicks (this .worldClock ) % this .timeline .value ().periodTicks ().orElse (24000 ));
109-
110- if (!config .shouldMirrorOverworldGameRules ()) {
111- this .rules = new GameRules (server .getWorldData ().enabledFeatures ());
112- config .getGameRules ().applyTo (this .rules , null );
113- }
55+ this .rules = gameRules ;
11456 }
11557
116- protected RuntimeLevel (MinecraftServer server , Executor executor , LevelStorageSource .LevelStorageAccess levelStorage , ServerLevelData levelData , ResourceKey <Level > dimension , LevelStem levelStem , boolean isDebug , long biomeZoomSeed , List <CustomSpawner > customSpawners , boolean tickTime , Style style , Holder <WorldClock > worldClock , Holder <Timeline > timeline ) {
117- super (server , executor , levelStorage , levelData , dimension , levelStem , isDebug , biomeZoomSeed , customSpawners , tickTime );
58+ protected RuntimeLevel (MinecraftServer server , Executor executor , LevelStorageSource .LevelStorageAccess levelStorage , ServerLevelData levelData , ResourceKey <Level > dimension ,
59+ LevelStem levelStem , boolean isDebug , long biomeZoomSeed , List <CustomSpawner > customSpawners , boolean tickTime , Style style ,
60+ @ Nullable GameRules gameRules , @ Nullable ServerClockManager clockManager ) {
11861 this .style = style ;
119- this .worldClock = worldClock ;
120- this .timeline = timeline ;
62+ this .rules = gameRules ;
63+ this .clockManager = clockManager ;
64+ super (server , executor , levelStorage , levelData , dimension , levelStem , isDebug , biomeZoomSeed , customSpawners , tickTime );
12165 }
12266
12367 @ Override
@@ -135,12 +79,9 @@ public long getSeed() {
13579
13680 @ Override
13781 protected void tickTime () {
138- if (this .tickTime ) {
139- long time = this .getRuntimeLevelData ().getGameTime () + 1L ;
140- this .getRuntimeLevelData ().setGameTime (time );
141- Profiler .get ().push ("scheduledFunctions" );
142- this .getServer ().getScheduledEvents ().tick (this .getServer (), time );
143- Profiler .get ().pop ();
82+ this .getRuntimeLevelData ().setGameTime (this .getServer ().overworld ().getGameTime ());
83+ if (this .tickTime && this .clockManager instanceof RuntimeClockManager clockManager ) {
84+ clockManager .tickFromLevel (this );
14485 }
14586 }
14687
@@ -161,8 +102,8 @@ private RuntimeLevelData getRuntimeLevelData() {
161102 }
162103
163104 @ Override
164- public RuntimeServerClockManager clockManager () {
165- return (( MinecraftServerExtension ) this .getServer ()). fantasy$ clockManager ();
105+ public ServerClockManager clockManager () {
106+ return this . clockManager != null ? this .clockManager : super . clockManager ();
166107 }
167108
168109 public enum Style {
0 commit comments