Kaynağa Gözat

Fix ColorHandlers on Forge being on the wrong event bus

shedaniel 4 yıl önce
ebeveyn
işleme
0a5f606bf4

+ 17 - 4
forge/src/main/java/me/shedaniel/architectury/platform/forge/EventBuses.java

@@ -21,15 +21,14 @@ package me.shedaniel.architectury.platform.forge;
 
 import net.minecraftforge.eventbus.api.IEventBus;
 
-import javax.annotation.Nullable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
+import java.util.function.Consumer;
 
 public final class EventBuses {
     private EventBuses() {}
     
     private static final Map<String, IEventBus> EVENT_BUS_MAP = new HashMap<>();
+    private static final Map<String, List<Consumer<IEventBus>>> ON_REGISTERED = new HashMap<>();
     
     public static void registerModEventBus(String modId, IEventBus bus) {
         IEventBus previous = EVENT_BUS_MAP.put(modId, bus);
@@ -37,6 +36,20 @@ public final class EventBuses {
             EVENT_BUS_MAP.put(modId, previous);
             throw new IllegalStateException("Can't register event bus for mod '" + modId + "' because it was previously registered!");
         }
+        
+        for (Consumer<IEventBus> runnable : ON_REGISTERED.getOrDefault(modId, Collections.emptyList())) {
+            runnable.accept(bus);
+        }
+    }
+    
+    public static void onRegistered(String modId, Consumer<IEventBus> busConsumer) {
+        if (EVENT_BUS_MAP.containsKey(modId)) {
+            busConsumer.accept(EVENT_BUS_MAP.get(modId));
+        } else {
+            synchronized (ON_REGISTERED) {
+                ON_REGISTERED.computeIfAbsent(modId, s -> new ArrayList<>()).add(busConsumer);
+            }
+        }
     }
     
     public static Optional<IEventBus> getModEventBus(String modId) {

+ 13 - 10
forge/src/main/java/me/shedaniel/architectury/registry/forge/ColorHandlersImpl.java

@@ -20,13 +20,14 @@
 package me.shedaniel.architectury.registry.forge;
 
 import com.google.common.collect.Lists;
+import me.shedaniel.architectury.forge.ArchitecturyForge;
+import me.shedaniel.architectury.platform.forge.EventBuses;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.color.block.BlockColor;
 import net.minecraft.client.color.item.ItemColor;
 import net.minecraft.world.level.ItemLike;
 import net.minecraft.world.level.block.Block;
 import net.minecraftforge.client.event.ColorHandlerEvent;
-import net.minecraftforge.common.MinecraftForge;
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.util.List;
@@ -37,15 +38,17 @@ public class ColorHandlersImpl {
     private static final List<Pair<BlockColor, Supplier<Block>[]>> BLOCK_COLORS = Lists.newArrayList();
     
     static {
-        MinecraftForge.EVENT_BUS.<ColorHandlerEvent.Item>addListener(event -> {
-            for (Pair<ItemColor, Supplier<ItemLike>[]> pair : ITEM_COLORS) {
-                event.getItemColors().register(pair.getLeft(), unpackItems(pair.getRight()));
-            }
-        });
-        MinecraftForge.EVENT_BUS.<ColorHandlerEvent.Block>addListener(event -> {
-            for (Pair<BlockColor, Supplier<Block>[]> pair : BLOCK_COLORS) {
-                event.getBlockColors().register(pair.getLeft(), unpackBlocks(pair.getRight()));
-            }
+        EventBuses.onRegistered(ArchitecturyForge.MOD_ID, bus -> {
+            bus.<ColorHandlerEvent.Item>addListener(event -> {
+                for (Pair<ItemColor, Supplier<ItemLike>[]> pair : ITEM_COLORS) {
+                    event.getItemColors().register(pair.getLeft(), unpackItems(pair.getRight()));
+                }
+            });
+            bus.<ColorHandlerEvent.Block>addListener(event -> {
+                for (Pair<BlockColor, Supplier<Block>[]> pair : BLOCK_COLORS) {
+                    event.getBlockColors().register(pair.getLeft(), unpackBlocks(pair.getRight()));
+                }
+            });
         });
     }