Search in sources :

Example 16 with Level

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

the class SpongeWorldManager method deleteWorld.

@Override
public CompletableFuture<Boolean> deleteWorld(final ResourceKey key) {
    final net.minecraft.resources.ResourceKey<Level> registryKey = SpongeWorldManager.createRegistryKey(Objects.requireNonNull(key, "key"));
    if (Level.OVERWORLD.equals(registryKey)) {
        return CompletableFuture.completedFuture(false);
    }
    if (!this.worldExists(key)) {
        return CompletableFuture.completedFuture(false);
    }
    final ServerLevel loadedWorld = this.worlds.get(registryKey);
    if (loadedWorld != null) {
        final boolean disableLevelSaving = loadedWorld.noSave;
        loadedWorld.noSave = true;
        try {
            this.unloadWorld0(loadedWorld);
        } catch (final IOException e) {
            loadedWorld.noSave = disableLevelSaving;
            return FutureUtil.completedWithException(e);
        }
    }
    final boolean isVanillaWorld = this.isVanillaWorld(key);
    final String directoryName = this.getDirectoryName(key);
    final Path directory = isVanillaWorld ? this.defaultWorldDirectory.resolve(directoryName) : this.customWorldsDirectory.resolve(key.namespace()).resolve(key.value());
    if (Files.exists(directory)) {
        try {
            for (final Path path : Files.walk(directory).sorted(Comparator.reverseOrder()).collect(Collectors.toList())) {
                Files.deleteIfExists(path);
            }
        } catch (final IOException e) {
            return FutureUtil.completedWithException(e);
        }
    }
    final Path configFile = SpongeCommon.spongeConfigDirectory().resolve(Launch.instance().id()).resolve("worlds").resolve(key.namespace()).resolve(key.value() + ".conf");
    try {
        Files.deleteIfExists(configFile);
    } catch (final IOException e) {
        return FutureUtil.completedWithException(e);
    }
    final Path dimensionTemplate = this.getDataPackFile(key);
    try {
        Files.deleteIfExists(dimensionTemplate);
    } catch (final IOException e) {
        FutureUtil.completedWithException(e);
    }
    return CompletableFuture.completedFuture(true);
}
Also used : Path(java.nio.file.Path) ServerLevel(net.minecraft.server.level.ServerLevel) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) IOException(java.io.IOException)

Example 17 with Level

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

the class SpongeWorldManager method moveWorld.

@Override
public CompletableFuture<Boolean> moveWorld(final ResourceKey key, final ResourceKey movedKey) {
    final net.minecraft.resources.ResourceKey<Level> registryKey = SpongeWorldManager.createRegistryKey(Objects.requireNonNull(key, "key"));
    if (Level.OVERWORLD.equals(registryKey)) {
        return CompletableFuture.completedFuture(false);
    }
    if (!this.worldExists(key)) {
        return CompletableFuture.completedFuture(false);
    }
    if (this.worldExists(movedKey)) {
        return CompletableFuture.completedFuture(false);
    }
    final ServerLevel loadedWorld = this.worlds.get(registryKey);
    if (loadedWorld != null) {
        try {
            this.unloadWorld0(loadedWorld);
        } catch (final IOException e) {
            return FutureUtil.completedWithException(e);
        }
    }
    final boolean isVanillaWorld = this.isVanillaWorld(key);
    final String directoryName = this.getDirectoryName(key);
    final Path originalDirectory = isVanillaWorld ? this.defaultWorldDirectory.resolve(directoryName) : this.customWorldsDirectory.resolve(key.namespace()).resolve(key.value());
    final boolean isVanillaMoveWorld = this.isVanillaWorld(movedKey);
    final String moveDirectoryName = this.getDirectoryName(movedKey);
    final Path moveDirectory = isVanillaMoveWorld ? this.defaultWorldDirectory.resolve(moveDirectoryName) : this.customWorldsDirectory.resolve(key.namespace()).resolve(key.value());
    try {
        Files.createDirectories(moveDirectory);
        Files.move(originalDirectory, moveDirectory, StandardCopyOption.REPLACE_EXISTING);
    } catch (final IOException e) {
        return FutureUtil.completedWithException(e);
    }
    final Path configFile = SpongeCommon.spongeConfigDirectory().resolve(Launch.instance().id()).resolve("worlds").resolve(key.namespace()).resolve(key.value() + ".conf");
    final Path copiedConfigFile = SpongeCommon.spongeConfigDirectory().resolve(Launch.instance().id()).resolve("worlds").resolve(movedKey.namespace()).resolve(movedKey.value() + ".conf");
    try {
        Files.createDirectories(copiedConfigFile.getParent());
        Files.move(configFile, copiedConfigFile, StandardCopyOption.REPLACE_EXISTING);
    } catch (final IOException e) {
        return FutureUtil.completedWithException(e);
    }
    final Path dimensionTemplate = this.getDataPackFile(key);
    final Path copiedDimensionTemplate = this.getDataPackFile(movedKey);
    try {
        Files.createDirectories(copiedDimensionTemplate.getParent());
        Files.move(dimensionTemplate, copiedDimensionTemplate, StandardCopyOption.REPLACE_EXISTING);
    } catch (final IOException e) {
        FutureUtil.completedWithException(e);
    }
    return CompletableFuture.completedFuture(true);
}
Also used : Path(java.nio.file.Path) ServerLevel(net.minecraft.server.level.ServerLevel) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) IOException(java.io.IOException)

Example 18 with Level

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

the class SpongeWorldManager method saveProperties.

@Override
public CompletableFuture<Boolean> saveProperties(final ServerWorldProperties properties) {
    final net.minecraft.resources.ResourceKey<Level> registryKey = SpongeWorldManager.createRegistryKey(Objects.requireNonNull(properties, "properties").key());
    if (this.worlds.get(registryKey) != null) {
        return CompletableFuture.completedFuture(false);
    }
    final ResourceKey key = properties.key();
    final boolean isVanillaWorld = this.isVanillaWorld(key);
    final String directoryName = this.getDirectoryName(key);
    final LevelStorageSource.LevelStorageAccess storageSource;
    try {
        if (isVanillaWorld) {
            storageSource = LevelStorageSource.createDefault(this.defaultWorldDirectory).createAccess(directoryName);
        } else {
            storageSource = LevelStorageSource.createDefault(this.customWorldsDirectory).createAccess(key.namespace() + File.separator + key.value());
        }
    } catch (final IOException e) {
        return FutureUtil.completedWithException(e);
    }
    try {
        try {
            storageSource.saveDataTag(BootstrapProperties.registries, (WorldData) properties, null);
        } catch (final Exception ex) {
            return FutureUtil.completedWithException(ex);
        }
    } finally {
        try {
            storageSource.close();
        } catch (final IOException ex) {
            return FutureUtil.completedWithException(ex);
        }
    }
    // Properties doesn't have everything we need...namely the generator, load the template and set values we actually got
    return this.loadTemplate(key).thenCompose(r -> {
        final WorldTemplate template = r.orElse(null);
        if (template != null) {
            final LevelStem scratch = ((SpongeWorldTemplate) template).asDimension();
            ((LevelStemBridge) (Object) scratch).bridge$populateFromLevelData((PrimaryLevelData) properties);
            return this.saveTemplate(((LevelStemBridge) (Object) scratch).bridge$asTemplate());
        }
        return CompletableFuture.completedFuture(true);
    });
}
Also used : LevelStorageSource(net.minecraft.world.level.storage.LevelStorageSource) IOException(java.io.IOException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) ReportedException(net.minecraft.ReportedException) ResourceKey(org.spongepowered.api.ResourceKey) LevelStem(net.minecraft.world.level.dimension.LevelStem) LevelStemBridge(org.spongepowered.common.bridge.world.level.dimension.LevelStemBridge) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) JsonObject(com.google.gson.JsonObject) WorldTemplate(org.spongepowered.api.world.server.WorldTemplate)

Example 19 with Level

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

the class ServerLocationData method register.

// @formatter:off
public static void register(final DataProviderRegistrator registrator) {
    registrator.asMutable(ServerLocation.class).create(Keys.BIOME_TEMPERATURE).get(h -> {
        final Level world = (Level) h.world();
        final BlockPos pos = VecHelper.toBlockPos(h);
        final Biome biome = world.getBiome(pos);
        return (double) biome.getBaseTemperature();
    }).create(Keys.BLOCK_LIGHT).get(h -> {
        final Level world = (Level) h.world();
        return world.getBrightness(LightLayer.BLOCK, VecHelper.toBlockPos(h));
    }).create(Keys.BLOCK_TEMPERATURE).get(h -> {
        final Level world = (Level) h.world();
        final BlockPos pos = VecHelper.toBlockPos(h);
        final Biome biome = world.getBiome(pos);
        return (double) biome.getTemperature(pos);
    }).create(Keys.SKY_LIGHT).get(h -> {
        final Level world = (Level) h.world();
        final BlockPos pos = VecHelper.toBlockPos(h);
        return world.getBrightness(LightLayer.SKY, pos);
    }).create(Keys.IS_FULL_BLOCK).get(h -> {
        final BlockState block = (BlockState) h.block();
        final Level world = (Level) h.world();
        final BlockPos pos = VecHelper.toBlockPos(h.position());
        return block.isSolidRender(world, pos);
    }).create(Keys.IS_INDIRECTLY_POWERED).get(h -> {
        final Level world = (Level) h.world();
        final BlockPos pos = VecHelper.toBlockPos(h);
        return world.getBestNeighborSignal(pos) > 0;
    }).create(Keys.DISPLAY_NAME).get(h -> SpongeAdventure.asAdventure(((Nameable) h.blockEntity().get()).getDisplayName())).supports(h -> h.blockEntity().isPresent() && h.blockEntity().get() instanceof NameableBlockEntity).create(Keys.CUSTOM_NAME).get(h -> {
        final BlockEntity blockEntity = h.blockEntity().get();
        return ((Nameable) blockEntity).hasCustomName() ? SpongeAdventure.asAdventure(((Nameable) blockEntity).getCustomName()) : null;
    }).set((h, v) -> (((CustomNameableBridge) h.blockEntity().get())).bridge$setCustomDisplayName(SpongeAdventure.asVanilla(v))).delete(h -> (((CustomNameableBridge) h.blockEntity().get())).bridge$setCustomDisplayName(null)).supports(h -> h.blockEntity().isPresent() && h.blockEntity().get() instanceof NameableBlockEntity).create(Keys.CREATOR).get(h -> ((LevelChunkBridge) h.world().chunk(h.chunkPosition())).bridge$getBlockCreatorUUID(VecHelper.toBlockPos(h.blockPosition())).orElse(null)).set((h, v) -> ((LevelChunkBridge) h.world().chunk(h.chunkPosition())).bridge$setBlockCreator(VecHelper.toBlockPos(h.blockPosition()), v)).delete(h -> ((LevelChunkBridge) h.world().chunk(h.chunkPosition())).bridge$setBlockCreator(VecHelper.toBlockPos(h.blockPosition()), null)).create(Keys.NOTIFIER).get(h -> ((LevelChunkBridge) h.world().chunk(h.chunkPosition())).bridge$getBlockNotifierUUID(VecHelper.toBlockPos(h.blockPosition())).orElse(null)).set((h, v) -> ((LevelChunkBridge) h.world().chunk(h.chunkPosition())).bridge$setBlockNotifier(VecHelper.toBlockPos(h.blockPosition()), v)).delete(h -> ((LevelChunkBridge) h.world().chunk(h.chunkPosition())).bridge$setBlockNotifier(VecHelper.toBlockPos(h.blockPosition()), null));
}
Also used : Nameable(net.minecraft.world.Nameable) BlockEntity(org.spongepowered.api.block.entity.BlockEntity) LevelChunkBridge(org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge) BlockState(net.minecraft.world.level.block.state.BlockState) NameableBlockEntity(org.spongepowered.api.block.entity.NameableBlockEntity) SpongeAdventure(org.spongepowered.common.adventure.SpongeAdventure) Biome(net.minecraft.world.level.biome.Biome) Keys(org.spongepowered.api.data.Keys) BlockPos(net.minecraft.core.BlockPos) Nameable(net.minecraft.world.Nameable) DataProviderRegistrator(org.spongepowered.common.data.provider.DataProviderRegistrator) VecHelper(org.spongepowered.common.util.VecHelper) LightLayer(net.minecraft.world.level.LightLayer) Level(net.minecraft.world.level.Level) ServerLocation(org.spongepowered.api.world.server.ServerLocation) CustomNameableBridge(org.spongepowered.common.bridge.CustomNameableBridge) CustomNameableBridge(org.spongepowered.common.bridge.CustomNameableBridge) Biome(net.minecraft.world.level.biome.Biome) BlockState(net.minecraft.world.level.block.state.BlockState) Level(net.minecraft.world.level.Level) BlockPos(net.minecraft.core.BlockPos) LevelChunkBridge(org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge) NameableBlockEntity(org.spongepowered.api.block.entity.NameableBlockEntity) BlockEntity(org.spongepowered.api.block.entity.BlockEntity) NameableBlockEntity(org.spongepowered.api.block.entity.NameableBlockEntity)

Example 20 with Level

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

the class MapInfoItemStackData method register.

// @formatter:off
public static void register(final DataProviderRegistrator registrator) {
    registrator.asMutable(ItemStack.class).create(Keys.MAP_INFO).supports(item -> item.getItem() instanceof MapItem).get(itemStack -> {
        if (itemStack.getTag() == null) {
            return null;
        }
        return (MapInfo) ((Level) Sponge.server().worldManager().defaultWorld()).getMapData(Constants.Map.MAP_PREFIX + itemStack.getTag().getInt(Constants.Map.MAP_ID));
    }).set((itemStack, mapInfo) -> {
        @Nullable CompoundTag nbt = itemStack.getTag();
        if (nbt == null) {
            nbt = new CompoundTag();
        }
        nbt.putInt(Constants.Map.MAP_ID, ((MapItemSavedDataBridge) mapInfo).bridge$getMapId());
        itemStack.setTag(nbt);
    });
}
Also used : Keys(org.spongepowered.api.data.Keys) CompoundTag(net.minecraft.nbt.CompoundTag) MapInfo(org.spongepowered.api.map.MapInfo) Constants(org.spongepowered.common.util.Constants) DataProviderRegistrator(org.spongepowered.common.data.provider.DataProviderRegistrator) MapItem(net.minecraft.world.item.MapItem) Sponge(org.spongepowered.api.Sponge) ItemStack(net.minecraft.world.item.ItemStack) MapItemSavedDataBridge(org.spongepowered.common.bridge.world.storage.MapItemSavedDataBridge) Level(net.minecraft.world.level.Level) Nullable(org.checkerframework.checker.nullness.qual.Nullable) Level(net.minecraft.world.level.Level) MapItem(net.minecraft.world.item.MapItem) Nullable(org.checkerframework.checker.nullness.qual.Nullable) CompoundTag(net.minecraft.nbt.CompoundTag)

Aggregations

Level (net.minecraft.world.level.Level)53 BlockPos (net.minecraft.core.BlockPos)26 ServerLevel (net.minecraft.server.level.ServerLevel)19 ItemStack (net.minecraft.world.item.ItemStack)14 BlockState (net.minecraft.world.level.block.state.BlockState)13 IOException (java.io.IOException)10 Direction (net.minecraft.core.Direction)8 ChunkPos (net.minecraft.world.level.ChunkPos)6 Path (java.nio.file.Path)5 ExecutionException (java.util.concurrent.ExecutionException)5 Nullable (javax.annotation.Nullable)5 Entity (net.minecraft.world.entity.Entity)5 Player (net.minecraft.world.entity.player.Player)5 BlockEntity (net.minecraft.world.level.block.entity.BlockEntity)5 LevelStem (net.minecraft.world.level.dimension.LevelStem)5 SubscribeEvent (net.minecraftforge.eventbus.api.SubscribeEvent)5 Map (java.util.Map)4 Set (java.util.Set)4 CompoundTag (net.minecraft.nbt.CompoundTag)4 ResourceLocation (net.minecraft.resources.ResourceLocation)4