From d1747f5e0cd65fc37b2f9f9527ec9e86bf9b6432 Mon Sep 17 00:00:00 2001 From: iceBear67 Date: Sat, 4 Jan 2025 12:28:21 +0800 Subject: [PATCH] Fix: afk status isn't updated after disconnection --- .../server/ServerPlayNetworkHandlerMixin.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java index 0abc16f..8979a77 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -4,15 +4,22 @@ import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.callback.SFCallbacks; import io.ib67.sfcraft.mixin.common.bridge.ServerPlayerBridge; import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator; +import net.minecraft.network.DisconnectionInfo; import net.minecraft.network.message.MessageDecorator; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ServerPlayNetworkHandler.class) public abstract class ServerPlayNetworkHandlerMixin { + @Shadow + public ServerPlayerEntity player; + /** * @author icybear * @reason small method, overwrite to reduce overhead @@ -25,6 +32,11 @@ public abstract class ServerPlayNetworkHandlerMixin { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;disconnect(Lnet/minecraft/text/Text;)V", ordinal = 2)) public void onPlayerIdling(ServerPlayNetworkHandler instance, Text text) { ((ServerPlayerBridge) instance.player).setLastActionTime(Long.MAX_VALUE); - SFCallbacks.PLAYER_IDLE.invoker().onSwitchIdle(instance.player,true); + SFCallbacks.PLAYER_IDLE.invoker().onSwitchIdle(instance.player, true); + } + + @Inject(method = "onDisconnected", at = @At("HEAD")) + public void onDisconnected(DisconnectionInfo instance, CallbackInfo ci) { + player.updateLastActionTime(); } }