Search in sources :

Example 1 with ServerWorldProperties

use of org.spongepowered.api.world.server.storage.ServerWorldProperties in project SpongeCommon by SpongePowered.

the class ServerChunkCacheMixin method impl$useSerializationBehaviorWhenSaving.

// @formatter:on
@Redirect(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ChunkMap;saveAllChunks(Z)V"))
private void impl$useSerializationBehaviorWhenSaving(final ChunkMap chunkManager, final boolean flush) {
    final ServerLevel world = this.level;
    final SerializationBehavior serializationBehavior = ((ServerWorldProperties) world.getLevelData()).serializationBehavior();
    if (serializationBehavior == SerializationBehavior.AUTOMATIC || serializationBehavior == SerializationBehavior.MANUAL) {
        ((ChunkMapAccessor) chunkManager).invoker$saveAllChunks(flush);
    }
}
Also used : ServerLevel(net.minecraft.server.level.ServerLevel) ServerWorldProperties(org.spongepowered.api.world.server.storage.ServerWorldProperties) ChunkMapAccessor(org.spongepowered.common.accessor.server.level.ChunkMapAccessor) SerializationBehavior(org.spongepowered.api.world.SerializationBehavior) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Example 2 with ServerWorldProperties

use of org.spongepowered.api.world.server.storage.ServerWorldProperties in project SpongeCommon by SpongePowered.

the class SpongeWorldManager method loadProperties.

@Override
public CompletableFuture<Optional<ServerWorldProperties>> loadProperties(final ResourceKey key) {
    final net.minecraft.resources.ResourceKey<Level> registryKey = SpongeWorldManager.createRegistryKey(Objects.requireNonNull(key, "key"));
    if (this.worlds.get(registryKey) != null) {
        return CompletableFuture.completedFuture(Optional.empty());
    }
    if (!this.worldExists(key)) {
        return CompletableFuture.completedFuture(Optional.empty());
    }
    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);
    }
    final WorldData levelData;
    try {
        final PrimaryLevelData defaultLevelData = (PrimaryLevelData) this.server.getWorldData();
        final LevelSettings defaultLevelSettings = ((PrimaryLevelDataAccessor) defaultLevelData).accessor$settings();
        try {
            levelData = storageSource.getDataTag((DynamicOps<Tag>) BootstrapProperties.worldSettingsAdapter, defaultLevelSettings.getDataPackConfig());
        } catch (final Exception ex) {
            return FutureUtil.completedWithException(ex);
        }
    } finally {
        try {
            storageSource.close();
        } catch (final IOException ex) {
            return FutureUtil.completedWithException(ex);
        }
    }
    return this.loadTemplate(key).thenCompose(r -> {
        r.ifPresent(template -> {
            final LevelStem scratch = ((SpongeWorldTemplate) template).asDimension();
            ((PrimaryLevelDataBridge) levelData).bridge$populateFromDimension(scratch);
        });
        return CompletableFuture.completedFuture(Optional.of((ServerWorldProperties) levelData));
    });
}
Also used : ServerWorldProperties(org.spongepowered.api.world.server.storage.ServerWorldProperties) LevelStorageSource(net.minecraft.world.level.storage.LevelStorageSource) IOException(java.io.IOException) WorldData(net.minecraft.world.level.storage.WorldData) PrimaryLevelDataBridge(org.spongepowered.common.bridge.world.level.storage.PrimaryLevelDataBridge) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) ReportedException(net.minecraft.ReportedException) PrimaryLevelData(net.minecraft.world.level.storage.PrimaryLevelData) LevelStem(net.minecraft.world.level.dimension.LevelStem) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) LevelSettings(net.minecraft.world.level.LevelSettings) PrimaryLevelDataAccessor(org.spongepowered.common.accessor.world.level.storage.PrimaryLevelDataAccessor) DynamicOps(com.mojang.serialization.DynamicOps)

Example 3 with ServerWorldProperties

use of org.spongepowered.api.world.server.storage.ServerWorldProperties in project SpongeCommon by SpongePowered.

the class DifficultyCommandMixin method setDifficulty.

// @formatter:on
/**
 * @author Zidane
 * @reason Only apply difficulty for the world the command was ran in (as in Sponge, all worlds have difficulties)
 */
@Overwrite
public static int setDifficulty(CommandSourceStack source, Difficulty difficulty) throws CommandSyntaxException {
    if (source.getLevel().getDifficulty() == difficulty) {
        throw DifficultyCommandMixin.ERROR_ALREADY_DIFFICULT.create(difficulty.getKey());
    } else {
        final LevelData levelData = source.getLevel().getLevelData();
        ((ServerWorldProperties) levelData).setDifficulty((org.spongepowered.api.world.difficulty.Difficulty) (Object) difficulty);
        source.getLevel().setSpawnSettings(((MinecraftServerAccessor) SpongeCommon.server()).invoker$isSpawningMonsters(), SpongeCommon.server().isSpawningAnimals());
        source.getLevel().getPlayers(p -> true).forEach(p -> p.connection.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked())));
        source.sendSuccess(new TranslatableComponent("commands.difficulty.success", difficulty.getDisplayName()), true);
        return 0;
    }
}
Also used : CommandSourceStack(net.minecraft.commands.CommandSourceStack) MinecraftServerAccessor(org.spongepowered.common.accessor.server.MinecraftServerAccessor) Overwrite(org.spongepowered.asm.mixin.Overwrite) SpongeCommon(org.spongepowered.common.SpongeCommon) Final(org.spongepowered.asm.mixin.Final) ServerWorldProperties(org.spongepowered.api.world.server.storage.ServerWorldProperties) LevelData(net.minecraft.world.level.storage.LevelData) Mixin(org.spongepowered.asm.mixin.Mixin) DynamicCommandExceptionType(com.mojang.brigadier.exceptions.DynamicCommandExceptionType) Shadow(org.spongepowered.asm.mixin.Shadow) ClientboundChangeDifficultyPacket(net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket) DifficultyCommand(net.minecraft.server.commands.DifficultyCommand) CommandSyntaxException(com.mojang.brigadier.exceptions.CommandSyntaxException) Difficulty(net.minecraft.world.Difficulty) TranslatableComponent(net.minecraft.network.chat.TranslatableComponent) ServerWorldProperties(org.spongepowered.api.world.server.storage.ServerWorldProperties) TranslatableComponent(net.minecraft.network.chat.TranslatableComponent) ClientboundChangeDifficultyPacket(net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket) LevelData(net.minecraft.world.level.storage.LevelData) Overwrite(org.spongepowered.asm.mixin.Overwrite)

Aggregations

ServerWorldProperties (org.spongepowered.api.world.server.storage.ServerWorldProperties)3 ServerLevel (net.minecraft.server.level.ServerLevel)2 CommandSyntaxException (com.mojang.brigadier.exceptions.CommandSyntaxException)1 DynamicCommandExceptionType (com.mojang.brigadier.exceptions.DynamicCommandExceptionType)1 DynamicOps (com.mojang.serialization.DynamicOps)1 IOException (java.io.IOException)1 ExecutionException (java.util.concurrent.ExecutionException)1 ReportedException (net.minecraft.ReportedException)1 CommandSourceStack (net.minecraft.commands.CommandSourceStack)1 TranslatableComponent (net.minecraft.network.chat.TranslatableComponent)1 ClientboundChangeDifficultyPacket (net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket)1 DifficultyCommand (net.minecraft.server.commands.DifficultyCommand)1 Difficulty (net.minecraft.world.Difficulty)1 Level (net.minecraft.world.level.Level)1 LevelSettings (net.minecraft.world.level.LevelSettings)1 LevelStem (net.minecraft.world.level.dimension.LevelStem)1 LevelData (net.minecraft.world.level.storage.LevelData)1 LevelStorageSource (net.minecraft.world.level.storage.LevelStorageSource)1 PrimaryLevelData (net.minecraft.world.level.storage.PrimaryLevelData)1 WorldData (net.minecraft.world.level.storage.WorldData)1