Speech is relayed by holopad holograms (#33978)
* Initial commit * Corrected a field attribute
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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})
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user