public void FindFriend(IClientAPI remoteClient, UUID HunterID, UUID PreyID) { UUID requester = remoteClient.AgentId; if (requester != HunterID) // only allow client agent to be the hunter (?) { return; } FriendInfo[] friends = GetFriendsFromCache(requester); if (friends.Length == 0) { return; } FriendInfo friend = GetFriend(friends, PreyID); if (friend == null) { return; } if (friend.TheirFlags == -1 || (friend.TheirFlags & (int)FriendRights.CanSeeOnMap) == 0) { return; } Scene hunterScene = (Scene)remoteClient.Scene; if (hunterScene == null) { return; } // check local ScenePresence sp; double px; double py; if (hunterScene.TryGetScenePresence(PreyID, out sp)) { if (sp == null) { return; } px = hunterScene.RegionInfo.WorldLocX + sp.AbsolutePosition.X; py = hunterScene.RegionInfo.WorldLocY + sp.AbsolutePosition.Y; remoteClient.SendFindAgent(HunterID, PreyID, px, py); return; } PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { PreyID.ToString() }); if (friendSessions == null || friendSessions.Length == 0) { return; } PresenceInfo friendSession = friendSessions[0]; if (friendSession == null) { return; } GridRegion region = GridService.GetRegionByUUID(hunterScene.RegionInfo.ScopeID, friendSession.RegionID); if (region == null) { return; } // we don't have presence location so point to a standard region center for now px = region.RegionLocX + 128.0; py = region.RegionLocY + 128.0; remoteClient.SendFindAgent(HunterID, PreyID, px, py); }