diff --git a/common/src/main/java/me/shedaniel/architectury/event/events/client/ClientLifecycleEvent.java b/common/src/main/java/me/shedaniel/architectury/event/events/client/ClientLifecycleEvent.java index aaa2dd53..26063913 100644 --- a/common/src/main/java/me/shedaniel/architectury/event/events/client/ClientLifecycleEvent.java +++ b/common/src/main/java/me/shedaniel/architectury/event/events/client/ClientLifecycleEvent.java @@ -30,14 +30,14 @@ import net.minecraft.client.multiplayer.ClientLevel; @Environment(EnvType.CLIENT) public interface ClientLifecycleEvent { /** - * Invoked when client has been initialised, not available in forge. + * Invoked when client has been initialised. + * Equivalent to Fabric's {@code ClientLifecycleEvents.CLIENT_STARTING}. */ - @Deprecated Event CLIENT_STARTED = EventFactory.createLoop(); /** - * Invoked when client is stopping, not available in forge. + * Invoked when client is stopping. + * Equivalent to Fabric's {@code ClientLifecycleEvents.CLIENT_STOPPING}. */ - @Deprecated Event CLIENT_STOPPING = EventFactory.createLoop(); /** * Invoked after a world is loaded only on the client-side. diff --git a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/MixinMinecraft.java b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/MixinMinecraft.java new file mode 100644 index 00000000..71fd18f5 --- /dev/null +++ b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/MixinMinecraft.java @@ -0,0 +1,41 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * 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.mixin.forge; + +import me.shedaniel.architectury.event.events.client.ClientLifecycleEvent; +import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// adopted from fabric +@Mixin(Minecraft.class) +public abstract class MixinMinecraft { + @Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;gameThread:Ljava/lang/Thread;", shift = At.Shift.AFTER, ordinal = 0), method = "run") + private void onStart(CallbackInfo ci) { + ClientLifecycleEvent.CLIENT_STARTED.invoker().stateChanged((Minecraft) (Object) this); + } + + @Inject(at = @At(value = "INVOKE", target = "Lorg/apache/logging/log4j/Logger;info(Ljava/lang/String;)V", shift = At.Shift.AFTER, remap = false), method = "destroy") + private void onStopping(CallbackInfo ci) { + ClientLifecycleEvent.CLIENT_STOPPING.invoker().stateChanged((Minecraft) (Object) this); + } +} diff --git a/forge/src/main/resources/architectury.mixins.json b/forge/src/main/resources/architectury.mixins.json index c7a50d24..92e1d3d6 100644 --- a/forge/src/main/resources/architectury.mixins.json +++ b/forge/src/main/resources/architectury.mixins.json @@ -6,6 +6,7 @@ "minVersion": "0.8", "client": [ "MixinClientLevel", + "MixinMinecraft", "ParticleEngineAccessor", "ParticleEngineAccessor$MutableSpriteSetAccessor" ], diff --git a/gradle.properties b/gradle.properties index 0dd07d8b..fbf0dc5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ supported_version=1.16.4/5 archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=1.28 +base_version=1.29 maven_group=me.shedaniel fabric_loader_version=0.12.12 diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java index 8417c7b5..cb0295a5 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java @@ -19,6 +19,7 @@ package me.shedaniel.architectury.test; +import me.shedaniel.architectury.event.events.client.ClientLifecycleEvent; import me.shedaniel.architectury.registry.entity.EntityRenderers; import me.shedaniel.architectury.test.debug.ConsoleMessageSink; import me.shedaniel.architectury.test.debug.MessageSink; @@ -59,6 +60,8 @@ public class TestMod { public static class Client { @Environment(EnvType.CLIENT) public static void initializeClient() { + ClientLifecycleEvent.CLIENT_STARTED.register((client) -> SINK.accept("Client started!")); + ClientLifecycleEvent.CLIENT_STOPPING.register((client) -> SINK.accept("Client stopping!")); TestKeybinds.initialize(); TestModNet.initializeClient(); EntityRenderers.register(TestEntity.TYPE, MinecartRenderer::new);