public void FlipX(List <Submarine> parents = null) { if (parents == null) { parents = new List <Submarine>(); } parents.Add(this); flippedX = !flippedX; Item.UpdateHulls(); List <Item> bodyItems = Item.ItemList.FindAll(it => it.Submarine == this && it.body != null); List <MapEntity> subEntities = MapEntity.mapEntityList.FindAll(me => me.Submarine == this); foreach (MapEntity e in subEntities) { if (e.MoveWithLevel || e is Item) { continue; } if (e is LinkedSubmarine) { Submarine sub = ((LinkedSubmarine)e).Sub; if (!parents.Contains(sub)) { Vector2 relative1 = sub.SubBody.Position - SubBody.Position; relative1.X = -relative1.X; sub.SetPosition(relative1 + SubBody.Position); sub.FlipX(parents); } } else { e.FlipX(); } } foreach (MapEntity mapEntity in subEntities) { mapEntity.Move(-HiddenSubPosition); } Vector2 pos = new Vector2(subBody.Position.X, subBody.Position.Y); subBody.Body.Remove(); subBody = new SubmarineBody(this); SetPosition(pos); if (entityGrid != null) { Hull.EntityGrids.Remove(entityGrid); entityGrid = null; } entityGrid = Hull.GenerateEntityGrid(this); foreach (MapEntity mapEntity in subEntities) { mapEntity.Move(HiddenSubPosition); } foreach (Item item in Item.ItemList) { if (bodyItems.Contains(item)) { item.Submarine = this; if (Position == Vector2.Zero) { item.Move(-HiddenSubPosition); } } else if (item.Submarine != this) { continue; } item.FlipX(); } Item.UpdateHulls(); Gap.UpdateHulls(); }
public void Load(bool unloadPrevious, XElement submarineElement = null) { if (unloadPrevious) { Unload(); } Loading = true; if (submarineElement == null) { XDocument doc = OpenFile(filePath); if (doc == null || doc.Root == null) { return; } submarineElement = doc.Root; } Description = submarineElement.GetAttributeString("description", ""); Enum.TryParse(submarineElement.GetAttributeString("tags", ""), out tags); //place the sub above the top of the level HiddenSubPosition = HiddenSubStartPosition; if (GameMain.GameSession != null && GameMain.GameSession.Level != null) { HiddenSubPosition += Vector2.UnitY * GameMain.GameSession.Level.Size.Y; } foreach (Submarine sub in Submarine.loaded) { HiddenSubPosition += Vector2.UnitY * (sub.Borders.Height + 5000.0f); } IdOffset = 0; foreach (MapEntity me in MapEntity.mapEntityList) { IdOffset = Math.Max(IdOffset, me.ID); } foreach (XElement element in submarineElement.Elements()) { string typeName = element.Name.ToString(); Type t; try { t = Type.GetType("Barotrauma." + typeName, true, true); if (t == null) { DebugConsole.ThrowError("Error in " + filePath + "! Could not find a entity of the type \"" + typeName + "\"."); continue; } } catch (Exception e) { DebugConsole.ThrowError("Error in " + filePath + "! Could not find a entity of the type \"" + typeName + "\".", e); continue; } try { MethodInfo loadMethod = t.GetMethod("Load"); loadMethod.Invoke(t, new object[] { element, this }); } catch (Exception e) { DebugConsole.ThrowError("Could not find the method \"Load\" in " + t + ".", e); } } Vector2 center = Vector2.Zero; var matchingHulls = Hull.hullList.FindAll(h => h.Submarine == this); if (matchingHulls.Any()) { Vector2 topLeft = new Vector2(matchingHulls[0].Rect.X, matchingHulls[0].Rect.Y); Vector2 bottomRight = new Vector2(matchingHulls[0].Rect.X, matchingHulls[0].Rect.Y); foreach (Hull hull in matchingHulls) { if (hull.Rect.X < topLeft.X) { topLeft.X = hull.Rect.X; } if (hull.Rect.Y > topLeft.Y) { topLeft.Y = hull.Rect.Y; } if (hull.Rect.Right > bottomRight.X) { bottomRight.X = hull.Rect.Right; } if (hull.Rect.Y - hull.Rect.Height < bottomRight.Y) { bottomRight.Y = hull.Rect.Y - hull.Rect.Height; } } center = (topLeft + bottomRight) / 2.0f; center.X -= center.X % GridSize.X; center.Y -= center.Y % GridSize.Y; if (center != Vector2.Zero) { foreach (Item item in Item.ItemList) { if (item.Submarine != this) { continue; } var wire = item.GetComponent <Items.Components.Wire>(); if (wire != null) { wire.MoveNodes(-center); } } for (int i = 0; i < MapEntity.mapEntityList.Count; i++) { if (MapEntity.mapEntityList[i].Submarine != this) { continue; } MapEntity.mapEntityList[i].Move(-center); } } } subBody = new SubmarineBody(this); subBody.SetPosition(HiddenSubPosition); loaded.Add(this); if (entityGrid != null) { Hull.EntityGrids.Remove(entityGrid); entityGrid = null; } entityGrid = Hull.GenerateEntityGrid(this); for (int i = 0; i < MapEntity.mapEntityList.Count; i++) { if (MapEntity.mapEntityList[i].Submarine != this) { continue; } MapEntity.mapEntityList[i].Move(HiddenSubPosition); } Loading = false; MapEntity.MapLoaded(this); //WayPoint.GenerateSubWaypoints(); #if CLIENT GameMain.LightManager.OnMapLoaded(); #endif ID = (ushort)(ushort.MaxValue - Submarine.loaded.IndexOf(this)); }