diff --git a/common/src/main/java/me/shedaniel/architectury/registry/Registries.java b/common/src/main/java/me/shedaniel/architectury/registry/Registries.java index 394a082c..189fab4d 100644 --- a/common/src/main/java/me/shedaniel/architectury/registry/Registries.java +++ b/common/src/main/java/me/shedaniel/architectury/registry/Registries.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; /** * Platform-agnostic wrapper of minecraft registries, should be used to register content. @@ -56,6 +57,19 @@ public final class Registries { return this.provider.get(registry); } + /** + * Listen to registry registration, the callback is called when content should be registered. + * On forge, this is invoked after {@code RegistryEvent.Register}. + * On fabric, this is invoked immediately. + * + * @param key the key of the registry + * @param callback the callback to be invoked + * @param the type of registry entry + */ + public void forRegistry(ResourceKey> key, Consumer> callback) { + this.provider.forRegistry(key, callback); + } + @SafeVarargs public final > RegistryBuilder builder(ResourceLocation registryId, T... typeGetter) { if (typeGetter.length != 0) throw new IllegalStateException("array must be empty!"); @@ -109,6 +123,8 @@ public final class Registries { @Deprecated Registry get(net.minecraft.core.Registry registry); + void forRegistry(ResourceKey> key, Consumer> consumer); + > RegistryBuilder builder(Class type, ResourceLocation registryId); } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java index 89430e0e..0824a4e5 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/RegistriesImpl.java @@ -40,6 +40,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Supplier; public class RegistriesImpl { @@ -71,7 +72,12 @@ public class RegistriesImpl { public Registry get(net.minecraft.core.Registry registry) { return new RegistryImpl<>(registry); } - + + @Override + public void forRegistry(ResourceKey> key, Consumer> consumer) { + consumer.accept(get(key)); + } + @Override @NotNull public > RegistryBuilder builder(Class type, ResourceLocation registryId) { diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java index e7414174..98119f6e 100644 --- a/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java @@ -21,6 +21,8 @@ package me.shedaniel.architectury.registry.forge; import com.google.common.base.Objects; import com.google.common.collect.HashBasedTable; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import com.google.common.collect.Table; import me.shedaniel.architectury.core.RegistryEntry; import me.shedaniel.architectury.platform.forge.EventBuses; @@ -49,6 +51,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Supplier; public class RegistriesImpl { @@ -70,29 +73,49 @@ public class RegistriesImpl { public static class RegistryProviderImpl implements Registries.RegistryProvider { private final String modId; - private final IEventBus eventBus; + private final LazyLoadedValue eventBus; private final Table, Supplier>> registry = HashBasedTable.create(); + private final Multimap>, Consumer>> listeners = HashMultimap.create(); public RegistryProviderImpl(String modId) { this.modId = modId; - this.eventBus = EventBuses.getModEventBus(modId).orElseThrow(() -> new IllegalStateException("Can't get event bus for mod '" + modId + "' because it was not registered!")); - this.eventBus.register(new EventListener()); + this.eventBus = new LazyLoadedValue<>(() -> { + IEventBus eventBus = EventBuses.getModEventBus(modId).orElseThrow(() -> new IllegalStateException("Can't get event bus for mod '" + modId + "' because it was not registered!")); + eventBus.register(new EventListener()); + return eventBus; + }); + } + + private void updateEventBus() { + synchronized (eventBus) { + // Make sure that the eventbus is setup + this.eventBus.get(); + } } @Override public Registry get(ResourceKey> registryKey) { + updateEventBus(); return get(RegistryManager.ACTIVE.getRegistry(registryKey.location())); } public Registry get(IForgeRegistry registry) { + updateEventBus(); return new ForgeBackedRegistryImpl<>(this.registry, registry); } @Override public Registry get(net.minecraft.core.Registry registry) { + updateEventBus(); return new VanillaBackedRegistryImpl<>(registry); } + @Override + public void forRegistry(ResourceKey> key, Consumer> consumer) { + this.listeners.put((ResourceKey>) (ResourceKey>) key, + (Consumer>) (Consumer>) consumer); + } + @Override public > RegistryBuilder builder(Class type, ResourceLocation registryId) { return new RegistryBuilderWrapper<>(this, new net.minecraftforge.registries.RegistryBuilder<>() @@ -104,7 +127,8 @@ public class RegistriesImpl { @SubscribeEvent public void handleEvent(RegistryEvent.Register event) { IForgeRegistry registry = event.getRegistry(); - + Registry archRegistry = get(registry); + for (Map.Entry, Supplier>>> row : RegistryProviderImpl.this.registry.rowMap().entrySet()) { if (row.getKey() == event.getGenericType()) { for (Map.Entry, Supplier>> entry : row.getValue().entrySet()) { @@ -113,6 +137,12 @@ public class RegistriesImpl { } } } + + for (Map.Entry>, Consumer>> entry : listeners.entries()) { + if (entry.getKey().location().equals(registry.getRegistryName())) { + entry.getValue().accept(archRegistry); + } + } } } } diff --git a/gradle.properties b/gradle.properties index 29adcc60..30c5cd96 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ supported_version=1.16.4/5 archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=1.24 +base_version=1.25 maven_group=me.shedaniel fabric_loader_version=0.11.1