Files
crystall-punk-14/Content.Server/Research/Systems/ResearchSystem.Server.cs

104 lines
3.5 KiB
C#
Raw Normal View History

2022-06-28 22:54:08 +10:00
using Content.Server.Power.EntitySystems;
using Content.Server.Research.Components;
using Content.Shared.Research.Prototypes;
namespace Content.Server.Research.Systems;
2022-06-28 22:54:08 +10:00
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);
2022-06-28 22:54:08 +10:00
}
public bool RegisterServerClient(ResearchServerComponent component, EntityUid client, ResearchClientComponent? clientComponent = null)
2022-06-28 22:54:08 +10:00
{
if (!Resolve(client, ref clientComponent))
return false;
2022-06-28 22:54:08 +10:00
if (component.Clients.Contains(client))
return false;
component.Clients.Add(client);
2022-06-28 22:54:08 +10:00
clientComponent.Server = component;
return true;
}
public void UnregisterServerClient(ResearchServerComponent component, EntityUid client, ResearchClientComponent? clientComponent = null)
2022-06-28 22:54:08 +10:00
{
if (!Resolve(client, ref clientComponent))
return;
2022-06-28 22:54:08 +10:00
component.Clients.Remove(client);
2022-06-28 22:54:08 +10:00
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);
2022-06-28 22:54:08 +10:00
}
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;
2022-06-28 22:54:08 +10:00
if (!CanUnlockTechnology(component, prototype, databaseComponent))
return false;
2022-06-28 22:54:08 +10:00
var result = UnlockTechnology(databaseComponent, prototype);
if (result)
ChangePointsOnServer(component.Owner, -prototype.RequiredPoints, component);
2022-06-28 22:54:08 +10:00
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)
2022-06-28 22:54:08 +10:00
{
RaiseLocalEvent(client, ref ev);
2022-06-28 22:54:08 +10:00
}
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);
}
2022-06-28 22:54:08 +10:00
}
}