public List <VisibleObject> GetTileContents(int x, int y) { lock (_lock) { return(EntityTree.GetObjects(new Rectangle(x, y, 1, 1))); } }
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); } } } }
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); } } }
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); } } }
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); } } }
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; } }
/// <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); } } }