Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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;
            }
        }
Example #4
0
        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;
                    }
                }
            }
        }
Example #5
0
        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());
            }
        }
Example #6
0
        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;
        }