using Content.Server.Body.Components; using Content.Server.Body.Systems; using Content.Shared._EE.Xelthia; using Content.Shared.Abilities.Psionics; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; using Content.Shared.Psionics; using Content.Shared.Bed.Sleep; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Shadowkin; using Content.Shared.Rejuvenate; using Content.Shared.Alert; using Content.Shared.Rounding; using Content.Shared.Actions; using Robust.Shared.Prototypes; using Content.Shared.Examine; using Content.Shared.Actions.Events; using Content.Shared.Body.Components; using Content.Shared.Body.Part; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Placement; using Robust.Shared.Random; using Robust.Shared.Serialization.Manager; using Robust.Shared.Timing; using Content.Shared.Chemistry.Components; namespace Content.Server._EE.Xelthia; /// /// Xelthia Arm Regrowth stuff /// public sealed class XelthiaSystem : EntitySystem { /// [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; //public const string XelthiaRegenerateActionId = "XelthiaRegenerateAction"; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRegrowthAction); } private void OnInit(EntityUid uid, XelthiaComponent component, ComponentStartup args) { _actionsSystem.AddAction(uid, ref component.XelthiaRegenerateAction, out var regenerateAction, "XelthiaRegenerateAction"); if (regenerateAction?.UseDelay != null) component.UseDelay = regenerateAction.UseDelay.Value; } private void OnRegrowthAction(EntityUid uid, XelthiaComponent component, ArmRegrowthEvent args) { var start = _gameTiming.CurTime; var end = _gameTiming.CurTime + component.UseDelay; _actionsSystem.SetCooldown(component.XelthiaRegenerateAction!.Value, start, end); // Cooldown //IEntityManager entityManager = uid; var bodySystem = _entityManager.System(); var transformSystem = _entityManager.System(); if (!_entityManager.TryGetComponent(uid, out BodyComponent? body) || !_entityManager.TryGetComponent(uid, out TransformComponent? xform)) return; var root = bodySystem.GetRootPartOrNull(uid, body); if (root is null) return; var parts = bodySystem.GetBodyChildrenOfType(uid, BodyPartType.Arm, body); // Deletes Arms and hands foreach (var part in parts) { foreach (var child in bodySystem.GetBodyPartChildren(part.Id, part.Component)) _entityManager.QueueDeleteEntity(child.Id); transformSystem.AttachToGridOrMap(part.Id); _entityManager.QueueDeleteEntity(part.Id); _entityManager.SpawnAtPosition("FoodMeatXelthiaTentacle", xform.Coordinates); // Should drop arms equal to the number attached } // Right Side var newLimb = _entityManager.SpawnAtPosition("RightArmXelthia", xform.Coordinates); // Copy-Pasted Code for arm spawning if (_entityManager.TryGetComponent(newLimb, out BodyPartComponent? limbComp)) bodySystem.AttachPart(root.Value.Entity, "right arm", newLimb, root.Value.BodyPart, limbComp); var newerLimb = _entityManager.SpawnAtPosition("RightHandXelthia", xform.Coordinates); // Spawns the hand Enum.TryParse("Hand", out var partType); bodySystem.TryCreatePartSlotAndAttach(newLimb, "right hand", newerLimb, partType); // Left Side newLimb = _entityManager.SpawnAtPosition("LeftArmXelthia", xform.Coordinates); // Copy-Pasted Code for arm spawning if (_entityManager.TryGetComponent(newLimb, out BodyPartComponent? limbComp2)) bodySystem.AttachPart(root.Value.Entity, "left arm", newLimb, root.Value.BodyPart, limbComp2); newerLimb = _entityManager.SpawnAtPosition("LeftHandXelthia", xform.Coordinates); // Spawns the hand bodySystem.TryCreatePartSlotAndAttach(newLimb, "left hand", newerLimb, partType); _entityManager.EntitySysManager.GetEntitySystem() .PlayPvs("/Audio/_EE/Voice/Xelthia/regrow.ogg", uid, null); var solution = new Solution(); TryComp(uid, out var stream); solution.AddReagent("XelthiaArmJuice", 3.5); _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); } }