فهرست منبع

[ci skip] Allow registering entries after it has been collected on Forge (#193)

* Allow registering entries after it has been collected on Forge

* Fix compilation
shedaniel 3 سال پیش
والد
کامیت
d74f13e52a
1فایلهای تغییر یافته به همراه30 افزوده شده و 14 حذف شده
  1. 30 14
      forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java

+ 30 - 14
forge/src/main/java/me/shedaniel/architectury/registry/forge/RegistriesImpl.java

@@ -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() {