using Content.Server.Research.Systems; using Content.Server.Research.TechnologyDisk.Components; using Content.Shared.UserInterface; using Content.Shared.Research; using Content.Shared.Research.Components; using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Shared.Timing; namespace Content.Server.Research.TechnologyDisk.Systems; public sealed class DiskConsoleSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly ResearchSystem _research = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; /// public override void Initialize() { SubscribeLocalEvent(OnPrintDisk); SubscribeLocalEvent(OnPointsChanged); SubscribeLocalEvent(OnRegistrationChanged); SubscribeLocalEvent(OnBeforeUiOpen); SubscribeLocalEvent(OnShutdown); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var printing, out var console, out var xform)) { if (printing.FinishTime > _timing.CurTime) continue; RemComp(uid, printing); Spawn(console.DiskPrototype, xform.Coordinates); } } private void OnPrintDisk(EntityUid uid, DiskConsoleComponent component, DiskConsolePrintDiskMessage args) { if (HasComp(uid)) return; if (!_research.TryGetClientServer(uid, out var server, out var serverComp)) return; if (serverComp.Points < component.PricePerDisk) return; _research.ModifyServerPoints(server.Value, -component.PricePerDisk, serverComp); _audio.PlayPvs(component.PrintSound, uid); var printing = EnsureComp(uid); printing.FinishTime = _timing.CurTime + component.PrintDuration; UpdateUserInterface(uid, component); } private void OnPointsChanged(EntityUid uid, DiskConsoleComponent component, ref ResearchServerPointsChangedEvent args) { UpdateUserInterface(uid, component); } private void OnRegistrationChanged(EntityUid uid, DiskConsoleComponent component, ref ResearchRegistrationChangedEvent args) { UpdateUserInterface(uid, component); } private void OnBeforeUiOpen(EntityUid uid, DiskConsoleComponent component, BeforeActivatableUIOpenEvent args) { UpdateUserInterface(uid, component); } public void UpdateUserInterface(EntityUid uid, DiskConsoleComponent? component = null) { if (!Resolve(uid, ref component, false)) return; var totalPoints = 0; if (_research.TryGetClientServer(uid, out _, out var server)) { totalPoints = server.Points; } var canPrint = !(TryComp(uid, out var printing) && printing.FinishTime >= _timing.CurTime) && totalPoints >= component.PricePerDisk; var state = new DiskConsoleBoundUserInterfaceState(totalPoints, component.PricePerDisk, canPrint); _ui.SetUiState(uid, DiskConsoleUiKey.Key, state); } private void OnShutdown(EntityUid uid, DiskConsolePrintingComponent component, ComponentShutdown args) { UpdateUserInterface(uid); } }