using Content.Shared._Horizon.Medical.Damage; using Content.Shared.Body.Components; namespace Content.Server._Horizon.Medical; public sealed class LimbDamageSystem : EntitySystem { /* [Dependency] private readonly IRobustRandom _rand = null!; [Dependency] private readonly BodySystem _body = null!; [Dependency] private readonly ContainerSystem _containers = null!; [Dependency] private readonly HandsSystem _hands = null!; */ public override void Initialize() { SubscribeLocalEvent(OnDamage); } //duct tape solution private void OnDamage(Entity ent, ref DamageBeforeApplyEvent args) { //if (HasComp(ent)) return; // Nuke Ops are immune to limb damage. Temporary solution. mb Deathsquad? //if (!TryComp(ent, out var appr) || appr.Species == "SlimePerson") return; // SlimePeople are immune to limb damage. //var chance = 0f; //foreach (var damage in args.Damage.DamageDict.Where(x => x.Value > 0)) // switch (damage.Key) // { // case "Blunt": // chance += 0.00005f * damage.Value.Float(); // break; // case "Slash": // chance += 0.0005f * damage.Value.Float(); // break; // case "Piercing": // chance += 0.0001f * damage.Value.Float(); // break; // case "Heat": // chance += 0.0002f * damage.Value.Float(); // break; // case "Cold": // chance += 0.0004f * damage.Value.Float(); // break; // case "Caustic": // chance += 0.001f * damage.Value.Float(); // break; // default: // break; // } //chance = Math.Clamp(chance, 0, 1); //if (_rand.Prob(chance)) //{ // if (!TryRemoveLimb(ent, out var part)) return; // Dirty(ent); // QueueDel(part.Value.Owner); // args.Cancelled = true; //} } //private bool TryRemoveLimb(Entity ent, [NotNullWhen(true)] out Entity? part) //{ // part = null; // var root = _body.GetRootPartOrNull(ent.Owner); // if (root is null) return false; // var parts = _body.GetAllBodyPart(root.Value.Entity, root.Value.BodyPart) // .Where(p => p.Comp.PartType != BodyPartType.Head) // .ToList(); // if (parts.Count == 0) return false; // part = _rand.Pick(parts); // var parentPartAndSlot = _body.GetParentPartAndSlotOrNull(part.Value.Owner); // if (parentPartAndSlot is null) return false; // var (_, slotId) = parentPartAndSlot.Value; // if (!_containers.TryGetContainingContainer((part.Value.Owner, null, null), out var container)) return false; // if (!_containers.Remove(part.Value.Owner, container)) return false; // if (TryComp(part.Value.Owner, out var virtualLimb) // && virtualLimb.Item.HasValue) // { // RemoveItemHand(ent.Owner, virtualLimb.Item.Value, BodySystem.GetPartSlotContainerId(slotId)); // var vizualizer = EnsureComp(ent.Owner); // var layer = SurgerySystem.GetLayer(slotId); // if (layer is not null) // { // vizualizer.Layers.Remove(layer.Value); // Dirty(ent.Owner, vizualizer); // } // } // else // { // switch (part.Value.Comp.PartType) // { // case BodyPartType.Arm: //todo move to systems // foreach (var limbSlotId in part.Value.Comp.Children.Keys) // { // if (limbSlotId is null) continue; // var child = _containers.GetContainer(part.Value.Owner, BodySystem.GetPartSlotContainerId(limbSlotId)); // foreach (var containedEnt in child.ContainedEntities) // { // if (TryComp(containedEnt, out BodyPartComponent? innerPart) // && innerPart.PartType == BodyPartType.Hand) // _hands.RemoveHand(ent.Owner, BodySystem.GetPartSlotContainerId(limbSlotId)); // } // } // break; // case BodyPartType.Hand: // var parentSlot = _body.GetParentPartAndSlotOrNull(part.Value.Owner); // if (parentSlot is not null) // _hands.RemoveHand(ent.Owner, BodySystem.GetPartSlotContainerId(parentSlot.Value.Slot)); // break; // case BodyPartType.Leg: // case BodyPartType.Foot: // break; // } // } // return true; //} //private void RemoveItemHand(EntityUid bodyId, EntityUid itemId, string handId) //{ // if (!TryComp(bodyId, out var hands) // || !_hands.TryGetHand(bodyId, handId, out var hand, hands)) // return; // if (!itemId.IsValid()) // { // Log.Debug("no valid item"); // return; // } // RemComp(itemId); // _hands.DoDrop(itemId, hand); // _hands.RemoveHand(bodyId, handId, hands); //} }