Files
tbd-station-14/Content.Server/Research/Systems/ResearchSystem.Server.cs
Nemanja 0549b22cbc 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
2022-12-19 15:14:02 -06:00

104 lines
3.5 KiB
C#

using Content.Server.Power.EntitySystems;
using Content.Server.Research.Components;
using Content.Shared.Research.Prototypes;
namespace Content.Server.Research.Systems;
public sealed partial class ResearchSystem
{
private bool CanRun(ResearchServerComponent component)
{
return this.IsPowered(component.Owner, EntityManager);
}
private void UpdateServer(ResearchServerComponent component, int time)
{
if (!CanRun(component))
return;
ChangePointsOnServer(component.Owner, PointsPerSecond(component) * time, component);
}
public bool RegisterServerClient(ResearchServerComponent component, EntityUid client, ResearchClientComponent? clientComponent = null)
{
if (!Resolve(client, ref clientComponent))
return false;
if (component.Clients.Contains(client))
return false;
component.Clients.Add(client);
clientComponent.Server = component;
return true;
}
public void UnregisterServerClient(ResearchServerComponent component, EntityUid client, ResearchClientComponent? clientComponent = null)
{
if (!Resolve(client, ref clientComponent))
return;
component.Clients.Remove(client);
clientComponent.Server = null;
}
public bool IsTechnologyUnlocked(ResearchServerComponent component, TechnologyPrototype prototype,
TechnologyDatabaseComponent? databaseComponent = null)
{
if (!Resolve(component.Owner, ref databaseComponent, false))
return false;
return databaseComponent.IsTechnologyUnlocked(prototype.ID);
}
public bool CanUnlockTechnology(ResearchServerComponent component, TechnologyPrototype technology, TechnologyDatabaseComponent? databaseComponent = null)
{
if (!Resolve(component.Owner, ref databaseComponent, false))
return false;
if (!databaseComponent.CanUnlockTechnology(technology) ||
component.Points < technology.RequiredPoints ||
IsTechnologyUnlocked(component, technology, databaseComponent))
return false;
return true;
}
public bool UnlockTechnology(ResearchServerComponent component, TechnologyPrototype prototype,
TechnologyDatabaseComponent? databaseComponent = null)
{
if (!Resolve(component.Owner, ref databaseComponent, false))
return false;
if (!CanUnlockTechnology(component, prototype, databaseComponent))
return false;
var result = UnlockTechnology(databaseComponent, prototype);
if (result)
ChangePointsOnServer(component.Owner, -prototype.RequiredPoints, component);
return result;
}
public int PointsPerSecond(ResearchServerComponent component)
{
var points = 0;
if (!CanRun(component))
return points;
var ev = new ResearchServerGetPointsPerSecondEvent(component.Owner, points);
foreach (var client in component.Clients)
{
RaiseLocalEvent(client, ref ev);
}
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);
}
}
}