From 244bfcde5b86180981e99ac9e88eb394f20bcd09 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Thu, 17 Apr 2008 05:07:14 +0000 Subject: * Implements 'Set Home to Here' * Implements 'Teleport Home' * User Server has to be updated for it to save your home in grid mode * home position accuracy is in int because the grid comms ExpectUser method tries to convert to Uint and crashes if it gets a float. Added a convert to decimal in ExpectUser but to avoid a breaking change with old revisions, kept the save value in int for now. Eventually it needs to be a float, but lets release another incremental version before doing that. --- OpenSim/Framework/IClientAPI.cs | 3 + OpenSim/Grid/UserServer/UserManager.cs | 87 ++++++++++++++++++++++ OpenSim/Region/ClientStack/ClientView.cs | 51 ++++++++++--- .../Region/Communications/OGS1/OGS1GridServices.cs | 6 +- .../Region/Communications/OGS1/OGS1UserServices.cs | 10 +++ .../Environment/Modules/BetaGridLikeMoneyModule.cs | 20 +++-- OpenSim/Region/Environment/Scenes/Scene.cs | 46 ++++++++++++ OpenSim/Region/Environment/Scenes/SceneEvents.cs | 4 +- .../Region/Examples/SimpleModule/MyNpcCharacter.cs | 1 + 9 files changed, 205 insertions(+), 23 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 75e6fcd..236bfe7 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -556,6 +556,9 @@ namespace OpenSim.Framework event ParcelBuy OnParcelBuy; event ObjectIncludeInSearch OnObjectIncludeInSearch; + + event UUIDNameRequest OnTeleportHomeRequest; + LLVector3 StartPos { get; set; } diff --git a/OpenSim/Grid/UserServer/UserManager.cs b/OpenSim/Grid/UserServer/UserManager.cs index cf3f8d8..2a53d7b 100644 --- a/OpenSim/Grid/UserServer/UserManager.cs +++ b/OpenSim/Grid/UserServer/UserManager.cs @@ -363,6 +363,93 @@ namespace OpenSim.Grid.UserServer if (requestData.Contains("ProfileURL")) { } + if (requestData.Contains("home_region")) + { + try + { + userProfile.HomeRegion = Convert.ToUInt64((string)requestData["home_region"]); + } + catch (ArgumentException) + { + m_log.Error("[PROFILE]:Failed to set home region, Invalid Argument"); + } + catch (FormatException) + { + m_log.Error("[PROFILE]:Failed to set home region, Invalid Format"); + } + catch (OverflowException) + { + m_log.Error("[PROFILE]:Failed to set home region, Value was too large"); + } + + } + if (requestData.Contains("home_pos_x")) + { + try + { + userProfile.HomeLocationX = (float)Convert.ToDecimal((string)requestData["home_pos_x"]); + } + catch (System.InvalidCastException) + { + m_log.Error("[PROFILE]:Failed to set home postion x"); + } + + } + if (requestData.Contains("home_pos_y")) + { + try + { + userProfile.HomeLocationY = (float)Convert.ToDecimal((string)requestData["home_pos_y"]); + } + catch (System.InvalidCastException) + { + m_log.Error("[PROFILE]:Failed to set home postion y"); + } + } + if (requestData.Contains("home_pos_z")) + { + try + { + userProfile.HomeLocationZ = (float)Convert.ToDecimal((string)requestData["home_pos_z"]); + } + catch (System.InvalidCastException) + { + m_log.Error("[PROFILE]:Failed to set home postion z"); + } + } + if (requestData.Contains("home_look_x")) + { + try + { + userProfile.HomeLookAtX = (float)Convert.ToDecimal((string)requestData["home_look_x"]); + } + catch (System.InvalidCastException) + { + m_log.Error("[PROFILE]:Failed to set home lookat x"); + } + } + if (requestData.Contains("home_look_y")) + { + try + { + userProfile.HomeLookAtY = (float)Convert.ToDecimal((string)requestData["home_look_y"]); + } + catch (System.InvalidCastException) + { + m_log.Error("[PROFILE]:Failed to set home lookat y"); + } + } + if (requestData.Contains("home_look_z")) + { + try + { + userProfile.HomeLookAtZ = (float)Convert.ToDecimal((string)requestData["home_look_z"]); + } + catch (System.InvalidCastException) + { + m_log.Error("[PROFILE]:Failed to set home lookat z"); + } + } // call plugin! bool ret = UpdateUserProfileProperties(userProfile); responseData["returnString"] = ret.ToString(); diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index 9c56c52..7a3cff1 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -227,6 +227,7 @@ namespace OpenSim.Region.ClientStack private UpdatePrimGroupRotation handlerUpdatePrimGroupRotation = null; //OnUpdatePrimGroupMouseRotation; private PacketStats handlerPacketStats = null; // OnPacketStats;# private RequestAsset handlerRequestAsset = null; // OnRequestAsset; + private UUIDNameRequest handlerTeleportHomeRequest = null; /* Properties */ @@ -776,6 +777,7 @@ namespace OpenSim.Region.ClientStack public event MoneyBalanceRequest OnMoneyBalanceRequest; public event ParcelBuy OnParcelBuy; + public event UUIDNameRequest OnTeleportHomeRequest; #region Scene/Avatar to Client @@ -4188,19 +4190,48 @@ namespace OpenSim.Region.ClientStack case PacketType.TeleportLandmarkRequest: TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack; LLUUID lmid = tpReq.Info.LandmarkID; - AssetBase lma = m_assetCache.GetAsset(lmid, false); - - if(lma == null) + AssetLandmark lm; + if (lmid != LLUUID.Zero) { - // Failed to find landmark - - TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel); - tpCancel.Info.SessionID = tpReq.Info.SessionID; - tpCancel.Info.AgentID = tpReq.Info.AgentID; - OutPacket(tpCancel, ThrottleOutPacketType.Task); + AssetBase lma = m_assetCache.GetAsset(lmid, false); + + if (lma == null) + { + // Failed to find landmark + + TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel); + tpCancel.Info.SessionID = tpReq.Info.SessionID; + tpCancel.Info.AgentID = tpReq.Info.AgentID; + OutPacket(tpCancel, ThrottleOutPacketType.Task); + } + + + try + { + lm = new AssetLandmark(lma); + } + catch (NullReferenceException) + { + // asset not found generates null ref inside the assetlandmark constructor. + TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel); + tpCancel.Info.SessionID = tpReq.Info.SessionID; + tpCancel.Info.AgentID = tpReq.Info.AgentID; + OutPacket(tpCancel, ThrottleOutPacketType.Task); + break; + } + } + else + { + + // Teleport home request + handlerTeleportHomeRequest = OnTeleportHomeRequest; + if (handlerTeleportHomeRequest != null) + { + handlerTeleportHomeRequest(this.AgentId,this); + } + break; } - AssetLandmark lm = new AssetLandmark(lma); handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest; if (handlerTeleportLandmarkRequest != null) { diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 9a7274c..1135ddd 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -579,9 +579,9 @@ namespace OpenSim.Region.Communications.OGS1 { m_log.Debug("[CONNECTION DEBUGGING]: Main agent detected"); agentData.startpos = - new LLVector3(Convert.ToUInt32(requestData["startpos_x"]), - Convert.ToUInt32(requestData["startpos_y"]), - Convert.ToUInt32(requestData["startpos_z"])); + new LLVector3((float)Convert.ToDecimal((string)requestData["startpos_x"]), + (float)Convert.ToDecimal((string)requestData["startpos_y"]), + (float)Convert.ToDecimal((string)requestData["startpos_z"])); agentData.child = false; } diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs index 5873eb8..c140213 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs @@ -314,6 +314,16 @@ namespace OpenSim.Region.Communications.OGS1 param["AboutText"] = UserProfile.AboutText; param["FLAboutText"] = UserProfile.FirstLifeAboutText; //param["ProfileURL"] = UserProfile.ProfileURL.ToString(); + + param["home_region"] = UserProfile.HomeRegion.ToString(); + + param["home_pos_x"] = UserProfile.HomeLocationX.ToString(); + param["home_pos_y"] = UserProfile.HomeLocationY.ToString(); + param["home_pos_z"] = UserProfile.HomeLocationZ.ToString(); + param["home_look_x"] = UserProfile.HomeLookAtX.ToString(); + param["home_look_y"] = UserProfile.HomeLookAtY.ToString(); + param["home_look_z"] = UserProfile.HomeLookAtZ.ToString(); + IList parameters = new ArrayList(); parameters.Add(param); diff --git a/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs b/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs index aef0f81..9727a8b 100644 --- a/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs +++ b/OpenSim/Region/Environment/Modules/BetaGridLikeMoneyModule.cs @@ -423,7 +423,7 @@ namespace OpenSim.Region.Environment.Modules { if (e.parcelPrice >= 0) { - doMoneyTranfer(agentId, e.parcelOwnerID, e.parcelPrice); + doMoneyTransfer(agentId, e.parcelOwnerID, e.parcelPrice); lock (e) { e.transactionID = Util.UnixTimeSinceEpoch(); @@ -446,13 +446,15 @@ namespace OpenSim.Region.Environment.Modules IClientAPI sender = null; IClientAPI receiver = null; + m_log.WarnFormat("[MONEY] Explicit transfer of {0} from {1} to {2}", e.amount, e.sender.ToString(), e.receiver.ToString()); + sender = LocateClientObject(e.sender); if (sender != null) { - receiver = LocateClientObject(e.reciever); - bool transactionresult = doMoneyTranfer(e.sender, e.reciever, e.amount); + receiver = LocateClientObject(e.receiver); + bool transactionresult = doMoneyTransfer(e.sender, e.receiver, e.amount); - if (e.sender != e.reciever) + if (e.sender != e.receiver) { if (sender != null) { @@ -462,14 +464,14 @@ namespace OpenSim.Region.Environment.Modules if (receiver != null) { - receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.reciever)); + receiver.SendMoneyBalance(LLUUID.Random(), transactionresult, Helpers.StringToField(e.description), GetFundsForAgentID(e.receiver)); } } else { - m_log.Warn("[MONEY]: Potential Fraud Warning, got money transfer request for avatar that isn't in this simulator - Details; Sender:" + e.sender.ToString() + " Reciver: " + e.reciever.ToString() + " Amount: " + e.amount.ToString()); + m_log.Warn("[MONEY]: Potential Fraud Warning, got money transfer request for avatar that isn't in this simulator - Details; Sender:" + e.sender.ToString() + " Reciver: " + e.receiver.ToString() + " Amount: " + e.amount.ToString()); } } @@ -490,7 +492,7 @@ namespace OpenSim.Region.Environment.Modules // Use this to exclude Region Owners (2), Estate Managers(1), Users (0), Disabled(-1) if (PriceUpload > 0 && userlevel <= UserLevelPaysFees) { - doMoneyTranfer(Uploader, EconomyBaseAccount, PriceUpload); + doMoneyTransfer(Uploader, EconomyBaseAccount, PriceUpload); } } @@ -634,8 +636,10 @@ namespace OpenSim.Region.Environment.Modules /// /// /// - private bool doMoneyTranfer(LLUUID Sender, LLUUID Receiver, int amount) + private bool doMoneyTransfer(LLUUID Sender, LLUUID Receiver, int amount) { + m_log.WarnFormat("[MONEY] Transfer {0} from {1} to {2}", amount, Sender.ToString(), Receiver.ToString()); + bool result = false; if (amount >= 0) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 08cf3d8..20572a9 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1581,9 +1581,55 @@ namespace OpenSim.Region.Environment.Scenes client.OnObjectIncludeInSearch += m_innerScene.MakeObjectSearchable; + client.OnTeleportHomeRequest += TeleportClientHome; + + client.OnSetStartLocationRequest += SetHomeRezPoint; + EventManager.TriggerOnNewClient(client); } + public virtual void TeleportClientHome(LLUUID AgentId, IClientAPI client) + { + UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(AgentId); + if (UserProfile != null) + { + ulong homeRegion = UserProfile.HomeRegion; + LLVector3 homePostion = new LLVector3(UserProfile.HomeLocationX,UserProfile.HomeLocationY,UserProfile.HomeLocationZ); + LLVector3 homeLookat = new LLVector3(UserProfile.HomeLookAt); + RequestTeleportLocation(client, homeRegion, homePostion,homeLookat,(uint)0); + + } + + } + + public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags) + { + UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(remoteClient.AgentId); + if (UserProfile != null) + { + // I know I'm ignoring the regionHandle provided by the teleport location request. + // reusing the TeleportLocationRequest delegate, so regionHandle isn't valid + UserProfile.HomeRegion = RegionInfo.RegionHandle; + + // We cast these to an int so as not to cause a breaking change with old regions + // Newer regions treat this as a float on the ExpectUser method.. so we need to wait a few + // releases before setting these to floats. (r4257) + UserProfile.HomeLocationX = (int)position.X; + UserProfile.HomeLocationY = (int)position.Y; + UserProfile.HomeLocationZ = (int)position.Z; + UserProfile.HomeLookAtX = (int)lookAt.X; + UserProfile.HomeLookAtY = (int)lookAt.Y; + UserProfile.HomeLookAtZ = (int)lookAt.Z; + CommsManager.UserService.UpdateUserProfileProperties(UserProfile); + + remoteClient.SendAgentAlertMessage("Set home to here if supported by login service",false); + } + else + { + remoteClient.SendAgentAlertMessage("Set Home request Failed",false); + } + + } protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client, bool child) { ScenePresence avatar = null; diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs index 67edf6b..89c519e 100644 --- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs +++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs @@ -158,7 +158,7 @@ namespace OpenSim.Region.Environment.Scenes public class MoneyTransferArgs : System.EventArgs { public LLUUID sender; - public LLUUID reciever; + public LLUUID receiver; // Always false. The SL protocol sucks. public bool authenticated = false; @@ -169,7 +169,7 @@ namespace OpenSim.Region.Environment.Scenes public MoneyTransferArgs(LLUUID asender, LLUUID areciever, int aamount, int atransactiontype, string adescription) { sender = asender; - reciever = areciever; + receiver = areciever; amount = aamount; transactiontype = atransactiontype; description = adescription; diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 426ab7e..a9f7fb9 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -163,6 +163,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event UpdateAvatarProperties OnUpdateAvatarProperties; public event ObjectIncludeInSearch OnObjectIncludeInSearch; + public event UUIDNameRequest OnTeleportHomeRequest; #pragma warning restore 67 -- cgit v1.1