mirror of
https://github.com/architectury/architectury-api.git
synced 2026-04-01 21:17:45 -05:00
Add Dynamic (DataPack, WorldGen) registries support (#462)
Signed-off-by: Sergey Shatunov <me@aur.rocks>
This commit is contained in:
@@ -23,6 +23,7 @@ import com.google.common.base.Objects;
|
||||
import com.google.common.base.Suppliers;
|
||||
import com.google.common.collect.HashMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.mojang.serialization.Codec;
|
||||
import dev.architectury.impl.RegistrySupplierImpl;
|
||||
import dev.architectury.platform.hooks.forge.EventBusesHooksImpl;
|
||||
import dev.architectury.registry.registries.Registrar;
|
||||
@@ -38,6 +39,7 @@ import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.neoforged.bus.api.EventPriority;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.neoforge.registries.DataPackRegistryEvent;
|
||||
import net.neoforged.neoforge.registries.NewRegistryEvent;
|
||||
import net.neoforged.neoforge.registries.RegisterEvent;
|
||||
import net.neoforged.neoforge.registries.RegistryBuilder;
|
||||
@@ -106,6 +108,9 @@ public class RegistrarManagerImpl {
|
||||
@Nullable
|
||||
private List<Registry<?>> newRegistries = new ArrayList<>();
|
||||
|
||||
@Nullable
|
||||
private List<DynamicRegistryData<?>> newDynamicRegistries = new ArrayList<>();
|
||||
|
||||
public RegistryProviderImpl(String modId) {
|
||||
this.modId = modId;
|
||||
EventBusesHooksImpl.getModEventBus(modId).get().register(new EventListener());
|
||||
@@ -138,6 +143,35 @@ public class RegistrarManagerImpl {
|
||||
return new RegistryBuilderWrapper<>(this, new RegistryBuilder<>(ResourceKey.createRegistryKey(registryId)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void registerDynamicRegistry(ResourceKey<Registry<T>> key, Codec<T> dataCodec) {
|
||||
if (newDynamicRegistries == null) {
|
||||
throw new IllegalStateException("Cannot create registries when registries are already aggregated!");
|
||||
}
|
||||
newDynamicRegistries.add(new DynamicRegistryData<>(key, dataCodec, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void registerDynamicRegistrySynced(ResourceKey<Registry<T>> key, Codec<T> dataCodec, Codec<T> networkCodec) {
|
||||
if (newDynamicRegistries == null) {
|
||||
throw new IllegalStateException("Cannot create registries when registries are already aggregated!");
|
||||
}
|
||||
newDynamicRegistries.add(new DynamicRegistryData<>(key, dataCodec, networkCodec));
|
||||
}
|
||||
|
||||
private record DynamicRegistryData<T>(
|
||||
ResourceKey<Registry<T>> key,
|
||||
Codec<T> dataCodec,
|
||||
@Nullable Codec<T> networkCodec) {
|
||||
public void register(DataPackRegistryEvent.NewRegistry event) {
|
||||
if (networkCodec != null) {
|
||||
event.dataPackRegistry(key, dataCodec, networkCodec);
|
||||
} else {
|
||||
event.dataPackRegistry(key, dataCodec);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class EventListener {
|
||||
@SubscribeEvent
|
||||
public void handleEvent(RegisterEvent event) {
|
||||
@@ -210,6 +244,16 @@ public class RegistrarManagerImpl {
|
||||
newRegistries = null;
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void handleEvent(DataPackRegistryEvent.NewRegistry event) {
|
||||
if (newDynamicRegistries != null) {
|
||||
for (DynamicRegistryData<?> data : newDynamicRegistries) {
|
||||
data.register(event);
|
||||
}
|
||||
newDynamicRegistries = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user