Speech is relayed by holopad holograms (#33978)

* Initial commit

* Corrected a field attribute
This commit is contained in:
chromiumboy
2025-01-02 05:41:12 -06:00
committed by GitHub
parent df487ea4fe
commit 59a87ef2c8
5 changed files with 41 additions and 10 deletions

View 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)

View 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;

View 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>

View 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})

View File

@@ -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