From 0a5f606bf454df4c7e705c176c7a4ce21b7bd5d6 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 4 Feb 2021 23:17:09 +0800 Subject: [PATCH] Fix ColorHandlers on Forge being on the wrong event bus --- .../platform/forge/EventBuses.java | 21 +++++++++++++---- .../registry/forge/ColorHandlersImpl.java | 23 +++++++++++-------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/forge/src/main/java/me/shedaniel/architectury/platform/forge/EventBuses.java b/forge/src/main/java/me/shedaniel/architectury/platform/forge/EventBuses.java index 1edf645b..16993ab0 100644 --- a/forge/src/main/java/me/shedaniel/architectury/platform/forge/EventBuses.java +++ b/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 EVENT_BUS_MAP = new HashMap<>(); + private static final Map>> 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 runnable : ON_REGISTERED.getOrDefault(modId, Collections.emptyList())) { + runnable.accept(bus); + } + } + + public static void onRegistered(String modId, Consumer 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 getModEventBus(String modId) { diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ColorHandlersImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ColorHandlersImpl.java index 8ed2165c..621c4629 100644 --- a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ColorHandlersImpl.java +++ b/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[]>> BLOCK_COLORS = Lists.newArrayList(); static { - MinecraftForge.EVENT_BUS.addListener(event -> { - for (Pair[]> pair : ITEM_COLORS) { - event.getItemColors().register(pair.getLeft(), unpackItems(pair.getRight())); - } - }); - MinecraftForge.EVENT_BUS.addListener(event -> { - for (Pair[]> pair : BLOCK_COLORS) { - event.getBlockColors().register(pair.getLeft(), unpackBlocks(pair.getRight())); - } + EventBuses.onRegistered(ArchitecturyForge.MOD_ID, bus -> { + bus.addListener(event -> { + for (Pair[]> pair : ITEM_COLORS) { + event.getItemColors().register(pair.getLeft(), unpackItems(pair.getRight())); + } + }); + bus.addListener(event -> { + for (Pair[]> pair : BLOCK_COLORS) { + event.getBlockColors().register(pair.getLeft(), unpackBlocks(pair.getRight())); + } + }); }); }