clean up a bunch of R&D code (#13071)

* clean up a bunch of R&D code

* don't store components

* brug

* speedrun some sloth review
This commit is contained in:
Nemanja
2022-12-19 16:14:02 -05:00
committed by GitHub
parent f78dca8504
commit 0549b22cbc
12 changed files with 159 additions and 143 deletions

View File

@@ -5,8 +5,8 @@ using Content.Server.Lathe.Components;
using Content.Server.Materials; using Content.Server.Materials;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems; using Content.Server.Power.EntitySystems;
using Content.Server.Research;
using Content.Server.Research.Components; using Content.Server.Research.Components;
using Content.Server.Research.Systems;
using Content.Server.UserInterface; using Content.Server.UserInterface;
using Content.Shared.Lathe; using Content.Shared.Lathe;
using Content.Shared.Materials; using Content.Shared.Materials;

View File

@@ -1,8 +1,7 @@
namespace Content.Server.Research.Components namespace Content.Server.Research.Components
{ {
[RegisterComponent] [RegisterComponent]
[Virtual] public sealed class ResearchClientComponent : Component
public class ResearchClientComponent : Component
{ {
public bool ConnectedToServer => Server != null; public bool ConnectedToServer => Server != null;

View File

@@ -1,24 +1,12 @@
namespace Content.Server.Research.Components namespace Content.Server.Research.Components
{ {
[RegisterComponent] [RegisterComponent]
public sealed class ResearchPointSourceComponent : ResearchClientComponent public sealed class ResearchPointSourceComponent : Component
{ {
[DataField("pointspersecond")] [DataField("pointspersecond"), ViewVariables(VVAccess.ReadWrite)]
private int _pointsPerSecond; public int PointsPerSecond;
[DataField("active")]
private bool _active;
[ViewVariables(VVAccess.ReadWrite)]
public int PointsPerSecond
{
get => _pointsPerSecond;
set => _pointsPerSecond = value;
}
[ViewVariables(VVAccess.ReadWrite)] [DataField("active"), ViewVariables(VVAccess.ReadWrite)]
public bool Active public bool Active;
{
get => _active;
set => _active = value;
}
} }
} }

View File

@@ -1,22 +1,45 @@
using Content.Server.Research.Systems;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.Research.Components namespace Content.Server.Research.Components
{ {
[Access(typeof(ResearchSystem))]
[RegisterComponent] [RegisterComponent]
public sealed class ResearchServerComponent : Component public sealed class ResearchServerComponent : Component
{ {
[ViewVariables(VVAccess.ReadWrite)] public string ServerName => _serverName; [DataField("servername"), ViewVariables(VVAccess.ReadWrite)]
public string ServerName = "RDSERVER";
[DataField("servername")] [DataField("points"), ViewVariables(VVAccess.ReadWrite)]
private string _serverName = "RDSERVER"; public int Points;
[ViewVariables(VVAccess.ReadWrite)] [DataField("points")]
public int Points = 0;
[ViewVariables(VVAccess.ReadOnly)] public int Id { get; set; }
[ViewVariables(VVAccess.ReadOnly)] [ViewVariables(VVAccess.ReadOnly)]
public List<ResearchPointSourceComponent> PointSources { get; } = new(); public int Id;
[ViewVariables(VVAccess.ReadOnly)] [ViewVariables(VVAccess.ReadOnly)]
public List<ResearchClientComponent> Clients { get; } = new(); public List<EntityUid> Clients = new();
[DataField("nextUpdateTime", customTypeSerializer: typeof(TimeOffsetSerializer))]
public TimeSpan NextUpdateTime = TimeSpan.Zero;
[DataField("researchConsoleUpdateTime"), ViewVariables(VVAccess.ReadWrite)]
public readonly TimeSpan ResearchConsoleUpdateTime = TimeSpan.FromSeconds(1);
} }
/// <summary>
/// Event raised on a server's clients when the point value of the server is changed.
/// </summary>
/// <param name="Server"></param>
/// <param name="Total"></param>
/// <param name="Delta"></param>
[ByRefEvent]
public readonly record struct ResearchServerPointsChangedEvent(EntityUid Server, int Total, int Delta);
/// <summary>
/// Event raised every second to calculate the amount of points added to the server.
/// </summary>
/// <param name="Server"></param>
/// <param name="Points"></param>
[ByRefEvent]
public record struct ResearchServerGetPointsPerSecondEvent(EntityUid Server, int Points);
} }

View File

@@ -1,6 +1,7 @@
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Server.Research.Components; using Content.Server.Research.Components;
using Content.Server.Popups; using Content.Server.Popups;
using Content.Server.Research.Systems;
using Robust.Shared.Player; using Robust.Shared.Player;
namespace Content.Server.Research.Disk namespace Content.Server.Research.Disk
@@ -8,6 +9,7 @@ namespace Content.Server.Research.Disk
public sealed class ResearchDiskSystem : EntitySystem public sealed class ResearchDiskSystem : EntitySystem
{ {
[Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly ResearchSystem _research = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -22,7 +24,7 @@ namespace Content.Server.Research.Disk
if (!TryComp<ResearchServerComponent>(args.Target, out var server)) if (!TryComp<ResearchServerComponent>(args.Target, out var server))
return; return;
server.Points += component.Points; _research.ChangePointsOnServer(server.Owner, component.Points, server);
_popupSystem.PopupEntity(Loc.GetString("research-disk-inserted", ("points", component.Points)), args.Target.Value, args.User); _popupSystem.PopupEntity(Loc.GetString("research-disk-inserted", ("points", component.Points)), args.Target.Value, args.User);
EntityManager.QueueDeleteEntity(uid); EntityManager.QueueDeleteEntity(uid);
} }

View File

@@ -1,7 +1,8 @@
using System.Linq;
using Content.Server.Research.Components; using Content.Server.Research.Components;
using Content.Shared.Research.Components; using Content.Shared.Research.Components;
namespace Content.Server.Research; namespace Content.Server.Research.Systems;
public sealed partial class ResearchSystem public sealed partial class ResearchSystem
{ {
@@ -50,8 +51,9 @@ public sealed partial class ResearchSystem
private void OnClientStartup(EntityUid uid, ResearchClientComponent component, ComponentStartup args) private void OnClientStartup(EntityUid uid, ResearchClientComponent component, ComponentStartup args)
{ {
if (Servers.Count > 0) var allServers = EntityQuery<ResearchServerComponent>(true).ToArray();
RegisterClientServer(component, Servers[0]); if (allServers.Length > 0)
RegisterClientServer(component, allServers[0]);
} }
private void OnClientShutdown(EntityUid uid, ResearchClientComponent component, ComponentShutdown args) private void OnClientShutdown(EntityUid uid, ResearchClientComponent component, ComponentShutdown args)
@@ -66,22 +68,23 @@ public sealed partial class ResearchSystem
private void UpdateClientInterface(ResearchClientComponent component) private void UpdateClientInterface(ResearchClientComponent component)
{ {
var state = new ResearchClientBoundInterfaceState(Servers.Count, GetServerNames(), var names = GetServerNames();
var state = new ResearchClientBoundInterfaceState(names.Length, names,
GetServerIds(), component.ConnectedToServer ? component.Server!.Id : -1); GetServerIds(), component.ConnectedToServer ? component.Server!.Id : -1);
_uiSystem.GetUiOrNull(component.Owner, ResearchClientUiKey.Key)?.SetState(state); _uiSystem.TrySetUiState(component.Owner, ResearchClientUiKey.Key, state);
} }
private bool RegisterClientServer(ResearchClientComponent component, ResearchServerComponent? server = null) private bool RegisterClientServer(ResearchClientComponent component, ResearchServerComponent? server = null)
{ {
if (server == null) return false; return server != null && RegisterServerClient(server, component.Owner, component);
return RegisterServerClient(server, component);
} }
private void UnregisterClientServer(ResearchClientComponent component) private void UnregisterClientServer(ResearchClientComponent component)
{ {
if (component.Server == null) return; if (component.Server == null)
return;
UnregisterServerClient(component.Server, component); UnregisterServerClient(component.Server, component.Owner, component);
} }
} }

View File

@@ -4,7 +4,7 @@ using Content.Shared.Research.Components;
using Content.Shared.Research.Prototypes; using Content.Shared.Research.Prototypes;
using Robust.Server.Player; using Robust.Server.Player;
namespace Content.Server.Research; namespace Content.Server.Research.Systems;
public sealed partial class ResearchSystem public sealed partial class ResearchSystem
{ {
@@ -13,6 +13,7 @@ public sealed partial class ResearchSystem
SubscribeLocalEvent<ResearchConsoleComponent, ConsoleUnlockTechnologyMessage>(OnConsoleUnlock); SubscribeLocalEvent<ResearchConsoleComponent, ConsoleUnlockTechnologyMessage>(OnConsoleUnlock);
SubscribeLocalEvent<ResearchConsoleComponent, ConsoleServerSyncMessage>(OnConsoleSync); SubscribeLocalEvent<ResearchConsoleComponent, ConsoleServerSyncMessage>(OnConsoleSync);
SubscribeLocalEvent<ResearchConsoleComponent, ConsoleServerSelectionMessage>(OnConsoleSelect); SubscribeLocalEvent<ResearchConsoleComponent, ConsoleServerSelectionMessage>(OnConsoleSelect);
SubscribeLocalEvent<ResearchConsoleComponent, ResearchServerPointsChangedEvent>(OnPointsChanged);
} }
private void OnConsoleSelect(EntityUid uid, ResearchConsoleComponent component, ConsoleServerSelectionMessage args) private void OnConsoleSelect(EntityUid uid, ResearchConsoleComponent component, ConsoleServerSelectionMessage args)
@@ -45,9 +46,11 @@ public sealed partial class ResearchSystem
if (!_prototypeManager.TryIndex(args.Id, out TechnologyPrototype? tech) || if (!_prototypeManager.TryIndex(args.Id, out TechnologyPrototype? tech) ||
client.Server == null || client.Server == null ||
!CanUnlockTechnology(client.Server, tech)) return; !CanUnlockTechnology(client.Server, tech))
return;
if (!UnlockTechnology(client.Server, tech)) return; if (!UnlockTechnology(client.Server, tech))
return;
SyncWithServer(database); SyncWithServer(database);
Dirty(database); Dirty(database);
@@ -69,6 +72,15 @@ public sealed partial class ResearchSystem
var pointsPerSecond = clientComponent.ConnectedToServer ? PointsPerSecond(clientComponent.Server) : 0; var pointsPerSecond = clientComponent.ConnectedToServer ? PointsPerSecond(clientComponent.Server) : 0;
state = new ResearchConsoleBoundInterfaceState(points, pointsPerSecond); state = new ResearchConsoleBoundInterfaceState(points, pointsPerSecond);
} }
_uiSystem.GetUiOrNull(component.Owner, ResearchConsoleUiKey.Key)?.SetState(state);
_uiSystem.TrySetUiState(component.Owner, ResearchConsoleUiKey.Key, state);
} }
private void OnPointsChanged(EntityUid uid, ResearchConsoleComponent component, ref ResearchServerPointsChangedEvent args)
{
if (!_uiSystem.IsUiOpen(uid, ResearchConsoleUiKey.Key))
return;
UpdateConsoleInterface(component);
}
} }

View File

@@ -1,10 +1,21 @@
using Content.Server.Power.EntitySystems; using Content.Server.Power.EntitySystems;
using Content.Server.Research.Components; using Content.Server.Research.Components;
namespace Content.Server.Research; namespace Content.Server.Research.Systems;
public sealed partial class ResearchSystem public sealed partial class ResearchSystem
{ {
private void InitializeSource()
{
SubscribeLocalEvent<ResearchPointSourceComponent, ResearchServerGetPointsPerSecondEvent>(OnGetPointsPerSecond);
}
private void OnGetPointsPerSecond(EntityUid uid, ResearchPointSourceComponent component, ref ResearchServerGetPointsPerSecondEvent args)
{
if (CanProduce(component))
args.Points += component.PointsPerSecond;
}
public bool CanProduce(ResearchPointSourceComponent component) public bool CanProduce(ResearchPointSourceComponent component)
{ {
return component.Active && this.IsPowered(component.Owner, EntityManager); return component.Active && this.IsPowered(component.Owner, EntityManager);

View File

@@ -1,28 +1,11 @@
using Content.Server.Power.EntitySystems; using Content.Server.Power.EntitySystems;
using Content.Server.Research.Components; using Content.Server.Research.Components;
using Content.Server.Station.Systems;
using Content.Shared.Research.Prototypes; using Content.Shared.Research.Prototypes;
namespace Content.Server.Research; namespace Content.Server.Research.Systems;
public sealed partial class ResearchSystem public sealed partial class ResearchSystem
{ {
private void InitializeServer()
{
SubscribeLocalEvent<ResearchServerComponent, ComponentStartup>(OnServerStartup);
SubscribeLocalEvent<ResearchServerComponent, ComponentShutdown>(OnServerShutdown);
}
private void OnServerShutdown(EntityUid uid, ResearchServerComponent component, ComponentShutdown args)
{
UnregisterServer(component);
}
private void OnServerStartup(EntityUid uid, ResearchServerComponent component, ComponentStartup args)
{
RegisterServer(component);
}
private bool CanRun(ResearchServerComponent component) private bool CanRun(ResearchServerComponent component)
{ {
return this.IsPowered(component.Owner, EntityManager); return this.IsPowered(component.Owner, EntityManager);
@@ -30,41 +13,37 @@ public sealed partial class ResearchSystem
private void UpdateServer(ResearchServerComponent component, int time) private void UpdateServer(ResearchServerComponent component, int time)
{ {
if (!CanRun(component)) return; if (!CanRun(component))
component.Points += PointsPerSecond(component) * time; return;
ChangePointsOnServer(component.Owner, PointsPerSecond(component) * time, component);
} }
public bool RegisterServerClient(ResearchServerComponent component, ResearchClientComponent clientComponent) public bool RegisterServerClient(ResearchServerComponent component, EntityUid client, ResearchClientComponent? clientComponent = null)
{ {
// TODO: This is shit but I'm just trying to fix RND for now until it gets bulldozed if (!Resolve(client, ref clientComponent))
if (TryComp<ResearchPointSourceComponent>(clientComponent.Owner, out var source)) return false;
{
if (component.PointSources.Contains(source)) return false;
component.PointSources.Add(source);
source.Server = component;
}
if (component.Clients.Contains(clientComponent)) return false; if (component.Clients.Contains(client))
component.Clients.Add(clientComponent); return false;
component.Clients.Add(client);
clientComponent.Server = component; clientComponent.Server = component;
return true; return true;
} }
public void UnregisterServerClient(ResearchServerComponent component, ResearchClientComponent clientComponent) public void UnregisterServerClient(ResearchServerComponent component, EntityUid client, ResearchClientComponent? clientComponent = null)
{ {
if (TryComp<ResearchPointSourceComponent>(clientComponent.Owner, out var source)) if (!Resolve(client, ref clientComponent))
{ return;
component.PointSources.Remove(source);
}
component.Clients.Remove(clientComponent); component.Clients.Remove(client);
clientComponent.Server = null; clientComponent.Server = null;
} }
public bool IsTechnologyUnlocked(ResearchServerComponent component, TechnologyPrototype prototype, public bool IsTechnologyUnlocked(ResearchServerComponent component, TechnologyPrototype prototype,
TechnologyDatabaseComponent? databaseComponent = null) TechnologyDatabaseComponent? databaseComponent = null)
{ {
if (!Resolve(component.Owner, ref databaseComponent, false)) return false; if (!Resolve(component.Owner, ref databaseComponent, false))
return false;
return databaseComponent.IsTechnologyUnlocked(prototype.ID); return databaseComponent.IsTechnologyUnlocked(prototype.ID);
} }
@@ -84,12 +63,14 @@ public sealed partial class ResearchSystem
public bool UnlockTechnology(ResearchServerComponent component, TechnologyPrototype prototype, public bool UnlockTechnology(ResearchServerComponent component, TechnologyPrototype prototype,
TechnologyDatabaseComponent? databaseComponent = null) TechnologyDatabaseComponent? databaseComponent = null)
{ {
if (!Resolve(component.Owner, ref databaseComponent, false)) return false; if (!Resolve(component.Owner, ref databaseComponent, false))
return false;
if (!CanUnlockTechnology(component, prototype, databaseComponent)) return false; if (!CanUnlockTechnology(component, prototype, databaseComponent))
return false;
var result = UnlockTechnology(databaseComponent, prototype); var result = UnlockTechnology(databaseComponent, prototype);
if (result) if (result)
component.Points -= prototype.RequiredPoints; ChangePointsOnServer(component.Owner, -prototype.RequiredPoints, component);
return result; return result;
} }
@@ -97,14 +78,26 @@ public sealed partial class ResearchSystem
{ {
var points = 0; var points = 0;
if (CanRun(component)) if (!CanRun(component))
return points;
var ev = new ResearchServerGetPointsPerSecondEvent(component.Owner, points);
foreach (var client in component.Clients)
{ {
foreach (var source in component.PointSources) RaiseLocalEvent(client, ref ev);
{
if (CanProduce(source)) points += source.PointsPerSecond;
}
} }
return points; return ev.Points;
}
public void ChangePointsOnServer(EntityUid uid, int points, ResearchServerComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
component.Points += points;
var ev = new ResearchServerPointsChangedEvent(uid, component.Points, points);
foreach (var client in component.Clients)
{
RaiseLocalEvent(client, ref ev);
}
} }
} }

View File

@@ -3,7 +3,7 @@ using Content.Shared.Research.Components;
using Content.Shared.Research.Prototypes; using Content.Shared.Research.Prototypes;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
namespace Content.Server.Research; namespace Content.Server.Research.Systems;
public sealed partial class ResearchSystem public sealed partial class ResearchSystem
{ {
@@ -22,13 +22,15 @@ public sealed partial class ResearchSystem
/// adding all technologies from the other that /// adding all technologies from the other that
/// this one doesn't have. /// this one doesn't have.
/// </summary> /// </summary>
/// <param name="component"></param>
/// <param name="otherDatabase">The other database</param> /// <param name="otherDatabase">The other database</param>
/// <param name="twoway">Whether the other database should be synced against this one too or not.</param> /// <param name="twoway">Whether the other database should be synced against this one too or not.</param>
public void Sync(TechnologyDatabaseComponent component, TechnologyDatabaseComponent otherDatabase, bool twoway = true) public void Sync(TechnologyDatabaseComponent component, TechnologyDatabaseComponent otherDatabase, bool twoway = true)
{ {
foreach (var tech in otherDatabase.TechnologyIds) foreach (var tech in otherDatabase.TechnologyIds)
{ {
if (!component.IsTechnologyUnlocked(tech)) AddTechnology(component, tech); if (!component.IsTechnologyUnlocked(tech))
AddTechnology(component, tech);
} }
if (twoway) if (twoway)
@@ -45,8 +47,10 @@ public sealed partial class ResearchSystem
/// <returns>Whether it could sync or not</returns> /// <returns>Whether it could sync or not</returns>
public bool SyncWithServer(TechnologyDatabaseComponent component, ResearchClientComponent? clientComponent = null) public bool SyncWithServer(TechnologyDatabaseComponent component, ResearchClientComponent? clientComponent = null)
{ {
if (!Resolve(component.Owner, ref clientComponent, false)) return false; if (!Resolve(component.Owner, ref clientComponent, false))
if (!TryComp<TechnologyDatabaseComponent>(clientComponent.Server?.Owner, out var clientDatabase)) return false; return false;
if (!TryComp<TechnologyDatabaseComponent>(clientComponent.Server?.Owner, out var clientDatabase))
return false;
Sync(component, clientDatabase); Sync(component, clientDatabase);
@@ -56,11 +60,13 @@ public sealed partial class ResearchSystem
/// <summary> /// <summary>
/// If possible, unlocks a technology on this database. /// If possible, unlocks a technology on this database.
/// </summary> /// </summary>
/// <param name="component"></param>
/// <param name="technology"></param> /// <param name="technology"></param>
/// <returns></returns> /// <returns></returns>
public bool UnlockTechnology(TechnologyDatabaseComponent component, TechnologyPrototype technology) public bool UnlockTechnology(TechnologyDatabaseComponent component, TechnologyPrototype technology)
{ {
if (!component.CanUnlockTechnology(technology)) return false; if (!component.CanUnlockTechnology(technology))
return false;
AddTechnology(component, technology.ID); AddTechnology(component, technology.ID);
Dirty(component); Dirty(component);
@@ -70,6 +76,7 @@ public sealed partial class ResearchSystem
/// <summary> /// <summary>
/// Adds a technology to the database without checking if it could be unlocked. /// Adds a technology to the database without checking if it could be unlocked.
/// </summary> /// </summary>
/// <param name="component"></param>
/// <param name="technology"></param> /// <param name="technology"></param>
public void AddTechnology(TechnologyDatabaseComponent component, string technology) public void AddTechnology(TechnologyDatabaseComponent component, string technology)
{ {

View File

@@ -1,50 +1,34 @@
using System.Linq;
using Content.Server.Research.Components; using Content.Server.Research.Components;
using Content.Shared.Research.Components;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
namespace Content.Server.Research namespace Content.Server.Research.Systems
{ {
[UsedImplicitly] [UsedImplicitly]
public sealed partial class ResearchSystem : EntitySystem public sealed partial class ResearchSystem : EntitySystem
{ {
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
private const int ResearchConsoleUIUpdateTime = 5;
private float _timer = ResearchConsoleUIUpdateTime;
private readonly List<ResearchServerComponent> _servers = new();
public IReadOnlyList<ResearchServerComponent> Servers => _servers;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
InitializeClient(); InitializeClient();
InitializeConsole(); InitializeConsole();
InitializeServer(); InitializeSource();
InitializeTechnology(); InitializeTechnology();
} }
public bool RegisterServer(ResearchServerComponent server)
{
if (_servers.Contains(server)) return false;
_servers.Add(server);
_servers[^1].Id = _servers.Count - 1;
return true;
}
public void UnregisterServer(ResearchServerComponent server)
{
_servers.Remove(server);
}
public ResearchServerComponent? GetServerById(int id) public ResearchServerComponent? GetServerById(int id)
{ {
foreach (var server in Servers) foreach (var server in EntityQuery<ResearchServerComponent>())
{ {
if (server.Id == id) return server; if (server.Id == id)
return server;
} }
return null; return null;
@@ -52,11 +36,12 @@ namespace Content.Server.Research
public string[] GetServerNames() public string[] GetServerNames()
{ {
var list = new string[Servers.Count]; var allServers = EntityQuery<ResearchServerComponent>(true).ToArray();
var list = new string[allServers.Length];
for (var i = 0; i < Servers.Count; i++) for (var i = 0; i < allServers.Length; i++)
{ {
list[i] = Servers[i].ServerName; list[i] = allServers[i].ServerName;
} }
return list; return list;
@@ -64,11 +49,12 @@ namespace Content.Server.Research
public int[] GetServerIds() public int[] GetServerIds()
{ {
var list = new int[Servers.Count]; var allServers = EntityQuery<ResearchServerComponent>(true).ToArray();
var list = new int[allServers.Length];
for (var i = 0; i < Servers.Count; i++) for (var i = 0; i < allServers.Length; i++)
{ {
list[i] = Servers[i].Id; list[i] = allServers[i].Id;
} }
return list; return list;
@@ -76,22 +62,13 @@ namespace Content.Server.Research
public override void Update(float frameTime) public override void Update(float frameTime)
{ {
_timer += frameTime; foreach (var server in EntityQuery<ResearchServerComponent>())
while (_timer > ResearchConsoleUIUpdateTime)
{ {
foreach (var server in _servers) if (server.NextUpdateTime > _timing.CurTime)
{ continue;
UpdateServer(server, ResearchConsoleUIUpdateTime); server.NextUpdateTime = _timing.CurTime + server.ResearchConsoleUpdateTime;
}
foreach (var console in EntityManager.EntityQuery<ResearchConsoleComponent>()) UpdateServer(server, (int) server.ResearchConsoleUpdateTime.TotalSeconds);
{
if (!_uiSystem.IsUiOpen(console.Owner, ResearchConsoleUiKey.Key)) continue;
UpdateConsoleInterface(console);
}
_timer -= ResearchConsoleUIUpdateTime;
} }
} }
} }

View File

@@ -4,8 +4,8 @@ using Content.Server.MachineLinking.Components;
using Content.Server.MachineLinking.Events; using Content.Server.MachineLinking.Events;
using Content.Server.Paper; using Content.Server.Paper;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Server.Research;
using Content.Server.Research.Components; using Content.Server.Research.Components;
using Content.Server.Research.Systems;
using Content.Server.UserInterface; using Content.Server.UserInterface;
using Content.Server.Xenoarchaeology.Equipment.Components; using Content.Server.Xenoarchaeology.Equipment.Components;
using Content.Server.Xenoarchaeology.XenoArtifacts; using Content.Server.Xenoarchaeology.XenoArtifacts;
@@ -38,6 +38,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
[Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly ArtifactSystem _artifact = default!; [Dependency] private readonly ArtifactSystem _artifact = default!;
[Dependency] private readonly PaperSystem _paper = default!; [Dependency] private readonly PaperSystem _paper = default!;
[Dependency] private readonly ResearchSystem _research = default!;
/// <inheritdoc/> /// <inheritdoc/>
public override void Initialize() public override void Initialize()
@@ -332,7 +333,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
/// <param name="args"></param> /// <param name="args"></param>
private void OnDestroyButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleDestroyButtonPressedMessage args) private void OnDestroyButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleDestroyButtonPressedMessage args)
{ {
if (!TryComp<ResearchClientComponent>(uid, out var client) || client.Server == null || component.AnalyzerEntity == null) if (!TryComp<ResearchClientComponent>(uid, out var client) || client.Server is not { } server || component.AnalyzerEntity == null)
return; return;
var entToDestroy = GetArtifactForAnalysis(component.AnalyzerEntity); var entToDestroy = GetArtifactForAnalysis(component.AnalyzerEntity);
@@ -345,7 +346,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
ResetAnalyzer(component.AnalyzerEntity.Value); ResetAnalyzer(component.AnalyzerEntity.Value);
} }
client.Server.Points += _artifact.GetResearchPointValue(entToDestroy.Value); _research.ChangePointsOnServer(server.Owner, _artifact.GetResearchPointValue(entToDestroy.Value), server);
EntityManager.DeleteEntity(entToDestroy.Value); EntityManager.DeleteEntity(entToDestroy.Value);
_audio.PlayPvs(component.DestroySound, component.AnalyzerEntity.Value, AudioParams.Default.WithVolume(2f)); _audio.PlayPvs(component.DestroySound, component.AnalyzerEntity.Value, AudioParams.Default.WithVolume(2f));