From 4dd9cf1ce4fe208d3e4474778e3c9a6102755d8c Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 12 Jun 2010 02:44:01 +0100 Subject: Change flavor to 0.7-RC1 --- OpenSim/Framework/Servers/VersionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index 90b5f57..c27bc9a 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs @@ -30,7 +30,7 @@ namespace OpenSim public class VersionInfo { private const string VERSION_NUMBER = "0.7"; - private const Flavour VERSION_FLAVOUR = Flavour.Dev; + private const Flavour VERSION_FLAVOUR = Flavour.RC1; public enum Flavour { @@ -71,4 +71,4 @@ namespace OpenSim /// public readonly static int MajorInterfaceVersion = 6; } -} \ No newline at end of file +} -- cgit v1.1 From 66619b599654397fb09da0f40d3d7e69dafcfb41 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 12 Jun 2010 12:08:45 -0700 Subject: Added checks for failed UpdateAgent calls. --- .../EntityTransfer/EntityTransferModule.cs | 46 ++++++++++++++-------- OpenSim/Region/Framework/Scenes/Scene.cs | 2 + 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index a33f5c5..5d50a83 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -396,7 +396,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.Position = position; SetCallbackURL(agent, sp.Scene.RegionInfo); - UpdateAgent(reg, finalDestination, agent); + if (!UpdateAgent(reg, finalDestination, agent)) + { + // Region doesn't take it + Fail(sp, finalDestination); + return; + } m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); @@ -421,21 +426,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // that the client contacted the destination before we send the attachments and close things here. if (!WaitForCallback(sp.UUID)) { - // Client never contacted destination. Let's restore everything back - sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); - - // Fail. Reset it back - sp.IsChildAgent = false; - - ResetFromTransit(sp.UUID); - - // Yikes! We should just have a ref to scene here. - //sp.Scene.InformClientOfNeighbours(sp); - EnableChildAgents(sp); - - // Finally, kill the agent we just created at the destination. - m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); - + Fail(sp, finalDestination); return; } @@ -475,6 +466,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } } + private void Fail(ScenePresence sp, GridRegion finalDestination) + { + // Client never contacted destination. Let's restore everything back + sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); + + // Fail. Reset it back + sp.IsChildAgent = false; + + ResetFromTransit(sp.UUID); + + EnableChildAgents(sp); + + // Finally, kill the agent we just created at the destination. + m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); + + } protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) { @@ -813,7 +820,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer cAgent.CallbackURI = "http://" + m_scene.RegionInfo.ExternalHostName + ":" + m_scene.RegionInfo.HttpPort + "/agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; - m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent); + if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) + { + // region doesn't take it + ResetFromTransit(agent.UUID); + return agent; + } // Next, let's close the child agent connections that are too far away. agent.CloseChildAgents(neighbourx, neighboury); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2b2c04a..bcfb4c9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3903,6 +3903,8 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); + // XPTO: if this agent is not allowed here as root, always return false + // We have to wait until the viewer contacts this region after receiving EAC. // That calls AddNewClient, which finally creates the ScenePresence ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); -- cgit v1.1 From eff641ab83c124bded9434dfb776838926028b65 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 12 Jun 2010 17:08:05 -0700 Subject: Added Old Guids=true to all MySql connection strings. --- bin/OpenSim.ini.example | 2 +- bin/Robust.HG.ini.example | 2 +- bin/Robust.ini.example | 2 +- bin/config-include/StandaloneCommon.ini.example | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index b14206a..0bc3d87 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -126,7 +126,7 @@ ; -->>> There are multiple connection strings defined in several places. Check it carefully! ; ; storage_plugin="OpenSim.Data.MySQL.dll" - ; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; + ; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;"; ; If you want to use a different database/server for estate data, then ; uncomment and change this connect string. Defaults to the above if not set ; estate_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 9af1e4c..2d69382 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -28,7 +28,7 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 [DatabaseService] StorageProvider = "OpenSim.Data.MySQL.dll" - ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=opensim123;" + ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;" ; * As an example, the below configuration precisely mimicks the legacy ; * asset server. It is read by the asset IN connector (defined above) diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index f1b9126..8331db8 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -28,7 +28,7 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 [DatabaseService] StorageProvider = "OpenSim.Data.MySQL.dll" - ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=opensim123;" + ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;" ; * As an example, the below configuration precisely mimicks the legacy diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index 572c153..bfa6725 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -17,7 +17,7 @@ ; Uncomment these lines if you want to use mysql storage ; Change the connection string to your db details ;StorageProvider = "OpenSim.Data.MySQL.dll" - ;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;" + ;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" [AssetService] DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll" -- cgit v1.1 From 14c587bea1e0acfca0ba1842c5a1fa10bdf45548 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 13 Jun 2010 21:45:39 +0100 Subject: Thank you, Snoopy2, for a patch to fix RemoteAdmin. Committed with the following changes: - Start location is NOT optional. The signature was defined with it being mandataory and there is no reason to change it - Adjusted comments to remove misleading or no longer true comments. Default is neuter, according to the code, not male, as the comment stated. --- .../RemoteController/RemoteAdminPlugin.cs | 949 +++++++++++++-------- .../SimianUserAccountServiceConnector.cs | 2 +- .../UserAccountService/UserAccountService.cs | 24 +- 3 files changed, 624 insertions(+), 351 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 7ebb5de..b248d11 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -998,35 +998,33 @@ namespace OpenSim.ApplicationPlugins.RemoteController string firstname = (string) requestData["user_firstname"]; string lastname = (string) requestData["user_lastname"]; string passwd = (string) requestData["user_password"]; - uint regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); - uint regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); + + regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); + regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); string email = ""; // empty string for email if (requestData.Contains("user_email")) email = (string)requestData["user_email"]; - UUID scopeID = m_app.SceneManager.CurrentOrFirstScene.RegionInfo.ScopeID; - - UserAccount account = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.GetUserAccount(scopeID, firstname, lastname); - - if (null != account) - throw new Exception(String.Format("Account {0} {1} already exists", firstname, lastname)); + Scene scene = m_app.SceneManager.CurrentOrFirstScene; + UUID scopeID = scene.RegionInfo.ScopeID; - account = new UserAccount(scopeID, firstname, lastname, email); + UserAccount account = CreateUser(scopeID, firstname, lastname, passwd, email); - bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account); - - if (!success) + if (null == account) throw new Exception(String.Format("failed to create new user {0} {1}", firstname, lastname)); - // Store the password - m_app.SceneManager.CurrentOrFirstScene.AuthenticationService.SetPassword(account.PrincipalID, passwd); + // Set home position - GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID, + GridRegion home = scene.GridService.GetRegionByPosition(scopeID, (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); - if (home == null) + if (null == home) { m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", firstname, lastname); + } else { + scene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); + m_log.DebugFormat("[RADMIN]: Set home region {0} for updated user account {1} {2}", home.RegionID, firstname, lastname); + } // Establish the avatar's initial appearance @@ -1169,9 +1167,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// start_region_y /// avatar's start region coordinates, Y /// value (changeable) - /// about_real_world + /// about_real_world (not implemented yet) /// "about" text of avatar owner (changeable) - /// about_virtual_world + /// about_virtual_world (not implemented yet) /// "about" text of avatar (changeable) /// /// @@ -1182,6 +1180,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// true or false /// error /// error message if success is false + /// avatar_uuid + /// UUID of the updated avatar + /// account; UUID.Zero if failed. + /// /// /// @@ -1189,31 +1191,34 @@ namespace OpenSim.ApplicationPlugins.RemoteController { m_log.Info("[RADMIN]: UpdateUserAccount: new request"); m_log.Warn("[RADMIN]: This method needs update for 0.7"); + + FailIfRemoteAdminDisabled("UpdateUserAccount"); + XmlRpcResponse response = new XmlRpcResponse(); Hashtable responseData = new Hashtable(); - //lock (rslock) - //{ - // try - // { - // Hashtable requestData = (Hashtable) request.Params[0]; + lock (rslock) + { + try + { + Hashtable requestData = (Hashtable) request.Params[0]; - // // check completeness - // checkStringParameters(request, new string[] { - // "password", "user_firstname", - // "user_lastname"}); + // check completeness + checkStringParameters(request, new string[] { + "password", "user_firstname", + "user_lastname"}); - // // check password - // if (!String.IsNullOrEmpty(m_requiredPassword) && - // (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); + // check password + if (!String.IsNullOrEmpty(m_requiredPassword) && + (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); - // // do the job - // string firstname = (string) requestData["user_firstname"]; - // string lastname = (string) requestData["user_lastname"]; + // do the job + string firstname = (string) requestData["user_firstname"]; + string lastname = (string) requestData["user_lastname"]; - // string passwd = String.Empty; - // uint? regX = null; - // uint? regY = null; + string passwd = String.Empty; + uint? regX = null; + uint? regY = null; // uint? ulaX = null; // uint? ulaY = null; // uint? ulaZ = null; @@ -1223,11 +1228,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController // string aboutFirstLive = String.Empty; // string aboutAvatar = String.Empty; - // if (requestData.ContainsKey("user_password")) passwd = (string) requestData["user_password"]; - // if (requestData.ContainsKey("start_region_x")) - // regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); - // if (requestData.ContainsKey("start_region_y")) - // regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); + if (requestData.ContainsKey("user_password")) passwd = (string) requestData["user_password"]; + if (requestData.ContainsKey("start_region_x")) + regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); + if (requestData.ContainsKey("start_region_y")) + regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); // if (requestData.ContainsKey("start_lookat_x")) // ulaX = Convert.ToUInt32((Int32) requestData["start_lookat_x"]); @@ -1247,21 +1252,18 @@ namespace OpenSim.ApplicationPlugins.RemoteController // if (requestData.ContainsKey("about_virtual_world")) // aboutAvatar = (string)requestData["about_virtual_world"]; - // UserProfileData userProfile - // = m_app.CommunicationsManager.UserService.GetUserProfile(firstname, lastname); - - // if (null == userProfile) - // throw new Exception(String.Format("avatar {0} {1} does not exist", firstname, lastname)); + Scene scene = m_app.SceneManager.CurrentOrFirstScene; + UUID scopeID = scene.RegionInfo.ScopeID; + UserAccount account = scene.UserAccountService.GetUserAccount(scopeID, firstname, lastname); - // if (!String.IsNullOrEmpty(passwd)) - // { - // m_log.DebugFormat("[RADMIN]: UpdateUserAccount: updating password for avatar {0} {1}", firstname, lastname); - // string md5PasswdHash = Util.Md5Hash(Util.Md5Hash(passwd) + ":" + String.Empty); - // userProfile.PasswordHash = md5PasswdHash; - // } + if (null == account) + throw new Exception(String.Format("avatar {0} {1} does not exist", firstname, lastname)); - // if (null != regX) userProfile.HomeRegionX = (uint) regX; - // if (null != regY) userProfile.HomeRegionY = (uint) regY; + if (!String.IsNullOrEmpty(passwd)) + { + m_log.DebugFormat("[RADMIN]: UpdateUserAccount: updating password for avatar {0} {1}", firstname, lastname); + ChangeUserPassword(firstname, lastname, passwd); + } // if (null != usaX) userProfile.HomeLocationX = (uint) usaX; // if (null != usaY) userProfile.HomeLocationY = (uint) usaY; @@ -1274,35 +1276,48 @@ namespace OpenSim.ApplicationPlugins.RemoteController // if (String.Empty != aboutFirstLive) userProfile.FirstLifeAboutText = aboutFirstLive; // if (String.Empty != aboutAvatar) userProfile.AboutText = aboutAvatar; - // // User has been created. Now establish gender and appearance. + // Set home position - // updateUserAppearance(responseData, requestData, userProfile.ID); + if ((null != regX) && (null != regY)) + { + GridRegion home = scene.GridService.GetRegionByPosition(scopeID, + (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); + if (null == home) { + m_log.WarnFormat("[RADMIN]: Unable to set home region for updated user account {0} {1}", firstname, lastname); + } else { + scene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); + m_log.DebugFormat("[RADMIN]: Set home region {0} for updated user account {1} {2}", home.RegionID, firstname, lastname); + } + } - // if (!m_app.CommunicationsManager.UserService.UpdateUserProfile(userProfile)) - // throw new Exception("did not manage to update user profile"); + // User has been created. Now establish gender and appearance. - // responseData["success"] = true; + updateUserAppearance(responseData, requestData, account.PrincipalID); - // response.Value = responseData; + responseData["success"] = true; + responseData["avatar_uuid"] = account.PrincipalID.ToString(); - // m_log.InfoFormat("[RADMIN]: UpdateUserAccount: account for user {0} {1} updated, UUID {2}", - // firstname, lastname, - // userProfile.ID); - // } - // catch (Exception e) - // { - // m_log.ErrorFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.Message); - // m_log.DebugFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.ToString()); + response.Value = responseData; - // responseData["success"] = false; - // responseData["error"] = e.Message; + m_log.InfoFormat("[RADMIN]: UpdateUserAccount: account for user {0} {1} updated, UUID {2}", + firstname, lastname, + account.PrincipalID); + } + catch (Exception e) + { - // response.Value = responseData; - // } - //} + m_log.ErrorFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.Message); + m_log.DebugFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.ToString()); - m_log.Info("[RADMIN]: UpdateUserAccount: request complete"); - return response; + responseData["success"] = false; + responseData["avatar_uuid"] = UUID.Zero.ToString(); + responseData["error"] = e.Message; + + response.Value = responseData; + } + m_log.Info("[RADMIN]: UpdateUserAccount: request complete"); + return response; + } } /// @@ -1316,73 +1331,74 @@ namespace OpenSim.ApplicationPlugins.RemoteController private void updateUserAppearance(Hashtable responseData, Hashtable requestData, UUID userid) { m_log.DebugFormat("[RADMIN] updateUserAppearance"); - m_log.Warn("[RADMIN]: This method needs update for 0.7"); - //string dmale = m_config.GetString("default_male", "Default Male"); - //string dfemale = m_config.GetString("default_female", "Default Female"); - //string dneut = m_config.GetString("default_female", "Default Default"); + string dmale = m_config.GetString("default_male", "Default Male"); + string dfemale = m_config.GetString("default_female", "Default Female"); + string dneut = m_config.GetString("default_female", "Default Default"); string model = String.Empty; - //// Has a gender preference been supplied? - - //if (requestData.Contains("gender")) - //{ - // switch ((string)requestData["gender"]) - // { - // case "m" : - // model = dmale; - // break; - // case "f" : - // model = dfemale; - // break; - // case "n" : - // default : - // model = dneut; - // break; - // } - //} - - //// Has an explicit model been specified? - - //if (requestData.Contains("model")) - //{ - // model = (string)requestData["model"]; - //} - - //// No appearance attributes were set - - //if (model == String.Empty) - //{ - // m_log.DebugFormat("[RADMIN] Appearance update not requested"); - // return; - //} - - //m_log.DebugFormat("[RADMIN] Setting appearance for avatar {0}, using model {1}", userid, model); - - //string[] nomens = model.Split(); - //if (nomens.Length != 2) - //{ - // m_log.WarnFormat("[RADMIN] User appearance not set for {0}. Invalid model name : <{1}>", userid, model); - // // nomens = dmodel.Split(); - // return; - //} - - //UserProfileData mprof = m_app.CommunicationsManager.UserService.GetUserProfile(nomens[0], nomens[1]); - - //// Is this the first time one of the default models has been used? Create it if that is the case - //// otherwise default to male. - - //if (mprof == null) - //{ - // m_log.WarnFormat("[RADMIN] Requested model ({0}) not found. Appearance unchanged", model); - // return; - //} - - //// Set current user's appearance. This bit is easy. The appearance structure is populated with - //// actual asset ids, however to complete the magic we need to populate the inventory with the - //// assets in question. - - //establishAppearance(userid, mprof.ID); + // Has a gender preference been supplied? + + if (requestData.Contains("gender")) + { + switch ((string)requestData["gender"]) + { + case "m" : + case "male" : + model = dmale; + break; + case "f" : + case "female" : + model = dfemale; + break; + case "n" : + case "neutral" : + default : + model = dneut; + break; + } + } + + // Has an explicit model been specified? + + if (requestData.Contains("model") && (String.IsNullOrEmpty((string)requestData["gender"]))) + { + model = (string)requestData["model"]; + } + + // No appearance attributes were set + + if (String.IsNullOrEmpty(model)) + { + m_log.DebugFormat("[RADMIN] Appearance update not requested"); + return; + } + + m_log.DebugFormat("[RADMIN] Setting appearance for avatar {0}, using model <{1}>", userid, model); + + string[] nomens = model.Split(); + if (nomens.Length != 2) + { + m_log.WarnFormat("[RADMIN] User appearance not set for {0}. Invalid model name : <{1}>", userid, model); + // nomens = dmodel.Split(); + return; + } + + Scene scene = m_app.SceneManager.CurrentOrFirstScene; + UUID scopeID = scene.RegionInfo.ScopeID; + UserAccount mprof = scene.UserAccountService.GetUserAccount(scopeID, nomens[0], nomens[1]); + + if (mprof == null) + { + m_log.WarnFormat("[RADMIN] Requested model ({0}) not found. Appearance unchanged", model); + return; + } + + // Set current user's appearance. This bit is easy. The appearance structure is populated with + // actual asset ids, however to complete the magic we need to populate the inventory with the + // assets in question. + + establishAppearance(userid, mprof.PrincipalID); m_log.DebugFormat("[RADMIN] Finished setting appearance for avatar {0}, using model {1}", userid, model); @@ -1397,116 +1413,312 @@ namespace OpenSim.ApplicationPlugins.RemoteController private void establishAppearance(UUID dest, UUID srca) { m_log.DebugFormat("[RADMIN] Initializing inventory for {0} from {1}", dest, srca); + Scene scene = m_app.SceneManager.CurrentOrFirstScene; AvatarAppearance ava = null; - AvatarData avatar = m_app.SceneManager.CurrentOrFirstScene.AvatarService.GetAvatar(srca); + AvatarData avatar = scene.AvatarService.GetAvatar(srca); if (avatar != null) ava = avatar.ToAvatarAppearance(srca); // If the model has no associated appearance we're done. - - // if (ava == null) - // { - // return new AvatarAppearance(); - // } - if (ava == null) return; - UICallback sic = new UICallback(); - UICallback dic = new UICallback(); - IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; + // Simple appearance copy or copy Clothing and Bodyparts folders? + bool copyFolders = m_config.GetBoolean("copy_folders", false); + + if (!copyFolders) + { + // Simple copy of wearables and appearance update + try + { + copyWearablesAndAttachments(dest, srca, ava); + AvatarData adata = new AvatarData(ava); + scene.AvatarService.SetAvatar(dest, adata); + } + catch (Exception e) + { + m_log.WarnFormat("[RADMIN] Error transferring appearance for {0} : {1}", + dest, e.Message); + } + + return; + } + + // Copy Clothing and Bodypart folders and appearance update try { Dictionary imap = new Dictionary(); + copyInventoryFolders(dest, srca, AssetType.Clothing, imap, ava); + copyInventoryFolders(dest, srca, AssetType.Bodypart, imap, ava); - iserv.GetUserInventory(dest, dic.callback); - iserv.GetUserInventory(srca, sic.callback); - - dic.GetInventory(); - sic.GetInventory(); + AvatarWearable[] wearables = ava.Wearables; - if (sic.OK && dic.OK) + for (int i=0; i + /// This method is called by establishAppearance to do a copy all inventory items + /// worn or attached to the Clothing inventory folder of the receiving avatar. + /// In parallel the avatar wearables and attachments are updated. + /// + + private void copyWearablesAndAttachments(UUID dest, UUID srca, AvatarAppearance ava) + { + IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; - foreach (InventoryFolderImpl folder in sic.folders) + // Get Clothing folder of receiver + InventoryFolderBase dstf = iserv.GetFolderForType(dest, AssetType.Clothing); + + if (dstf == null) + throw new Exception("Cannot locate folder(s)"); + + // Missing destination folder? This should *never* be the case + if (dstf.Type != (short)AssetType.Clothing) + { + dstf = new InventoryFolderBase(); + dstf.ID = UUID.Random(); + dstf.Name = "Clothing"; + dstf.Owner = dest; + dstf.Type = (short)AssetType.Clothing; + dstf.ParentID = iserv.GetRootFolder(dest).ID; + dstf.Version = 1; + iserv.AddFolder(dstf); // store base record + m_log.ErrorFormat("[RADMIN] Created folder for destination {0}", srca); + } + + // Wearables + AvatarWearable[] wearables = ava.Wearables; + AvatarWearable wearable; + + for (int i=0; i attachments = ava.GetAttachmentDictionary(); + + foreach (KeyValuePair kvp in attachments) + { + int attachpoint = kvp.Key; + UUID itemID = kvp.Value[0]; + + if (itemID != UUID.Zero) { - throw new Exception("Unable to load both inventories"); + // Get inventory item and copy it + InventoryItemBase item = new InventoryItemBase(itemID, srca); + item = iserv.GetItem(item); + + if (item != null) + { + InventoryItemBase dsti = new InventoryItemBase(UUID.Random(), dest); + dsti.Name = item.Name; + dsti.Description = item.Description; + dsti.InvType = item.InvType; + dsti.CreatorId = item.CreatorId; + dsti.CreatorIdAsUuid = item.CreatorIdAsUuid; + dsti.NextPermissions = item.NextPermissions; + dsti.CurrentPermissions = item.CurrentPermissions; + dsti.BasePermissions = item.BasePermissions; + dsti.EveryOnePermissions = item.EveryOnePermissions; + dsti.GroupPermissions = item.GroupPermissions; + dsti.AssetType = item.AssetType; + dsti.AssetID = item.AssetID; + dsti.GroupID = item.GroupID; + dsti.GroupOwned = item.GroupOwned; + dsti.SalePrice = item.SalePrice; + dsti.SaleType = item.SaleType; + dsti.Flags = item.Flags; + dsti.CreationDate = item.CreationDate; + dsti.Folder = dstf.ID; + + iserv.AddItem(dsti); + m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", dsti.ID, dstf.ID); + + // Attach item + ava.SetAttachment(attachpoint, dsti.ID, dsti.AssetID); + m_log.DebugFormat("[RADMIN] Attached {0}", dsti.ID); + } + else + { + m_log.WarnFormat("[RADMIN] Error transferring {0} to folder {1}", itemID, dstf.ID); + } } + } - AvatarData adata = new AvatarData(ava); - m_app.SceneManager.CurrentOrFirstScene.AvatarService.SetAvatar(dest, adata); + + } + + /// + /// This method is called by establishAppearance to copy inventory folders to make + /// copies of Clothing and Bodyparts inventory folders and attaches worn attachments + /// + + private void copyInventoryFolders(UUID dest, UUID srca, AssetType assettype, Dictionary imap, + AvatarAppearance ava) + { + IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; + + InventoryFolderBase srcf = iserv.GetFolderForType(srca, assettype); + InventoryFolderBase dstf = iserv.GetFolderForType(dest, assettype); + + if (srcf == null || dstf == null) + throw new Exception("Cannot locate folder(s)"); + + // Missing source folder? This should *never* be the case + if (srcf.Type != (short)assettype) + { + srcf = new InventoryFolderBase(); + srcf.ID = UUID.Random(); + if (assettype == AssetType.Clothing) { + srcf.Name = "Clothing"; + } else { + srcf.Name = "Body Parts"; + } + srcf.Owner = srca; + srcf.Type = (short)assettype; + srcf.ParentID = iserv.GetRootFolder(srca).ID; + srcf.Version = 1; + iserv.AddFolder(srcf); // store base record + m_log.ErrorFormat("[RADMIN] Created folder for source {0}", srca); } - catch (Exception e) + + // Missing destination folder? This should *never* be the case + if (dstf.Type != (short)assettype) { - m_log.WarnFormat("[RADMIN] Error transferring inventory for {0} : {1}", - dest, e.Message); - return; + dstf = new InventoryFolderBase(); + dstf.ID = UUID.Random(); + dstf.Name = assettype.ToString(); + dstf.Owner = dest; + dstf.Type = (short)assettype; + dstf.ParentID = iserv.GetRootFolder(dest).ID; + dstf.Version = 1; + iserv.AddFolder(dstf); // store base record + m_log.ErrorFormat("[RADMIN] Created folder for destination {0}", srca); } - return; + InventoryFolderBase efolder; + List folders = iserv.GetFolderContent(srca, srcf.ID).Folders; + + foreach (InventoryFolderBase folder in folders) + { + + efolder = new InventoryFolderBase(); + efolder.ID = UUID.Random(); + efolder.Name = folder.Name; + efolder.Owner = dest; + efolder.Type = folder.Type; + efolder.Version = folder.Version; + efolder.ParentID = dstf.ID; + iserv.AddFolder(efolder); + + m_log.DebugFormat("[RADMIN] Added folder {0} to folder {1}", efolder.ID, srcf.ID); + + List items = iserv.GetFolderContent(srca, folder.ID).Items; + + foreach (InventoryItemBase item in items) + { + InventoryItemBase dsti = new InventoryItemBase(UUID.Random(), dest); + dsti.Name = item.Name; + dsti.Description = item.Description; + dsti.InvType = item.InvType; + dsti.CreatorId = item.CreatorId; + dsti.CreatorIdAsUuid = item.CreatorIdAsUuid; + dsti.NextPermissions = item.NextPermissions; + dsti.CurrentPermissions = item.CurrentPermissions; + dsti.BasePermissions = item.BasePermissions; + dsti.EveryOnePermissions = item.EveryOnePermissions; + dsti.GroupPermissions = item.GroupPermissions; + dsti.AssetType = item.AssetType; + dsti.AssetID = item.AssetID; + dsti.GroupID = item.GroupID; + dsti.GroupOwned = item.GroupOwned; + dsti.SalePrice = item.SalePrice; + dsti.SaleType = item.SaleType; + dsti.Flags = item.Flags; + dsti.CreationDate = item.CreationDate; + dsti.Folder = efolder.ID; + + iserv.AddItem(dsti); + imap.Add(item.ID, dsti.ID); + m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", dsti.ID, efolder.ID); + + // Attach item, if original is attached + int attachpoint = ava.GetAttachpoint(item.ID); + if (attachpoint != 0) + { + ava.SetAttachment(attachpoint, dsti.ID, dsti.AssetID); + m_log.DebugFormat("[RADMIN] Attached {0}", dsti.ID); + } + } + } } - /// + /// /// This method is called if a given model avatar name can not be found. If the external /// file has already been loaded once, then control returns immediately. If not, then it /// looks for a default appearance file. This file contains XML definitions of zero or more named @@ -1557,9 +1769,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController bool include = false; bool select = false; - UICallback uic; - IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; - IAssetService aserv = m_app.SceneManager.CurrentOrFirstScene.AssetService; + Scene scene = m_app.SceneManager.CurrentOrFirstScene; + IInventoryService iserv = scene.InventoryService; + IAssetService aserv = scene.AssetService; doc.LoadXml(File.ReadAllText(dafn)); @@ -1596,29 +1808,31 @@ namespace OpenSim.ApplicationPlugins.RemoteController passwd = GetStringAttribute(avatar,"password",passwd); string[] nomens = name.Split(); - UUID scopeID = m_app.SceneManager.CurrentOrFirstScene.RegionInfo.ScopeID; - UserAccount account = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.GetUserAccount(scopeID, nomens[0], nomens[1]); + UUID scopeID = scene.RegionInfo.ScopeID; + UserAccount account = scene.UserAccountService.GetUserAccount(scopeID, nomens[0], nomens[1]); if (null == account) { - account = new UserAccount(scopeID, nomens[0], nomens[1], email); - bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account); - if (!success) + account = CreateUser(scopeID, nomens[0], nomens[1], passwd, email); + if (null == account) { m_log.ErrorFormat("[RADMIN] Avatar {0} {1} was not created", nomens[0], nomens[1]); return false; } - // !!! REFACTORING PROBLEM: need to set the password - - GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID, - (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); - if (home != null) - m_app.SceneManager.CurrentOrFirstScene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); } - else - { - ID = account.PrincipalID; + + // Set home position + + GridRegion home = scene.GridService.GetRegionByPosition(scopeID, + (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); + if (null == home) { + m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", nomens[0], nomens[1]); + } else { + scene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); + m_log.DebugFormat("[RADMIN]: Set home region {0} for updated user account {1} {2}", home.RegionID, nomens[0], nomens[1]); } + ID = account.PrincipalID; + m_log.DebugFormat("[RADMIN] User {0}[{1}] created or retrieved", name, ID); include = true; } @@ -1635,46 +1849,36 @@ namespace OpenSim.ApplicationPlugins.RemoteController if (include) { - uic = new UICallback(); - // Request the inventory - iserv.GetUserInventory(ID, uic.callback); - - // While the inventory is being fetched, setup for appearance processing - AvatarData adata = m_app.SceneManager.CurrentOrFirstScene.AvatarService.GetAvatar(ID); + // Setup for appearance processing + AvatarData adata = scene.AvatarService.GetAvatar(ID); if (adata != null) mava = adata.ToAvatarAppearance(ID); else mava = new AvatarAppearance(); + AvatarWearable[] wearables = mava.Wearables; + for (int i=0; i folders = iserv.GetFolderContent(ID, cfolder.ID).Folders; + efolder = null; + + foreach (InventoryFolderBase folder in folders) { - if (folder.Name == oname && folder.ParentID == cfolder.ID) + if (folder.Name == oname) { efolder = folder; break; @@ -1711,14 +1918,14 @@ namespace OpenSim.ApplicationPlugins.RemoteController if (efolder == null) { m_log.DebugFormat("[RADMIN] Creating outfit folder {0} for {1}", oname, name); - efolder = new InventoryFolderImpl(); + efolder = new InventoryFolderBase(); efolder.ID = UUID.Random(); efolder.Name = oname; - efolder.Type = 5; - efolder.Version = 1; efolder.Owner = ID; - cfolder.AddChildFolder(efolder); // make connection - iserv.AddFolder(efolder); // store base record + efolder.Type = (short)AssetType.Clothing; + efolder.Version = 1; + efolder.ParentID = cfolder.ID; + iserv.AddFolder(efolder); m_log.DebugFormat("[RADMIN] Adding outfile folder {0} to folder {1}", efolder.ID, cfolder.ID); } @@ -1745,26 +1952,55 @@ namespace OpenSim.ApplicationPlugins.RemoteController InventoryItemBase iitem = null; - if ((iitem = efolder.FindAsset(assetid)) == null) + // Check if asset is in inventory already + iitem = null; + List iitems = iserv.GetFolderContent(ID, efolder.ID).Items; + + foreach (InventoryItemBase litem in iitems) + { + if (litem.AssetID == assetid) + { + iitem = litem; + break; + } + } + + // Create inventory item + if (iitem == null) { - iitem = new InventoryItemBase(); - iitem.ID = UUID.Random(); + iitem = new InventoryItemBase(UUID.Random(), ID); iitem.Name = GetStringAttribute(item,"name",""); iitem.Description = GetStringAttribute(item,"desc",""); iitem.InvType = GetIntegerAttribute(item,"invtype",-1); - iitem.AssetType = GetIntegerAttribute(item,"assettype",-1); - iitem.Flags = GetUnsignedAttribute(item,"flags",0); - iitem.AssetID = assetid; // associated asset - iitem.Folder = efolder.ID; // Parent folder - iitem.Owner = ID; // Agent ID - iitem.BasePermissions = GetUnsignedAttribute(perms,"base",0x7fffffff); + iitem.CreatorId = GetStringAttribute(item,"creatorid",""); + iitem.CreatorIdAsUuid = (UUID)GetStringAttribute(item,"creatoruuid",""); iitem.NextPermissions = GetUnsignedAttribute(perms,"next",0x7fffffff); iitem.CurrentPermissions = GetUnsignedAttribute(perms,"current",0x7fffffff); - iitem.GroupPermissions = GetUnsignedAttribute(perms,"group",0x7fffffff); + iitem.BasePermissions = GetUnsignedAttribute(perms,"base",0x7fffffff); iitem.EveryOnePermissions = GetUnsignedAttribute(perms,"everyone",0x7fffffff); - m_log.DebugFormat("[RADMIN] Adding item {0} to folder {1}", iitem.ID, efolder.ID); + iitem.GroupPermissions = GetUnsignedAttribute(perms,"group",0x7fffffff); + iitem.AssetType = GetIntegerAttribute(item,"assettype",-1); + iitem.AssetID = assetid; // associated asset + iitem.GroupID = (UUID)GetStringAttribute(item,"groupid",""); + iitem.GroupOwned = (GetStringAttribute(item,"groupowned","false") == "true"); + iitem.SalePrice = GetIntegerAttribute(item,"saleprice",0); + iitem.SaleType = (byte)GetIntegerAttribute(item,"saletype",0); + iitem.Flags = GetUnsignedAttribute(item,"flags",0); + iitem.CreationDate = GetIntegerAttribute(item,"creationdate",Util.UnixTimeSinceEpoch()); + iitem.Folder = efolder.ID; // Parent folder + iserv.AddItem(iitem); + m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", iitem.ID, efolder.ID); + } + + // Attach item, if attachpoint is specified + int attachpoint = GetIntegerAttribute(item,"attachpoint",0); + if (attachpoint != 0) + { + mava.SetAttachment(attachpoint, iitem.ID, iitem.AssetID); + m_log.DebugFormat("[RADMIN] Attached {0}", iitem.ID); } + // Record whether or not the item is to be initially worn try { @@ -1774,25 +2010,22 @@ namespace OpenSim.ApplicationPlugins.RemoteController mava.Wearables[iitem.Flags].AssetID = iitem.AssetID; } } - catch {} + catch (Exception e) + { + m_log.WarnFormat("[RADMIN] Error wearing item {0} : {1}", iitem.ID, e.Message); + } } // foreach item in outfit m_log.DebugFormat("[RADMIN] Outfit {0} load completed", oname); } // foreach outfit m_log.DebugFormat("[RADMIN] Inventory update complete for {0}", name); AvatarData adata2 = new AvatarData(mava); - m_app.SceneManager.CurrentOrFirstScene.AvatarService.SetAvatar(ID, adata2); + scene.AvatarService.SetAvatar(ID, adata2); } catch (Exception e) { m_log.WarnFormat("[RADMIN] Inventory processing incomplete for user {0} : {1}", name, e.Message); } - else - { - m_log.WarnFormat("[RADMIN] Unable to retrieve inventory for {0}[{1}]", - name, ID); - // continue to next avatar - } } // End of include } m_log.DebugFormat("[RADMIN] Default avatar loading complete"); @@ -2660,81 +2893,115 @@ namespace OpenSim.ApplicationPlugins.RemoteController public void Dispose() { } - } - - class UICallback - { - private Object uilock = new Object(); - internal InventoryFolderImpl root = null; - internal List folders; - internal List items; - internal bool OK = false; - - public void callback(ICollection p_folders, ICollection p_items) - { - lock (uilock) - { - folders = (List) p_folders; - items = (List) p_items; - OK = true; - System.Threading.Monitor.Pulse(uilock); - } - } - public void GetInventory() + /// + /// Create a user + /// + /// + /// + /// + /// + /// + private UserAccount CreateUser(UUID scopeID, string firstName, string lastName, string password, string email) { - Dictionary fmap = new Dictionary(); - - if (OK == false) + Scene scene = m_app.SceneManager.CurrentOrFirstScene; + IUserAccountService m_UserAccountService = scene.UserAccountService; + IGridService m_GridService = scene.GridService; + IAuthenticationService m_AuthenticationService = scene.AuthenticationService; + IGridUserService m_GridUserService = scene.GridUserService; + IInventoryService m_InventoryService = scene.InventoryService; + + UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); + if (null == account) { - lock (uilock) + account = new UserAccount(scopeID, firstName, lastName, email); + if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0)) { - if (OK == false) - System.Threading.Monitor.Wait(uilock); + account.ServiceURLs = new Dictionary(); + account.ServiceURLs["HomeURI"] = string.Empty; + account.ServiceURLs["GatekeeperURI"] = string.Empty; + account.ServiceURLs["InventoryServerURI"] = string.Empty; + account.ServiceURLs["AssetServerURI"] = string.Empty; } - } - - // Got the inventory OK. So now merge the content of the default appearance - // file with whatever we already have in-world. For convenience we initialize - // the inventory hierarchy. - // Find root and build an index - - foreach (InventoryFolderImpl folder in folders) - { - if (folder.ParentID == UUID.Zero) + if (m_UserAccountService.StoreUserAccount(account)) { - if (root == null) + bool success; + if (m_AuthenticationService != null) { - root = folder; + success = m_AuthenticationService.SetPassword(account.PrincipalID, password); + if (!success) + m_log.WarnFormat("[RADMIN]: Unable to set password for account {0} {1}.", + firstName, lastName); + } + + GridRegion home = null; + if (m_GridService != null) + { + List defaultRegions = m_GridService.GetDefaultRegions(UUID.Zero); + if (defaultRegions != null && defaultRegions.Count >= 1) + home = defaultRegions[0]; + + if (m_GridUserService != null && home != null) + m_GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); + else + m_log.WarnFormat("[RADMIN]: Unable to set home for account {0} {1}.", + firstName, lastName); } else + m_log.WarnFormat("[RADMIN]: Unable to retrieve home region for account {0} {1}.", + firstName, lastName); + + if (m_InventoryService != null) { - throw new Exception("Multiple root folders found"); + success = m_InventoryService.CreateUserInventory(account.PrincipalID); + if (!success) + m_log.WarnFormat("[RADMIN]: Unable to create inventory for account {0} {1}.", + firstName, lastName); } + + m_log.InfoFormat("[RADMIN]: Account {0} {1} created successfully", firstName, lastName); + return account; + } else { + m_log.ErrorFormat("[RADMIN]: Account creation failed for account {0} {1}", firstName, lastName); } - fmap.Add(folder.ID, folder); } - - // Hard to continue if the root folder is not there - if (root == null) + else { - throw new Exception("Root folder not found"); + m_log.ErrorFormat("[RADMIN]: A user with the name {0} {1} already exists!", firstName, lastName); } + return null; + } - // Construct the folder hierarchy - foreach (InventoryFolderImpl folder in folders) + /// + /// Change password + /// + /// + /// + /// + private bool ChangeUserPassword(string firstName, string lastName, string password) + { + Scene scene = m_app.SceneManager.CurrentOrFirstScene; + IUserAccountService m_UserAccountService = scene.UserAccountService; + IAuthenticationService m_AuthenticationService = scene.AuthenticationService; + + UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, firstName, lastName); + if (null != account) { - if (folder.ID != root.ID) - { - fmap[folder.ParentID].AddChildFolder(folder); + bool success = false; + if (m_AuthenticationService != null) + success = m_AuthenticationService.SetPassword(account.PrincipalID, password); + if (!success) { + m_log.WarnFormat("[RADMIN]: Unable to set password for account {0} {1}.", + firstName, lastName); + return false; } + return true; } - - // Find a home for every pre-existing item - foreach (InventoryItemBase item in items) + else { - fmap[item.Folder].Items.Add(item.ID, item); + m_log.ErrorFormat("[RADMIN]: No such user"); + return false; } } } diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 874f1a2..56c73ec 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 063251a..326e502 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -357,7 +357,7 @@ namespace OpenSim.Services.UserAccountService /// /// /// - public void CreateUser(string firstName, string lastName, string password, string email) + private void CreateUser(string firstName, string lastName, string password, string email) { UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName); if (null == account) @@ -374,12 +374,14 @@ namespace OpenSim.Services.UserAccountService if (StoreUserAccount(account)) { - bool success = false; + bool success; if (m_AuthenticationService != null) + { success = m_AuthenticationService.SetPassword(account.PrincipalID, password); - if (!success) - m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.", - firstName, lastName); + if (!success) + m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.", + firstName, lastName); + } GridRegion home = null; if (m_GridService != null) @@ -399,18 +401,22 @@ namespace OpenSim.Services.UserAccountService firstName, lastName); if (m_InventoryService != null) + { success = m_InventoryService.CreateUserInventory(account.PrincipalID); - if (!success) - m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.", - firstName, lastName); + if (!success) + m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.", + firstName, lastName); + } m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", firstName, lastName); + } else { + m_log.ErrorFormat("[USER ACCOUNT SERVICE]: Account creation failed for account {0} {1}", firstName, lastName); } } else { m_log.ErrorFormat("[USER ACCOUNT SERVICE]: A user with the name {0} {1} already exists!", firstName, lastName); } - } + } } } -- cgit v1.1 From 9069114d0fb86371839338f16e9d306686ea60ac Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 13 Jun 2010 21:57:56 +0100 Subject: Fox my changes to radmin --- OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index b248d11..e57aaa0 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -999,8 +999,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController string lastname = (string) requestData["user_lastname"]; string passwd = (string) requestData["user_password"]; - regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); - regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); + uint regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); + uint regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); string email = ""; // empty string for email if (requestData.Contains("user_email")) -- cgit v1.1 From 19558f380a1e9cbaff849eb15262266ea79b60d2 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 13 Jun 2010 19:06:22 -0700 Subject: Fixes the long-standing RegionUp bug! Plus lots of other cleanups related to neighbours. --- .../Avatar/Attachments/AttachmentsModule.cs | 2 +- .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 2 +- .../EntityTransfer/EntityTransferModule.cs | 28 +++++++++++++++++++++ .../Neighbour/NeighbourServiceInConnectorModule.cs | 5 +--- .../Grid/LocalGridServiceConnector.cs | 17 +------------ .../Grid/RemoteGridServiceConnector.cs | 5 +--- .../Neighbour/LocalNeighbourServiceConnector.cs | 8 +++--- .../Simulation/RemoteSimulationConnector.cs | 1 - OpenSim/Region/Framework/Scenes/Scene.cs | 29 +++------------------- .../Framework/Scenes/SceneCommunicationService.cs | 21 ++++++---------- .../Connectors/Grid/GridServiceConnector.cs | 9 +++---- .../Simulation/SimulationServiceConnector.cs | 2 +- OpenSim/Services/GridService/GridService.cs | 5 ++-- 13 files changed, 55 insertions(+), 79 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 6d16c52..a7b4c66 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -352,7 +352,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // Save avatar attachment information if (m_scene.AvatarFactory != null) { - m_log.Debug("[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID); + m_log.Debug("[ATTACHMENTS MODULE]: Dettaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID); m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); } } diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 22c8937..7e5a8ec 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -198,7 +198,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory public void UpdateDatabase(UUID user, AvatarAppearance appearance) { - //m_log.DebugFormat("[APPEARANCE]: UpdateDatabase"); + m_log.DebugFormat("[APPEARANCE]: UpdateDatabase"); AvatarData adata = new AvatarData(appearance); m_scene.AvatarService.SetAvatar(user, adata); } diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 5d50a83..ab1cfc3 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -922,12 +922,40 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// public void EnableChildAgent(ScenePresence sp, GridRegion region) { + m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighour {0}", region.RegionName); + + AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); agent.BaseFolder = UUID.Zero; agent.InventoryFolder = UUID.Zero; agent.startpos = new Vector3(128, 128, 70); agent.child = true; agent.Appearance = sp.Appearance; + agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); + + agent.ChildrenCapSeeds = new Dictionary(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); + m_log.DebugFormat("[XXX] Seeds 1 {0}", agent.ChildrenCapSeeds.Count); + + if (!agent.ChildrenCapSeeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) + agent.ChildrenCapSeeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); + m_log.DebugFormat("[XXX] Seeds 2 {0}", agent.ChildrenCapSeeds.Count); + + sp.AddNeighbourRegion(region.RegionHandle, agent.CapsPath); + foreach (ulong h in agent.ChildrenCapSeeds.Keys) + m_log.DebugFormat("[XXX] --> {0}", h); + m_log.DebugFormat("[XXX] Adding {0}", region.RegionHandle); + agent.ChildrenCapSeeds.Add(region.RegionHandle, agent.CapsPath); + + if (sp.Scene.CapsModule != null) + { + sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, agent.ChildrenCapSeeds); + } + + if (currentAgentCircuit != null) + { + agent.ServiceURLs = currentAgentCircuit.ServiceURLs; + agent.Viewer = currentAgentCircuit.Viewer; + } InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; d.BeginInvoke(sp, agent, region, region.ExternalEndPoint, true, diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs index 8a90370..35518d5 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Neighbour/NeighbourServiceInConnectorModule.cs @@ -123,17 +123,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Neighbour public GridRegion HelloNeighbour(ulong regionHandle, RegionInfo thisRegion) { - m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}", - thisRegion.RegionName, regionHandle, m_Scenes.Count); foreach (Scene s in m_Scenes) { if (s.RegionInfo.RegionHandle == regionHandle) { - m_log.Debug("[NEIGHBOUR IN CONNECTOR]: Found region to SendHelloNeighbour"); + //m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: HelloNeighbour from {0} to {1}", thisRegion.RegionName, s.RegionInfo.RegionName); return s.IncomingHelloNeighbour(thisRegion); } } - m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: region handle {0} not found", regionHandle); return null; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index 1b00c8a..b2e3f4f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs @@ -181,22 +181,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public List GetNeighbours(UUID scopeID, UUID regionID) { - if (m_LocalCache.ContainsKey(regionID)) - { - List neighbours = m_LocalCache[regionID].GetNeighbours(); - if (neighbours.Count == 0) - // try the DB - neighbours = m_GridService.GetNeighbours(scopeID, regionID); - return neighbours; - } - else - { - m_log.WarnFormat("[LOCAL GRID CONNECTOR]: GetNeighbours: Requested region {0} is not on this sim", regionID); - return new List(); - } - - // Don't go to the DB - //return m_GridService.GetNeighbours(scopeID, regionID); + return m_GridService.GetNeighbours(scopeID, regionID); } public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs index 46741a5..16e25e6 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs @@ -153,12 +153,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return false; } - // Let's override GetNeighbours completely -- never go to the grid server - // Neighbours are/should be cached locally - // For retrieval from the DB, caller should call GetRegionByPosition public override List GetNeighbours(UUID scopeID, UUID regionID) { - return m_LocalGridService.GetNeighbours(scopeID, regionID); + return base.GetNeighbours(scopeID, regionID); } public override GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs index daba0b3..f71bf46 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Neighbour/LocalNeighbourServiceConnector.cs @@ -121,17 +121,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour public GridRegion HelloNeighbour(ulong regionHandle, RegionInfo thisRegion) { - m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}", - thisRegion.RegionName, regionHandle, m_Scenes.Count); + m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from {0}, to {1}.", + thisRegion.RegionName, regionHandle); foreach (Scene s in m_Scenes) { if (s.RegionInfo.RegionHandle == regionHandle) { - m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour"); + //m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour"); return s.IncomingHelloNeighbour(thisRegion); } } - m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: region handle {0} not found", regionHandle); + //m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: region handle {0} not found", regionHandle); return null; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index 9e8454f..3f577f2 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs @@ -181,7 +181,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation // else do the remote thing if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) { - //m_regionClient.SendUserInformation(regInfo, aCircuit); return m_remoteConnector.CreateAgent(destination, aCircuit, teleportFlags, out reason); } return false; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 55060c3..2ff611e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -948,12 +948,6 @@ namespace OpenSim.Region.Framework.Scenes // Let the grid service module know, so this can be cached m_eventManager.TriggerOnRegionUp(otherRegion); - RegionInfo regInfo = new RegionInfo(xcell, ycell, otherRegion.InternalEndPoint, otherRegion.ExternalHostName); - regInfo.RegionID = otherRegion.RegionID; - regInfo.RegionName = otherRegion.RegionName; - regInfo.ScopeID = otherRegion.ScopeID; - regInfo.ExternalHostName = otherRegion.ExternalHostName; - GridRegion r = new GridRegion(regInfo); try { ForEachScenePresence(delegate(ScenePresence agent) @@ -968,7 +962,7 @@ namespace OpenSim.Region.Framework.Scenes old.Add(otherRegion.RegionHandle); agent.DropOldNeighbours(old); if (m_teleportModule != null) - m_teleportModule.EnableChildAgent(agent, r); + m_teleportModule.EnableChildAgent(agent, otherRegion); } } ); @@ -1518,6 +1512,7 @@ namespace OpenSim.Region.Framework.Scenes { m_log.DebugFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); LoginsDisabled = false; + m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface(), RegionInfo); } } } @@ -1802,6 +1797,8 @@ namespace OpenSim.Region.Framework.Scenes { RegisterCommsEvents(); + m_sceneGridService.SetScene(this); + // These two 'commands' *must be* next to each other or sim rebooting fails. //m_sceneGridService.RegisterRegion(m_interregionCommsOut, RegionInfo); @@ -1812,24 +1809,6 @@ namespace OpenSim.Region.Framework.Scenes throw new Exception(error); } - m_sceneGridService.SetScene(this); - m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface(), RegionInfo); - - //Dictionary dGridSettings = m_sceneGridService.GetGridSettings(); - - //if (dGridSettings.ContainsKey("allow_forceful_banlines")) - //{ - // if (dGridSettings["allow_forceful_banlines"] != "TRUE") - // { - // m_log.Info("[GRID]: Grid is disabling forceful parcel banlists"); - // EventManager.TriggerSetAllowForcefulBan(false); - // } - // else - // { - // m_log.Info("[GRID]: Grid is allowing forceful parcel banlists"); - // EventManager.TriggerSetAllowForcefulBan(true); - // } - //} } /// diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index bd8ccce..c675322 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -182,24 +182,17 @@ namespace OpenSim.Region.Framework.Scenes { //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); - for (int x = (int)region.RegionLocX - 1; x <= region.RegionLocX + 1; x++) + List neighbours = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID); + m_log.DebugFormat("[INTERGRID]: Informing {0} neighbours that this region is up", neighbours.Count); + foreach (GridRegion n in neighbours) { - for (int y = (int)region.RegionLocY - 1; y <= region.RegionLocY + 1; y++) - { - if (!((x == region.RegionLocX) && (y == region.RegionLocY))) // skip this region - { - ulong handle = Utils.UIntsToLong((uint)x * Constants.RegionSize, (uint)y * Constants.RegionSize); - InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; - - d.BeginInvoke(neighbourService, region, handle, - InformNeighborsThatRegionisUpCompleted, - d); - } - } + InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; + d.BeginInvoke(neighbourService, region, n.RegionHandle, + InformNeighborsThatRegionisUpCompleted, + d); } } - public delegate void SendChildAgentDataUpdateDelegate(AgentPosition cAgentData, ulong regionHandle); /// diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs index 0ec8912..1831533 100644 --- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs +++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs @@ -210,9 +210,6 @@ namespace OpenSim.Services.Connectors GridRegion rinfo = new GridRegion((Dictionary)r); rinfos.Add(rinfo); } - else - m_log.DebugFormat("[GRID CONNECTOR]: GetNeighbours {0}, {1} received invalid response type {2}", - scopeID, regionID, r.GetType()); } } else @@ -299,9 +296,9 @@ namespace OpenSim.Services.Connectors { if (replyData["result"] is Dictionary) rinfo = new GridRegion((Dictionary)replyData["result"]); - else - m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received no region", - scopeID, x, y); + //else + // m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received no region", + // scopeID, x, y); } else m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received null response", diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index ff0dd7e..32f02fb 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -479,7 +479,7 @@ namespace OpenSim.Services.Connectors.Simulation } catch (WebException ex) { - m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent delete {0}", ex.Message); + m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent delete from {0}: {1}", destination.RegionName, ex.Message); return false; } finally diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 7c98642..225530f 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -273,14 +273,15 @@ namespace OpenSim.Services.GridService if (region != null) { // Not really? Maybe? - List rdatas = m_Database.Get(region.posX - (int)Constants.RegionSize, region.posY - (int)Constants.RegionSize, - region.posX + (int)Constants.RegionSize, region.posY + (int)Constants.RegionSize, scopeID); + List rdatas = m_Database.Get(region.posX - (int)Constants.RegionSize - 1, region.posY - (int)Constants.RegionSize - 1, + region.posX + (int)Constants.RegionSize + 1, region.posY + (int)Constants.RegionSize + 1, scopeID); foreach (RegionData rdata in rdatas) if (rdata.RegionID != regionID) rinfos.Add(RegionData2RegionInfo(rdata)); } + m_log.DebugFormat("[GRID SERVICE]: region {0} has {1} neighours", region.RegionName, rinfos.Count); return rinfos; } -- cgit v1.1 From bd346ab8c7bc8358d467b39dd21070d935a9131b Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 13 Jun 2010 19:18:17 -0700 Subject: Fixes attachments coming back upon being detached in neighbouring regions and crossing. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c1e835e..6c119c2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3128,6 +3128,7 @@ namespace OpenSim.Region.Framework.Scenes { if (cAgent.Attachments != null) { + m_appearance.ClearAttachments(); foreach (AttachmentData att in cAgent.Attachments) { m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID); -- cgit v1.1 From 704da8c8238835c63e8ca560fc7778603e9f6795 Mon Sep 17 00:00:00 2001 From: Tom Grimshaw Date: Mon, 14 Jun 2010 04:03:54 -0700 Subject: osGetAvatarList: Use AbsolutePosition instead of the position of the physics actor, or the avatar disappears when they sit down. --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 0e86c86..db43902 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2222,12 +2222,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { if (avatar.IsChildAgent == false) { - if (avatar.PhysicsActor != null && avatar.PhysicsActor.Position != null) - { - result.Add(avatar.UUID); - result.Add(avatar.PhysicsActor.Position); - result.Add(avatar.Name); - } + result.Add(avatar.UUID); + result.Add(avatar.AbsolutePosition); + result.Add(avatar.Name); } } }); -- cgit v1.1 From 53c32d877319290244d18b2f5cd7f7b37cec4243 Mon Sep 17 00:00:00 2001 From: Tom Grimshaw Date: Mon, 14 Jun 2010 04:03:54 -0700 Subject: osGetAvatarList: Use AbsolutePosition instead of the position of the physics actor, or the avatar disappears when they sit down. --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index cd6d3a3..01b64eb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2218,12 +2218,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { if (avatar.IsChildAgent == false) { - if (avatar.PhysicsActor != null && avatar.PhysicsActor.Position != null) - { - result.Add(avatar.UUID); - result.Add(avatar.PhysicsActor.Position); - result.Add(avatar.Name); - } + result.Add(avatar.UUID); + result.Add(avatar.AbsolutePosition); + result.Add(avatar.Name); } } }); -- cgit v1.1 From ef1496ca2d22ad3d24bc9b53830a49f5a9c550d8 Mon Sep 17 00:00:00 2001 From: Tom Grimshaw Date: Mon, 14 Jun 2010 04:28:38 -0700 Subject: Add "alert dialog" for sending dialogs to users from the console --- OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs index b5c3176..4e36c5d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs @@ -55,6 +55,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog m_scene.AddCommand( this, "alert general", "alert general ", "Send an alert to everyone", HandleAlertConsoleCommand); + + m_scene.AddCommand( + this, "alert dialog", "alert dialog ", "Send a dialog alert to everyone", HandleAlertConsoleCommand); + + } public void PostInitialise() {} @@ -181,6 +186,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog "[DIALOG]: Sending general alert in region {0} with message {1}", m_scene.RegionInfo.RegionName, message); SendGeneralAlert(message); } + else if (cmdparams[1] == "dialog") + { + string message = CombineParams(cmdparams, 2); + + m_log.InfoFormat( + "[DIALOG]: Sending dialog alert in region {0} with message {1}", m_scene.RegionInfo.RegionName, message); + SendNotificationToUsersInRegion(UUID.Zero, "System", message); + } else { string firstName = cmdparams[1]; -- cgit v1.1 From 9c9ce9e8dd19c887ba91ff9b70f1b0e4f6a3f8df Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 14 Jun 2010 11:50:42 -0700 Subject: * Deleted duplicated migration that was failing anyway. * Added an error message in initial estate owner creation that makes it clear what needs to happen. --- OpenSim/Data/MySQL/Resources/RegionStore.migrations | 2 -- OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations index bdb3558..3f644f9 100644 --- a/OpenSim/Data/MySQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -787,8 +787,6 @@ CREATE TABLE `regionwindlight` ( PRIMARY KEY (`region_id`) ); -ALTER TABLE estate_settings AUTO_INCREMENT = 100; -COMMIT; :VERSION 33 #--------------------- diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2ff611e..e2ab643 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1334,6 +1334,8 @@ namespace OpenSim.Region.Framework.Scenes m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; m_regInfo.EstateSettings.Save(); } + else + m_log.ErrorFormat("[SCENE]: Unable to store account. If this simulator is connected to a grid,\n you must create the estate owner account first."); } else { -- cgit v1.1 From 6dd3f2b8b8cbfe6c3d395486afca42648b46075d Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 15 Jun 2010 01:52:37 +0100 Subject: Readusr master version and flavor --- OpenSim/Framework/Servers/VersionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index c27bc9a..100bf1f 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs @@ -29,8 +29,8 @@ namespace OpenSim { public class VersionInfo { - private const string VERSION_NUMBER = "0.7"; - private const Flavour VERSION_FLAVOUR = Flavour.RC1; + private const string VERSION_NUMBER = "0.7.1"; + private const Flavour VERSION_FLAVOUR = Flavour.Dev; public enum Flavour { -- cgit v1.1 From 0031d4a6186dbcab38a9f7fd2113ff6a5de2923a Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 15 Jun 2010 01:52:37 +0100 Subject: Readjust master version and flavor --- OpenSim/Framework/Servers/VersionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index c27bc9a..100bf1f 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs @@ -29,8 +29,8 @@ namespace OpenSim { public class VersionInfo { - private const string VERSION_NUMBER = "0.7"; - private const Flavour VERSION_FLAVOUR = Flavour.RC1; + private const string VERSION_NUMBER = "0.7.1"; + private const Flavour VERSION_FLAVOUR = Flavour.Dev; public enum Flavour { -- cgit v1.1 From 07b8eddb64d7f34c5aace2b704dfa2e0681eea1d Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 14 Jun 2010 19:11:49 -0700 Subject: Typo corrected in Robust.HG.ini.example --- bin/Robust.HG.ini.example | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 2d69382..9830d38 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -5,13 +5,13 @@ ;; HG1.5 handlers are: OpenSim.Server.Handlers.dll:GatekeeperService ;; OpenSim.Server.Handlers.dll:UserAgentService -;; OpenSim.Server.Handlers.dll:HGInventoryServiceInConnector -;; An additional OpenSim.Server.Handlers.dll:AssetServiceConnector is started -;; in port 8002, outside the firewall +;; Additional OpenSim.Server.Handlers.dll:AssetServiceConnector and +;; OpenSim.Server.Handlers.dll:XInventoryInConnector +;; are started in port 8002, outside the firewall ;; [Startup] -ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryServiceInConnector,8002/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8003/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:AssetServiceConnector" +ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8003/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:AssetServiceConnector" ; * This is common for all services, it's the network setup for the entire ; * server instance, if none if specified above -- cgit v1.1 From 38f098588cb2227602b8e5a5059d0513195da52f Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 15 Jun 2010 16:36:22 -0700 Subject: Fixes creation date issue on user accounts. --- OpenSim/Services/Interfaces/IUserAccountService.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/Interfaces/IUserAccountService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs index 09d1d87..c580078 100644 --- a/OpenSim/Services/Interfaces/IUserAccountService.cs +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs @@ -29,6 +29,8 @@ using System; using System.Collections.Generic; using OpenMetaverse; +using OpenSim.Framework; + namespace OpenSim.Services.Interfaces { public class UserAccount @@ -50,7 +52,7 @@ namespace OpenSim.Services.Interfaces LastName = lastName; Email = email; ServiceURLs = new Dictionary(); - // Created = ??? + Created = Util.UnixTimeSinceEpoch(); } public string FirstName; -- cgit v1.1 From 6c0a372346305f9de07d664aa58019a6cdfd6c63 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 15 Jun 2010 17:46:36 -0700 Subject: * Support salted and unsalted password hashes in SimianAuthenticationServiceConnector --- .../SimianAuthenticationServiceConnector.cs | 53 +++++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs index de3ee4e..3c784f2 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs @@ -114,10 +114,9 @@ namespace OpenSim.Services.Connectors.SimianGrid { if (identity["Type"].AsString() == "md5hash") { - string credential = identity["Credential"].AsString(); - - if (password == credential || "$1$" + password == credential || "$1$" + Utils.MD5String(password) == credential || Utils.MD5String(password) == credential) - return Authorize(principalID); + string authorizeResult; + if (CheckPassword(principalID, password, identity["Credential"].AsString(), out authorizeResult)) + return authorizeResult; md5hashFound = true; break; @@ -125,9 +124,7 @@ namespace OpenSim.Services.Connectors.SimianGrid } } - if (md5hashFound) - m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + principalID + " using md5hash $1$" + Utils.MD5String(password)); - else + if (!md5hashFound) m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + principalID + ", no md5hash identity found"); } else @@ -228,6 +225,48 @@ namespace OpenSim.Services.Connectors.SimianGrid return false; } + private bool CheckPassword(UUID userID, string password, string simianGridCredential, out string authorizeResult) + { + if (simianGridCredential.Contains(":")) + { + // Salted version + int idx = simianGridCredential.IndexOf(':'); + string finalhash = simianGridCredential.Substring(0, idx); + string salt = simianGridCredential.Substring(idx + 1); + + if (finalhash == Utils.MD5String(password + ":" + salt)) + { + authorizeResult = Authorize(userID); + return true; + } + else + { + m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + userID + + " using md5hash " + Utils.MD5String(password) + ":" + salt); + } + } + else + { + // Unsalted version + if (password == simianGridCredential || + "$1$" + password == simianGridCredential || + "$1$" + Utils.MD5String(password) == simianGridCredential || + Utils.MD5String(password) == simianGridCredential) + { + authorizeResult = Authorize(userID); + return true; + } + else + { + m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + userID + + " using md5hash $1$" + Utils.MD5String(password)); + } + } + + authorizeResult = null; + return false; + } + private string Authorize(UUID userID) { NameValueCollection requestArgs = new NameValueCollection -- cgit v1.1 From 117fd629d68ef8ab373b70fd5e9e6a643e8eaa65 Mon Sep 17 00:00:00 2001 From: Tom Grimshaw Date: Wed, 16 Jun 2010 08:32:47 -0700 Subject: Allow llMapDestination to be used in any event if the host is an attachment. This fixes Mantis 0000098. --- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 9f3e354..c332fd8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -9470,8 +9470,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); - if (detectedParams == null) return; // only works on the first detected avatar - + if (detectedParams == null) + { + if (m_host.IsAttachment == true) + { + detectedParams = new DetectParams(); + detectedParams.Key = m_host.OwnerID; + } + else + { + return; + } + } + ScenePresence avatar = World.GetScenePresence(detectedParams.Key); if (avatar != null) { @@ -9479,6 +9490,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api new Vector3((float)pos.x, (float)pos.y, (float)pos.z), new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z)); } + ScriptSleep(1000); } -- cgit v1.1 From b9c40320f108a84d7841cdc9e98009cf650f930e Mon Sep 17 00:00:00 2001 From: Tom Grimshaw Date: Wed, 16 Jun 2010 09:20:20 -0700 Subject: Fix llAttachToAvatar. This addresses mantis 128 . --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c332fd8..877c3cb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3065,9 +3065,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); - if (m_host.ParentGroup.RootPart.AttachmentPoint == 0) - return; - TaskInventoryItem item; m_host.TaskInventory.LockItemsForRead(true); @@ -3093,11 +3090,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ScenePresence presence = World.GetScenePresence(m_host.OwnerID); + /* IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; if (attachmentsModule != null) + { attachmentsModule.AttachObject( - presence.ControllingClient, grp.LocalId, + presence.ControllingClient, grp.LocalId, (uint)attachment, Quaternion.Identity, Vector3.Zero, false); + } + */ + grp.AttachToAgent(m_host.OwnerID, (uint)attachment, Vector3.Zero, false); } } -- cgit v1.1 From 544627c79cceb59f4172ddbcef0fcfd992e62003 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 17 Jun 2010 03:03:55 +0100 Subject: Force newly connecting remote consoles to display a prompt --- OpenSim/Framework/Console/RemoteConsole.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index a46a6cb..c038aac 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs @@ -44,6 +44,7 @@ namespace OpenSim.Framework.Console { public int last; public long lastLineSeen; + public bool newConnection = true; } // A console that uses REST interfaces @@ -424,6 +425,12 @@ namespace OpenSim.Framework.Console XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession", ""); + if (c.newConnection) + { + c.newConnection = false; + Output("+++" + DefaultPrompt); + } + lock (m_Scrollback) { long startLine = m_LineNumber - m_Scrollback.Count; -- cgit v1.1 From d1c8b083b8d44417d67fb401646eaa7215ff0851 Mon Sep 17 00:00:00 2001 From: Tom Grimshaw Date: Thu, 17 Jun 2010 04:15:07 -0700 Subject: Fix llRot2Euler with a mathematically sound implementation. The only difference between this an SL is that SL resolves a figure of negative PI into PI, and does the equivalent in the reverse (llEuler2Rot, -1.0 becomes 1.0); --- .../Shared/Api/Implementation/LSL_Api.cs | 46 +++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 877c3cb..fe8c70e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -502,25 +502,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return remainder; } - // Old implementation of llRot2Euler, now normalized - - public LSL_Vector llRot2Euler(LSL_Rotation r) - { - m_host.AddScriptLPS(1); - //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke - LSL_Rotation t = new LSL_Rotation(r.x * r.x, r.y * r.y, r.z * r.z, r.s * r.s); - double m = (t.x + t.y + t.z + t.s); - if (m == 0) return new LSL_Vector(); - double n = 2 * (r.y * r.s + r.x * r.z); - double p = m * m - n * n; - if (p > 0) - return new LSL_Vector(NormalizeAngle(Math.Atan2(2.0 * (r.x * r.s - r.y * r.z), (-t.x - t.y + t.z + t.s))), - NormalizeAngle(Math.Atan2(n, Math.Sqrt(p))), - NormalizeAngle(Math.Atan2(2.0 * (r.z * r.s - r.x * r.y), (t.x - t.y - t.z + t.s)))); - else if (n > 0) - return new LSL_Vector(0.0, Math.PI * 0.5, NormalizeAngle(Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z))); - else - return new LSL_Vector(0.0, -Math.PI * 0.5, NormalizeAngle(Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z))); + public LSL_Vector llRot2Euler(LSL_Rotation q1) + { + m_host.AddScriptLPS(1); + LSL_Vector eul = new LSL_Vector(); + + double sqw = q1.s*q1.s; + double sqx = q1.x*q1.x; + double sqy = q1.z*q1.z; + double sqz = q1.y*q1.y; + double unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor + double test = q1.x*q1.z + q1.y*q1.s; + if (test > 0.4999*unit) { // singularity at north pole + eul.z = 2 * Math.Atan2(q1.x,q1.s); + eul.y = Math.PI/2; + eul.x = 0; + return eul; + } + if (test < -0.4999*unit) { // singularity at south pole + eul.z = -2 * Math.Atan2(q1.x,q1.s); + eul.y = -Math.PI/2; + eul.x = 0; + return eul; + } + eul.z = Math.Atan2(2*q1.z*q1.s-2*q1.x*q1.y , sqx - sqy - sqz + sqw); + eul.y = Math.Asin(2*test/unit); + eul.x = Math.Atan2(2*q1.x*q1.s-2*q1.z*q1.y , -sqx + sqy - sqz + sqw); + return eul; } /* From wiki: -- cgit v1.1