public List <MapEntity> CreateInstance(Vector2 position, Submarine sub) { List <MapEntity> entities = MapEntity.LoadAll(sub, configElement, configPath); if (entities.Count == 0) { return(entities); } Vector2 offset = sub == null ? Vector2.Zero : sub.HiddenSubPosition; foreach (MapEntity me in entities) { me.Move(position); Item item = me as Item; if (item == null) { continue; } Wire wire = item.GetComponent <Wire>(); if (wire != null) { wire.MoveNodes(position - offset); } } MapEntity.MapLoaded(entities, true); #if CLIENT if (Screen.Selected == GameMain.SubEditorScreen) { MapEntity.SelectedList.Clear(); entities.ForEach(e => MapEntity.AddSelection(e)); } #endif return(entities); }
public static XElement Save(List <MapEntity> entities, string name, string description, bool hideInMenus = false) { XElement element = new XElement("ItemAssembly", new XAttribute("name", name), new XAttribute("description", description), new XAttribute("hideinmenus", hideInMenus)); //move the entities so that their "center of mass" is at {0,0} var assemblyEntities = MapEntity.CopyEntities(entities); //find wires and items that are contained inside another item //place them at {0,0} to prevent them from messing up the origin of the prefab and to hide them in preview List <MapEntity> disabledEntities = new List <MapEntity>(); foreach (MapEntity mapEntity in assemblyEntities) { if (mapEntity is Item item) { var wire = item.GetComponent <Wire>(); if (item.ParentInventory != null || (wire != null && wire.Connections.Any(c => c != null))) { item.SetTransform(Vector2.Zero, 0.0f); disabledEntities.Add(mapEntity); } } } float minX = int.MaxValue, maxX = int.MinValue; float minY = int.MaxValue, maxY = int.MinValue; foreach (MapEntity mapEntity in assemblyEntities) { if (disabledEntities.Contains(mapEntity)) { continue; } minX = Math.Min(minX, mapEntity.WorldRect.X); maxX = Math.Max(maxX, mapEntity.WorldRect.Right); minY = Math.Min(minY, mapEntity.WorldRect.Y - mapEntity.WorldRect.Height); maxY = Math.Max(maxY, mapEntity.WorldRect.Y); } Vector2 center = new Vector2((minX + maxX) / 2.0f, (minY + maxY) / 2.0f); if (Submarine.MainSub != null) { center -= Submarine.MainSub.HiddenSubPosition; } center.X -= center.X % Submarine.GridSize.X; center.Y -= center.Y % Submarine.GridSize.Y; MapEntity.SelectedList.Clear(); assemblyEntities.ForEach(e => MapEntity.AddSelection(e)); foreach (MapEntity mapEntity in assemblyEntities) { mapEntity.Move(-center); mapEntity.Submarine = Submarine.MainSub; var entityElement = mapEntity.Save(element); if (disabledEntities.Contains(mapEntity)) { entityElement.Add(new XAttribute("hideinassemblypreview", "true")); } } return(element); }