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(-)
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