Add ClientLifecycleEvent.CLIENT_SETUP and allow deferring in ColorHandlers

This commit is contained in:
shedaniel
2021-01-23 02:15:49 +08:00
parent 7c4b602b10
commit 465aeae5bd
10 changed files with 104 additions and 66 deletions

View File

@@ -58,6 +58,12 @@ public final class EventFactory {
return new EventImpl<>(function);
}
@SafeVarargs
public static <T> Event<T> createLoop(T... typeGetter) {
if (typeGetter.length != 0) throw new IllegalStateException("array must be empty!");
return createLoop((Class<T>) typeGetter.getClass().getComponentType());
}
@SuppressWarnings("UnstableApiUsage")
public static <T> Event<T> createLoop(Class<T> clazz) {
return of(listeners -> (T) Proxy.newProxyInstance(EventFactory.class.getClassLoader(), new Class[]{clazz}, new AbstractInvocationHandler() {
@@ -71,6 +77,12 @@ public final class EventFactory {
}));
}
@SafeVarargs
public static <T> Event<T> createInteractionResult(T... typeGetter) {
if (typeGetter.length != 0) throw new IllegalStateException("array must be empty!");
return createInteractionResult((Class<T>) typeGetter.getClass().getComponentType());
}
@SuppressWarnings("UnstableApiUsage")
public static <T> Event<T> createInteractionResult(Class<T> clazz) {
return of(listeners -> (T) Proxy.newProxyInstance(EventFactory.class.getClassLoader(), new Class[]{clazz}, new AbstractInvocationHandler() {
@@ -87,6 +99,12 @@ public final class EventFactory {
}));
}
@SafeVarargs
public static <T> Event<T> createInteractionResultHolder(T... typeGetter) {
if (typeGetter.length != 0) throw new IllegalStateException("array must be empty!");
return createInteractionResultHolder((Class<T>) typeGetter.getClass().getComponentType());
}
@SuppressWarnings("UnstableApiUsage")
public static <T> Event<T> createInteractionResultHolder(Class<T> clazz) {
return of(listeners -> (T) Proxy.newProxyInstance(EventFactory.class.getClassLoader(), new Class[]{clazz}, new AbstractInvocationHandler() {
@@ -103,6 +121,12 @@ public final class EventFactory {
}));
}
@SafeVarargs
public static <T> Event<Consumer<T>> createConsumerLoop(T... typeGetter) {
if (typeGetter.length != 0) throw new IllegalStateException("array must be empty!");
return createConsumerLoop((Class<T>) typeGetter.getClass().getComponentType());
}
@SuppressWarnings("UnstableApiUsage")
public static <T> Event<Consumer<T>> createConsumerLoop(Class<T> clazz) {
Event<Consumer<T>> event = of(listeners -> (Consumer<T>) Proxy.newProxyInstance(EventFactory.class.getClassLoader(), new Class[]{Consumer.class}, new AbstractInvocationHandler() {
@@ -124,6 +148,12 @@ public final class EventFactory {
return event;
}
@SafeVarargs
public static <T> Event<Actor<T>> createActorLoop(T... typeGetter) {
if (typeGetter.length != 0) throw new IllegalStateException("array must be empty!");
return createActorLoop((Class<T>) typeGetter.getClass().getComponentType());
}
@SuppressWarnings("UnstableApiUsage")
public static <T> Event<Actor<T>> createActorLoop(Class<T> clazz) {
Event<Actor<T>> event = of(listeners -> (Actor<T>) Proxy.newProxyInstance(EventFactory.class.getClassLoader(), new Class[]{Actor.class}, new AbstractInvocationHandler() {

View File

@@ -41,6 +41,7 @@ public interface ClientLifecycleEvent {
* Invoked after a world is loaded only on client, equivalent to forge's {@code WorldEvent.Load}.
*/
Event<ClientWorldState> CLIENT_WORLD_LOAD = EventFactory.createLoop(ClientWorldState.class);
Event<ClientState> CLIENT_SETUP = EventFactory.createLoop();
@Deprecated
@Environment(EnvType.CLIENT)

View File

@@ -27,17 +27,34 @@ import net.minecraft.client.color.item.ItemColor;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Block;
import java.util.Arrays;
import java.util.function.Supplier;
@Environment(EnvType.CLIENT)
public final class ColorHandlers {
private ColorHandlers() {}
@ExpectPlatform
public static void registerItemColors(ItemColor color, ItemLike... items) {
registerItemColors(color, Arrays.stream(items)
.map(item -> (Supplier<ItemLike>) () -> item)
.toArray(Supplier[]::new));
}
public static void registerBlockColors(BlockColor color, Block... blocks) {
registerBlockColors(color, Arrays.stream(blocks)
.map(block -> (Supplier<Block>) () -> block)
.toArray(Supplier[]::new));
}
@SafeVarargs
@ExpectPlatform
public static void registerItemColors(ItemColor color, Supplier<ItemLike>... items) {
throw new AssertionError();
}
@SafeVarargs
@ExpectPlatform
public static void registerBlockColors(BlockColor color, Block... blocks) {
public static void registerBlockColors(BlockColor color, Supplier<Block>... blocks) {
throw new AssertionError();
}
}

View File

@@ -39,6 +39,5 @@ public final class RenderTypes {
public static void register(RenderType type, Fluid... fluids) {
throw new AssertionError();
}
}

View File

@@ -0,0 +1,10 @@
package me.shedaniel.architectury.init.fabric;
import me.shedaniel.architectury.event.events.client.ClientLifecycleEvent;
import net.minecraft.client.Minecraft;
public class ArchitecturyClient {
public static void init() {
ClientLifecycleEvent.CLIENT_SETUP.invoker().stateChanged(Minecraft.getInstance());
}
}

View File

@@ -25,12 +25,21 @@ import net.minecraft.client.color.item.ItemColor;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Block;
import java.util.Arrays;
import java.util.function.Supplier;
public class ColorHandlersImpl {
public static void registerItemColors(ItemColor color, ItemLike... items) {
ColorProviderRegistry.ITEM.register(color, items);
@SafeVarargs
public static void registerItemColors(ItemColor itemColor, Supplier<ItemLike>... items) {
ColorProviderRegistry.ITEM.register(itemColor, Arrays.stream(items)
.map(Supplier::get)
.toArray(ItemLike[]::new));
}
public static void registerBlockColors(BlockColor color, Block... blocks) {
ColorProviderRegistry.BLOCK.register(color, blocks);
@SafeVarargs
public static void registerBlockColors(BlockColor blockColor, Supplier<Block>... blocks) {
ColorProviderRegistry.BLOCK.register(blockColor, Arrays.stream(blocks)
.map(Supplier::get)
.toArray(Block[]::new));
}
}

View File

@@ -16,6 +16,9 @@
"main": [
"me.shedaniel.architectury.utils.fabric.GameInstanceImpl::init"
],
"client": [
"me.shedaniel.architectury.init.fabric.ArchitecturyClient::init"
],
"modmenu": [
"me.shedaniel.architectury.compat.fabric.ModMenuCompatibility"
]

View File

@@ -38,6 +38,7 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import java.util.List;
@@ -275,5 +276,10 @@ public class EventHandlerImplClient {
public static void event(net.minecraftforge.client.event.TextureStitchEvent.Post event) {
TextureStitchEvent.POST.invoker().stitch(event.getMap());
}
@SubscribeEvent
public static void event(FMLClientSetupEvent event) {
ClientLifecycleEvent.CLIENT_SETUP.invoker().stateChanged(event.getMinecraftSupplier().get());
}
}
}

View File

@@ -1,49 +0,0 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021 shedaniel
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package me.shedaniel.architectury.event.forge;
import me.shedaniel.architectury.event.events.TextureStitchEvent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public class ModBasedEventHandlerImpl {
@OnlyIn(Dist.CLIENT)
public static class Client {
@SubscribeEvent
public static void event(net.minecraftforge.client.event.TextureStitchEvent.Pre event) {
TextureStitchEvent.PRE.invoker().stitch(event.getMap(), event::addSprite);
}
@SubscribeEvent
public static void event(net.minecraftforge.client.event.TextureStitchEvent.Post event) {
TextureStitchEvent.POST.invoker().stitch(event.getMap());
}
}
public static class Common {
}
@OnlyIn(Dist.DEDICATED_SERVER)
public static class Server {
}
}

View File

@@ -29,38 +29,50 @@ import net.minecraftforge.client.event.ColorHandlerEvent;
import net.minecraftforge.common.MinecraftForge;
import org.apache.commons.lang3.tuple.Pair;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
public class ColorHandlersImpl {
private static final List<Pair<ItemColor, ItemLike[]>> ITEM_COLORS = Lists.newArrayList();
private static final List<Pair<BlockColor, Block[]>> BLOCK_COLORS = Lists.newArrayList();
private static final List<Pair<ItemColor, Supplier<ItemLike>[]>> ITEM_COLORS = Lists.newArrayList();
private static final List<Pair<BlockColor, Supplier<Block>[]>> BLOCK_COLORS = Lists.newArrayList();
static {
MinecraftForge.EVENT_BUS.<ColorHandlerEvent.Item>addListener(event -> {
for (Pair<ItemColor, ItemLike[]> pair : ITEM_COLORS) {
event.getItemColors().register(pair.getLeft(), pair.getRight());
for (Pair<ItemColor, Supplier<ItemLike>[]> pair : ITEM_COLORS) {
event.getItemColors().register(pair.getLeft(), Arrays.stream(pair.getRight())
.map(Supplier::get)
.toArray(ItemLike[]::new));
}
});
MinecraftForge.EVENT_BUS.<ColorHandlerEvent.Block>addListener(event -> {
for (Pair<BlockColor, Block[]> pair : BLOCK_COLORS) {
event.getBlockColors().register(pair.getLeft(), pair.getRight());
for (Pair<BlockColor, Supplier<Block>[]> pair : BLOCK_COLORS) {
event.getBlockColors().register(pair.getLeft(), Arrays.stream(pair.getRight())
.map(Supplier::get)
.toArray(Block[]::new));
}
});
}
public static void registerItemColors(ItemColor itemColor, ItemLike... items) {
@SafeVarargs
public static void registerItemColors(ItemColor itemColor, Supplier<ItemLike>... items) {
if (Minecraft.getInstance().getItemColors() == null) {
ITEM_COLORS.add(Pair.of(itemColor, items));
} else {
Minecraft.getInstance().getItemColors().register(itemColor, items);
Minecraft.getInstance().getItemColors().register(itemColor, Arrays.stream(items)
.map(Supplier::get)
.toArray(ItemLike[]::new));
}
}
public static void registerBlockColors(BlockColor blockColor, Block... blocks) {
@SafeVarargs
public static void registerBlockColors(BlockColor blockColor, Supplier<Block>... blocks) {
if (Minecraft.getInstance().getBlockColors() == null) {
BLOCK_COLORS.add(Pair.of(blockColor, blocks));
} else {
Minecraft.getInstance().getBlockColors().register(blockColor, blocks);
Minecraft.getInstance().getBlockColors().register(blockColor, Arrays.stream(blocks)
.map(Supplier::get)
.toArray(Block[]::new));
}
}
}