using Content.Shared.Research.Components; using Content.Shared.Research.Systems; using Robust.Shared.Random; namespace Content.Server.Research.Systems; public sealed class ResearchStealerSystem : SharedResearchStealerSystem { [Dependency] private readonly SharedResearchSystem _research = default!; [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnDoAfter); } private void OnDoAfter(EntityUid uid, ResearchStealerComponent comp, ResearchStealDoAfterEvent args) { if (args.Cancelled || args.Handled || args.Target == null) return; var target = args.Target.Value; if (!TryComp(target, out var database)) return; var ev = new ResearchStolenEvent(uid, target, new()); var count = _random.Next(comp.MinToSteal, comp.MaxToSteal + 1); for (var i = 0; i < count; i++) { if (database.UnlockedTechnologies.Count == 0) break; var toRemove = _random.Pick(database.UnlockedTechnologies); if (_research.TryRemoveTechnology((target, database), toRemove)) ev.Techs.Add(toRemove); } RaiseLocalEvent(uid, ref ev); args.Handled = true; } } /// /// Event raised on the user when research is stolen from a RND server. /// Techs contains every technology id researched. /// [ByRefEvent] public record struct ResearchStolenEvent(EntityUid Used, EntityUid Target, List Techs);