private void AddBodyPart(BodyPart part, string slotName) { DebugTools.AssertNotNull(part); DebugTools.AssertNotNull(slotName); _parts.Add(slotName, part); part.Body = this; var argsAdded = new BodyPartAddedEventArgs(part, slotName); foreach (var component in Owner.GetAllComponents <IBodyPartAdded>().ToArray()) { component.BodyPartAdded(argsAdded); } if (!Template.Layers.TryGetValue(slotName, out var partMap) || !_reflectionManager.TryParseEnumReference(partMap, out var partEnum)) { Logger.Warning($"Template {Template.Name} has an invalid RSI map key {partMap} for body part {part.Name}."); return; } part.RSIMap = partEnum; var partMessage = new BodyPartAddedMessage(part.RSIPath, part.RSIState, partEnum); SendNetworkMessage(partMessage); 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 MechanismSpriteAddedMessage(mechanismEnum); SendNetworkMessage(mechanismMessage); } }
public bool TryAddPart(string slot, IBodyPart part, bool force = false) { DebugTools.AssertNotNull(part); DebugTools.AssertNotNull(slot); // Make sure the given slot exists if (!force) { if (!HasSlot(slot)) { return(false); } // And that nothing is in it if (!_parts.TryAdd(slot, part)) { return(false); } } else { _parts[slot] = part; } part.Body = this; var argsAdded = new BodyPartAddedEventArgs(part, slot); foreach (var component in Owner.GetAllComponents <IBodyPartAdded>().ToArray()) { component.BodyPartAdded(argsAdded); } // TODO: Sort this duplicate out OnBodyChanged(); if (!Template.Layers.TryGetValue(slot, out var partMap) || !_reflectionManager.TryParseEnumReference(partMap, out var partEnum)) { Logger.Warning($"Template {Template.Name} has an invalid RSI map key {partMap} for body part {part.Name}."); return(false); } part.RSIMap = partEnum; var partMessage = new BodyPartAddedMessage(part.RSIPath, part.RSIState, partEnum); SendNetworkMessage(partMessage); 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 MechanismSpriteAddedMessage(mechanismEnum); SendNetworkMessage(mechanismMessage); } return(true); }