Skip to content

Commit

Permalink
Registry rework (#4179)
Browse files Browse the repository at this point in the history
  • Loading branch information
aromaa authored Mar 8, 2025
1 parent 6096d56 commit 46f542b
Show file tree
Hide file tree
Showing 187 changed files with 4,039 additions and 7,466 deletions.
2 changes: 1 addition & 1 deletion SpongeAPI
Submodule SpongeAPI updated 74 files
+68 −2 src/main/java/org/spongepowered/api/advancement/Advancement.java
+0 −128 src/main/java/org/spongepowered/api/advancement/AdvancementTemplate.java
+1 −1 src/main/java/org/spongepowered/api/advancement/AdvancementTree.java
+68 −1 src/main/java/org/spongepowered/api/adventure/ChatType.java
+0 −88 src/main/java/org/spongepowered/api/adventure/ChatTypeTemplate.java
+4 −2 src/main/java/org/spongepowered/api/command/Command.java
+11 −0 src/main/java/org/spongepowered/api/command/parameter/managed/ValueCompleter.java
+6 −1 src/main/java/org/spongepowered/api/command/parameter/managed/ValueParameter.java
+11 −0 src/main/java/org/spongepowered/api/command/parameter/managed/ValueParameterModifier.java
+11 −0 src/main/java/org/spongepowered/api/command/parameter/managed/ValueParser.java
+1 −1 src/main/java/org/spongepowered/api/command/parameter/managed/standard/ResourceKeyedValueParameter.java
+3 −1 src/main/java/org/spongepowered/api/command/registrar/CommandRegistrarType.java
+15 −15 src/main/java/org/spongepowered/api/data/Keys.java
+16 −1 src/main/java/org/spongepowered/api/data/type/ArtType.java
+0 −44 src/main/java/org/spongepowered/api/data/type/ArtTypeTemplate.java
+12 −8 src/main/java/org/spongepowered/api/datapack/DataPackSerializable.java
+0 −106 src/main/java/org/spongepowered/api/datapack/DataPackType.java
+0 −119 src/main/java/org/spongepowered/api/datapack/DataPackTypes.java
+0 −107 src/main/java/org/spongepowered/api/datapack/DataPacks.java
+0 −26 src/main/java/org/spongepowered/api/datapack/package-info.java
+1 −2 src/main/java/org/spongepowered/api/entity/living/player/server/ServerPlayer.java
+7 −0 src/main/java/org/spongepowered/api/event/advancement/AdvancementTreeEvent.java
+60 −1 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageType.java
+0 −97 src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageTypeTemplate.java
+8 −0 src/main/java/org/spongepowered/api/event/lifecycle/RegisterCommandEvent.java
+0 −39 src/main/java/org/spongepowered/api/event/lifecycle/RegisterDataPackValueEvent.java
+12 −0 src/main/java/org/spongepowered/api/event/lifecycle/RegisterRegistryEvent.java
+90 −6 src/main/java/org/spongepowered/api/event/lifecycle/RegisterRegistryValueEvent.java
+3 −1 src/main/java/org/spongepowered/api/item/recipe/Recipe.java
+1 −2 src/main/java/org/spongepowered/api/item/recipe/RecipeManager.java
+0 −36 src/main/java/org/spongepowered/api/item/recipe/RecipeRegistration.java
+3 −15 src/main/java/org/spongepowered/api/item/recipe/cooking/CookingRecipe.java
+5 −18 src/main/java/org/spongepowered/api/item/recipe/crafting/ShapedCraftingRecipe.java
+5 −18 src/main/java/org/spongepowered/api/item/recipe/crafting/ShapelessCraftingRecipe.java
+4 −15 src/main/java/org/spongepowered/api/item/recipe/crafting/SpecialCraftingRecipe.java
+5 −18 src/main/java/org/spongepowered/api/item/recipe/single/StoneCutterRecipe.java
+5 −18 src/main/java/org/spongepowered/api/item/recipe/smithing/SmithingRecipe.java
+7 −0 src/main/java/org/spongepowered/api/registry/RegistryHolder.java
+21 −24 src/main/java/org/spongepowered/api/registry/RegistryRegistrationSet.java
+14 −2 src/main/java/org/spongepowered/api/registry/RegistryTypes.java
+0 −250 src/main/java/org/spongepowered/api/tag/TagTemplate.java
+0 −63 src/main/java/org/spongepowered/api/util/DataPackEntryBuilder.java
+10 −1 src/main/java/org/spongepowered/api/world/WorldType.java
+0 −82 src/main/java/org/spongepowered/api/world/WorldTypeTemplate.java
+32 −1 src/main/java/org/spongepowered/api/world/biome/Biome.java
+0 −63 src/main/java/org/spongepowered/api/world/biome/BiomeTemplate.java
+72 −72 src/main/java/org/spongepowered/api/world/biome/Biomes.java
+0 −15 src/main/java/org/spongepowered/api/world/generation/ChunkGenerator.java
+26 −7 src/main/java/org/spongepowered/api/world/generation/carver/Carver.java
+0 −59 src/main/java/org/spongepowered/api/world/generation/carver/CarverTemplate.java
+3 −2 src/main/java/org/spongepowered/api/world/generation/config/noise/DensityFunction.java
+45 −1 src/main/java/org/spongepowered/api/world/generation/config/noise/Noise.java
+103 −3 src/main/java/org/spongepowered/api/world/generation/config/noise/NoiseGeneratorConfig.java
+0 −137 src/main/java/org/spongepowered/api/world/generation/config/noise/NoiseGeneratorConfigTemplate.java
+0 −76 src/main/java/org/spongepowered/api/world/generation/config/noise/NoiseTemplate.java
+27 −1 src/main/java/org/spongepowered/api/world/generation/feature/Feature.java
+0 −59 src/main/java/org/spongepowered/api/world/generation/feature/FeatureTemplate.java
+35 −1 src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeature.java
+0 −75 src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeatureTemplate.java
+0 −61 src/main/java/org/spongepowered/api/world/generation/structure/SchematicTemplate.java
+2 −1 src/main/java/org/spongepowered/api/world/generation/structure/Structure.java
+37 −1 src/main/java/org/spongepowered/api/world/generation/structure/StructureSet.java
+0 −66 src/main/java/org/spongepowered/api/world/generation/structure/StructureSetTemplate.java
+0 −81 src/main/java/org/spongepowered/api/world/generation/structure/StructureTemplate.java
+54 −1 src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPool.java
+3 −3 src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPoolElement.java
+0 −84 src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPoolTemplate.java
+28 −1 src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorList.java
+0 −118 src/main/java/org/spongepowered/api/world/server/DataPackManager.java
+29 −24 src/main/java/org/spongepowered/api/world/server/WorldArchetypeType.java
+18 −18 src/main/java/org/spongepowered/api/world/server/WorldArchetypeTypes.java
+26 −13 src/main/java/org/spongepowered/api/world/server/WorldManager.java
+0 −169 src/main/java/org/spongepowered/api/world/server/WorldTemplate.java
+341 −0 src/main/java/org/spongepowered/api/world/server/storage/ServerWorldProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@ public void onServerAboutToStart(final ServerAboutToStartEvent event) {

lifecycle.establishServerFeatures();

lifecycle.establishServerRegistries((Server) event.getServer());
lifecycle.callStartingEngineEvent((Server) event.getServer());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,19 @@
*/
package org.spongepowered.forge.mixin.core.server;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.packs.resources.MultiPackResourceManager;
import net.minecraft.world.level.Level;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.spongepowered.api.registry.RegistryHolder;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.common.bridge.server.MinecraftServerBridge;
import org.spongepowered.common.bridge.server.level.ServerLevelBridge;
import org.spongepowered.forge.ForgeServer;

Expand All @@ -50,4 +55,10 @@ public abstract class MinecraftServerMixin_Forge implements ForgeServer {
public long[] getTickTime(ResourceKey<Level> dim) {
return ((ServerLevelBridge) this.shadow$getLevel(dim)).bridge$recentTickTimes();
}

@ModifyExpressionValue(method = "lambda$reloadResources$29", at = @At(value = "NEW", target = "Lnet/minecraft/server/packs/resources/MultiPackResourceManager;"))
private MultiPackResourceManager impl$onReloadResources(final MultiPackResourceManager original) {
((MinecraftServerBridge) this).bridge$reloadServerRegistries((RegistryHolder) original);
return original;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ public static List<Generator> levelDataRegistries(final Context context) {
"Biomes",
"BIOME",
context.relativeClass("world.biome", "Biome"),
Registries.BIOME
Registries.BIOME,
a -> true,
RegistryScope.SERVER
),
new RegistryEntriesGenerator<>(
"world.generation.carver",
Expand Down Expand Up @@ -219,6 +221,15 @@ public static List<Generator> levelDataRegistries(final Context context) {
"FLUID_TYPE",
context.relativeClass("fluid", "FluidType"),
Registries.FLUID
),
new RegistryEntriesGenerator<>(
"world.server",
"WorldArchetypeTypes",
"WORLD_ARCHETYPE_TYPE",
context.relativeClass("world.server", "WorldArchetypeType"),
Registries.LEVEL_STEM,
$ -> true,
RegistryScope.SERVER
)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ public void onServerAboutToStart(final ServerAboutToStartEvent event) {

lifecycle.establishServerFeatures();

lifecycle.establishServerRegistries((Server) event.getServer());
lifecycle.callStartingEngineEvent((Server) event.getServer());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,19 @@
*/
package org.spongepowered.neoforge.mixin.core.server;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.packs.resources.MultiPackResourceManager;
import net.minecraft.world.level.Level;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.spongepowered.api.registry.RegistryHolder;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.common.bridge.server.MinecraftServerBridge;
import org.spongepowered.common.bridge.server.level.ServerLevelBridge;
import org.spongepowered.neoforge.NeoServer;

Expand All @@ -50,4 +55,10 @@ public abstract class MinecraftServerMixin_Neo implements NeoServer {
public long[] getTickTime(ResourceKey<Level> dim) {
return ((ServerLevelBridge) this.shadow$getLevel(dim)).bridge$recentTickTimes();
}

@ModifyExpressionValue(method = "lambda$reloadResources$29", at = @At(value = "NEW", target = "Lnet/minecraft/server/packs/resources/MultiPackResourceManager;"))
private MultiPackResourceManager impl$onReloadResources(final MultiPackResourceManager original) {
((MinecraftServerBridge) this).bridge$reloadServerRegistries((RegistryHolder) original);
return original;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,17 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.common.datapack;
package org.spongepowered.common.accessor.resources;

import net.minecraft.core.RegistryAccess;
import org.spongepowered.api.datapack.DataPackEntry;
import net.minecraft.core.WritableRegistry;
import net.minecraft.resources.RegistryDataLoader;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

public interface DataPackEncoder<E, T extends DataPackEntry<T>> {
@Mixin(targets = "net/minecraft/resources/RegistryDataLoader$Loader")
public interface RegistryDataLoader_LoaderAccessor<T> {

E encode(T serializable, RegistryAccess registryAccess);
@Accessor("data") RegistryDataLoader.RegistryData<T> accessor$data();

@Accessor("registry") WritableRegistry<T> accessor$registry();
}
1 change: 1 addition & 0 deletions src/accessors/resources/mixins.sponge.accessors.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"network.protocol.game.ServerboundMovePlayerPacketAccessor",
"network.protocol.game.ServerboundMoveVehiclePacketAccessor",
"network.protocol.handshake.ClientIntentionPacketAccessor",
"resources.RegistryDataLoader_LoaderAccessor",
"resources.ResourceKeyAccessor",
"server.MinecraftServerAccessor",
"server.level.ChunkMap_TrackedEntityAccessor",
Expand Down
16 changes: 9 additions & 7 deletions src/launch/java/org/spongepowered/common/launch/Lifecycle.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,14 @@
package org.spongepowered.common.launch;

import com.google.inject.Injector;
import net.minecraft.core.RegistryAccess;
import net.minecraft.server.RegistryLayer;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.level.WorldDataConfiguration;
import org.spongepowered.api.Client;
import org.spongepowered.api.Engine;
import org.spongepowered.api.Server;
import org.spongepowered.api.registry.Registry;
import org.spongepowered.api.registry.RegistryHolder;

import java.util.stream.Stream;


/**
Expand All @@ -50,9 +51,6 @@ public interface Lifecycle {
void callRegisterBuilderEvent();

void establishEarlyGlobalRegistries();
void finalizeEarlyGlobalRegistries();

void establishGlobalRegistries(RegistryAccess.Frozen registryAccess, final RegistryLayer layer);

void establishDataProviders();

Expand All @@ -70,7 +68,11 @@ public interface Lifecycle {

void callConstructEvent();

void establishServerRegistries(Server server);
void beginEstablishServerRegistries(RegistryHolder server);

void processServerRegistries(RegistryHolder server, Stream<? extends Registry<?>> registries);

void endEstablishServerRegistries(RegistryHolder server);

void establishClientRegistries(Client client);

Expand Down
99 changes: 47 additions & 52 deletions src/main/java/org/spongepowered/common/SpongeLifecycle.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,24 @@
import com.google.inject.Singleton;
import io.leangen.geantyref.TypeToken;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.server.RegistryLayer;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.level.WorldDataConfiguration;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.spongepowered.api.Client;
import org.spongepowered.api.Engine;
import org.spongepowered.api.Game;
import org.spongepowered.api.Server;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.advancement.criteria.trigger.Trigger;
import org.spongepowered.api.event.Cause;
import org.spongepowered.api.event.EventContext;
import org.spongepowered.api.event.SpongeEventFactory;
import org.spongepowered.api.registry.RegistryHolder;
import org.spongepowered.api.registry.RegistryRoots;
import org.spongepowered.api.registry.RegistryType;
import org.spongepowered.api.registry.RegistryTypes;
import org.spongepowered.common.applaunch.plugin.DummyPluginContainer;
import org.spongepowered.common.bridge.core.WritableRegistryBridge;
import org.spongepowered.common.bridge.server.MinecraftServerBridge;
import org.spongepowered.common.bridge.server.packs.resources.ResourceManagerBridge;
import org.spongepowered.common.data.SpongeDataManager;
Expand All @@ -71,15 +72,17 @@
import org.spongepowered.plugin.PluginContainer;

import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Singleton
public final class SpongeLifecycle implements Lifecycle {

private final Game game;
private final Injector injector;
private FeatureFlagSet featureFlags;
public boolean establishedPluginRegistries = false;

@Inject
public SpongeLifecycle(final Game game, final Injector injector) {
Expand Down Expand Up @@ -113,50 +116,25 @@ public void callRegisterBuilderEvent() {
this.game.eventManager().post(new RegisterBuilderEventImpl(Cause.of(EventContext.empty(), this.game), this.game));
}

@SuppressWarnings("unchecked")
@Override
public void establishEarlyGlobalRegistries() {
final SpongeRegistryHolder holder = (SpongeRegistryHolder) this.game;
holder.setRootMinecraftRegistry((Registry<Registry<?>>) BuiltInRegistries.REGISTRY);

SpongeRegistries.registerEarlyGlobalRegistries(holder);
}

@Override
public void finalizeEarlyGlobalRegistries() {
// Plugin registries
this.game.eventManager().post(new AbstractRegisterRegistryEvent.GameScopedImpl(Cause.of(EventContext.empty(), this.game), this.game));

// Vanilla registries we want plugins to be able to modify:
// TODO marker for this in API?
this.game.eventManager().post(new AbstractRegisterRegistryValueEvent.BuiltInImpl<>(Cause.of(EventContext.empty(), this.game), this.game,
(org.spongepowered.api.registry.Registry<Trigger<?>>) BuiltInRegistries.TRIGGER_TYPES));
}
// Freeze Sponge Root - Registries are now available
holder.registryHolder().freezeSpongeRootRegistry();

@Override
public void establishGlobalRegistries(final RegistryAccess.Frozen registryAccess, final RegistryLayer layer) {
final SpongeRegistryHolder holder = (SpongeRegistryHolder) this.game;
SpongeCommon.logger().info("Layer {}", layer);
switch (layer)
{
// WORLDGEN ->
case DIMENSIONS -> {
SpongeRegistries.registerGlobalRegistriesDimensionLayer((SpongeRegistryHolder) this.game, registryAccess, this.featureFlags);

// Plugin registries
this.game.eventManager().post(new AbstractRegisterRegistryEvent.GameScopedImpl(Cause.of(EventContext.empty(), this.game), this.game));

// Freeze Sponge Root - Registries are now available
holder.registryHolder().freezeSpongeRootRegistry();
}
case RELOADABLE -> {
if (!this.establishedPluginRegistries) {
// Plugin registry values
this.game.eventManager().post(new AbstractRegisterRegistryValueEvent.GameScopedImpl(Cause.of(EventContext.empty(), this.game), this.game));
// Freeze Dynamic Registries - Values are now available
holder.registryHolder().freezeSpongeDynamicRegistries();

this.establishedPluginRegistries = true;
}
}
}
this.game.eventManager().post(new AbstractRegisterRegistryValueEvent.GameScopedImpl(Cause.of(EventContext.empty(), this.game), this.game,
holder.streamRegistries().collect(Collectors.toMap(org.spongepowered.api.registry.Registry::type, Function.identity()))));

// Freeze Dynamic Registries - Values are now available
holder.registryHolder().freezeSpongeDynamicRegistries(true);
}

@Override
Expand Down Expand Up @@ -209,31 +187,48 @@ public void callConstructEvent() {
}

@Override
public void establishServerRegistries(final Server server) {
SpongeRegistries.registerServerRegistries(server);
public void beginEstablishServerRegistries(final RegistryHolder server) {
SpongeRegistries.registerServerRegistries((SpongeRegistryHolder) server, this.featureFlags);

((SpongeRegistryHolder) server).registryHolder().featureFlagSet(this.featureFlags);

this.game.eventManager().post(new AbstractRegisterRegistryEvent.EngineScopedImpl<>(Cause.of(EventContext.empty(), this.game), this.game,
server));
this.game.eventManager().post(
AbstractRegisterRegistryEvent.EngineScopedImpl.server(Cause.of(EventContext.empty(), this.game), this.game, server));

((SpongeRegistryHolder) server).registryHolder().freezeSpongeRootRegistry();

this.game.eventManager().post(new AbstractRegisterRegistryValueEvent.EngineScopedImpl<>(Cause.of(EventContext.empty(), this.game),
this.game, server));
this.processServerRegistries(server, server.streamRegistries(RegistryRoots.SPONGE)
.filter(r -> !r.type().equals(RegistryTypes.ADVANCEMENT) && !r.type().equals(RegistryTypes.RECIPE)));
}

@Override
public void processServerRegistries(final RegistryHolder server, final Stream<? extends org.spongepowered.api.registry.Registry<?>> registries) {
final Map<RegistryType<?>, org.spongepowered.api.registry.Registry<?>> map =
registries.collect(Collectors.toMap(org.spongepowered.api.registry.Registry::type, Function.identity()));
if (!map.isEmpty()) {
map.values().forEach(r -> ((WritableRegistryBridge<?>) r).bridge$setRegistryHolder(server));
this.game.eventManager().post(AbstractRegisterRegistryValueEvent.EngineScopedImpl.server(Cause.of(EventContext.empty(), this.game), this.game, server, map));
map.values().forEach(r -> ((WritableRegistryBridge<?>) r).bridge$markEventCalled());
((SpongeRegistryHolder) server).registryHolder().freezeSpongeDynamicRegistries(false);
}
}

((SpongeRegistryHolder) server).registryHolder().freezeSpongeDynamicRegistries();
@Override
public void endEstablishServerRegistries(final RegistryHolder server) {
((SpongeRegistryHolder) server).registryHolder().freezeSpongeDynamicRegistries(true);
}

@Override
public void establishClientRegistries(final Client client) {
this.game.eventManager().post(new AbstractRegisterRegistryEvent.EngineScopedImpl<>(Cause.of(EventContext.empty(), this.game), this.game,
client));
this.game.eventManager().post(
AbstractRegisterRegistryEvent.EngineScopedImpl.client(Cause.of(EventContext.empty(), this.game), this.game, client));

((SpongeRegistryHolder) client).registryHolder().freezeSpongeRootRegistry();

this.game.eventManager().post(new AbstractRegisterRegistryValueEvent.EngineScopedImpl<>(Cause.of(EventContext.empty(), this.game),
this.game, client));
this.game.eventManager().post(AbstractRegisterRegistryValueEvent.EngineScopedImpl.client(Cause.of(EventContext.empty(), this.game),
this.game, client, client.streamRegistries(RegistryRoots.SPONGE).collect(Collectors.toMap(org.spongepowered.api.registry.Registry::type, Function.identity()))));

((SpongeRegistryHolder) client).registryHolder().freezeSpongeDynamicRegistries();
((SpongeRegistryHolder) client).registryHolder().freezeSpongeDynamicRegistries(true);
}

@Override
Expand Down
Loading

0 comments on commit 46f542b

Please sign in to comment.