From: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:41:12 +0000 (-0600) Subject: Speech is relayed by holopad holograms (#33978) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=59a87ef2c845cb27026600e68960150bc8608f0e;p=space-station-14.git Speech is relayed by holopad holograms (#33978) * Initial commit * Corrected a field attribute --- diff --git a/Content.Server/Holopad/HolopadSystem.cs b/Content.Server/Holopad/HolopadSystem.cs index fabf642ad3..c5e6c15b51 100644 --- a/Content.Server/Holopad/HolopadSystem.cs +++ b/Content.Server/Holopad/HolopadSystem.cs @@ -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(uid, out var component)) + if (!TryComp(hologramUid, out var holopadHologram)) { - Del(uid); + Del(hologramUid); return; } - entity.Comp.Hologram = new Entity(uid, component); + entity.Comp.Hologram = new Entity(hologramUid, holopadHologram); + + // Relay speech preferentially through the hologram + if (TryComp(hologramUid, out var hologramSpeech) && + TryComp(entity, out var entityTelephone)) + { + _telephoneSystem.SetSpeakerForTelephone((entity, entityTelephone), (hologramUid, hologramSpeech)); + } } private void DeleteHologram(Entity hologram, Entity attachedHolopad) diff --git a/Content.Server/Telephone/TelephoneSystem.cs b/Content.Server/Telephone/TelephoneSystem.cs index ff7368bfb3..dd068612f7 100644 --- a/Content.Server/Telephone/TelephoneSystem.cs +++ b/Content.Server/Telephone/TelephoneSystem.cs @@ -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 entity, Entity? speaker) + { + entity.Comp.Speaker = speaker; + } + private (string?, string?) GetNameAndJobOfCallingEntity(EntityUid uid) { string? presumedName = null; diff --git a/Content.Shared/Telephone/TelephoneComponent.cs b/Content.Shared/Telephone/TelephoneComponent.cs index d739a8412d..c24840ce01 100644 --- a/Content.Shared/Telephone/TelephoneComponent.cs +++ b/Content.Shared/Telephone/TelephoneComponent.cs @@ -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; + /// + /// Speech is relayed through this entity instead of the telephone + /// + [ViewVariables(VVAccess.ReadOnly)] + public Entity? Speaker = null; + /// /// Telephone number for this device /// @@ -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 } diff --git a/Resources/Locale/en-US/telephone/telephone.ftl b/Resources/Locale/en-US/telephone/telephone.ftl index 67e54c26f3..b279111d23 100644 --- a/Resources/Locale/en-US/telephone/telephone.ftl +++ b/Resources/Locale/en-US/telephone/telephone.ftl @@ -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 diff --git a/Resources/Prototypes/Entities/Structures/Machines/holopad.yml b/Resources/Prototypes/Entities/Structures/Machines/holopad.yml index 891777f306..0dfe45c5ae 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/holopad.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/holopad.yml @@ -149,6 +149,7 @@ # These are spawned by holopads - type: entity id: HolopadHologram + name: hologram categories: [ HideSpawnMenu ] suffix: DO NOT MAP components: @@ -163,6 +164,10 @@ - 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