public WorldLink GetWorldLinkFromRealPosition(WorldPosition realPosition) { var worldBlockPosition = realPosition.ToBlockPositionPoint(); WorldLink worldLink = null; if (realPosition.InteriorID == Interior.Outside) { // Check if we are on a worldLink WorldGridChunk worldGridChunk = GetFromRealPoint((int)realPosition.X, (int)realPosition.Y); ulong key = GeometryUtils.ConvertPointToLong(worldBlockPosition.X, worldBlockPosition.Y); if (worldGridChunk.WorldLinks != null && worldGridChunk.WorldLinks.ContainsKey(key) == true) { worldLink = worldGridChunk.WorldLinks[key]; } } else { // Check if we were on a worldLink Interior interior = InteriorManager.Get(realPosition.InteriorID); ulong key = GeometryUtils.ConvertPointToLong(worldBlockPosition.X, worldBlockPosition.Y); if (interior.WorldLinks != null && interior.WorldLinks.ContainsKey(key) == true) { worldLink = interior.WorldLinks[key]; } } return(worldLink); }
public override void AddWorldLink(WorldLink worldLink) { Debug.Assert(worldLink.FromInteriorID == ID, "FromInteriorID is different than interior ID!"); Debug.Assert(worldLink.FromBlock.X >= 0 && worldLink.FromBlock.X < Dimensions.X && worldLink.FromBlock.Y >= 0 && worldLink.FromBlock.Y < Dimensions.Y, "FromBlock is has wrong size!"); base.AddWorldLink(worldLink); }
public virtual void AddWorldLink(WorldLink worldLink) { if (WorldLinks == null) { WorldLinks = new Dictionary <ulong, WorldLink>(); } lock (WorldLinks) { WorldLinks[GeometryUtils.ConvertPointToLong(worldLink.FromBlock.X, worldLink.FromBlock.Y)] = worldLink; } }
public virtual void RemoveWorldLink(WorldLink worldLink) { if (WorldLinks != null) { lock (WorldLinks) { WorldLinks.Remove(GeometryUtils.ConvertPointToLong(worldLink.FromBlock.X, worldLink.FromBlock.Y)); if (WorldLinks.Count == 0) { WorldLinks = null; } } } }
public void UpdateWorldLink(WorldLink oldWorldLink, WorldLink newWorldLink = null) { if (oldWorldLink != null) { try { WorldLink oldWorldLinkFrom = GetWorldLinkFromRealPosition(oldWorldLink.ToRealWorldPositionFrom()); WorldPart oldWorldPartFrom = (oldWorldLink.FromInteriorID == Interior.Outside) ? SimulationGame.World.GetFromRealPoint(oldWorldLink.FromBlock.X * BlockSize.X, oldWorldLink.FromBlock.Y * BlockSize.Y) : (WorldPart)SimulationGame.World.InteriorManager.Get(oldWorldLink.FromInteriorID); oldWorldPartFrom.RemoveWorldLink(oldWorldLinkFrom); } catch (Exception e) { System.Windows.Forms.MessageBox.Show("Couldn't remove oldWorldLinkFrom: " + e.Message); } try { WorldLink oldWorldLinkTo = GetWorldLinkFromRealPosition(oldWorldLink.ToRealWorldPositionTo()); WorldPart oldWorldPartTo = (oldWorldLink.ToInteriorID == Interior.Outside) ? SimulationGame.World.GetFromRealPoint(oldWorldLink.ToBlock.X * BlockSize.X, oldWorldLink.ToBlock.Y * BlockSize.Y) : (WorldPart)SimulationGame.World.InteriorManager.Get(oldWorldLink.ToInteriorID); oldWorldPartTo.RemoveWorldLink(oldWorldLinkTo); } catch (Exception e) { System.Windows.Forms.MessageBox.Show("Couldn't remove oldWorldLinkTo: " + e.Message); } } if (newWorldLink != null) { WorldPart newWorldPartFrom = (newWorldLink.FromInteriorID == Interior.Outside) ? SimulationGame.World.GetFromRealPoint(newWorldLink.FromBlock.X * BlockSize.X, newWorldLink.FromBlock.Y * BlockSize.Y) : (WorldPart)SimulationGame.World.InteriorManager.Get(newWorldLink.FromInteriorID); WorldPart newWorldPartTo = (newWorldLink.ToInteriorID == Interior.Outside) ? SimulationGame.World.GetFromRealPoint(newWorldLink.ToBlock.X * BlockSize.X, newWorldLink.ToBlock.Y * BlockSize.Y) : (WorldPart)SimulationGame.World.InteriorManager.Get(newWorldLink.ToInteriorID); newWorldPartFrom.AddWorldLink(newWorldLink); newWorldPartTo.AddWorldLink(newWorldLink.SwapFromTo()); } }
public void ChangeDimensions(Point newDimensions) { var newBlockingGrid = new int[newDimensions.X, newDimensions.Y]; var newBounds = new Rectangle(0, 0, newDimensions.X * WorldGrid.BlockSize.X, newDimensions.Y * WorldGrid.BlockSize.Y); for (int blockX = 0; blockX < newDimensions.X; blockX++) { for (int blockY = 0; blockY < newDimensions.Y; blockY++) { if (blockX >= Dimensions.X || blockY >= Dimensions.Y) { newBlockingGrid[blockX, blockY] = 0; continue; } else { newBlockingGrid[blockX, blockY] = blockingGrid[blockX, blockY]; } } } if (ContainedObjects != null) { for (int i = 0; i < ContainedObjects.Count; i++) { var containedObject = ContainedObjects[i]; if (newBounds.Contains(containedObject.Position.ToPoint()) == false) { if (containedObject is DurableEntity) { System.Windows.Forms.MessageBox.Show("Cannot change dimensions because Durable Entity would be destroyed!"); return; } containedObject.DisconnectFromWorld(); containedObject.Destroy(); i--; } } } if (AmbientObjects != null) { for (int i = 0; i < AmbientObjects.Count; i++) { var ambientObject = AmbientObjects[i]; if (newBounds.Contains(ambientObject.Position.ToPoint()) == false) { ambientObject.DisconnectFromWorld(); ambientObject.Destroy(); i--; } } } if (WorldLinks != null) { WorldLink[] wordLinks = new WorldLink[WorldLinks.Count]; WorldLinks.Values.CopyTo(wordLinks, 0); foreach (var worldLink in wordLinks) { if (newBounds.Contains(worldLink.ToRealWorldPositionFrom().ToPoint()) == false) { SimulationGame.World.UpdateWorldLink(worldLink); } } } blockingGrid = newBlockingGrid; Dimensions = newDimensions; }