From b46387091470f3d1465c05625a656228ca54fd61 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Mon, 27 Oct 2014 17:27:42 -0400 Subject: Add hypergrid teleporting support to user profiles picks --- .../Avatar/UserProfiles/UserProfileModule.cs | 113 ++++++++++++++++++--- 1 file changed, 97 insertions(+), 16 deletions(-) (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index f4a4f17..8337a2f 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -48,6 +48,8 @@ using Mono.Addins; using OpenSim.Services.Connectors.Hypergrid; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Services.UserProfilesService; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; +using Microsoft.CSharp; namespace OpenSim.Region.CoreModules.Avatar.UserProfiles { @@ -78,7 +80,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles /// /// The configuration /// - public IConfigSource Config { + public IConfigSource Config + { get; set; } @@ -89,7 +92,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles /// /// The profile server URI. /// - public string ProfileServerUri { + public string ProfileServerUri + { get; set; } @@ -111,11 +115,17 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles /// /// true if enabled; otherwise, false. /// - public bool Enabled { + public bool Enabled + { get; set; } + public string MyGatekeeper + { + get; private set; + } + #region IRegionModuleBase implementation /// @@ -152,6 +162,9 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles m_log.Debug("[PROFILES]: Full Profiles Enabled"); ReplaceableInterface = null; Enabled = true; + + MyGatekeeper = Util.GetConfigVarFromSections(source, "GatekeeperURI", + new string[] { "Startup", "Hypergrid", "UserProfiles" }, String.Empty); } /// @@ -599,30 +612,64 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles return; UUID targetID; - UUID.TryParse(args[0], out targetID); + UUID.TryParse (args [0], out targetID); string serverURI = string.Empty; - GetUserProfileServerURI(targetID, out serverURI); + GetUserProfileServerURI (targetID, out serverURI); + + string theirGatekeeperURI; + GetUserGatekeeperURI (targetID, out theirGatekeeperURI); + IClientAPI remoteClient = (IClientAPI)sender; - UserProfilePick pick = new UserProfilePick(); - UUID.TryParse(args[0], out pick.CreatorId); - UUID.TryParse(args[1], out pick.PickId); + UserProfilePick pick = new UserProfilePick (); + UUID.TryParse (args [0], out pick.CreatorId); + UUID.TryParse (args [1], out pick.PickId); object Pick = (object)pick; - if(!rpc.JsonRpcRequest(ref Pick, "pickinforequest", serverURI, UUID.Random().ToString())) - { - remoteClient.SendAgentAlertMessage( + if (!rpc.JsonRpcRequest (ref Pick, "pickinforequest", serverURI, UUID.Random ().ToString ())) { + remoteClient.SendAgentAlertMessage ( "Error selecting pick", false); return; } - pick = (UserProfilePick) Pick; - - Vector3 globalPos; - Vector3.TryParse(pick.GlobalPos,out globalPos); + pick = (UserProfilePick)Pick; + + Vector3 globalPos = new Vector3(Vector3.Zero); + + // Smoke and mirrors + if (pick.Gatekeeper == MyGatekeeper) + { + Vector3.TryParse(pick.GlobalPos,out globalPos); + } + else + { + // Setup the illusion + string region = string.Format("{0} {1}",pick.Gatekeeper,pick.SimName); + GridRegion target = Scene.GridService.GetRegionByName(Scene.RegionInfo.ScopeID, region); + + if(target == null) + { + // This is a dead or unreachable region + } + else + { + // Work our slight of hand + int x = target.RegionLocX; + int y = target.RegionLocY; + + dynamic synthX = globalPos.X - (globalPos.X/Constants.RegionSize) * Constants.RegionSize; + synthX += x; + globalPos.X = synthX; + + dynamic synthY = globalPos.Y - (globalPos.Y/Constants.RegionSize) * Constants.RegionSize; + synthY += y; + globalPos.Y = synthY; + } + } m_log.DebugFormat("[PROFILES]: PickInfoRequest: {0} : {1}", pick.Name.ToString(), pick.SnapshotId.ToString()); + // Pull the rabbit out of the hat remoteClient.SendPickInfoReply(pick.PickId,pick.CreatorId,pick.TopPick,pick.ParcelId,pick.Name, pick.Desc,pick.SnapshotId,pick.User,pick.OriginalName,pick.SimName, globalPos,pick.SortOrder,pick.Enabled); @@ -659,7 +706,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles /// Enabled. /// public void PickInfoUpdate(IClientAPI remoteClient, UUID pickID, UUID creatorID, bool topPick, string name, string desc, UUID snapshotID, int sortOrder, bool enabled) - { + { + //TODO: See how this works with NPC, May need to test m_log.DebugFormat("[PROFILES]: Start PickInfoUpdate Name: {0} PickId: {1} SnapshotId: {2}", name, pickID.ToString(), snapshotID.ToString()); UserProfilePick pick = new UserProfilePick(); @@ -699,6 +747,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles avaPos.X, avaPos.Y, p.Scene.Name); } + pick.PickId = pickID; pick.CreatorId = creatorID; pick.TopPick = topPick; @@ -708,6 +757,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles pick.SnapshotId = snapshotID; pick.User = landOwnerName; pick.SimName = remoteClient.Scene.RegionInfo.RegionName; + pick.Gatekeeper = MyGatekeeper; pick.GlobalPos = posGlobal.ToString(); pick.SortOrder = sortOrder; pick.Enabled = enabled; @@ -1260,6 +1310,37 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles } /// + /// Gets the user gatekeeper server URI. + /// + /// + /// The user gatekeeper server URI. + /// + /// + /// If set to true user URI. + /// + /// + /// If set to true server URI. + /// + bool GetUserGatekeeperURI(UUID userID, out string serverURI) + { + bool local; + local = UserManagementModule.IsLocalGridUser(userID); + + if (!local) + { + serverURI = UserManagementModule.GetUserServerURL(userID, "GatekeeperURI"); + // Is Foreign + return true; + } + else + { + serverURI = MyGatekeeper; + // Is local + return false; + } + } + + /// /// Gets the user profile server UR. /// /// -- cgit v1.1