Search in sources :

Example 11 with Level

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

the class SpongeBlockEntityArchetype method apply.

@Override
public Optional<BlockEntity> apply(final ServerLocation location) {
    final BlockState currentState = location.block();
    final Block currentBlock = ((net.minecraft.world.level.block.state.BlockState) currentState).getBlock();
    final Block newBlock = ((net.minecraft.world.level.block.state.BlockState) this.blockState).getBlock();
    final Level minecraftWorld = (net.minecraft.world.level.Level) location.world();
    final BlockPos blockpos = VecHelper.toBlockPos(location);
    if (currentBlock != newBlock) {
        ((org.spongepowered.api.world.World) minecraftWorld).setBlock(blockpos.getX(), blockpos.getY(), blockpos.getZ(), this.blockState, BlockChangeFlags.ALL);
    }
    final CompoundTag compound = this.compound.copy();
    final net.minecraft.world.level.block.entity.@Nullable BlockEntity tileEntity = minecraftWorld.getBlockEntity(blockpos);
    if (tileEntity == null) {
        return Optional.empty();
    }
    compound.putInt(Constants.TileEntity.X_POS, blockpos.getX());
    compound.putInt(Constants.TileEntity.Y_POS, blockpos.getY());
    compound.putInt(Constants.TileEntity.Z_POS, blockpos.getZ());
    tileEntity.load((net.minecraft.world.level.block.state.BlockState) currentState, compound);
    tileEntity.clearCache();
    return Optional.of((org.spongepowered.api.block.entity.BlockEntity) tileEntity);
}
Also used : BlockState(org.spongepowered.api.block.BlockState) Block(net.minecraft.world.level.block.Block) Level(net.minecraft.world.level.Level) BlockPos(net.minecraft.core.BlockPos) CompoundTag(net.minecraft.nbt.CompoundTag) Nullable(org.checkerframework.checker.nullness.qual.Nullable)

Example 12 with Level

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

the class SpongeWorldManager method unloadWorld.

@Override
public CompletableFuture<Boolean> unloadWorld(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);
    }
    final ServerLevel world = this.worlds.get(registryKey);
    if (world == null) {
        return CompletableFuture.completedFuture(false);
    }
    return this.unloadWorld((org.spongepowered.api.world.server.ServerWorld) world);
}
Also used : ServerLevel(net.minecraft.server.level.ServerLevel) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel)

Example 13 with Level

use of net.minecraft.world.level.Level 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 14 with Level

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

the class SpongeWorldManager method unloadWorld0.

private void unloadWorld0(final ServerLevel world) throws IOException {
    final net.minecraft.resources.ResourceKey<Level> registryKey = world.dimension();
    if (world.getPlayers(p -> true).size() != 0) {
        throw new IOException(String.format("World '%s' was told to unload but players remain.", registryKey.location()));
    }
    SpongeCommon.logger().info("Unloading world '{}' ({})", registryKey.location(), RegistryTypes.WORLD_TYPE.get().valueKey((WorldType) world.dimensionType()));
    SpongeCommon.post(SpongeEventFactory.createUnloadWorldEvent(PhaseTracker.getCauseStackManager().currentCause(), (org.spongepowered.api.world.server.ServerWorld) world));
    final BlockPos spawnPoint = world.getSharedSpawnPos();
    world.getChunkSource().removeRegionTicket(SpongeWorldManager.SPAWN_CHUNKS, new ChunkPos(spawnPoint), 11, registryKey.location());
    ((PrimaryLevelDataBridge) world.getLevelData()).bridge$configAdapter().save();
    ((ServerLevelBridge) world).bridge$setManualSave(true);
    try {
        world.save(null, true, world.noSave);
        world.close();
        ((ServerLevelBridge) world).bridge$getLevelSave().close();
    } catch (final Exception ex) {
        throw new IOException(ex);
    }
    this.worlds.remove(registryKey);
}
Also used : IOException(java.io.IOException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) ReportedException(net.minecraft.ReportedException) WorldType(org.spongepowered.api.world.WorldType) Level(net.minecraft.world.level.Level) ServerLevel(net.minecraft.server.level.ServerLevel) BlockPos(net.minecraft.core.BlockPos) ChunkPos(net.minecraft.world.level.ChunkPos) ServerLevelBridge(org.spongepowered.common.bridge.server.level.ServerLevelBridge)

Example 15 with Level

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

the class VolumeStreamUtils method getBiomeStream.

@SuppressWarnings("unchecked")
public static <R extends Region<R>> VolumeStream<R, org.spongepowered.api.world.biome.Biome> getBiomeStream(final LevelReader reader, final Vector3i min, final Vector3i max, final StreamOptions options) {
    VolumeStreamUtils.validateStreamArgs(Objects.requireNonNull(min, "min"), Objects.requireNonNull(max, "max"), Objects.requireNonNull(options, "options"));
    final boolean shouldCarbonCopy = options.carbonCopy();
    final Vector3i size = max.sub(min).add(1, 1, 1);
    @MonotonicNonNull final ObjectArrayMutableBiomeBuffer backingVolume;
    if (shouldCarbonCopy) {
        final Registry<Biome> biomeRegistry;
        if (reader instanceof Level) {
            biomeRegistry = ((Level) reader).registryAccess().registry(Registry.BIOME_REGISTRY).get();
        } else {
            biomeRegistry = BuiltinRegistries.BIOME;
        }
        backingVolume = new ObjectArrayMutableBiomeBuffer(min, size, VolumeStreamUtils.nativeToSpongeRegistry(biomeRegistry));
    } else {
        backingVolume = null;
    }
    return VolumeStreamUtils.<R, org.spongepowered.api.world.biome.Biome, net.minecraft.world.level.biome.Biome, ChunkAccess, BlockPos>generateStream(min, max, options, // Ref
    (R) reader, // IdentityFunction
    (pos, biome) -> {
        if (shouldCarbonCopy) {
            backingVolume.setBiome(pos, biome);
        }
    }, // ChunkAccessor
    VolumeStreamUtils.getChunkAccessorByStatus(reader, options.loadingStyle().generateArea()), // Biome by key
    (key, biome) -> key, // Entity Accessor
    VolumeStreamUtils.getBiomesForChunkByPos(reader, min, max), // Filtered Position Entity Accessor
    (blockPos, world) -> {
        final net.minecraft.world.level.biome.Biome biome = shouldCarbonCopy ? backingVolume.getNativeBiome(blockPos.getX(), blockPos.getY(), blockPos.getZ()) : ((LevelReader) world).getBiome(blockPos);
        return new Tuple<>(blockPos, biome);
    });
}
Also used : ObjectArrayMutableBiomeBuffer(org.spongepowered.common.world.volume.buffer.biome.ObjectArrayMutableBiomeBuffer) Biome(net.minecraft.world.level.biome.Biome) ChunkAccess(net.minecraft.world.level.chunk.ChunkAccess) Biome(net.minecraft.world.level.biome.Biome) MonotonicNonNull(org.checkerframework.checker.nullness.qual.MonotonicNonNull) Vector3i(org.spongepowered.math.vector.Vector3i) Level(net.minecraft.world.level.Level) BlockPos(net.minecraft.core.BlockPos) Tuple(net.minecraft.util.Tuple)

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