Fix ColorHandlers on Forge being on the wrong event bus

This commit is contained in:
shedaniel
2021-02-04 23:17:09 +08:00
parent 2e77a254f6
commit 0a5f606bf4
2 changed files with 30 additions and 14 deletions

View File

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

View File

@@ -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()));
}
});
});
}