mirror of
https://github.com/EngineHub/WorldEdit.git
synced 2024-12-21 04:49:51 +08:00
Only map options if needed to replace seed (#1843)
* Only map options if needed to replace seed * Add bukkit adapters. Co-authored-by: wizjany <wizjany@gmail.com>
This commit is contained in:
parent
f414af50f6
commit
8686672108
Binary file not shown.
@ -41,7 +41,6 @@
|
|||||||
import com.sk89q.worldedit.fabric.mixin.AccessorLevelProperties;
|
import com.sk89q.worldedit.fabric.mixin.AccessorLevelProperties;
|
||||||
import com.sk89q.worldedit.fabric.mixin.AccessorServerChunkManager;
|
import com.sk89q.worldedit.fabric.mixin.AccessorServerChunkManager;
|
||||||
import com.sk89q.worldedit.internal.Constants;
|
import com.sk89q.worldedit.internal.Constants;
|
||||||
import com.sk89q.worldedit.internal.block.BlockStateIdAccess;
|
|
||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.math.Vector3;
|
import com.sk89q.worldedit.math.Vector3;
|
||||||
@ -61,7 +60,6 @@
|
|||||||
import com.sk89q.worldedit.world.item.ItemTypes;
|
import com.sk89q.worldedit.world.item.ItemTypes;
|
||||||
import com.sk89q.worldedit.world.weather.WeatherType;
|
import com.sk89q.worldedit.world.weather.WeatherType;
|
||||||
import com.sk89q.worldedit.world.weather.WeatherTypes;
|
import com.sk89q.worldedit.world.weather.WeatherTypes;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.entity.BlockEntity;
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.ItemEntity;
|
import net.minecraft.entity.ItemEntity;
|
||||||
@ -78,11 +76,11 @@
|
|||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.Util;
|
import net.minecraft.util.Util;
|
||||||
import net.minecraft.util.dynamic.RegistryOps;
|
import net.minecraft.util.dynamic.RegistryOps;
|
||||||
|
import net.minecraft.util.dynamic.RegistryReadingOps;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Box;
|
import net.minecraft.util.math.Box;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.util.registry.DynamicRegistryManager;
|
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
@ -325,30 +323,14 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws
|
|||||||
LevelStorage levelStorage = LevelStorage.create(tempDir);
|
LevelStorage levelStorage = LevelStorage.create(tempDir);
|
||||||
try (LevelStorage.Session session = levelStorage.createSession("WorldEditTempGen")) {
|
try (LevelStorage.Session session = levelStorage.createSession("WorldEditTempGen")) {
|
||||||
ServerWorld originalWorld = (ServerWorld) getWorld();
|
ServerWorld originalWorld = (ServerWorld) getWorld();
|
||||||
long seed = options.getSeed().orElse(originalWorld.getSeed());
|
|
||||||
AccessorLevelProperties levelProperties = (AccessorLevelProperties)
|
AccessorLevelProperties levelProperties = (AccessorLevelProperties)
|
||||||
originalWorld.getServer().getSaveProperties();
|
originalWorld.getServer().getSaveProperties();
|
||||||
GeneratorOptions originalOpts = levelProperties.getGeneratorOptions();
|
GeneratorOptions originalOpts = levelProperties.getGeneratorOptions();
|
||||||
|
|
||||||
RegistryOps<NbtElement> nbtRegOps = RegistryOps.of(
|
long seed = options.getSeed().orElse(originalWorld.getSeed());
|
||||||
NbtOps.INSTANCE,
|
GeneratorOptions newOpts = options.getSeed().isPresent()
|
||||||
((ExtendedMinecraftServer) originalWorld.getServer())
|
? replaceSeed(originalWorld, seed, originalOpts)
|
||||||
.getServerResourceManager().getResourceManager(),
|
: originalOpts;
|
||||||
(DynamicRegistryManager.Impl) originalWorld.getServer().getRegistryManager()
|
|
||||||
);
|
|
||||||
GeneratorOptions newOpts = GeneratorOptions.CODEC
|
|
||||||
.encodeStart(nbtRegOps, originalOpts)
|
|
||||||
.flatMap(tag ->
|
|
||||||
GeneratorOptions.CODEC.parse(
|
|
||||||
recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.get().map(
|
|
||||||
l -> l,
|
|
||||||
error -> {
|
|
||||||
throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message());
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
levelProperties.setGeneratorOptions(newOpts);
|
levelProperties.setGeneratorOptions(newOpts);
|
||||||
RegistryKey<World> worldRegKey = originalWorld.getRegistryKey();
|
RegistryKey<World> worldRegKey = originalWorld.getRegistryKey();
|
||||||
@ -382,6 +364,33 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private GeneratorOptions replaceSeed(ServerWorld originalWorld, long seed, GeneratorOptions originalOpts) {
|
||||||
|
RegistryReadingOps<NbtElement> nbtRegReadOps = RegistryReadingOps.of(
|
||||||
|
NbtOps.INSTANCE,
|
||||||
|
originalWorld.getServer().getRegistryManager()
|
||||||
|
);
|
||||||
|
RegistryOps<NbtElement> nbtRegOps = RegistryOps.method_36574(
|
||||||
|
NbtOps.INSTANCE,
|
||||||
|
((ExtendedMinecraftServer) originalWorld.getServer())
|
||||||
|
.getServerResourceManager().getResourceManager(),
|
||||||
|
originalWorld.getServer().getRegistryManager()
|
||||||
|
);
|
||||||
|
return GeneratorOptions.CODEC
|
||||||
|
.encodeStart(nbtRegReadOps, originalOpts)
|
||||||
|
.flatMap(tag ->
|
||||||
|
GeneratorOptions.CODEC.parse(
|
||||||
|
recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.get()
|
||||||
|
.map(
|
||||||
|
l -> l,
|
||||||
|
error -> {
|
||||||
|
throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Dynamic<NbtElement> recursivelySetSeed(Dynamic<NbtElement> dynamic, long seed, Set<Dynamic<NbtElement>> seen) {
|
private Dynamic<NbtElement> recursivelySetSeed(Dynamic<NbtElement> dynamic, long seed, Set<Dynamic<NbtElement>> seen) {
|
||||||
if (!seen.add(dynamic)) {
|
if (!seen.add(dynamic)) {
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
import com.sk89q.worldedit.forge.internal.NBTConverter;
|
import com.sk89q.worldedit.forge.internal.NBTConverter;
|
||||||
import com.sk89q.worldedit.forge.internal.TileEntityUtils;
|
import com.sk89q.worldedit.forge.internal.TileEntityUtils;
|
||||||
import com.sk89q.worldedit.internal.Constants;
|
import com.sk89q.worldedit.internal.Constants;
|
||||||
import com.sk89q.worldedit.internal.block.BlockStateIdAccess;
|
|
||||||
import com.sk89q.worldedit.internal.util.BiomeMath;
|
import com.sk89q.worldedit.internal.util.BiomeMath;
|
||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
@ -62,7 +61,6 @@
|
|||||||
import com.sk89q.worldedit.world.item.ItemTypes;
|
import com.sk89q.worldedit.world.item.ItemTypes;
|
||||||
import com.sk89q.worldedit.world.weather.WeatherType;
|
import com.sk89q.worldedit.world.weather.WeatherType;
|
||||||
import com.sk89q.worldedit.world.weather.WeatherTypes;
|
import com.sk89q.worldedit.world.weather.WeatherTypes;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.item.ItemEntity;
|
import net.minecraft.entity.item.ItemEntity;
|
||||||
import net.minecraft.inventory.IClearable;
|
import net.minecraft.inventory.IClearable;
|
||||||
@ -83,6 +81,7 @@
|
|||||||
import net.minecraft.util.math.BlockRayTraceResult;
|
import net.minecraft.util.math.BlockRayTraceResult;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.util.registry.DynamicRegistries;
|
import net.minecraft.util.registry.DynamicRegistries;
|
||||||
|
import net.minecraft.util.registry.WorldGenSettingsExport;
|
||||||
import net.minecraft.util.registry.WorldSettingsImport;
|
import net.minecraft.util.registry.WorldSettingsImport;
|
||||||
import net.minecraft.world.Dimension;
|
import net.minecraft.world.Dimension;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
@ -335,30 +334,14 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws
|
|||||||
SaveFormat levelStorage = SaveFormat.func_237269_a_(tempDir);
|
SaveFormat levelStorage = SaveFormat.func_237269_a_(tempDir);
|
||||||
try (SaveFormat.LevelSave session = levelStorage.func_237274_c_("WorldEditTempGen")) {
|
try (SaveFormat.LevelSave session = levelStorage.func_237274_c_("WorldEditTempGen")) {
|
||||||
ServerWorld originalWorld = (ServerWorld) getWorld();
|
ServerWorld originalWorld = (ServerWorld) getWorld();
|
||||||
long seed = options.getSeed().orElse(originalWorld.getSeed());
|
|
||||||
ServerWorldInfo levelProperties =
|
ServerWorldInfo levelProperties =
|
||||||
(ServerWorldInfo) originalWorld.getServer().func_240793_aU_();
|
(ServerWorldInfo) originalWorld.getServer().func_240793_aU_();
|
||||||
DimensionGeneratorSettings originalOpts = levelProperties.field_237343_c_;
|
DimensionGeneratorSettings originalOpts = levelProperties.field_237343_c_;
|
||||||
|
|
||||||
WorldSettingsImport<INBT> nbtRegOps = WorldSettingsImport.func_244335_a(
|
long seed = options.getSeed().orElse(originalWorld.getSeed());
|
||||||
NBTDynamicOps.INSTANCE,
|
DimensionGeneratorSettings newOpts = options.getSeed().isPresent()
|
||||||
originalWorld.getServer().getDataPackRegistries().func_240970_h_(),
|
? replaceSeed(originalWorld, seed, originalOpts)
|
||||||
(DynamicRegistries.Impl) originalWorld.getServer().func_244267_aX()
|
: originalOpts;
|
||||||
);
|
|
||||||
Codec<DimensionGeneratorSettings> dimCodec = DimensionGeneratorSettings.field_236201_a_;
|
|
||||||
DimensionGeneratorSettings newOpts = dimCodec
|
|
||||||
.encodeStart(nbtRegOps, originalOpts)
|
|
||||||
.flatMap(tag ->
|
|
||||||
dimCodec.parse(
|
|
||||||
recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.get().map(
|
|
||||||
l -> l,
|
|
||||||
error -> {
|
|
||||||
throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message());
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
levelProperties.field_237343_c_ = newOpts;
|
levelProperties.field_237343_c_ = newOpts;
|
||||||
RegistryKey<World> worldRegKey = originalWorld.func_234923_W_();
|
RegistryKey<World> worldRegKey = originalWorld.func_234923_W_();
|
||||||
@ -393,6 +376,34 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DimensionGeneratorSettings replaceSeed(ServerWorld originalWorld, long seed, DimensionGeneratorSettings originalOpts) {
|
||||||
|
WorldGenSettingsExport<INBT> nbtReadRegOps = WorldGenSettingsExport.func_240896_a_(
|
||||||
|
NBTDynamicOps.INSTANCE,
|
||||||
|
originalWorld.getServer().func_244267_aX()
|
||||||
|
);
|
||||||
|
WorldSettingsImport<INBT> nbtRegOps = WorldSettingsImport.func_244335_a(
|
||||||
|
NBTDynamicOps.INSTANCE,
|
||||||
|
originalWorld.getServer().getDataPackRegistries().func_240970_h_(),
|
||||||
|
(DynamicRegistries.Impl) originalWorld.getServer().func_244267_aX()
|
||||||
|
);
|
||||||
|
Codec<DimensionGeneratorSettings> dimCodec = DimensionGeneratorSettings.field_236201_a_;
|
||||||
|
DimensionGeneratorSettings newOpts = dimCodec
|
||||||
|
.encodeStart(nbtReadRegOps, originalOpts)
|
||||||
|
.flatMap(tag ->
|
||||||
|
dimCodec.parse(
|
||||||
|
recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.get()
|
||||||
|
.map(
|
||||||
|
l -> l,
|
||||||
|
error -> {
|
||||||
|
throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return newOpts;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Dynamic<INBT> recursivelySetSeed(Dynamic<INBT> dynamic, long seed, Set<Dynamic<INBT>> seen) {
|
private Dynamic<INBT> recursivelySetSeed(Dynamic<INBT> dynamic, long seed, Set<Dynamic<INBT>> seen) {
|
||||||
if (!seen.add(dynamic)) {
|
if (!seen.add(dynamic)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user