예제 #1
0
 public List <VisibleObject> GetTileContents(int x, int y)
 {
     lock (_lock)
     {
         return(EntityTree.GetObjects(new Rectangle(x, y, 1, 1)));
     }
 }
예제 #2
0
        public void Insert(VisibleObject obj, byte x, byte y, bool updateClient = true)
        {
            lock (_lock)
            {
                if (Objects.Add(obj))
                {
                    obj.Map = this;
                    obj.X   = x;
                    obj.Y   = y;

                    EntityTree.Add(obj);

                    var user = obj as User;
                    if (user != null)
                    {
                        if (updateClient)
                        {
                            obj.SendMapInfo();
                            obj.SendLocation();
                        }
                        Users.Add(user.Name, user);
                    }

                    var affectedObjects = EntityTree.GetObjects(obj.GetViewport());

                    foreach (var target in affectedObjects)
                    {
                        target.AoiEntry(obj);
                        obj.AoiEntry(target);
                    }
                }
            }
        }
예제 #3
0
 public void NotifyNearbyAoiDeparture(VisibleObject objectToRemove)
 {
     foreach (var obj in EntityTree.GetObjects(objectToRemove.GetViewport()))
     {
         if (obj is User)
         {
             var user = obj as User;
             user.AoiDeparture(objectToRemove);
         }
     }
 }
예제 #4
0
 public void NotifyNearbyAoiEntry(VisibleObject objectToAdd)
 {
     foreach (var obj in EntityTree.GetObjects(objectToAdd.GetViewport()))
     {
         if (obj is User)
         {
             Logger.DebugFormat("Notifying {0} of object {1} at {2},{3} with sprite {4}", obj.Name, objectToAdd.Name,
                                objectToAdd.X, objectToAdd.Y, objectToAdd.Sprite);
             var user = obj as User;
             user.AoiEntry(objectToAdd);
         }
     }
 }
예제 #5
0
파일: Map.cs 프로젝트: bigspoondude/server
        public void Remove(VisibleObject obj)
        {
            lock (_lock)
            {
                if (Objects.Remove(obj))
                {
                    EntityTree.Remove(obj);

                    if (obj is User)
                    {
                        var user = obj as User;
                        Users.Remove(user.Name);
                        if (user.ActiveExchange != null)
                        {
                            user.ActiveExchange.CancelExchange(user);
                        }
                    }

                    var affectedObjects = EntityTree.GetObjects(obj.GetViewport());

                    foreach (var target in affectedObjects)
                    {
                        // If the target of a Remove is a player, we insert a 250ms delay to allow the animation
                        // frame to complete, or a slight delay to allow a kill animation to finish animating.
                        // Yes, this is a thing we do.
                        if (target is User && obj is User)
                        {
                            ((User)target).AoiDeparture(obj, 250);
                        }
                        else if (target is User && obj is Creature)
                        {
                            ((User)target).AoiDeparture(obj, 100);
                        }
                        else
                        {
                            target.AoiDeparture(obj);
                        }

                        obj.AoiDeparture(target);
                    }

                    obj.Map = null;
                }
                else
                {
                    GameLog.Fatal("Failed to remove gameobject id: {0} name: {1}", obj.Id, obj.Name);
                }
            }
        }
예제 #6
0
        public void Remove(VisibleObject obj)
        {
            if (Objects.Remove(obj))
            {
                EntityTree.Remove(obj);

                if (obj is User)
                {
                    var user = obj as User;
                    Users.Remove(user.Name);
                    if (user.ActiveExchange != null)
                    {
                        user.ActiveExchange.CancelExchange(user);
                    }
                }

                var affectedObjects = EntityTree.GetObjects(obj.GetViewport());

                foreach (var target in affectedObjects)
                {
                    // If the target of a Remove is a player, we insert a 250ms delay to allow the animation
                    // frame to complete.
                    if (target is User)
                    {
                        ((User)target).AoiDeparture(obj, 250);
                    }
                    else
                    {
                        target.AoiDeparture(obj);
                    }

                    obj.AoiDeparture(target);
                }

                obj.Map = null;
                obj.X   = 0;
                obj.Y   = 0;
            }
        }
예제 #7
0
        /// <summary>
        /// Toggle a given door's state (open/closed) and send updates to users nearby.
        /// </summary>
        /// <param name="x">The X coordinate of the door.</param>
        /// <param name="y">The Y coordinate of the door.</param>
        /// <returns></returns>
        public void ToggleDoor(byte x, byte y)
        {
            var coords = new Tuple <byte, byte>(x, y);

            Logger.DebugFormat("Door {0}@{1},{2}: Open: {3}, changing to {4}",
                               Name, x, y, Doors[coords].Closed,
                               !Doors[coords].Closed);

            Doors[coords].Closed = !Doors[coords].Closed;

            // There are several examples of doors in Temuair that trigger graphic
            // changes but do not trigger collision updates (e.g. 3-panel doors in
            // Piet & Undine).
            if (Doors[coords].UpdateCollision)
            {
                Logger.DebugFormat("Door {0}@{1},{2}: updateCollision is set, collisions are now {3}",
                                   Name, x, y, !Doors[coords].Closed);
                IsWall[x, y] = !IsWall[x, y];
            }

            Logger.DebugFormat("Toggling door at {0},{1}", x, y);
            Logger.DebugFormat("Door is now in state: Open: {0} Collision: {1}", Doors[coords].Closed, IsWall[x, y]);

            var updateViewport = GetViewport(x, y);

            foreach (var obj in EntityTree.GetObjects(updateViewport))
            {
                if (obj is User)
                {
                    var user = obj as User;
                    Logger.DebugFormat("Sending door packet to {0}: X {1}, Y {2}, Open {3}, LR {4}",
                                       user.Name, x, y, Doors[coords].Closed,
                                       Doors[coords].IsLeftRight);

                    user.SendDoorUpdate(x, y, Doors[coords].Closed,
                                        Doors[coords].IsLeftRight);
                }
            }
        }