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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user