Search in sources :

Example 1 with SpongeUserManager

use of org.spongepowered.common.user.SpongeUserManager in project SpongeCommon by SpongePowered.

the class SpongeUserData method save.

public void save() throws IOException {
    synchronized (this) {
        final SpongeUserManager userManager = ((SpongeServer) SpongeCommon.server()).userManager();
        final LevelStorageSource.LevelStorageAccess storageSource = ((MinecraftServerAccessor) Sponge.server()).accessor$storageSource();
        final File file = storageSource.getLevelPath(LevelResource.PLAYER_DATA_DIR).resolve(this.uniqueId() + ".dat").toFile();
        this.writeCompound(this.compound);
        try (final FileOutputStream out = new FileOutputStream(file)) {
            NbtIo.writeCompressed(this.compound, out);
            userManager.unmarkDirty(this);
        } catch (final IOException e) {
            // We log the message here because the error may be swallowed by a completable future.
            SpongeCommon.logger().warn("Failed to save user file [{}]!", file, e);
            throw e;
        }
    }
}
Also used : MinecraftServerAccessor(org.spongepowered.common.accessor.server.MinecraftServerAccessor) SpongeServer(org.spongepowered.common.SpongeServer) FileOutputStream(java.io.FileOutputStream) LevelStorageSource(net.minecraft.world.level.storage.LevelStorageSource) IOException(java.io.IOException) File(java.io.File) SpongeUserManager(org.spongepowered.common.user.SpongeUserManager)

Example 2 with SpongeUserManager

use of org.spongepowered.common.user.SpongeUserManager in project SpongeCommon by SpongePowered.

the class SpongeWorldManager method loadLevel.

public void loadLevel() {
    final PrimaryLevelData defaultLevelData = (PrimaryLevelData) this.server.getWorldData();
    final WorldGenSettings defaultGenerationSettings = defaultLevelData.worldGenSettings();
    final LevelSettings defaultLevelSettings = ((PrimaryLevelDataAccessor) defaultLevelData).accessor$settings();
    final MappedRegistry<LevelStem> templates = defaultGenerationSettings.dimensions();
    final boolean multiworldEnabled = this.server.isSingleplayer() || this.server.isNetherEnabled();
    if (!multiworldEnabled) {
        SpongeCommon.logger().warn("The option 'allow-nether' has been set to 'false' in the server.properties. " + "Multi-World support has been disabled and no worlds besides the default world will be loaded.");
    }
    for (final RegistryEntry<LevelStem> entry : ((Registry<LevelStem>) (Object) templates).streamEntries().collect(Collectors.toList())) {
        final ResourceKey worldKey = entry.key();
        final LevelStem template = entry.value();
        final LevelStemBridge templateBridge = (LevelStemBridge) (Object) template;
        ((ResourceKeyBridge) templateBridge).bridge$setKey(worldKey);
        final boolean isDefaultWorld = this.isDefaultWorld(worldKey);
        if (!isDefaultWorld && !multiworldEnabled) {
            continue;
        }
        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);
        if (!isDefaultWorld && !templateBridge.bridge$loadOnStartup()) {
            SpongeCommon.logger().warn("World '{}' has been disabled from loading at startup. Skipping...", worldKey);
            continue;
        }
        final String directoryName = this.getDirectoryName(worldKey);
        final boolean isVanillaSubLevel = this.isVanillaSubWorld(directoryName);
        final LevelStorageSource.LevelStorageAccess storageSource;
        if (isDefaultWorld) {
            storageSource = ((MinecraftServerAccessor) this.server).accessor$storageSource();
        } else {
            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) {
                throw new RuntimeException(String.format("Failed to create level data for world '%s'!", worldKey), e);
            }
        }
        PrimaryLevelData levelData;
        final boolean isDebugGeneration;
        if (isDefaultWorld) {
            levelData = defaultLevelData;
            isDebugGeneration = defaultGenerationSettings.isDebug();
        } else {
            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 = ((WorldGenSettingsBridge) defaultLevelData.worldGenSettings()).bridge$copy();
                }
                isDebugGeneration = generationSettings.isDebug();
                ((DimensionGeneratorSettingsAccessor) generationSettings).accessor$dimensions(new MappedRegistry<>(net.minecraft.core.Registry.LEVEL_STEM_REGISTRY, Lifecycle.stable()));
                levelData = new PrimaryLevelData(levelSettings, generationSettings, Lifecycle.stable());
            } else {
                isDebugGeneration = levelData.worldGenSettings().isDebug();
            }
        }
        ((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 long seed = BiomeManager.obfuscateSeed(levelData.worldGenSettings().seed());
        final net.minecraft.resources.ResourceKey<Level> registryKey = SpongeWorldManager.createRegistryKey(worldKey);
        final ChunkProgressListener chunkStatusListener = ((MinecraftServerAccessor) this.server).accessor$progressListenerFactory().create(11);
        final List<CustomSpawner> spawners;
        if (isDefaultWorld) {
            spawners = ImmutableList.of(new PhantomSpawner(), new PatrolSpawner(), new CatSpawner(), new VillageSiege(), new WanderingTraderSpawner(levelData));
        } else {
            spawners = ImmutableList.of();
        }
        final ServerLevel world = new ServerLevel(this.server, ((MinecraftServerAccessor) this.server).accessor$executor(), storageSource, levelData, registryKey, (DimensionType) worldType, chunkStatusListener, template.generator(), isDebugGeneration, seed, spawners, true);
        // Ensure that the world border is registered.
        world.getWorldBorder().applySettings(levelData.getWorldBorder());
        this.worlds.put(registryKey, world);
        this.prepareWorld(world, isDebugGeneration);
    }
    ((MinecraftServerAccessor) this.server).invoker$forceDifficulty();
    for (final Map.Entry<net.minecraft.resources.ResourceKey<Level>, ServerLevel> entry : this.worlds.entrySet()) {
        try {
            this.postWorldLoad(entry.getValue(), true).get();
        } catch (final InterruptedException | ExecutionException e) {
            throw new IllegalStateException(e);
        }
    }
    ((SpongeUserManager) Sponge.server().userManager()).init();
    ((SpongeServer) SpongeCommon.server()).getPlayerDataManager().load();
}
Also used : DimensionGeneratorSettingsAccessor(org.spongepowered.common.accessor.world.gen.DimensionGeneratorSettingsAccessor) MinecraftServerAccessor(org.spongepowered.common.accessor.server.MinecraftServerAccessor) Difficulty(net.minecraft.world.Difficulty) GameType(net.minecraft.world.level.GameType) PrimaryLevelData(net.minecraft.world.level.storage.PrimaryLevelData) WorldGenSettings(net.minecraft.world.level.levelgen.WorldGenSettings) WanderingTraderSpawner(net.minecraft.world.entity.npc.WanderingTraderSpawner) WorldType(org.spongepowered.api.world.WorldType) VillageSiege(net.minecraft.world.entity.ai.village.VillageSiege) LevelStorageSource(net.minecraft.world.level.storage.LevelStorageSource) PrimaryLevelDataBridge(org.spongepowered.common.bridge.world.level.storage.PrimaryLevelDataBridge) ResourceKey(org.spongepowered.api.ResourceKey) JsonObject(com.google.gson.JsonObject) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) LevelSettings(net.minecraft.world.level.LevelSettings) Map(java.util.Map) ServerLevel(net.minecraft.server.level.ServerLevel) ChunkProgressListener(net.minecraft.server.level.progress.ChunkProgressListener) WorldConfig(org.spongepowered.common.config.inheritable.WorldConfig) PatrolSpawner(net.minecraft.world.level.levelgen.PatrolSpawner) CustomSpawner(net.minecraft.world.level.CustomSpawner) CatSpawner(net.minecraft.world.entity.npc.CatSpawner) LevelStemBridge(org.spongepowered.common.bridge.world.level.dimension.LevelStemBridge) ExecutionException(java.util.concurrent.ExecutionException) SpongeUserManager(org.spongepowered.common.user.SpongeUserManager) ResourceKeyBridge(org.spongepowered.common.bridge.ResourceKeyBridge) GameRules(net.minecraft.world.level.GameRules) IOException(java.io.IOException) LevelStem(net.minecraft.world.level.dimension.LevelStem) Tag(net.minecraft.nbt.Tag) PrimaryLevelDataAccessor(org.spongepowered.common.accessor.world.level.storage.PrimaryLevelDataAccessor) PhantomSpawner(net.minecraft.world.level.levelgen.PhantomSpawner)

Example 3 with SpongeUserManager

use of org.spongepowered.common.user.SpongeUserManager in project SpongeCommon by SpongePowered.

the class MinecraftServerMixin_API method api$initializeSpongeFields.

@Inject(method = "<init>", at = @At("TAIL"))
public void api$initializeSpongeFields(final Thread p_i232576_1_, final RegistryAccess.RegistryHolder p_i232576_2_, final LevelStorageSource.LevelStorageAccess p_i232576_3_, final WorldData p_i232576_4_, final PackRepository p_i232576_5_, final Proxy p_i232576_6_, final DataFixer p_i232576_7_, final ServerResources p_i232576_8_, final MinecraftSessionService p_i232576_9_, final GameProfileRepository p_i232576_10_, final GameProfileCache p_i232576_11_, final ChunkProgressListenerFactory p_i232576_12_, final CallbackInfo ci) {
    this.api$scheduler = new ServerScheduler();
    this.api$playerDataHandler = new SpongePlayerDataManager(this);
    this.api$teleportHelper = new SpongeTeleportHelper();
    this.api$mapStorage = new SpongeMapStorage();
    this.api$registryHolder = new RegistryHolderLogic(p_i232576_2_);
    this.api$userManager = new SpongeUserManager((MinecraftServer) (Object) this);
}
Also used : ServerScheduler(org.spongepowered.common.scheduler.ServerScheduler) SpongePlayerDataManager(org.spongepowered.common.world.storage.SpongePlayerDataManager) RegistryHolderLogic(org.spongepowered.common.registry.RegistryHolderLogic) SpongeUserManager(org.spongepowered.common.user.SpongeUserManager) SpongeTeleportHelper(org.spongepowered.common.world.teleport.SpongeTeleportHelper) SpongeMapStorage(org.spongepowered.common.map.SpongeMapStorage) MinecraftServer(net.minecraft.server.MinecraftServer) Inject(org.spongepowered.asm.mixin.injection.Inject)

Aggregations

SpongeUserManager (org.spongepowered.common.user.SpongeUserManager)3 IOException (java.io.IOException)2 LevelStorageSource (net.minecraft.world.level.storage.LevelStorageSource)2 MinecraftServerAccessor (org.spongepowered.common.accessor.server.MinecraftServerAccessor)2 JsonObject (com.google.gson.JsonObject)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 Map (java.util.Map)1 ExecutionException (java.util.concurrent.ExecutionException)1 Tag (net.minecraft.nbt.Tag)1 MinecraftServer (net.minecraft.server.MinecraftServer)1 ServerLevel (net.minecraft.server.level.ServerLevel)1 ChunkProgressListener (net.minecraft.server.level.progress.ChunkProgressListener)1 Difficulty (net.minecraft.world.Difficulty)1 VillageSiege (net.minecraft.world.entity.ai.village.VillageSiege)1 CatSpawner (net.minecraft.world.entity.npc.CatSpawner)1 WanderingTraderSpawner (net.minecraft.world.entity.npc.WanderingTraderSpawner)1 CustomSpawner (net.minecraft.world.level.CustomSpawner)1 GameRules (net.minecraft.world.level.GameRules)1 GameType (net.minecraft.world.level.GameType)1