Implement ClientLifecycleEvent on Forge (+ testmod)

Signed-off-by: Max <maxh2709@gmail.com>
This commit is contained in:
Max
2022-01-30 03:12:40 +01:00
committed by shedaniel
parent f95be560ca
commit 80d2843601
4 changed files with 32 additions and 5 deletions

View File

@@ -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 level is loaded only on the client-side.

View File

@@ -0,0 +1,23 @@
package dev.architectury.mixin.forge;
import dev.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);
}
// using {1} rather than Log4j directly for 1.18.2+ support
@Inject(at = @At(value = "INVOKE", target = "{1}(Ljava/lang/String;)V" /* Logger.info */, shift = At.Shift.AFTER, remap = false), method = "destroy")
private void onStopping(CallbackInfo ci) {
ClientLifecycleEvent.CLIENT_STOPPING.invoker().stateChanged((Minecraft) (Object) this);
}
}

View File

@@ -5,7 +5,8 @@
"compatibilityLevel": "JAVA_16",
"minVersion": "0.8",
"client": [
"MixinClientLevel"
"MixinClientLevel",
"MixinMinecraft"
],
"mixins": [
"MixinBlockEntity",

View File

@@ -19,6 +19,7 @@
package dev.architectury.test;
import dev.architectury.event.events.client.ClientLifecycleEvent;
import dev.architectury.registry.client.level.entity.EntityRendererRegistry;
import dev.architectury.test.debug.ConsoleMessageSink;
import dev.architectury.test.debug.MessageSink;
@@ -60,6 +61,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();
EntityRendererRegistry.register(() -> TestEntity.TYPE, context -> new MinecartRenderer<>(context, ModelLayers.MINECART));