Search in sources :

Example 6 with LevelStem

use of net.minecraft.world.level.dimension.LevelStem in project Tropicraft by Tropicraft.

the class TropicraftDimension method createDimension.

public static LevelStem createDimension(Registry<DimensionType> dimensionTypeRegistry, Registry<Biome> biomeRegistry, Registry<NoiseGeneratorSettings> dimensionSettingsRegistry, long seed) {
    Supplier<DimensionType> dimensionType = () -> dimensionTypeRegistry.getOrThrow(TropicraftDimension.DIMENSION_TYPE);
    ChunkGenerator generator = TropicraftDimension.createGenerator(biomeRegistry, dimensionSettingsRegistry, seed);
    return new LevelStem(dimensionType, generator);
}
Also used : DimensionType(net.minecraft.world.level.dimension.DimensionType) LevelStem(net.minecraft.world.level.dimension.LevelStem) ChunkGenerator(net.minecraft.world.level.chunk.ChunkGenerator) TropicraftChunkGenerator(net.tropicraft.core.common.dimension.chunk.TropicraftChunkGenerator)

Example 7 with LevelStem

use of net.minecraft.world.level.dimension.LevelStem in project SpongeCommon by SpongePowered.

the class PrimaryLevelDataMixin method impl$ignorePluginDimensionsWhenWritingWorldGenSettings.

@Redirect(method = "setTagData", at = @At(value = "INVOKE", remap = false, target = "Lcom/mojang/serialization/Codec;encodeStart(Lcom/mojang/serialization/DynamicOps;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;", ordinal = 0))
private DataResult<Object> impl$ignorePluginDimensionsWhenWritingWorldGenSettings(final Codec codec, final DynamicOps<Object> ops, final Object input) {
    WorldGenSettings dimensionGeneratorSettings = (WorldGenSettings) input;
    // Sub levels will have an empty dimensions registry so it is an easy toggle off
    if (dimensionGeneratorSettings.dimensions().entrySet().size() == 0) {
        return codec.encodeStart(ops, dimensionGeneratorSettings);
    }
    dimensionGeneratorSettings = ((WorldGenSettingsBridge) input).bridge$copy();
    final MappedRegistry<LevelStem> registry = new MappedRegistry<>(Registry.LEVEL_STEM_REGISTRY, Lifecycle.stable());
    ((org.spongepowered.api.registry.Registry<LevelStem>) (Object) dimensionGeneratorSettings.dimensions()).streamEntries().forEach(entry -> {
        if (Constants.MINECRAFT.equals(entry.key().namespace())) {
            ((org.spongepowered.api.registry.Registry<LevelStem>) (Object) registry).register(entry.key(), entry.value());
        }
    });
    ((DimensionGeneratorSettingsAccessor) dimensionGeneratorSettings).accessor$dimensions(registry);
    return codec.encodeStart(ops, dimensionGeneratorSettings);
}
Also used : DimensionGeneratorSettingsAccessor(org.spongepowered.common.accessor.world.gen.DimensionGeneratorSettingsAccessor) WorldGenSettings(net.minecraft.world.level.levelgen.WorldGenSettings) LevelStem(net.minecraft.world.level.dimension.LevelStem) Registry(net.minecraft.core.Registry) MappedRegistry(net.minecraft.core.MappedRegistry) MappedRegistry(net.minecraft.core.MappedRegistry) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Example 8 with LevelStem

use of net.minecraft.world.level.dimension.LevelStem in project SpongeCommon by SpongePowered.

the class SpongeWorldManager method loadWorld0.

private CompletableFuture<org.spongepowered.api.world.server.ServerWorld> loadWorld0(final net.minecraft.resources.ResourceKey<Level> registryKey, final LevelStem template, final WorldGenSettings generatorSettings) {
    final PrimaryLevelData defaultLevelData = (PrimaryLevelData) this.server.getWorldData();
    final LevelSettings defaultLevelSettings = ((PrimaryLevelDataAccessor) defaultLevelData).accessor$settings();
    final LevelStemBridge templateBridge = (LevelStemBridge) (Object) template;
    final ResourceKey worldKey = ((ResourceKeyBridge) templateBridge).bridge$getKey();
    final WorldType worldType = (WorldType) template.type();
    final ResourceKey worldTypeKey = RegistryTypes.WORLD_TYPE.get().valueKey((WorldType) template.type());
    MinecraftServerAccessor.accessor$LOGGER().info("Loading world '{}' ({})", worldKey, worldTypeKey);
    final String directoryName = this.getDirectoryName(worldKey);
    final boolean isVanillaSubLevel = this.isVanillaSubWorld(directoryName);
    final LevelStorageSource.LevelStorageAccess storageSource;
    try {
        if (isVanillaSubLevel) {
            storageSource = LevelStorageSource.createDefault(this.defaultWorldDirectory).createAccess(directoryName);
        } else {
            storageSource = LevelStorageSource.createDefault(this.customWorldsDirectory).createAccess(worldKey.namespace() + File.separator + worldKey.value());
        }
    } catch (final IOException e) {
        e.printStackTrace();
        return FutureUtil.completedWithException(new RuntimeException(String.format("Failed to create level data for world '%s'!", worldKey), e));
    }
    PrimaryLevelData levelData;
    levelData = (PrimaryLevelData) storageSource.getDataTag((DynamicOps<Tag>) BootstrapProperties.worldSettingsAdapter, defaultLevelSettings.getDataPackConfig());
    if (levelData == null) {
        final LevelSettings levelSettings;
        final WorldGenSettings generationSettings;
        if (this.server.isDemo()) {
            levelSettings = MinecraftServer.DEMO_SETTINGS;
            generationSettings = WorldGenSettings.demoSettings(BootstrapProperties.registries);
        } else {
            levelSettings = new LevelSettings(directoryName, (GameType) (Object) BootstrapProperties.gameMode.get(Sponge.game()), templateBridge.bridge$hardcore().orElse(BootstrapProperties.hardcore), (Difficulty) (Object) BootstrapProperties.difficulty.get(Sponge.game()), templateBridge.bridge$commands().orElse(BootstrapProperties.commands), new GameRules(), defaultLevelData.getDataPackConfig());
            generationSettings = generatorSettings;
        }
        levelData = new PrimaryLevelData(levelSettings, generationSettings, Lifecycle.stable());
    }
    ((PrimaryLevelDataBridge) levelData).bridge$populateFromDimension(template);
    final InheritableConfigHandle<WorldConfig> configAdapter = SpongeGameConfigs.createWorld(worldTypeKey, worldKey);
    ((PrimaryLevelDataBridge) levelData).bridge$configAdapter(configAdapter);
    levelData.setModdedInfo(this.server.getServerModName(), this.server.getModdedStatus().isPresent());
    final boolean isDebugGeneration = levelData.worldGenSettings().isDebug();
    final long seed = BiomeManager.obfuscateSeed(levelData.worldGenSettings().seed());
    final ChunkProgressListener chunkStatusListener = ((MinecraftServerAccessor) this.server).accessor$progressListenerFactory().create(11);
    final ServerLevel world = new ServerLevel(this.server, ((MinecraftServerAccessor) this.server).accessor$executor(), storageSource, levelData, registryKey, (DimensionType) worldType, chunkStatusListener, template.generator(), isDebugGeneration, seed, ImmutableList.of(), true);
    this.worlds.put(registryKey, world);
    return SpongeCommon.asyncScheduler().submit(() -> this.prepareWorld(world, isDebugGeneration)).thenApply(w -> {
        ((MinecraftServerAccessor) this.server).invoker$forceDifficulty();
        return w;
    }).thenCompose(w -> this.postWorldLoad(w, false)).thenApply(w -> (org.spongepowered.api.world.server.ServerWorld) w);
}
Also used : MinecraftServerAccessor(org.spongepowered.common.accessor.server.MinecraftServerAccessor) ServerLevelBridge(org.spongepowered.common.bridge.server.level.ServerLevelBridge) SpongeGameConfigs(org.spongepowered.common.config.SpongeGameConfigs) WorldConfig(org.spongepowered.common.config.inheritable.WorldConfig) DimensionGeneratorSettingsAccessor(org.spongepowered.common.accessor.world.gen.DimensionGeneratorSettingsAccessor) MinecraftServer(net.minecraft.server.MinecraftServer) FutureUtil(org.spongepowered.common.util.FutureUtil) Map(java.util.Map) Path(java.nio.file.Path) WanderingTraderSpawner(net.minecraft.world.entity.npc.WanderingTraderSpawner) BootstrapProperties(org.spongepowered.common.server.BootstrapProperties) WorldManager(org.spongepowered.api.world.server.WorldManager) ForcedChunksSavedData(net.minecraft.world.level.ForcedChunksSavedData) InheritableConfigHandle(org.spongepowered.common.config.inheritable.InheritableConfigHandle) RegistryAccess(net.minecraft.core.RegistryAccess) FileVisitResult(java.nio.file.FileVisitResult) PlatformHooks(org.spongepowered.common.hooks.PlatformHooks) Stream(java.util.stream.Stream) TicketType(net.minecraft.server.level.TicketType) MappedRegistry(net.minecraft.core.MappedRegistry) GameType(net.minecraft.world.level.GameType) CrashReport(net.minecraft.CrashReport) CustomSpawner(net.minecraft.world.level.CustomSpawner) RegistryEntry(org.spongepowered.api.registry.RegistryEntry) LevelStorageSource_LevelStorageAccessAccessor(org.spongepowered.common.accessor.world.level.storage.LevelStorageSource_LevelStorageAccessAccessor) Registry(org.spongepowered.api.registry.Registry) WorldGenSettings(net.minecraft.world.level.levelgen.WorldGenSettings) PrimaryLevelDataBridge(org.spongepowered.common.bridge.world.level.storage.PrimaryLevelDataBridge) JsonParser(com.google.gson.JsonParser) StandardCopyOption(java.nio.file.StandardCopyOption) ArrayList(java.util.ArrayList) VillageSiege(net.minecraft.world.entity.ai.village.VillageSiege) ResourceKey(org.spongepowered.api.ResourceKey) Server(org.spongepowered.api.Server) DataResult(com.mojang.serialization.DataResult) Difficulty(net.minecraft.world.Difficulty) Files(java.nio.file.Files) BufferedWriter(java.io.BufferedWriter) SpongeEventFactory(org.spongepowered.api.event.SpongeEventFactory) IOException(java.io.IOException) Lifecycle(com.mojang.serialization.Lifecycle) PhaseTracker(org.spongepowered.common.event.tracking.PhaseTracker) Decoder(com.mojang.serialization.Decoder) RegistryTypes(org.spongepowered.api.registry.RegistryTypes) InputStreamReader(java.io.InputStreamReader) Pair(com.mojang.datafixers.util.Pair) File(java.io.File) ChunkPos(net.minecraft.world.level.ChunkPos) ExecutionException(java.util.concurrent.ExecutionException) RegistryReadOps(net.minecraft.resources.RegistryReadOps) DataPackSerializer(org.spongepowered.common.datapack.DataPackSerializer) LevelStem(net.minecraft.world.level.dimension.LevelStem) LevelResource(net.minecraft.world.level.storage.LevelResource) ResourceLocation(net.minecraft.resources.ResourceLocation) JsonObject(com.google.gson.JsonObject) SpongeServer(org.spongepowered.common.SpongeServer) MinecraftServerAccessor(org.spongepowered.common.accessor.server.MinecraftServerAccessor) PrimaryLevelDataAccessor(org.spongepowered.common.accessor.world.level.storage.PrimaryLevelDataAccessor) JsonOps(com.mojang.serialization.JsonOps) DynamicOps(com.mojang.serialization.DynamicOps) PatrolSpawner(net.minecraft.world.level.levelgen.PatrolSpawner) SimpleFileVisitor(java.nio.file.SimpleFileVisitor) WorldData(net.minecraft.world.level.storage.WorldData) BiomeManager(net.minecraft.world.level.biome.BiomeManager) WorldTypes(org.spongepowered.api.world.WorldTypes) ChunkProgressListener(net.minecraft.server.level.progress.ChunkProgressListener) PrimaryLevelData(net.minecraft.world.level.storage.PrimaryLevelData) Collection(java.util.Collection) Launch(org.spongepowered.common.launch.Launch) GameRules(net.minecraft.world.level.GameRules) Sponge(org.spongepowered.api.Sponge) UUID(java.util.UUID) Collectors(java.util.stream.Collectors) PhantomSpawner(net.minecraft.world.level.levelgen.PhantomSpawner) Objects(java.util.Objects) Util(net.minecraft.Util) List(java.util.List) CommandStorage(net.minecraft.world.level.storage.CommandStorage) BlockPos(net.minecraft.core.BlockPos) Optional(java.util.Optional) Level(net.minecraft.world.level.Level) LevelStemBridge(org.spongepowered.common.bridge.world.level.dimension.LevelStemBridge) FilenameUtils(org.apache.commons.io.FilenameUtils) Tag(net.minecraft.nbt.Tag) ServerChunkCache(net.minecraft.server.level.ServerChunkCache) Constants(org.spongepowered.common.util.Constants) WorldType(org.spongepowered.api.world.WorldType) CompletableFuture(java.util.concurrent.CompletableFuture) DimensionType(net.minecraft.world.level.dimension.DimensionType) ServerLevel(net.minecraft.server.level.ServerLevel) ServerWorldProperties(org.spongepowered.api.world.server.storage.ServerWorldProperties) OptionalInt(java.util.OptionalInt) JsonElement(com.google.gson.JsonElement) WorldTemplate(org.spongepowered.api.world.server.WorldTemplate) ImmutableList(com.google.common.collect.ImmutableList) LongIterator(it.unimi.dsi.fastutil.longs.LongIterator) Task(org.spongepowered.api.scheduler.Task) ResourceKeyBridge(org.spongepowered.common.bridge.ResourceKeyBridge) LevelStorageSource(net.minecraft.world.level.storage.LevelStorageSource) Features(net.minecraft.data.worldgen.Features) ReportedException(net.minecraft.ReportedException) SpongeUserManager(org.spongepowered.common.user.SpongeUserManager) SpongeCommon(org.spongepowered.common.SpongeCommon) BasicFileAttributes(java.nio.file.attribute.BasicFileAttributes) CatSpawner(net.minecraft.world.entity.npc.CatSpawner) WorldGenSettingsBridge(org.spongepowered.common.bridge.world.level.levelgen.WorldGenSettingsBridge) TimeUnit(java.util.concurrent.TimeUnit) LevelSettings(net.minecraft.world.level.LevelSettings) Comparator(java.util.Comparator) Collections(java.util.Collections) RegistryWriteOps(net.minecraft.resources.RegistryWriteOps) InputStream(java.io.InputStream) ServerLevel(net.minecraft.server.level.ServerLevel) ChunkProgressListener(net.minecraft.server.level.progress.ChunkProgressListener) Difficulty(net.minecraft.world.Difficulty) WorldConfig(org.spongepowered.common.config.inheritable.WorldConfig) GameType(net.minecraft.world.level.GameType) PrimaryLevelData(net.minecraft.world.level.storage.PrimaryLevelData) WorldGenSettings(net.minecraft.world.level.levelgen.WorldGenSettings) WorldType(org.spongepowered.api.world.WorldType) LevelStemBridge(org.spongepowered.common.bridge.world.level.dimension.LevelStemBridge) ResourceKeyBridge(org.spongepowered.common.bridge.ResourceKeyBridge) GameRules(net.minecraft.world.level.GameRules) LevelStorageSource(net.minecraft.world.level.storage.LevelStorageSource) IOException(java.io.IOException) PrimaryLevelDataBridge(org.spongepowered.common.bridge.world.level.storage.PrimaryLevelDataBridge) ResourceKey(org.spongepowered.api.ResourceKey) LevelSettings(net.minecraft.world.level.LevelSettings) Tag(net.minecraft.nbt.Tag) PrimaryLevelDataAccessor(org.spongepowered.common.accessor.world.level.storage.PrimaryLevelDataAccessor)

Example 9 with LevelStem

use of net.minecraft.world.level.dimension.LevelStem in project SpongeCommon by SpongePowered.

the class SpongeWorldManager method loadWorld.

@Override
public CompletableFuture<org.spongepowered.api.world.server.ServerWorld> loadWorld(final ResourceKey key) {
    final net.minecraft.resources.ResourceKey<Level> registryKey = SpongeWorldManager.createRegistryKey(Objects.requireNonNull(key, "key"));
    if (Level.OVERWORLD.equals(registryKey)) {
        FutureUtil.completedWithException(new IllegalArgumentException("The default world cannot be told to load!"));
    }
    final ServerLevel world = this.worlds.get(registryKey);
    if (world != null) {
        return CompletableFuture.completedFuture((org.spongepowered.api.world.server.ServerWorld) world);
    }
    return this.loadTemplate(key).thenCompose(r -> {
        WorldTemplate loadedTemplate = r.orElse(null);
        if (loadedTemplate == null) {
            final LevelStem scratch = BootstrapProperties.worldGenSettings.dimensions().get(net.minecraft.resources.ResourceKey.create(net.minecraft.core.Registry.LEVEL_STEM_REGISTRY, (ResourceLocation) (Object) key));
            if (scratch != null) {
                ((ResourceKeyBridge) (Object) scratch).bridge$setKey(key);
                loadedTemplate = new SpongeWorldTemplate(scratch);
            }
            if (loadedTemplate == null) {
                return FutureUtil.completedWithException(new IOException(String.format("Failed to load a template for '%s'!", key)));
            }
            this.saveTemplate(loadedTemplate);
        }
        return this.loadWorld0(registryKey, ((SpongeWorldTemplate) loadedTemplate).asDimension(), ((WorldGenSettings) loadedTemplate.generationConfig()));
    });
}
Also used : ServerLevel(net.minecraft.server.level.ServerLevel) IOException(java.io.IOException) WorldGenSettings(net.minecraft.world.level.levelgen.WorldGenSettings) LevelStem(net.minecraft.world.level.dimension.LevelStem) ResourceLocation(net.minecraft.resources.ResourceLocation) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) WorldTemplate(org.spongepowered.api.world.server.WorldTemplate) ResourceKeyBridge(org.spongepowered.common.bridge.ResourceKeyBridge)

Example 10 with LevelStem

use of net.minecraft.world.level.dimension.LevelStem in project SpongeCommon by SpongePowered.

the class SpongeWorldTemplate method asDimension.

public LevelStem asDimension() {
    final LevelStem scratch = new LevelStem(() -> BootstrapProperties.registries.dimensionTypes().get((ResourceLocation) (Object) this.worldType.location()), (net.minecraft.world.level.chunk.ChunkGenerator) this.generator);
    ((LevelStemBridge) (Object) scratch).bridge$setFromSettings(false);
    ((LevelStemBridge) (Object) scratch).bridge$populateFromTemplate(this);
    return scratch;
}
Also used : LevelStem(net.minecraft.world.level.dimension.LevelStem) LevelStemBridge(org.spongepowered.common.bridge.world.level.dimension.LevelStemBridge) ResourceLocation(net.minecraft.resources.ResourceLocation)

Aggregations

LevelStem (net.minecraft.world.level.dimension.LevelStem)13 IOException (java.io.IOException)7 LevelStemBridge (org.spongepowered.common.bridge.world.level.dimension.LevelStemBridge)6 ExecutionException (java.util.concurrent.ExecutionException)5 ServerLevel (net.minecraft.server.level.ServerLevel)5 Level (net.minecraft.world.level.Level)5 WorldGenSettings (net.minecraft.world.level.levelgen.WorldGenSettings)4 LevelStorageSource (net.minecraft.world.level.storage.LevelStorageSource)4 ResourceKeyBridge (org.spongepowered.common.bridge.ResourceKeyBridge)4 JsonElement (com.google.gson.JsonElement)3 JsonObject (com.google.gson.JsonObject)3 ReportedException (net.minecraft.ReportedException)3 MappedRegistry (net.minecraft.core.MappedRegistry)3 ResourceLocation (net.minecraft.resources.ResourceLocation)3 LevelSettings (net.minecraft.world.level.LevelSettings)3 PrimaryLevelData (net.minecraft.world.level.storage.PrimaryLevelData)3 ResourceKey (org.spongepowered.api.ResourceKey)3 WorldTemplate (org.spongepowered.api.world.server.WorldTemplate)3 DimensionGeneratorSettingsAccessor (org.spongepowered.common.accessor.world.gen.DimensionGeneratorSettingsAccessor)3 PrimaryLevelDataAccessor (org.spongepowered.common.accessor.world.level.storage.PrimaryLevelDataAccessor)3