66import com .fastasyncworldedit .core .queue .IChunkGet ;
77import com .fastasyncworldedit .core .queue .implementation .chunk .ChunkCache ;
88import com .google .common .collect .ImmutableList ;
9- import com .mojang .serialization .Lifecycle ;
109import com .sk89q .worldedit .bukkit .BukkitAdapter ;
1110import com .sk89q .worldedit .bukkit .WorldEditPlugin ;
1211import com .sk89q .worldedit .bukkit .adapter .Refraction ;
1312import com .sk89q .worldedit .extent .Extent ;
1413import com .sk89q .worldedit .regions .Region ;
1514import com .sk89q .worldedit .util .io .file .SafeFiles ;
1615import com .sk89q .worldedit .world .RegenOptions ;
16+ import io .papermc .lib .PaperLib ;
17+ import io .papermc .paper .world .PaperWorldLoader ;
18+ import io .papermc .paper .world .saveddata .PaperWorldPDC ;
1719import net .minecraft .core .Holder ;
1820import net .minecraft .resources .ResourceKey ;
1921import net .minecraft .server .MinecraftServer ;
2022import net .minecraft .server .dedicated .DedicatedServer ;
2123import net .minecraft .server .level .ServerLevel ;
2224import net .minecraft .util .ProgressListener ;
2325import net .minecraft .world .level .Level ;
24- import net .minecraft .world .level .LevelSettings ;
2526import net .minecraft .world .level .biome .Biome ;
2627import net .minecraft .world .level .dimension .LevelStem ;
2728import net .minecraft .world .level .levelgen .NoiseBasedChunkGenerator ;
29+ import net .minecraft .world .level .levelgen .WorldGenSettings ;
2830import net .minecraft .world .level .levelgen .WorldOptions ;
29- import net .minecraft .world .level .storage .LevelData ;
31+ import net .minecraft .world .level .storage .LevelResource ;
3032import net .minecraft .world .level .storage .LevelStorageSource ;
31- import net .minecraft .world .level .storage .PrimaryLevelData ;
33+ import net .minecraft .world .level .storage .SavedDataStorage ;
3234import org .bukkit .Bukkit ;
3335import org .bukkit .World ;
3436import org .bukkit .craftbukkit .CraftServer ;
3537import org .bukkit .craftbukkit .CraftWorld ;
38+ import org .bukkit .craftbukkit .persistence .CraftPersistentDataContainer ;
3639import org .bukkit .generator .BiomeProvider ;
3740
3841import javax .annotation .Nonnull ;
3942import java .lang .reflect .Field ;
4043import java .nio .file .Path ;
4144import java .util .Map ;
4245import java .util .OptionalLong ;
46+ import java .util .UUID ;
4347import java .util .function .BooleanSupplier ;
4448import java .util .function .Supplier ;
4549
4650import static net .minecraft .core .registries .Registries .BIOME ;
4751
4852public class PaperweightRegen extends Regenerator {
4953
54+ private static final String REGEN_WORLD_NAME = "faweregentempworld" ;
55+
5056 private static final Field serverWorldsField ;
5157 private static final Field paperConfigField ;
5258 private static final Field generatorSettingBaseSupplierField ;
@@ -108,6 +114,10 @@ protected boolean prepare() {
108114
109115 @ Override
110116 protected boolean initNewWorld () throws Exception {
117+ if (!PaperLib .isPaper ()) {
118+ throw new UnsupportedOperationException ("Regen requires Paper" );
119+ }
120+
111121 //world folder
112122 tempDir = java .nio .file .Files .createTempDirectory ("FastAsyncWorldEditWorldGen" );
113123
@@ -116,41 +126,36 @@ protected boolean initNewWorld() throws Exception {
116126 org .bukkit .generator .ChunkGenerator generator = originalBukkitWorld .getGenerator ();
117127 LevelStorageSource levelStorageSource = LevelStorageSource .createDefault (tempDir );
118128 ResourceKey <LevelStem > levelStemResourceKey = getWorldDimKey (environment );
119- session = levelStorageSource .createAccess ("faweregentempworld" , levelStemResourceKey );
120- LevelData originalWorldData = originalServerWorld .serverLevelData ;
129+ session = levelStorageSource .createAccess (REGEN_WORLD_NAME );
121130
122131 MinecraftServer server = originalServerWorld .getCraftServer ().getServer ();
123- WorldOptions originalOpts = originalWorldData . worldGenOptions ();
132+ WorldOptions originalOpts = originalServerWorld . worldGenSettings . options ();
124133 WorldOptions newOpts = options .getSeed ().isPresent ()
125134 ? originalOpts .withSeed (OptionalLong .of (seed ))
126135 : originalOpts ;
127- LevelSettings newWorldSettings = new LevelSettings (
128- "faweregentempworld" ,
129- originalWorldData .settings .gameType (),
130- originalWorldData .settings .hardcore (),
131- originalWorldData .settings .difficulty (),
132- originalWorldData .settings .allowCommands (),
133- originalWorldData .settings .gameRules (),
134- originalWorldData .settings .getDataConfiguration ()
136+ WorldGenSettings newWorldGenSettings = new WorldGenSettings (
137+ newOpts ,
138+ originalServerWorld .worldGenSettings .dimensions ()
135139 );
136140
137- PrimaryLevelData .SpecialWorldProperty specialWorldProperty =
138- originalWorldData .isFlatWorld ()
139- ? PrimaryLevelData .SpecialWorldProperty .FLAT
140- : originalWorldData .isDebugWorld ()
141- ? PrimaryLevelData .SpecialWorldProperty .DEBUG
142- : PrimaryLevelData .SpecialWorldProperty .NONE ;
143- PrimaryLevelData newWorldData = new PrimaryLevelData (newWorldSettings , newOpts , specialWorldProperty , Lifecycle .stable ());
141+ PaperWorldLoader .LoadedWorldData loadedWorldData = new PaperWorldLoader .LoadedWorldData (
142+ REGEN_WORLD_NAME ,
143+ UUID .randomUUID (),
144+ new PaperWorldPDC ((CraftPersistentDataContainer ) originalBukkitWorld .getPersistentDataContainer ()),
145+ originalServerWorld .serverLevelData
146+ );
144147
145148 BiomeProvider biomeProvider = getBiomeProvider ();
146149
150+ SavedDataStorage savedDataStorage = new SavedDataStorage (session .getDimensionPath (originalServerWorld .dimension ())
151+ .resolve (LevelResource .DATA .id ()), server .getFixerUpper (), server .registryAccess ());
147152
148153 //init world
149154 freshWorld = Fawe .instance ().getQueueHandler ().sync ((Supplier <ServerLevel >) () -> new ServerLevel (
150155 server ,
151156 server .executor ,
152157 session ,
153- newWorldData ,
158+ newWorldGenSettings ,
154159 originalServerWorld .dimension (),
155160 new LevelStem (
156161 originalServerWorld .dimensionTypeRegistration (),
@@ -160,10 +165,12 @@ protected boolean initNewWorld() throws Exception {
160165 seed ,
161166 ImmutableList .of (),
162167 false ,
163- originalServerWorld . getRandomSequences () ,
168+ levelStemResourceKey ,
164169 environment ,
165170 generator ,
166- biomeProvider
171+ biomeProvider ,
172+ savedDataStorage ,
173+ loadedWorldData
167174 ) {
168175
169176 private final Holder <Biome > singleBiome = options .hasBiomeType () ? DedicatedServer .getServer ().registryAccess ()
@@ -200,7 +207,6 @@ public void save(
200207 }).get ();
201208 freshWorld .noSave = true ;
202209 removeWorldFromWorldsMap ();
203- newWorldData .checkName (originalServerWorld .serverLevelData .getLevelName ()); //rename to original world name
204210 if (paperConfigField != null ) {
205211 paperConfigField .set (freshWorld , originalServerWorld .paperConfig ());
206212 }
@@ -250,7 +256,7 @@ protected IChunkCache<IChunkGet> initSourceQueueCache() {
250256 private void removeWorldFromWorldsMap () {
251257 try {
252258 Map <String , World > map = (Map <String , World >) serverWorldsField .get (Bukkit .getServer ());
253- map .remove ("faweregentempworld" );
259+ map .remove (REGEN_WORLD_NAME );
254260 } catch (IllegalAccessException e ) {
255261 throw new RuntimeException (e );
256262 }
0 commit comments