using Content.Shared.Research.Components; using Content.Shared.Research.Prototypes; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Players; namespace Content.Server.Research.Components { [RegisterComponent] public class TechnologyDatabaseComponent : SharedTechnologyDatabaseComponent { public override ComponentState GetComponentState() { return new TechnologyDatabaseState(_technologies); } /// /// Synchronizes this database against other, /// adding all technologies from the other that /// this one doesn't have. /// /// The other database /// Whether the other database should be synced against this one too or not. public void Sync(TechnologyDatabaseComponent otherDatabase, bool twoway = true) { foreach (var tech in otherDatabase.Technologies) { if (!IsTechnologyUnlocked(tech)) AddTechnology(tech); } if (twoway) otherDatabase.Sync(this, false); Dirty(); } /// /// If there's a research client component attached to the owner entity, /// and the research client is connected to a research server, this method /// syncs against the research server, and the server against the local database. /// /// Whether it could sync or not public bool SyncWithServer() { if (!IoCManager.Resolve().TryGetComponent(Owner, out ResearchClientComponent? client)) return false; if (client.Server?.Database == null) return false; Sync(client.Server.Database); return true; } /// /// If possible, unlocks a technology on this database. /// /// /// public bool UnlockTechnology(TechnologyPrototype technology) { if (!CanUnlockTechnology(technology)) return false; AddTechnology(technology); Dirty(); return true; } /// /// Adds a technology to the database without checking if it could be unlocked. /// /// public void AddTechnology(TechnologyPrototype technology) { _technologies.Add(technology); } } }