]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Predict typing indicator (#29551)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sat, 29 Jun 2024 03:33:56 +0000 (13:33 +1000)
committerGitHub <noreply@github.com>
Sat, 29 Jun 2024 03:33:56 +0000 (13:33 +1000)
It greatly annoys me in the rare instance I do play.

Content.Client/Chat/TypingIndicator/TypingIndicatorSystem.cs
Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs
Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs

index 844f793fc49991b6501de1cd25307c3bfd39c10f..33dbc06ad8786993ec37371bcfa5d393b4d067c2 100644 (file)
@@ -65,14 +65,13 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
     {
         if (_isClientTyping == isClientTyping)
             return;
-        _isClientTyping = isClientTyping;
 
-        // check if player controls any pawn
+        // check if player controls any entity.
         if (_playerManager.LocalEntity == null)
             return;
 
-        // send a networked event to server
-        RaiseNetworkEvent(new TypingChangedEvent(isClientTyping));
+        _isClientTyping = isClientTyping;
+        RaisePredictiveEvent(new TypingChangedEvent(isClientTyping));
     }
 
     private void OnShowTypingChanged(bool showTyping)
index c923738930a37fee3d1ffbfb5ea19173426486c1..d180a958ca360546622f251566bed18bb047d26d 100644 (file)
@@ -1,64 +1,7 @@
-using Content.Shared.ActionBlocker;
 using Content.Shared.Chat.TypingIndicator;
-using Robust.Shared.Player;
 
 namespace Content.Server.Chat.TypingIndicator;
 
-// Server-side typing system
-// It receives networked typing events from clients
-// And sync typing indicator using appearance component
 public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
 {
-    [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
-    [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
-
-    public override void Initialize()
-    {
-        base.Initialize();
-        SubscribeLocalEvent<PlayerAttachedEvent>(OnPlayerAttached);
-        SubscribeLocalEvent<TypingIndicatorComponent, PlayerDetachedEvent>(OnPlayerDetached);
-        SubscribeNetworkEvent<TypingChangedEvent>(OnClientTypingChanged);
-    }
-
-    private void OnPlayerAttached(PlayerAttachedEvent ev)
-    {
-        // when player poses entity we want to make sure that there is typing indicator
-        EnsureComp<TypingIndicatorComponent>(ev.Entity);
-        // we also need appearance component to sync visual state
-        EnsureComp<AppearanceComponent>(ev.Entity);
-    }
-
-    private void OnPlayerDetached(EntityUid uid, TypingIndicatorComponent component, PlayerDetachedEvent args)
-    {
-        // player left entity body - hide typing indicator
-        SetTypingIndicatorEnabled(uid, false);
-    }
-
-    private void OnClientTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs args)
-    {
-        var uid = args.SenderSession.AttachedEntity;
-        if (!Exists(uid))
-        {
-            Log.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity.");
-            return;
-        }
-
-        // check if this entity can speak or emote
-        if (!_actionBlocker.CanEmote(uid.Value) && !_actionBlocker.CanSpeak(uid.Value))
-        {
-            // nah, make sure that typing indicator is disabled
-            SetTypingIndicatorEnabled(uid.Value, false);
-            return;
-        }
-
-        SetTypingIndicatorEnabled(uid.Value, ev.IsTyping);
-    }
-
-    private void SetTypingIndicatorEnabled(EntityUid uid, bool isEnabled, AppearanceComponent? appearance = null)
-    {
-        if (!Resolve(uid, ref appearance, false))
-            return;
-
-        _appearance.SetData(uid, TypingIndicatorVisuals.IsTyping, isEnabled, appearance);
-    }
 }
index 81ebcfb1088e0536978caaf2f6c5939fa8b0ed68..dffe3cc185b459e066c019babadf748e96857dc8 100644 (file)
@@ -1,12 +1,17 @@
+using Content.Shared.ActionBlocker;
 using Content.Shared.Clothing;
+using Robust.Shared.Player;
 
 namespace Content.Shared.Chat.TypingIndicator;
 
 /// <summary>
-///     Sync typing indicator icon between client and server.
+///     Supports typing indicators on entities.
 /// </summary>
 public abstract class SharedTypingIndicatorSystem : EntitySystem
 {
+    [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
+    [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+
     /// <summary>
     ///     Default ID of <see cref="TypingIndicatorPrototype"/>
     /// </summary>
@@ -16,8 +21,27 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
     public override void Initialize()
     {
         base.Initialize();
+        SubscribeLocalEvent<PlayerAttachedEvent>(OnPlayerAttached);
+        SubscribeLocalEvent<TypingIndicatorComponent, PlayerDetachedEvent>(OnPlayerDetached);
+
         SubscribeLocalEvent<TypingIndicatorClothingComponent, ClothingGotEquippedEvent>(OnGotEquipped);
         SubscribeLocalEvent<TypingIndicatorClothingComponent, ClothingGotUnequippedEvent>(OnGotUnequipped);
+
+        SubscribeAllEvent<TypingChangedEvent>(OnTypingChanged);
+    }
+
+    private void OnPlayerAttached(PlayerAttachedEvent ev)
+    {
+        // when player poses entity we want to make sure that there is typing indicator
+        EnsureComp<TypingIndicatorComponent>(ev.Entity);
+        // we also need appearance component to sync visual state
+        EnsureComp<AppearanceComponent>(ev.Entity);
+    }
+
+    private void OnPlayerDetached(EntityUid uid, TypingIndicatorComponent component, PlayerDetachedEvent args)
+    {
+        // player left entity body - hide typing indicator
+        SetTypingIndicatorEnabled(uid, false);
     }
 
     private void OnGotEquipped(EntityUid uid, TypingIndicatorClothingComponent component, ClothingGotEquippedEvent args)
@@ -33,6 +57,34 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
         if (!TryComp<TypingIndicatorComponent>(args.Wearer, out var indicator))
             return;
 
-        indicator.Prototype = SharedTypingIndicatorSystem.InitialIndicatorId;
+        indicator.Prototype = InitialIndicatorId;
+    }
+
+    private void OnTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs args)
+    {
+        var uid = args.SenderSession.AttachedEntity;
+        if (!Exists(uid))
+        {
+            Log.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity.");
+            return;
+        }
+
+        // check if this entity can speak or emote
+        if (!_actionBlocker.CanEmote(uid.Value) && !_actionBlocker.CanSpeak(uid.Value))
+        {
+            // nah, make sure that typing indicator is disabled
+            SetTypingIndicatorEnabled(uid.Value, false);
+            return;
+        }
+
+        SetTypingIndicatorEnabled(uid.Value, ev.IsTyping);
+    }
+
+    private void SetTypingIndicatorEnabled(EntityUid uid, bool isEnabled, AppearanceComponent? appearance = null)
+    {
+        if (!Resolve(uid, ref appearance, false))
+            return;
+
+        _appearance.SetData(uid, TypingIndicatorVisuals.IsTyping, isEnabled, appearance);
     }
 }