private bool RemoveBodyPart(string slotName, bool drop) { DebugTools.AssertNotNull(slotName); if (!_parts.Remove(slotName, out var part)) { return(false); } IEntity?dropped = null; if (drop) { part.SpawnDropped(out dropped); } part.Body = null; var args = new BodyPartRemovedEventArgs(part, slotName); foreach (var component in Owner.GetAllComponents <IBodyPartRemoved>()) { component.BodyPartRemoved(args); } if (part.RSIMap != null) { var message = new BodyPartRemovedMessage(part.RSIMap, dropped?.Uid); SendNetworkMessage(message); } foreach (var mechanism in part.Mechanisms) { if (!Template.MechanismLayers.TryGetValue(mechanism.Id, out var mechanismMap)) { continue; } if (!_reflectionManager.TryParseEnumReference(mechanismMap, out var mechanismEnum)) { Logger.Warning($"Template {Template.Name} has an invalid RSI map key {mechanismMap} for mechanism {mechanism.Id}."); continue; } var mechanismMessage = new MechanismSpriteRemovedMessage(mechanismEnum); SendNetworkMessage(mechanismMessage); } return(true); }
public bool RemovePart(string slot, bool drop) { DebugTools.AssertNotNull(slot); if (!_parts.Remove(slot, out var part)) { return(false); } IEntity?dropped = null; if (drop) { part.SpawnDropped(out dropped); } part.Body = null; var args = new BodyPartRemovedEventArgs(part, slot); foreach (var component in Owner.GetAllComponents <IBodyPartRemoved>()) { component.BodyPartRemoved(args); } if (part.RSIMap != null) { var message = new BodyPartRemovedMessage(part.RSIMap, dropped?.Uid); SendNetworkMessage(message); } foreach (var mechanism in part.Mechanisms) { if (!Template.MechanismLayers.TryGetValue(mechanism.Id, out var mechanismMap)) { continue; } if (!_reflectionManager.TryParseEnumReference(mechanismMap, out var mechanismEnum)) { Logger.Warning($"Template {Template.Name} has an invalid RSI map key {mechanismMap} for mechanism {mechanism.Id}."); continue; } var mechanismMessage = new MechanismSpriteRemovedMessage(mechanismEnum); SendNetworkMessage(mechanismMessage); } if (CurrentDamageState == DamageState.Dead) { return(true); } // creadth: fall down if no legs if (part.PartType == BodyPartType.Leg && Parts.Count(x => x.Value.PartType == BodyPartType.Leg) == 0) { EntitySystem.Get <StandingStateSystem>().Down(Owner); } // creadth: immediately kill entity if last vital part removed if (part.IsVital && Parts.Count(x => x.Value.PartType == part.PartType) == 0) { CurrentDamageState = DamageState.Dead; ForceHealthChangedEvent(); } if (TryGetSlotConnections(slot, out var connections)) { foreach (var connectionName in connections) { if (TryGetPart(connectionName, out var result) && !ConnectedToCenter(result)) { RemovePart(connectionName, drop); } } } OnBodyChanged(); return(true); }