using System.Linq; using Content.Shared._White.TTS; using Content.Shared.Containers.ItemSlots; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Content.Shared.Popups; using Content.Shared.PowerCell.Components; using Content.Shared.Silicons.Borgs.Components; using Content.Shared.Wires; using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; namespace Content.Shared.Silicons.Borgs; /// /// This handles logic, interactions, and UI related to and other related components. /// public abstract partial class SharedBorgSystem : EntitySystem { [Dependency] protected readonly SharedContainerSystem Container = default!; [Dependency] protected readonly ItemSlotsSystem ItemSlots = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] protected readonly IPrototypeManager PrototypeManager = default!; // PARSEC EDIT [Dependency] protected readonly IRobustRandom RobustRandom = default!; // PARSEC EDIT private HashSet _voices = new(); /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnItemSlotInsertAttempt); SubscribeLocalEvent(OnItemSlotEjectAttempt); SubscribeLocalEvent(OnInserted); SubscribeLocalEvent(OnRemoved); SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); // WD edit SubscribeLocalEvent(EnsureRandomTTS); InitializeRelay(); GenerateVoiceList(); // WD edit } // PARSEC added private void EnsureRandomTTS(EntityUid uid, SharedTTSComponent component, ComponentInit args) { if (!HasComp(uid)) return; var voiceId = RobustRandom.Pick(_voices); component.VoicePrototypeId = voiceId.ID; Dirty(uid, component); } private void GenerateVoiceList() { _voices = PrototypeManager.EnumeratePrototypes() .Where(x => x.BorgVoice) .ToHashSet(); } // PARSEC added private void OnItemSlotInsertAttempt(EntityUid uid, BorgChassisComponent component, ref ItemSlotInsertAttemptEvent args) { if (args.Cancelled) return; if (!TryComp(uid, out var cellSlotComp) || !TryComp(uid, out var panel)) return; if (!ItemSlots.TryGetSlot(uid, cellSlotComp.CellSlotId, out var cellSlot) || cellSlot != args.Slot) return; if (!panel.Open || args.User == uid) args.Cancelled = true; } private void OnItemSlotEjectAttempt(EntityUid uid, BorgChassisComponent component, ref ItemSlotEjectAttemptEvent args) { if (args.Cancelled) return; if (!TryComp(uid, out var cellSlotComp) || !TryComp(uid, out var panel)) return; if (!ItemSlots.TryGetSlot(uid, cellSlotComp.CellSlotId, out var cellSlot) || cellSlot != args.Slot) return; if (!panel.Open || args.User == uid) args.Cancelled = true; } private void OnStartup(EntityUid uid, BorgChassisComponent component, ComponentStartup args) { if (!TryComp(uid, out var containerManager)) return; component.BrainContainer = Container.EnsureContainer(uid, component.BrainContainerId, containerManager); component.ModuleContainer = Container.EnsureContainer(uid, component.ModuleContainerId, containerManager); } protected virtual void OnInserted(EntityUid uid, BorgChassisComponent component, EntInsertedIntoContainerMessage args) { } protected virtual void OnRemoved(EntityUid uid, BorgChassisComponent component, EntRemovedFromContainerMessage args) { } private void OnRefreshMovementSpeedModifiers(EntityUid uid, BorgChassisComponent component, RefreshMovementSpeedModifiersEvent args) { if (component.Activated) return; if (!TryComp(uid, out var movement)) return; var sprintDif = movement.BaseWalkSpeed / movement.BaseSprintSpeed; args.ModifySpeed(1f, sprintDif); } }