Skip to content

Commit

Permalink
Implement WorldArchetype
Browse files Browse the repository at this point in the history
  • Loading branch information
aromaa committed Mar 11, 2025
1 parent 434571a commit b30e8e9
Show file tree
Hide file tree
Showing 8 changed files with 173 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@
import org.spongepowered.api.world.schematic.PaletteType;
import org.spongepowered.api.world.schematic.Schematic;
import org.spongepowered.api.world.server.TicketType;
import org.spongepowered.api.world.server.WorldArchetype;
import org.spongepowered.api.world.server.WorldArchetypeType;
import org.spongepowered.api.world.server.storage.ServerWorldProperties;
import org.spongepowered.api.world.volume.stream.StreamOptions;
Expand Down Expand Up @@ -237,6 +238,7 @@
import org.spongepowered.common.world.server.SpongeLocatableBlockBuilder;
import org.spongepowered.common.world.server.SpongeServerWorldPropertiesLoadOptions;
import org.spongepowered.common.world.server.SpongeTicketTypeBuilder;
import org.spongepowered.common.world.server.SpongeWorldArchetype;
import org.spongepowered.common.world.server.SpongeWorldArchetypeType;
import org.spongepowered.common.world.server.SpongeWorldTypeBuilder;
import org.spongepowered.common.world.volume.stream.SpongeStreamOptionsBuilder;
Expand Down Expand Up @@ -389,6 +391,7 @@ public void registerDefaultBuilders() {
.register(TicketType.Builder.class, SpongeTicketTypeBuilder::new)
.register(PortalLogic.Builder.class, SpongePortalLogicBuilder::new)
.register(ServerWorldProperties.LoadOptions.Builder.class, SpongeServerWorldPropertiesLoadOptions.BuilderImpl::new)
.register(WorldArchetype.Builder.class, SpongeWorldArchetype.BuilderImpl::new)
;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
package org.spongepowered.common.world.server;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.spongepowered.api.world.server.WorldArchetypeType;
import org.spongepowered.api.world.server.WorldArchetype;
import org.spongepowered.api.world.server.storage.ServerWorldProperties;

import java.util.Optional;
Expand Down Expand Up @@ -67,10 +67,10 @@ public Optional<Consumer<ServerWorldProperties>> loadCallback() {
}
}

public record CreateOperationImpl(WorldArchetypeType worldArchetype, @Nullable Consumer<ServerWorldProperties> callback) implements CreateOperation {
public record CreateOperationImpl(WorldArchetype worldArchetype, @Nullable Consumer<ServerWorldProperties> callback) implements CreateOperation {

@Override
public WorldArchetypeType worldArchetype() {
public WorldArchetype worldArchetype() {
return this.worldArchetype;
}

Expand Down Expand Up @@ -100,7 +100,7 @@ public LoadStep load() {
}

@Override
public CreateStep create(final WorldArchetypeType worldArchetype) {
public CreateStep create(final WorldArchetype worldArchetype) {
this.createOperation = new CreateOperationImpl(worldArchetype, null);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* This file is part of Sponge, licensed under the MIT License (MIT).
*
* Copyright (c) SpongePowered <https://www.spongepowered.org>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.common.world.server;

import org.spongepowered.api.world.generation.config.WorldGenerationConfig;
import org.spongepowered.api.world.server.WorldArchetype;
import org.spongepowered.api.world.server.WorldArchetypeType;

import java.util.Objects;
import java.util.Optional;

public record SpongeWorldArchetype(WorldArchetypeType type, Optional<WorldGenerationConfig> generationConfig) implements WorldArchetype {

public static final class BuilderImpl implements WorldArchetype.Builder {

private WorldArchetypeType type;
private WorldGenerationConfig generationConfig;

@Override
public Builder type(final WorldArchetypeType type) {
this.type = type;
return this;
}

@Override
public Builder generationConfig(final WorldGenerationConfig generationConfig) {
this.generationConfig = generationConfig;
return this;
}

@Override
public WorldArchetype build() {
return new SpongeWorldArchetype(Objects.requireNonNull(this.type, "type"), Optional.ofNullable(this.generationConfig));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import net.minecraft.world.level.levelgen.FlatLevelSource;
import net.minecraft.world.level.levelgen.PatrolSpawner;
import net.minecraft.world.level.levelgen.PhantomSpawner;
import net.minecraft.world.level.levelgen.WorldOptions;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.storage.LevelDataAndDimensions;
import net.minecraft.world.level.storage.LevelStorageSource;
Expand All @@ -79,7 +80,10 @@
import org.spongepowered.api.util.file.DeleteFileVisitor;
import org.spongepowered.api.world.DefaultWorldKeys;
import org.spongepowered.api.world.WorldType;
import org.spongepowered.api.world.generation.config.WorldGenerationConfig;
import org.spongepowered.api.world.server.ServerWorld;
import org.spongepowered.api.world.server.WorldArchetype;
import org.spongepowered.api.world.server.WorldArchetypeType;
import org.spongepowered.api.world.server.WorldManager;
import org.spongepowered.api.world.server.storage.ServerWorldProperties;
import org.spongepowered.common.SpongeCommon;
Expand Down Expand Up @@ -279,7 +283,7 @@ public CompletableFuture<Optional<ServerWorld>> loadWorld(final ResourceKey key,
try {
final LevelStorageSource.LevelStorageAccess storageSource = this.getLevelStorageAccess(key);
try {
final LevelDataLoadResult result = this.loadLevelData(key, () -> this.createLevelData(registryKey, (LevelStem) (Object) createOperation.worldArchetype()));
final LevelDataLoadResult result = this.loadLevelData(key, () -> this.createLevelData(registryKey, createOperation.worldArchetype()));
createOperation.createCallback().ifPresent(c -> c.accept((ServerWorldProperties) result.data()));
return this.loadWorld0(registryKey, result, storageSource);
} catch (final Exception e) {
Expand Down Expand Up @@ -386,7 +390,7 @@ public CompletableFuture<Optional<ServerWorldProperties>> loadProperties(final R
final ServerWorldProperties.LoadOptions.@Nullable CreateOperation createOperation = propertiesLoadOptions.createOperation().orElse(null);
if (createOperation != null && !this.worldExists(key)) {
final ServerWorldProperties properties = (ServerWorldProperties) this.loadLevelData(key, () -> this.createLevelData(
registryKey, (LevelStem) (Object) createOperation.worldArchetype())).data();
registryKey, createOperation.worldArchetype())).data();
createOperation.createCallback().ifPresent(c -> c.accept(properties));
return CompletableFuture.completedFuture(Optional.of(properties));
}
Expand Down Expand Up @@ -683,7 +687,8 @@ public void createNonDefaultLevels() {
try {
final LevelStorageSource.LevelStorageAccess storageSource = this.getLevelStorageAccess(worldKey);
try {
final LevelDataLoadResult levelData = this.loadLevelData(storageSource, registryKey, () -> this.createLevelData(registryKey, levelStem));
final LevelDataLoadResult levelData = this.loadLevelData(storageSource, registryKey, () ->
this.createLevelData(registryKey, WorldArchetype.of((WorldArchetypeType) (Object) levelStem)));
if (!((PrimaryLevelDataBridge) levelData.data()).bridge$loadOnStartup()) {
SpongeCommon.logger().warn("World '{}' has been disabled from loading at startup. Skipping...", worldKey);
continue;
Expand Down Expand Up @@ -771,12 +776,13 @@ private LevelDataLoadResult readLevelData(final net.minecraft.resources.Resource
}


private LevelDataLoadResult createLevelData(final net.minecraft.resources.ResourceKey<Level> registryKey,
final LevelStem levelStem) {
private LevelDataLoadResult createLevelData(final net.minecraft.resources.ResourceKey<Level> registryKey, final WorldArchetype archetype) {
final LevelStem levelStem = (LevelStem) (Object) archetype.type();
final PrimaryLevelData defaultLevelData = (PrimaryLevelData) this.server.getWorldData();
final LevelSettings levelSettings = this.createLevelSettings(defaultLevelData, this.getDirectoryName((ResourceKey) (Object) registryKey.location()));
return new LevelDataLoadResult(
new PrimaryLevelData(levelSettings, defaultLevelData.worldGenOptions(), SpongeWorldManager.specialWorldProperty(levelStem), Lifecycle.stable()), levelStem);
new PrimaryLevelData(levelSettings, (WorldOptions) archetype.generationConfig().orElse((WorldGenerationConfig) defaultLevelData.worldGenOptions()),
SpongeWorldManager.specialWorldProperty(levelStem), Lifecycle.stable()), levelStem);
}

private LevelSettings createLevelSettings(final PrimaryLevelData defaultLevelData, final String directoryName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,10 @@
*/
package org.spongepowered.common.world.server;

import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.dimension.BuiltinDimensionTypes;
import net.minecraft.world.level.dimension.DimensionType;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
Expand All @@ -43,7 +41,6 @@
import org.spongepowered.api.util.Range;
import org.spongepowered.api.world.WorldType;
import org.spongepowered.api.world.WorldTypeEffect;
import org.spongepowered.common.SpongeCommon;
import org.spongepowered.common.bridge.world.level.dimension.DimensionTypeBridge;
import org.spongepowered.common.data.SpongeDataManager;
import org.spongepowered.common.data.provider.DataProviderLookup;
Expand Down Expand Up @@ -72,8 +69,6 @@ public <V> WorldType.Builder add(final Key<? extends Value<V>> key, final V valu
@Override
public WorldType.Builder reset() {
this.data = DataManipulator.mutableOf();
final DimensionType defaultOverworld = SpongeCommon.vanillaRegistry(Registries.DIMENSION_TYPE).getValue(BuiltinDimensionTypes.OVERWORLD);
this.from((WorldType) (Object) defaultOverworld);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.spongepowered.api.world.portal.PortalLogic;
import org.spongepowered.api.world.server.ServerLocation;
import org.spongepowered.api.world.server.ServerWorld;
import org.spongepowered.api.world.server.WorldArchetype;
import org.spongepowered.api.world.server.WorldArchetypeType;
import org.spongepowered.api.world.server.WorldArchetypeTypes;
import org.spongepowered.api.world.server.storage.ServerWorldProperties;
Expand Down Expand Up @@ -176,7 +177,7 @@ private CommandResult createWorld(final CommandContext context,final Parameter.V
final WorldType worldType = context.requireOne(worldTypeParameter);
final WorldArchetypeType worldArchetypeType = WorldArchetypeType.of(worldType, ChunkGenerator.overworld());

this.game.server().worldManager().loadWorld(key, ServerWorldProperties.LoadOptions.create(worldArchetypeType)).whenComplete((r, t) -> {
this.game.server().worldManager().loadWorld(key, ServerWorldProperties.LoadOptions.create(WorldArchetype.of(worldArchetypeType))).whenComplete((r, t) -> {
if (t != null) {
context.cause().audience().sendMessage(Identity.nil(), Component.text(t.getMessage()));
} else if (r.isPresent()) {
Expand Down
Loading

0 comments on commit b30e8e9

Please sign in to comment.