using Content.Server.Mind; using Content.Shared.Species.Components; using Content.Shared.Body.Events; using Content.Shared.Zombies; using Content.Server.Zombies; using Robust.Shared.Prototypes; using Robust.Shared.Timing; namespace Content.Server.Species.Systems; public sealed partial class NymphSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _protoManager= default!; [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly ZombieSystem _zombie = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnRemovedFromPart); } private void OnRemovedFromPart(EntityUid uid, NymphComponent comp, ref OrganRemovedFromBodyEvent args) { if (!_timing.IsFirstTimePredicted) return; if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.OldBody)) return; if (!_protoManager.TryIndex(comp.EntityPrototype, out var entityProto)) return; // Get the organs' position & spawn a nymph there var coords = Transform(uid).Coordinates; var nymph = SpawnAtPosition(entityProto.ID, coords); if (HasComp(args.OldBody)) // Zombify the new nymph if old one is a zombie _zombie.ZombifyEntity(nymph); // Move the mind if there is one and it's supposed to be transferred if (comp.TransferMind == true && _mindSystem.TryGetMind(args.OldBody, out var mindId, out var mind)) _mindSystem.TransferTo(mindId, nymph, mind: mind); // Delete the old organ QueueDel(uid); } }