Răsfoiți Sursa

Implement ClientLifecycleEvent on Forge (+ testmod)
Bump version to 1.29

Signed-off-by: Max <maxh2709@gmail.com>

Max 3 ani în urmă
părinte
comite
8ff46417b1

+ 4 - 4
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<ClientState> 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<ClientState> CLIENT_STOPPING = EventFactory.createLoop();
     /**
      * Invoked after a world is loaded only on the client-side.

+ 41 - 0
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);
+    }
+}

+ 1 - 0
forge/src/main/resources/architectury.mixins.json

@@ -6,6 +6,7 @@
   "minVersion": "0.8",
   "client": [
     "MixinClientLevel",
+    "MixinMinecraft",
     "ParticleEngineAccessor",
     "ParticleEngineAccessor$MutableSpriteSetAccessor"
   ],

+ 1 - 1
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

+ 3 - 0
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<TestEntity>::new);