forked from ss14Starlight/space-station-14
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHeadsetSystem.cs
More file actions
149 lines (129 loc) · 5.68 KB
/
Copy pathHeadsetSystem.cs
File metadata and controls
149 lines (129 loc) · 5.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using Content.Shared.Chat;
using Content.Shared.Inventory.Events;
using Content.Shared.Radio;
using Content.Shared.Radio.Components;
using Content.Shared.Radio.EntitySystems;
using Content.Shared._Starlight.TextToSpeech;
using Robust.Shared.Network;
using Robust.Shared.Player;
using Content.Server.Speech; // Starlight
using Content.Server._Starlight.Language; // Starlight
using Content.Shared._Starlight.Clothing;
namespace Content.Server.Radio.EntitySystems;
public sealed partial class HeadsetSystem : SharedHeadsetSystem
{
[Dependency] private INetManager _netMan = default!;
[Dependency] private RadioSystem _radio = default!;
[Dependency] private LanguageSystem _language = default!; // Starlight
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<HeadsetComponent, RadioReceiveEvent>(OnHeadsetReceive);
SubscribeLocalEvent<HeadsetComponent, EncryptionChannelsChangedEvent>(OnKeysChanged);
SubscribeLocalEvent<WearingHeadsetComponent, EntitySpokeEvent>(OnSpeak);
}
private void OnKeysChanged(EntityUid uid, HeadsetComponent component, EncryptionChannelsChangedEvent args)
{
UpdateRadioChannels(uid, component, args.Component);
}
private void UpdateRadioChannels(EntityUid uid, HeadsetComponent headset, EncryptionKeyHolderComponent? keyHolder = null)
{
// make sure to not add ActiveRadioComponent when headset is being deleted
if (!headset.Enabled || MetaData(uid).EntityLifeStage >= EntityLifeStage.Terminating)
return;
if (!Resolve(uid, ref keyHolder))
return;
if (keyHolder.Channels.Count == 0 && keyHolder.CustomChannels.Count == 0) // Starlight
RemComp<ActiveRadioComponent>(uid);
//Starlight begin
else
{
var comp = EnsureComp<ActiveRadioComponent>(uid);
comp.Channels = new(keyHolder.Channels);
comp.CustomChannels = new(keyHolder.CustomChannels);
Dirty(uid, comp);
}
//Starlight end
}
private void OnSpeak(EntityUid uid, WearingHeadsetComponent component, EntitySpokeEvent args)
{
#region Starlight
HeadsetLoudModeComponent? loudComp = null;
if(TryComp<HeadsetLoudModeComponent>(component.Headset, out var comp) && comp.Active)
{
loudComp = comp;
}
#endregion Starlight
if (args.Channel != null
&& TryComp(component.Headset, out EncryptionKeyHolderComponent? keys)
&& keys.Channels.Contains(args.Channel.ID))
{
_radio.SendRadioMessage(uid, args.Message, args.Channel, component.Headset, args.Language, loudComp: loudComp); // Starlight-edit: This literally never specified language??? bruh.
args.Channel = null; // prevent duplicate messages from other listeners.
}
//Starlight begin
if (args.UsingCustomChannel && args.CustomChannel is not null)
_radio.SendCustomRadioMessage(uid, args.Message.Text, args.CustomChannel, component.Headset, args.Language, loudComp: loudComp); // Custom channel data is already confirmed to exist on this headset
//Starlight end
}
protected override void OnGotEquipped(EntityUid uid, HeadsetComponent component, GotEquippedEvent args)
{
base.OnGotEquipped(uid, component, args);
if (component.IsEquipped && component.Enabled)
{
EnsureComp<WearingHeadsetComponent>(args.EquipTarget).Headset = uid;
UpdateRadioChannels(uid, component);
}
}
protected override void OnGotUnequipped(EntityUid uid, HeadsetComponent component, GotUnequippedEvent args)
{
base.OnGotUnequipped(uid, component, args);
RemComp<ActiveRadioComponent>(uid);
RemComp<WearingHeadsetComponent>(args.EquipTarget);
}
public void SetEnabled(EntityUid uid, bool value, HeadsetComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
if (component.Enabled == value)
return;
component.Enabled = value;
Dirty(uid, component);
if (!value)
{
RemCompDeferred<ActiveRadioComponent>(uid);
if (component.IsEquipped)
RemCompDeferred<WearingHeadsetComponent>(Transform(uid).ParentUid);
}
else if (component.IsEquipped)
{
EnsureComp<WearingHeadsetComponent>(Transform(uid).ParentUid).Headset = uid;
UpdateRadioChannels(uid, component);
}
}
private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref RadioReceiveEvent args)
{
// TODO: change this when a code refactor is done
// this is currently done this way because receiving radio messages on an entity otherwise requires that entity
// to have an ActiveRadioComponent
var parent = Transform(uid).ParentUid;
if (parent.IsValid())
{
var relayEvent = new HeadsetRadioReceiveRelayEvent(args);
RaiseLocalEvent(parent, ref relayEvent);
}
// Starlight - Start
if (TryComp(parent, out ActorComponent? actor))
{
var canUnderstand = _language.CanUnderstand(parent, args.Language.ID) || args.Language.Speech.RadioChannel is not null;
var msg = new MsgChatMessage
{
Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg
};
_netMan.ServerSendMessage(msg, actor.PlayerSession.Channel);
}
if (parent != args.MessageSource && TryComp(args.MessageSource, out TextToSpeechComponent? _))
args.Receivers.Add(parent);
// Starlight - End
}
}