* Revert "- fix: YAML linter fixes. (#598)" This reverts commit012bf3c357. * Revert "Automatic changelog update" This reverts commitcf1c3a9af5. * Revert "[Fix] Base Layer Prototype (#597)" This reverts commitb000423999. * Revert "Modules update (#596)" This reverts commit00fbdead77. * Revert "Automatic changelog update" This reverts commit0d7a12b2a2. * Revert "Fixes (#593)" This reverts commit943c77031c. * Revert "minor loadout fixes (#594)" This reverts commit143c010a89. * Revert "Update DryDock.yml (#595)" This reverts commit4cd0100ac7. * Revert "Automatic changelog update" This reverts commit08eadc690f. * Revert "fix: Maximum message size (#591)" This reverts commit343f3612eb. * Revert "Черри пики 7 (#592)" This reverts commit3f97bdce2f. * Revert "Automatic changelog update" This reverts commit0678eca250. * Revert "Рандомфиксы (#590)" This reverts commit2b9e5e2437. * Revert "Нижнее бельё в лодауты (#580)" This reverts commite01a47b089. * Revert "add lathe sounds (#588)" This reverts commitc80a2985f2. * Revert "Добавил параметр группы для некоторых реагентов (#585)" This reverts commit713b16bb98. * Revert "add hrp ++++ aspect (#587)" This reverts commita6a69cc60f. * Revert "Новые амбиенты и пару песен (#586)" This reverts commit48c86bd846. * Revert "Сообщения в ПДА 2 (#583)" This reverts commitcced3cc98b. * Revert "Automatic changelog update" This reverts commitabf435b11d. * Revert "Chem stuff and more (#584)" This reverts commit3608960f5c. * Revert "JobRequiremet refactor (#579)" This reverts commit9a9c9598e0. * Revert "Revert "Reapply "Нижнее бельё в лодауты""" This reverts commit44447d573f. * Revert "Reapply "Нижнее бельё в лодауты"" This reverts commit0c4d082ad3. * Revert "Revert "Нижнее бельё в лодауты"" This reverts commit56473c5492. * Revert "Нижнее бельё в лодауты" This reverts commitd1cb0cb364. * Revert "DryDock and WhiteMoose update (#578)" This reverts commit14755808af. * Revert "Automatic changelog update" This reverts commit0133f82722. * Revert "Fixes (#576)" This reverts commitb7cc49896c. * Revert "порт системы регенерации солюшена цинки (#574)" This reverts commita22cf3d50b. * Revert "Воровские перчатки (#573)" This reverts commitbb7140f3d4. * Revert "mood resprite (#572)" This reverts commit4db96dc569. * Revert "fix missing letter (#571)" This reverts commit94ea756794. * Revert "Сообщения в ПДА (#564)" This reverts commitd023d29e54. * Revert "- fix: No visible aghost." This reverts commit27e7f25f7e. * Revert "- tweak: Nerf cult shield." This reverts commit6a384246b8.
280 lines
10 KiB
C#
280 lines
10 KiB
C#
using Content.Server.AlertLevel;
|
|
using Content.Server.CartridgeLoader;
|
|
using Content.Server.Chat.Managers;
|
|
using Content.Server.DeviceNetwork.Components;
|
|
using Content.Server.Instruments;
|
|
using Content.Server.Light.EntitySystems;
|
|
using Content.Server.Light.Events;
|
|
using Content.Server.PDA.Ringer;
|
|
using Content.Server.Station.Systems;
|
|
using Content.Server.Store.Components;
|
|
using Content.Server.Store.Systems;
|
|
using Content.Shared.Access.Components;
|
|
using Content.Shared.CartridgeLoader;
|
|
using Content.Shared.Chat;
|
|
using Content.Shared.Light.Components;
|
|
using Content.Shared.PDA;
|
|
using Robust.Server.Containers;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.Containers;
|
|
using Robust.Shared.Player;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Server.PDA
|
|
{
|
|
public sealed class PdaSystem : SharedPdaSystem
|
|
{
|
|
[Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!;
|
|
[Dependency] private readonly InstrumentSystem _instrument = default!;
|
|
[Dependency] private readonly RingerSystem _ringer = default!;
|
|
[Dependency] private readonly StationSystem _station = default!;
|
|
[Dependency] private readonly StoreSystem _store = default!;
|
|
[Dependency] private readonly IChatManager _chatManager = default!;
|
|
[Dependency] private readonly UserInterfaceSystem _ui = default!;
|
|
[Dependency] private readonly UnpoweredFlashlightSystem _unpoweredFlashlight = default!;
|
|
[Dependency] private readonly ContainerSystem _containerSystem = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<PdaComponent, LightToggleEvent>(OnLightToggle);
|
|
|
|
// UI Events:
|
|
SubscribeLocalEvent<PdaComponent, PdaRequestUpdateInterfaceMessage>(OnUiMessage);
|
|
SubscribeLocalEvent<PdaComponent, PdaToggleFlashlightMessage>(OnUiMessage);
|
|
SubscribeLocalEvent<PdaComponent, PdaShowRingtoneMessage>(OnUiMessage);
|
|
SubscribeLocalEvent<PdaComponent, PdaShowMusicMessage>(OnUiMessage);
|
|
SubscribeLocalEvent<PdaComponent, PdaShowUplinkMessage>(OnUiMessage);
|
|
SubscribeLocalEvent<PdaComponent, PdaLockUplinkMessage>(OnUiMessage);
|
|
|
|
SubscribeLocalEvent<PdaComponent, CartridgeLoaderNotificationSentEvent>(OnNotification);
|
|
|
|
SubscribeLocalEvent<StationRenamedEvent>(OnStationRenamed);
|
|
SubscribeLocalEvent<AlertLevelChangedEvent>(OnAlertLevelChanged);
|
|
}
|
|
|
|
protected override void OnComponentInit(EntityUid uid, PdaComponent pda, ComponentInit args)
|
|
{
|
|
base.OnComponentInit(uid, pda, args);
|
|
|
|
if (!HasComp<UserInterfaceComponent>(uid))
|
|
return;
|
|
|
|
UpdateAlertLevel(uid, pda);
|
|
UpdateStationName(uid, pda);
|
|
}
|
|
|
|
protected override void OnItemInserted(EntityUid uid, PdaComponent pda, EntInsertedIntoContainerMessage args)
|
|
{
|
|
base.OnItemInserted(uid, pda, args);
|
|
UpdatePdaUi(uid, pda);
|
|
}
|
|
|
|
protected override void OnItemRemoved(EntityUid uid, PdaComponent pda, EntRemovedFromContainerMessage args)
|
|
{
|
|
if (args.Container.ID != pda.IdSlot.ID && args.Container.ID != pda.PenSlot.ID && args.Container.ID != pda.PaiSlot.ID)
|
|
return;
|
|
|
|
// TODO: This is super cursed just use compstates please.
|
|
if (MetaData(uid).EntityLifeStage >= EntityLifeStage.Terminating)
|
|
return;
|
|
|
|
base.OnItemRemoved(uid, pda, args);
|
|
UpdatePdaUi(uid, pda);
|
|
}
|
|
|
|
private void OnLightToggle(EntityUid uid, PdaComponent pda, LightToggleEvent args)
|
|
{
|
|
pda.FlashlightOn = args.IsOn;
|
|
UpdatePdaUi(uid, pda);
|
|
}
|
|
|
|
public void SetOwner(EntityUid uid, PdaComponent pda, string ownerName)
|
|
{
|
|
pda.OwnerName = ownerName;
|
|
UpdatePdaUi(uid, pda);
|
|
}
|
|
|
|
private void OnStationRenamed(StationRenamedEvent ev)
|
|
{
|
|
UpdateAllPdaUisOnStation();
|
|
}
|
|
|
|
private void OnAlertLevelChanged(AlertLevelChangedEvent args)
|
|
{
|
|
UpdateAllPdaUisOnStation();
|
|
}
|
|
|
|
private void UpdateAllPdaUisOnStation()
|
|
{
|
|
var query = EntityQueryEnumerator<PdaComponent>();
|
|
while (query.MoveNext(out var ent, out var comp))
|
|
{
|
|
UpdatePdaUi(ent, comp);
|
|
}
|
|
}
|
|
|
|
private void OnNotification(Entity<PdaComponent> ent, ref CartridgeLoaderNotificationSentEvent args)
|
|
{
|
|
_ringer.RingerPlayRingtone(ent.Owner);
|
|
|
|
if (!_containerSystem.TryGetContainingContainer(ent, out var container)
|
|
|| !TryComp<ActorComponent>(container.Owner, out var actor))
|
|
return;
|
|
|
|
var message = FormattedMessage.EscapeText(args.Message);
|
|
var wrappedMessage = Loc.GetString("pda-notification-message",
|
|
("header", args.Header),
|
|
("message", message));
|
|
|
|
_chatManager.ChatMessageToOne(
|
|
ChatChannel.Notifications,
|
|
message,
|
|
wrappedMessage,
|
|
EntityUid.Invalid,
|
|
false,
|
|
actor.PlayerSession.Channel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Send new UI state to clients, call if you modify something like uplink.
|
|
/// </summary>
|
|
public void UpdatePdaUi(EntityUid uid, PdaComponent? pda = null)
|
|
{
|
|
if (!Resolve(uid, ref pda, false))
|
|
return;
|
|
|
|
if (!_ui.TryGetUi(uid, PdaUiKey.Key, out var ui))
|
|
return;
|
|
|
|
var address = GetDeviceNetAddress(uid);
|
|
var hasInstrument = HasComp<InstrumentComponent>(uid);
|
|
var showUplink = HasComp<StoreComponent>(uid) && IsUnlocked(uid);
|
|
|
|
UpdateStationName(uid, pda);
|
|
UpdateAlertLevel(uid, pda);
|
|
// TODO: Update the level and name of the station with each call to UpdatePdaUi is only needed for latejoin players.
|
|
// TODO: If someone can implement changing the level and name of the station when changing the PDA grid, this can be removed.
|
|
|
|
// TODO don't make this depend on cartridge loader!?!?
|
|
if (!TryComp(uid, out CartridgeLoaderComponent? loader))
|
|
return;
|
|
|
|
var programs = _cartridgeLoader.GetAvailablePrograms(uid, loader);
|
|
var id = CompOrNull<IdCardComponent>(pda.ContainedId);
|
|
var state = new PdaUpdateState(
|
|
programs,
|
|
GetNetEntity(loader.ActiveProgram),
|
|
pda.FlashlightOn,
|
|
pda.PenSlot.HasItem,
|
|
pda.PaiSlot.HasItem,
|
|
new PdaIdInfoText
|
|
{
|
|
ActualOwnerName = pda.OwnerName,
|
|
IdOwner = id?.FullName,
|
|
JobTitle = id?.JobTitle,
|
|
StationAlertLevel = pda.StationAlertLevel,
|
|
StationAlertColor = pda.StationAlertColor
|
|
},
|
|
pda.StationName,
|
|
showUplink,
|
|
hasInstrument,
|
|
address);
|
|
|
|
_ui.SetUiState(ui, state);
|
|
}
|
|
|
|
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaRequestUpdateInterfaceMessage msg)
|
|
{
|
|
if (!PdaUiKey.Key.Equals(msg.UiKey))
|
|
return;
|
|
|
|
UpdatePdaUi(uid, pda);
|
|
}
|
|
|
|
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaToggleFlashlightMessage msg)
|
|
{
|
|
if (!PdaUiKey.Key.Equals(msg.UiKey))
|
|
return;
|
|
|
|
if (TryComp<UnpoweredFlashlightComponent>(uid, out var flashlight))
|
|
_unpoweredFlashlight.ToggleLight(uid, flashlight);
|
|
}
|
|
|
|
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowRingtoneMessage msg)
|
|
{
|
|
if (!PdaUiKey.Key.Equals(msg.UiKey))
|
|
return;
|
|
|
|
if (HasComp<RingerComponent>(uid))
|
|
_ringer.ToggleRingerUI(uid, msg.Session);
|
|
}
|
|
|
|
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowMusicMessage msg)
|
|
{
|
|
if (!PdaUiKey.Key.Equals(msg.UiKey))
|
|
return;
|
|
|
|
if (TryComp<InstrumentComponent>(uid, out var instrument))
|
|
_instrument.ToggleInstrumentUi(uid, msg.Session, instrument);
|
|
}
|
|
|
|
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowUplinkMessage msg)
|
|
{
|
|
if (!PdaUiKey.Key.Equals(msg.UiKey))
|
|
return;
|
|
|
|
// check if its locked again to prevent malicious clients opening locked uplinks
|
|
if (TryComp<StoreComponent>(uid, out var store) && IsUnlocked(uid))
|
|
_store.ToggleUi(msg.Session.AttachedEntity!.Value, uid, store);
|
|
}
|
|
|
|
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaLockUplinkMessage msg)
|
|
{
|
|
if (!PdaUiKey.Key.Equals(msg.UiKey))
|
|
return;
|
|
|
|
if (TryComp<RingerUplinkComponent>(uid, out var uplink))
|
|
{
|
|
_ringer.LockUplink(uid, uplink);
|
|
UpdatePdaUi(uid, pda);
|
|
}
|
|
}
|
|
|
|
private bool IsUnlocked(EntityUid uid)
|
|
{
|
|
return !TryComp<RingerUplinkComponent>(uid, out var uplink) || uplink.Unlocked;
|
|
}
|
|
|
|
private void UpdateStationName(EntityUid uid, PdaComponent pda)
|
|
{
|
|
var station = _station.GetOwningStation(uid);
|
|
pda.StationName = station is null ? null : Name(station.Value);
|
|
}
|
|
|
|
private void UpdateAlertLevel(EntityUid uid, PdaComponent pda)
|
|
{
|
|
var station = _station.GetOwningStation(uid);
|
|
if (!TryComp(station, out AlertLevelComponent? alertComp) ||
|
|
alertComp.AlertLevels == null)
|
|
return;
|
|
pda.StationAlertLevel = alertComp.CurrentLevel;
|
|
if (alertComp.AlertLevels.Levels.TryGetValue(alertComp.CurrentLevel, out var details))
|
|
pda.StationAlertColor = details.Color;
|
|
}
|
|
|
|
private string? GetDeviceNetAddress(EntityUid uid)
|
|
{
|
|
string? address = null;
|
|
|
|
if (TryComp(uid, out DeviceNetworkComponent? deviceNetworkComponent))
|
|
{
|
|
address = deviceNetworkComponent?.Address;
|
|
}
|
|
|
|
return address;
|
|
}
|
|
}
|
|
}
|