Add Dynamic (DataPack, WorldGen) registries support (#462)

Signed-off-by: Sergey Shatunov <me@aur.rocks>
This commit is contained in:
Sergey Shatunov
2024-01-10 05:03:43 +08:00
committed by GitHub
parent 907389bd6b
commit a4cbdb3102
4 changed files with 159 additions and 0 deletions

View File

@@ -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.EventBusesHooks;
import dev.architectury.registry.registries.Registrar;
@@ -122,6 +123,9 @@ public class RegistrarManagerImpl {
@Nullable
private List<RegistryBuilderEntry> builders = new ArrayList<>();
@Nullable
private List<DynamicRegistryData<?>> newDynamicRegistries = new ArrayList<>();
public RegistryProviderImpl(String modId) {
this.modId = modId;
this.eventBus = Suppliers.memoize(() -> {
@@ -177,6 +181,36 @@ public class RegistrarManagerImpl {
.setName(registryId), 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) {
@@ -266,6 +300,16 @@ public class RegistrarManagerImpl {
builders = null;
}
}
@SubscribeEvent
public void handleEvent(DataPackRegistryEvent.NewRegistry event) {
if (newDynamicRegistries != null) {
for (DynamicRegistryData<?> data : newDynamicRegistries) {
data.register(event);
}
newDynamicRegistries = null;
}
}
}
}