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);
}
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);
}
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));
});
}
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);
}
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);
});
}
Aggregations