using Content.Server.Roles; using Content.Shared.Containers.ItemSlots; using Content.Shared.Mind.Components; using Content.Shared.Roles; using Content.Shared.Silicons.Borgs.Components; using Robust.Shared.Containers; namespace Content.Server.Silicons.Borgs; /// public sealed partial class BorgSystem { [Dependency] private readonly SharedRoleSystem _roles = default!; public void InitializeMMI() { SubscribeLocalEvent(OnMMIInit); SubscribeLocalEvent(OnMMIEntityInserted); SubscribeLocalEvent(OnMMIMindAdded); SubscribeLocalEvent(OnMMIMindRemoved); SubscribeLocalEvent(OnMMILinkedMindAdded); SubscribeLocalEvent(OnMMILinkedRemoved); } private void OnMMIInit(EntityUid uid, MMIComponent component, ComponentInit args) { if (!TryComp(uid, out var itemSlots)) return; if (ItemSlots.TryGetSlot(uid, component.BrainSlotId, out var slot, itemSlots)) component.BrainSlot = slot; else ItemSlots.AddItemSlot(uid, component.BrainSlotId, component.BrainSlot, itemSlots); } private void OnMMIEntityInserted(EntityUid uid, MMIComponent component, EntInsertedIntoContainerMessage args) { if (args.Container.ID != component.BrainSlotId) return; var ent = args.Entity; var linked = EnsureComp(ent); linked.LinkedMMI = uid; Dirty(uid, component); if (_mind.TryGetMind(ent, out var mindId, out var mind)) { _mind.TransferTo(mindId, uid, true, mind: mind); if (!_roles.MindHasRole(mindId)) _roles.MindAddRole(mindId, "MindRoleSiliconBrain", silent: true); } _appearance.SetData(uid, MMIVisuals.BrainPresent, true); } private void OnMMIMindAdded(EntityUid uid, MMIComponent component, MindAddedMessage args) { _appearance.SetData(uid, MMIVisuals.HasMind, true); } private void OnMMIMindRemoved(EntityUid uid, MMIComponent component, MindRemovedMessage args) { _appearance.SetData(uid, MMIVisuals.HasMind, false); } private void OnMMILinkedMindAdded(EntityUid uid, MMILinkedComponent component, MindAddedMessage args) { if (!_mind.TryGetMind(uid, out var mindId, out var mind) || component.LinkedMMI == null) return; _mind.TransferTo(mindId, component.LinkedMMI, true, mind: mind); } private void OnMMILinkedRemoved(EntityUid uid, MMILinkedComponent component, EntGotRemovedFromContainerMessage args) { if (Terminating(uid)) return; if (component.LinkedMMI is not { } linked) return; RemComp(uid, component); if (_mind.TryGetMind(linked, out var mindId, out var mind)) { if (_roles.MindHasRole(mindId)) _roles.MindRemoveRole(mindId); _mind.TransferTo(mindId, uid, true, mind: mind); } _appearance.SetData(linked, MMIVisuals.BrainPresent, false); } }