]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Speech is relayed by holopad holograms (#33978)
authorchromiumboy <50505512+chromiumboy@users.noreply.github.com>
Thu, 2 Jan 2025 11:41:12 +0000 (05:41 -0600)
committerGitHub <noreply@github.com>
Thu, 2 Jan 2025 11:41:12 +0000 (12:41 +0100)
* Initial commit

* Corrected a field attribute

Content.Server/Holopad/HolopadSystem.cs
Content.Server/Telephone/TelephoneSystem.cs
Content.Shared/Telephone/TelephoneComponent.cs
Resources/Locale/en-US/telephone/telephone.ftl
Resources/Prototypes/Entities/Structures/Machines/holopad.yml

index fabf642ad3b0b5fad20c95379738840e8f8f9e2d..c5e6c15b5163073c389a6d6b5a3f586a4362779c 100644 (file)
@@ -10,6 +10,7 @@ using Content.Shared.Holopad;
 using Content.Shared.IdentityManagement;
 using Content.Shared.Labels.Components;
 using Content.Shared.Silicons.StationAi;
+using Content.Shared.Speech;
 using Content.Shared.Telephone;
 using Content.Shared.UserInterface;
 using Content.Shared.Verbs;
@@ -528,16 +529,23 @@ public sealed class HolopadSystem : SharedHolopadSystem
             entity.Comp.HologramProtoId == null)
             return;
 
-        var uid = Spawn(entity.Comp.HologramProtoId, Transform(entity).Coordinates);
+        var hologramUid = Spawn(entity.Comp.HologramProtoId, Transform(entity).Coordinates);
 
         // Safeguard - spawned holograms must have this component
-        if (!TryComp<HolopadHologramComponent>(uid, out var component))
+        if (!TryComp<HolopadHologramComponent>(hologramUid, out var holopadHologram))
         {
-            Del(uid);
+            Del(hologramUid);
             return;
         }
 
-        entity.Comp.Hologram = new Entity<HolopadHologramComponent>(uid, component);
+        entity.Comp.Hologram = new Entity<HolopadHologramComponent>(hologramUid, holopadHologram);
+
+        // Relay speech preferentially through the hologram
+        if (TryComp<SpeechComponent>(hologramUid, out var hologramSpeech) &&
+            TryComp<TelephoneComponent>(entity, out var entityTelephone))
+        {
+            _telephoneSystem.SetSpeakerForTelephone((entity, entityTelephone), (hologramUid, hologramSpeech));
+        }
     }
 
     private void DeleteHologram(Entity<HolopadHologramComponent> hologram, Entity<HolopadComponent> attachedHolopad)
index ff7368bfb342e2e2c5d875c0d131a98e25942d80..dd068612f75a4f46bd4b62db730b910b16067247 100644 (file)
@@ -105,14 +105,17 @@ public sealed class TelephoneSystem : SharedTelephoneSystem
         var nameEv = new TransformSpeakerNameEvent(args.MessageSource, Name(args.MessageSource));
         RaiseLocalEvent(args.MessageSource, nameEv);
 
-        var name = Loc.GetString("speech-name-relay",
-            ("speaker", Name(entity)),
-            ("originalName", nameEv.VoiceName));
+        // Determine if speech should be relayed via the telephone itself or a designated speaker
+        var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;
+
+        var name = Loc.GetString("chat-telephone-name-relay",
+            ("originalName", nameEv.VoiceName),
+            ("speaker", Name(speaker)));
 
         var range = args.TelephoneSource.Comp.LinkedTelephones.Count > 1 ? ChatTransmitRange.HideChat : ChatTransmitRange.GhostRangeLimit;
         var volume = entity.Comp.SpeakerVolume == TelephoneVolume.Speak ? InGameICChatType.Speak : InGameICChatType.Whisper;
 
-        _chat.TrySendInGameICMessage(entity, args.Message, volume, range, nameOverride: name, checkRadioPrefix: false);
+        _chat.TrySendInGameICMessage(speaker, args.Message, volume, range, nameOverride: name, checkRadioPrefix: false);
     }
 
     #endregion
@@ -412,6 +415,11 @@ public sealed class TelephoneSystem : SharedTelephoneSystem
         }
     }
 
+    public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
+    {
+        entity.Comp.Speaker = speaker;
+    }
+
     private (string?, string?) GetNameAndJobOfCallingEntity(EntityUid uid)
     {
         string? presumedName = null;
index d739a8412d6e5a989f89381c2456e348f676bf85..c24840ce01a4c3e69a90b5b79c583761d95cf0dd 100644 (file)
@@ -1,4 +1,5 @@
 using Content.Shared.Chat;
+using Content.Shared.Speech;
 using Robust.Shared.Audio;
 using Robust.Shared.GameStates;
 using Robust.Shared.Serialization;
@@ -92,6 +93,12 @@ public sealed partial class TelephoneComponent : Component
     [DataField]
     public bool UnlistedNumber = false;
 
+    /// <summary>
+    /// Speech is relayed through this entity instead of the telephone
+    /// </summary>
+    [ViewVariables(VVAccess.ReadOnly)]
+    public Entity<SpeechComponent>? Speaker = null;
+
     /// <summary>
     /// Telephone number for this device
     /// </summary>
@@ -183,7 +190,7 @@ public readonly record struct TelephoneMessageReceivedEvent(string Message, MsgC
 public struct TelephoneCallOptions
 {
     public bool IgnoreRange;    // The source can always reach its target
-    public bool ForceConnect;   // The source immediately starts a call with the receiver, potentially interrupting a call that is already in progress 
+    public bool ForceConnect;   // The source immediately starts a call with the receiver, potentially interrupting a call that is already in progress
     public bool ForceJoin;      // The source smoothly joins a call in progress, or starts a normal call with the receiver if there is none
     public bool MuteSource;     // Chatter from the source is not transmitted - could be used for eavesdropping when combined with 'ForceJoin'
     public bool MuteReceiver;   // Chatter from the receiver is not transmitted - useful for broadcasting messages to multiple receivers
@@ -215,7 +222,7 @@ public enum TelephoneVolume : byte
 [Serializable, NetSerializable]
 public enum TelephoneRange : byte
 {
-    Grid,       // Can only reach telephones that are on the same grid 
+    Grid,       // Can only reach telephones that are on the same grid
     Map,        // Can reach any telephone that is on the same map
     Unlimited,  // Can reach any telephone, across any distance
 }
index 67e54c26f3080157c16077a07868a60ccce1a769..b279111d2370d5dd2723f85b8cbb130639c21afc 100644 (file)
@@ -8,3 +8,6 @@ chat-telephone-caller-id-with-job = [color={$color}][font={$fontType} size={$fon
 chat-telephone-caller-id-without-job = [color={$color}][font={$fontType} size={$fontSize}][bold]{CAPITALIZE($callerName)}[/bold][/font][/color]
 chat-telephone-unknown-device = [color={$color}][font={$fontType} size={$fontSize}][bolditalic]Unknown source[/bolditalic][/font][/color]
 chat-telephone-device-id = [color={$color}][font={$fontType} size={$fontSize}][bold]{CAPITALIZE($deviceName)}[/bold][/font][/color]
+
+# Chat text
+chat-telephone-name-relay = {$originalName} ({$speaker})
\ No newline at end of file
index 891777f306cd03290718a62d5f2b1b5219d0a1cc..0dfe45c5ae40ca543e278f3f4379b17292b5067e 100644 (file)
 # These are spawned by holopads
 - type: entity
   id: HolopadHologram
+  name: hologram
   categories: [ HideSpawnMenu ]
   suffix: DO NOT MAP
   components:
   - type: Appearance
   - type: TypingIndicator
     proto: robot
+  - type: Speech
+    speechVerb: Robotic
+    speechSounds: Borg
+    speechBubbleOffset: 0.45
   - type: HolopadHologram
     rsiPath: Structures/Machines/holopad.rsi
     rsiState: icon_in_call