| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- using System.Linq;
- using Content.Server.Power.EntitySystems;
- using Content.Shared.Research.Components;
- namespace Content.Server.Research.Systems;
- public sealed partial class ResearchSystem
- {
- private void InitializeServer()
- {
- SubscribeLocalEvent<ResearchServerComponent, ComponentStartup>(OnServerStartup);
- SubscribeLocalEvent<ResearchServerComponent, ComponentShutdown>(OnServerShutdown);
- SubscribeLocalEvent<ResearchServerComponent, TechnologyDatabaseModifiedEvent>(OnServerDatabaseModified);
- }
- private void OnServerStartup(EntityUid uid, ResearchServerComponent component, ComponentStartup args)
- {
- var unusedId = EntityQuery<ResearchServerComponent>(true)
- .Max(s => s.Id) + 1;
- component.Id = unusedId;
- Dirty(uid, component);
- }
- private void OnServerShutdown(EntityUid uid, ResearchServerComponent component, ComponentShutdown args)
- {
- foreach (var client in new List<EntityUid>(component.Clients))
- {
- UnregisterClient(client, uid, serverComponent: component, dirtyServer: false);
- }
- }
- private void OnServerDatabaseModified(EntityUid uid, ResearchServerComponent component, ref TechnologyDatabaseModifiedEvent args)
- {
- foreach (var client in component.Clients)
- {
- RaiseLocalEvent(client, ref args);
- }
- }
- private bool CanRun(EntityUid uid)
- {
- return this.IsPowered(uid, EntityManager);
- }
- private void UpdateServer(EntityUid uid, int time, ResearchServerComponent? component = null)
- {
- if (!Resolve(uid, ref component))
- return;
- if (!CanRun(uid))
- return;
- ModifyServerPoints(uid, GetPointsPerSecond(uid, component) * time, component);
- }
- /// <summary>
- /// Registers a client to the specified server.
- /// </summary>
- /// <param name="client">The client being registered</param>
- /// <param name="server">The server the client is being registered to</param>
- /// <param name="clientComponent"></param>
- /// <param name="serverComponent"></param>
- /// <param name="dirtyServer">Whether or not to dirty the server component after registration</param>
- public void RegisterClient(EntityUid client, EntityUid server, ResearchClientComponent? clientComponent = null,
- ResearchServerComponent? serverComponent = null, bool dirtyServer = true)
- {
- if (!Resolve(client, ref clientComponent) || !Resolve(server, ref serverComponent))
- return;
- if (serverComponent.Clients.Contains(client))
- return;
- serverComponent.Clients.Add(client);
- clientComponent.Server = server;
- SyncClientWithServer(client, clientComponent: clientComponent);
- if (dirtyServer)
- Dirty(server, serverComponent);
- var ev = new ResearchRegistrationChangedEvent(server);
- RaiseLocalEvent(client, ref ev);
- }
- /// <summary>
- /// Unregisterse a client from its server
- /// </summary>
- /// <param name="client"></param>
- /// <param name="clientComponent"></param>
- /// <param name="dirtyServer"></param>
- public void UnregisterClient(EntityUid client, ResearchClientComponent? clientComponent = null, bool dirtyServer = true)
- {
- if (!Resolve(client, ref clientComponent))
- return;
- if (clientComponent.Server is not { } server)
- return;
- UnregisterClient(client, server, clientComponent, dirtyServer: dirtyServer);
- }
- /// <summary>
- /// Unregisters a client from its server
- /// </summary>
- /// <param name="client"></param>
- /// <param name="server"></param>
- /// <param name="clientComponent"></param>
- /// <param name="serverComponent"></param>
- /// <param name="dirtyServer"></param>
- public void UnregisterClient(EntityUid client, EntityUid server, ResearchClientComponent? clientComponent = null,
- ResearchServerComponent? serverComponent = null, bool dirtyServer = true)
- {
- if (!Resolve(client, ref clientComponent) || !Resolve(server, ref serverComponent))
- return;
- serverComponent.Clients.Remove(client);
- clientComponent.Server = null;
- SyncClientWithServer(client, clientComponent: clientComponent);
- if (dirtyServer)
- {
- Dirty(server, serverComponent);
- }
- var ev = new ResearchRegistrationChangedEvent(null);
- RaiseLocalEvent(client, ref ev);
- }
- /// <summary>
- /// Gets the amount of points generated by all the server's sources in a second.
- /// </summary>
- /// <param name="uid"></param>
- /// <param name="component"></param>
- /// <returns></returns>
- public int GetPointsPerSecond(EntityUid uid, ResearchServerComponent? component = null)
- {
- var points = 0;
- if (!Resolve(uid, ref component))
- return points;
- if (!CanRun(uid))
- return points;
- var ev = new ResearchServerGetPointsPerSecondEvent(uid, points);
- foreach (var client in component.Clients)
- {
- RaiseLocalEvent(client, ref ev);
- }
- return ev.Points;
- }
- /// <summary>
- /// Adds a specified number of points to a server.
- /// </summary>
- /// <param name="uid">The server</param>
- /// <param name="points">The amount of points being added</param>
- /// <param name="component"></param>
- public void ModifyServerPoints(EntityUid uid, int points, ResearchServerComponent? component = null)
- {
- if (points == 0)
- return;
- 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);
- }
- Dirty(uid, component);
- }
- }
|