private void DeleteUndelete(bool redo) { bool wasDeleted = WasDeleted; // We are redoing instead of undoing, flip the behavior if (redo) { wasDeleted = !wasDeleted; } if (wasDeleted) { Debug.Assert(Receivers.All(entity => entity.GetReplacementOrThis().Removed), "Tried to redo a deletion but some items were not deleted"); List <MapEntity> clones = MapEntity.Clone(CloneList); int length = Math.Min(Receivers.Count, clones.Count); for (int i = 0; i < length; i++) { MapEntity clone = clones[i], receiver = Receivers[i]; if (receiver.GetReplacementOrThis() is Item item && clone is Item cloneItem) { foreach (ItemComponent ic in item.Components) { int index = item.GetComponentIndex(ic); ItemComponent component = cloneItem.Components.ElementAtOrDefault(index); switch (component) { case null: continue; case ItemContainer newContainer when newContainer.Inventory != null && ic is ItemContainer itemContainer && itemContainer.Inventory != null: itemContainer.Inventory.GetReplacementOrThiS().ReplacedBy = newContainer.Inventory; goto default; default: ic.GetReplacementOrThis().ReplacedBy = component; break; } } } receiver.GetReplacementOrThis().ReplacedBy = clone; } for (int i = 0; i < length; i++) { MapEntity clone = clones[i], receiver = Receivers[i]; if (clone is Item it) { foreach (var(slotRef, inventory) in PreviousInventories) { if (slotRef.Item == receiver) { inventory.GetReplacementOrThiS().TryPutItem(it, slotRef.Slot, false, false, null, createNetworkEvent: false); } } } } foreach (MapEntity clone in clones) { clone.Submarine = Submarine.MainSub; } } else { foreach (MapEntity t in Receivers) { MapEntity receiver = t.GetReplacementOrThis(); if (!receiver.Removed) { receiver.Remove(); } } } }
public MapEntity GetReplacementOrThis() { return(ReplacedBy?.GetReplacementOrThis() ?? this); }