|
@@ -20,10 +20,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;
|
|
|
import me.shedaniel.architectury.registry.Registries;
|
|
@@ -47,10 +45,7 @@ import org.jetbrains.annotations.NotNull;
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
import java.lang.reflect.Type;
|
|
|
-import java.util.Iterator;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Optional;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.function.Consumer;
|
|
|
import java.util.function.Supplier;
|
|
|
|
|
@@ -71,10 +66,24 @@ public class RegistriesImpl {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ public static class Data {
|
|
|
+ private boolean collected = false;
|
|
|
+ private final Map<RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>> objects = new LinkedHashMap<>();
|
|
|
+
|
|
|
+ public void register(IForgeRegistry registry, RegistryObject object, Supplier<? extends IForgeRegistryEntry<?>> reference) {
|
|
|
+ if (!collected) {
|
|
|
+ objects.put(object, reference);
|
|
|
+ } else {
|
|
|
+ registry.register(reference.get());
|
|
|
+ object.updateReference(registry);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static class RegistryProviderImpl implements Registries.RegistryProvider {
|
|
|
private final String modId;
|
|
|
private final LazyLoadedValue<IEventBus> eventBus;
|
|
|
- private final Table<Type, RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>> registry = HashBasedTable.create();
|
|
|
+ private final Map<Type, Data> registry = new HashMap<>();
|
|
|
private final Multimap<ResourceKey<net.minecraft.core.Registry<?>>, Consumer<Registry<?>>> listeners = HashMultimap.create();
|
|
|
|
|
|
public RegistryProviderImpl(String modId) {
|
|
@@ -128,13 +137,19 @@ public class RegistriesImpl {
|
|
|
public void handleEvent(RegistryEvent.Register event) {
|
|
|
IForgeRegistry registry = event.getRegistry();
|
|
|
Registry<Object> archRegistry = get(registry);
|
|
|
-
|
|
|
- for (Map.Entry<Type, Map<RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>>> row : RegistryProviderImpl.this.registry.rowMap().entrySet()) {
|
|
|
- if (row.getKey() == event.getGenericType()) {
|
|
|
- for (Map.Entry<RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>> entry : row.getValue().entrySet()) {
|
|
|
+
|
|
|
+ for (Map.Entry<Type, Data> typeDataEntry : RegistryProviderImpl.this.registry.entrySet()) {
|
|
|
+ if (typeDataEntry.getKey() == registry.getRegistrySuperType()) {
|
|
|
+ Data data = typeDataEntry.getValue();
|
|
|
+
|
|
|
+ data.collected = true;
|
|
|
+
|
|
|
+ for (Map.Entry<RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>> entry : data.objects.entrySet()) {
|
|
|
registry.register(entry.getValue().get());
|
|
|
entry.getKey().updateReference(registry);
|
|
|
}
|
|
|
+
|
|
|
+ data.objects.clear();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -295,9 +310,9 @@ public class RegistriesImpl {
|
|
|
|
|
|
public static class ForgeBackedRegistryImpl<T extends IForgeRegistryEntry<T>> implements Registry<T> {
|
|
|
private IForgeRegistry<T> delegate;
|
|
|
- private Table<Type, RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>> registry;
|
|
|
+ private Map<Type, Data> registry;
|
|
|
|
|
|
- public ForgeBackedRegistryImpl(Table<Type, RegistryObject<?>, Supplier<? extends IForgeRegistryEntry<?>>> registry, IForgeRegistry<T> delegate) {
|
|
|
+ public ForgeBackedRegistryImpl(Map<Type, Data> registry, IForgeRegistry<T> delegate) {
|
|
|
this.registry = registry;
|
|
|
this.delegate = delegate;
|
|
|
}
|
|
@@ -349,7 +364,8 @@ public class RegistriesImpl {
|
|
|
@Override
|
|
|
public @NotNull <E extends T> RegistrySupplier<E> registerSupplied(ResourceLocation id, Supplier<E> supplier) {
|
|
|
RegistryObject registryObject = RegistryObject.of(id, delegate);
|
|
|
- registry.put(delegate.getRegistrySuperType(), registryObject, () -> supplier.get().setRegistryName(id));
|
|
|
+ registry.computeIfAbsent(delegate.getRegistrySuperType(), type -> new Data())
|
|
|
+ .register(delegate, registryObject, () -> supplier.get().setRegistryName(id));
|
|
|
return new RegistrySupplier<E>() {
|
|
|
@Override
|
|
|
public @NotNull ResourceLocation getRegistryId() {
|