From 142f8a4aeca211ff6f88c7227f8654cd43a0dbaf Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 25 Feb 2012 21:00:19 -0800 Subject: [PATCH 01/25] HG: Remove async in posting assets to foreign grid. Mono hates concurrency there. --- .../Framework/InventoryAccess/HGInventoryAccessModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index 0c4ff7f81d..d2fe3888fa 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs @@ -117,7 +117,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess string userAssetServer = string.Empty; if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission) { - Util.FireAndForget(delegate { m_assMapper.Post(assetID, avatarID, userAssetServer); }); + m_assMapper.Post(assetID, avatarID, userAssetServer); } } From 4268427ac36410452bcfee9fe51d7deeb0ef303d Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Mon, 27 Feb 2012 15:15:03 -0800 Subject: [PATCH 02/25] Some clean up in WebUtil, remove unused ServiceRequest function. --- OpenSim/Framework/WebUtil.cs | 78 ++++-------------------------------- 1 file changed, 7 insertions(+), 71 deletions(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index b761dfe2a8..af25da9b04 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -63,77 +63,7 @@ namespace OpenSim.Framework // a "long" call for warning & debugging purposes public const int LongCallTime = 500; -// /// -// /// Send LLSD to an HTTP client in application/llsd+json form -// /// -// /// HTTP response to send the data in -// /// LLSD to send to the client -// public static void SendJSONResponse(OSHttpResponse response, OSDMap body) -// { -// byte[] responseData = Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(body)); -// -// response.ContentEncoding = Encoding.UTF8; -// response.ContentLength = responseData.Length; -// response.ContentType = "application/llsd+json"; -// response.Body.Write(responseData, 0, responseData.Length); -// } -// -// /// -// /// Send LLSD to an HTTP client in application/llsd+xml form -// /// -// /// HTTP response to send the data in -// /// LLSD to send to the client -// public static void SendXMLResponse(OSHttpResponse response, OSDMap body) -// { -// byte[] responseData = OSDParser.SerializeLLSDXmlBytes(body); -// -// response.ContentEncoding = Encoding.UTF8; -// response.ContentLength = responseData.Length; -// response.ContentType = "application/llsd+xml"; -// response.Body.Write(responseData, 0, responseData.Length); -// } - - /// - /// Make a GET or GET-like request to a web service that returns LLSD - /// or JSON data - /// - public static OSDMap ServiceRequest(string url, string httpVerb) - { - string errorMessage; - - try - { - HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); - request.Method = httpVerb; - - using (WebResponse response = request.GetResponse()) - { - using (Stream responseStream = response.GetResponseStream()) - { - try - { - string responseStr = responseStream.GetStreamString(); - OSD responseOSD = OSDParser.Deserialize(responseStr); - if (responseOSD.Type == OSDType.Map) - return (OSDMap)responseOSD; - else - errorMessage = "Response format was invalid."; - } - catch - { - errorMessage = "Failed to parse the response."; - } - } - } - } - catch (Exception ex) - { - m_log.Warn(httpVerb + " on URL " + url + " failed: " + ex.Message); - errorMessage = ex.Message; - } - - return new OSDMap { { "Message", OSD.FromString("Service request failed. " + errorMessage) } }; - } + #region JSONRequest /// /// PUT JSON-encoded data to a web service that returns LLSD or @@ -303,6 +233,10 @@ namespace OpenSim.Framework return result; } + #endregion JSONRequest + + #region FormRequest + /// /// POST URL-encoded form data to a web service that returns LLSD or /// JSON data @@ -397,6 +331,8 @@ namespace OpenSim.Framework result["Message"] = OSD.FromString("Service request failed: " + msg); return result; } + + #endregion FormRequest #region Uri From a813e7ffdd811979a0b326fd73f2199b528e95a6 Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Tue, 28 Feb 2012 15:45:07 -0500 Subject: [PATCH 03/25] Fixed two typos. White space cleanups. Signed-off-by: nebadon --- .../World/WorldMap/WorldMapModule.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 74b047be14..fd122da7ec 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -132,7 +132,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { } - public Type ReplaceableInterface + public Type ReplaceableInterface { get { return null; } } @@ -220,7 +220,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // There is a major hack going on in this method. The viewer doesn't request // map blocks (RequestMapBlocks) above 2048. That means that if we don't hack, // grids above that cell don't have a map at all. So, here's the hack: we wait - // for this CAP request to come, and we inject the map blocks at this point. + // for this CAP request to come, and we inject the map blocks at this point. // In a normal scenario, this request simply sends back the MapLayer (the blue color). // In the hacked scenario, it also sends the map blocks via UDP. // @@ -751,7 +751,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { uint x = 0, y = 0; Utils.LongToUInts(regionhandle, out x, out y); - GridRegion mreg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); + GridRegion mreg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); if (mreg != null) { @@ -857,7 +857,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap finally { if (os != null) - os.Close(); + os.Close(); } string response_mapItems_reply = null; @@ -960,16 +960,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // on an unloaded square. // But make sure: Look whether the one we requested is in there List regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, - minX * (int)Constants.RegionSize, - maxX * (int)Constants.RegionSize, - minY * (int)Constants.RegionSize, + minX * (int)Constants.RegionSize, + maxX * (int)Constants.RegionSize, + minY * (int)Constants.RegionSize, maxY * (int)Constants.RegionSize); if (regions != null) { foreach (GridRegion r in regions) { - if ((r.RegionLocX == minX * (int)Constants.RegionSize) && + if ((r.RegionLocX == minX * (int)Constants.RegionSize) && (r.RegionLocY == minY * (int)Constants.RegionSize)) { // found it => add it to response @@ -1004,7 +1004,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { List mapBlocks = new List(); List regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, - (minX - 4) * (int)Constants.RegionSize, + (minX - 4) * (int)Constants.RegionSize, (maxX + 4) * (int)Constants.RegionSize, (minY - 4) * (int)Constants.RegionSize, (maxY + 4) * (int)Constants.RegionSize); @@ -1336,7 +1336,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // Cannot create a map for a nonexistant heightmap if (m_scene.Heightmap == null) return; - + //create a texture asset of the terrain IMapImageGenerator terrain = m_scene.RequestModuleInterface(); if (terrain == null) @@ -1345,7 +1345,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap byte[] data = terrain.WriteJpeg2000Image(); if (data == null) return; - + byte[] overlay = GenerateOverlay(); m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE"); @@ -1366,7 +1366,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // Store the new one m_log.DebugFormat("[WORLDMAP]: Storing map tile {0}", asset.ID); m_scene.AssetService.Store(asset); - + if (overlay != null) { parcelImageID = UUID.Random(); @@ -1390,7 +1390,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap m_scene.RegionInfo.RegionSettings.TerrainImageID = terrainImageID; m_scene.RegionInfo.RegionSettings.ParcelImageID = parcelImageID; m_scene.RegionInfo.RegionSettings.Save(); - + // Delete the old one // m_log.DebugFormat("[WORLDMAP]: Deleting old map tile {0}", lastTerrainImageID); m_scene.AssetService.Delete(lastTerrainImageID.ToString()); @@ -1469,18 +1469,18 @@ namespace OpenSim.Region.CoreModules.World.WorldMap if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0) { landForSale = true; - + saleBitmap = land.MergeLandBitmaps(saleBitmap, land.GetLandBitmap()); } } if (!landForSale) { - m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not geenrating overlay", m_scene.RegionInfo.RegionName); + m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not generating overlay", m_scene.RegionInfo.RegionName); return null; } - m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, genrating overlay", m_scene.RegionInfo.RegionName); + m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, generating overlay", m_scene.RegionInfo.RegionName); for (int x = 0 ; x < 64 ; x++) { From 2fce7dd593571986cc08122a4fe015800fa765a6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 28 Feb 2012 22:54:21 +0000 Subject: [PATCH 04/25] Call Dispose() via using() on SqliteCommands in WebStatsModule after use. --- .../Region/UserStatistics/WebStatsModule.cs | 199 +++++++++--------- 1 file changed, 99 insertions(+), 100 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index ad272f7839..b9ba4bc797 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -224,13 +224,11 @@ namespace OpenSim.Region.UserStatistics concurrencyCounter--; response_code = 200; - } else { strOut = MainServer.Instance.GetHTTP404(""); } - responsedata["int_response_code"] = response_code; responsedata["content_type"] = contenttype; @@ -247,43 +245,44 @@ namespace OpenSim.Region.UserStatistics // TODO: FIXME: implement stats migrations const string SQL = @"SELECT * FROM migrations LIMIT 1"; - SqliteCommand cmd = new SqliteCommand(SQL, db); - - try + using (SqliteCommand cmd = new SqliteCommand(SQL, db)) { - cmd.ExecuteNonQuery(); - } - catch (SqliteSyntaxException) - { - CreateTables(db); + try + { + cmd.ExecuteNonQuery(); + } + catch (SqliteSyntaxException) + { + CreateTables(db); + } } } } public void CreateTables(SqliteConnection db) { - SqliteCommand createcmd = new SqliteCommand(SQL_STATS_TABLE_CREATE, db); - createcmd.ExecuteNonQuery(); + using (SqliteCommand createcmd = new SqliteCommand(SQL_STATS_TABLE_CREATE, db)) + { + createcmd.ExecuteNonQuery(); - createcmd.CommandText = SQL_MIGRA_TABLE_CREATE; - createcmd.ExecuteNonQuery(); + createcmd.CommandText = SQL_MIGRA_TABLE_CREATE; + createcmd.ExecuteNonQuery(); + } } public virtual void PostInitialise() { if (!enabled) - { return; - } + AddHandlers(); } public virtual void Close() { if (!enabled) - { return; - } + dbConn.Close(); dbConn.Dispose(); m_sessions.Clear(); @@ -304,7 +303,8 @@ namespace OpenSim.Region.UserStatistics public void OnRegisterCaps(UUID agentID, Caps caps) { - m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); +// m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); + string capsPath = "/CAPS/VS/" + UUID.Random(); caps.RegisterHandler("ViewerStats", new RestStreamHandler("POST", capsPath, @@ -318,7 +318,6 @@ namespace OpenSim.Region.UserStatistics public void OnDeRegisterCaps(UUID agentID, Caps caps) { - } protected virtual void AddHandlers() @@ -368,7 +367,6 @@ namespace OpenSim.Region.UserStatistics public void OnMakeChildAgent(ScenePresence agent) { - } public void OnClientClosed(UUID agentID, Scene scene) @@ -430,6 +428,7 @@ namespace OpenSim.Region.UserStatistics return scene.RegionInfo.RegionID; } } + return UUID.Zero; } @@ -458,14 +457,14 @@ namespace OpenSim.Region.UserStatistics UserSessionData usd; OSD message = OSDParser.DeserializeLLSDXml(request); OSDMap mmap; + lock (m_sessions) { if (agentID != UUID.Zero) { - if (!m_sessions.ContainsKey(agentID)) { - m_log.Warn("[WEB STATS MODULE]: no session for stat disclosure"); + m_log.WarnFormat("[WEB STATS MODULE]: no session for stat disclosure for agent {0}", agentID); return new UserSessionID(); } uid = m_sessions[agentID]; @@ -585,8 +584,6 @@ namespace OpenSim.Region.UserStatistics usd.n_out_kb = (float)net_out["kbytes"].AsReal(); usd.n_out_pk = net_out["packets"].AsInteger(); } - - } } @@ -602,83 +599,85 @@ namespace OpenSim.Region.UserStatistics lock (db) { - SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_UPDATE, db); - updatecmd.Parameters.Add(new SqliteParameter(":session_id", uid.session_data.session_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":agent_id", uid.session_data.agent_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":region_id", uid.session_data.region_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":last_updated", (int) uid.session_data.last_updated)); - updatecmd.Parameters.Add(new SqliteParameter(":remote_ip", uid.session_data.remote_ip)); - updatecmd.Parameters.Add(new SqliteParameter(":name_f", uid.session_data.name_f)); - updatecmd.Parameters.Add(new SqliteParameter(":name_l", uid.session_data.name_l)); - updatecmd.Parameters.Add(new SqliteParameter(":avg_agents_in_view", uid.session_data.avg_agents_in_view)); - updatecmd.Parameters.Add(new SqliteParameter(":min_agents_in_view", - (int) uid.session_data.min_agents_in_view)); - updatecmd.Parameters.Add(new SqliteParameter(":max_agents_in_view", - (int) uid.session_data.max_agents_in_view)); - updatecmd.Parameters.Add(new SqliteParameter(":mode_agents_in_view", - (int) uid.session_data.mode_agents_in_view)); - updatecmd.Parameters.Add(new SqliteParameter(":avg_fps", uid.session_data.avg_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":min_fps", uid.session_data.min_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":max_fps", uid.session_data.max_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":mode_fps", uid.session_data.mode_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":a_language", uid.session_data.a_language)); - updatecmd.Parameters.Add(new SqliteParameter(":mem_use", uid.session_data.mem_use)); - updatecmd.Parameters.Add(new SqliteParameter(":meters_traveled", uid.session_data.meters_traveled)); - updatecmd.Parameters.Add(new SqliteParameter(":avg_ping", uid.session_data.avg_ping)); - updatecmd.Parameters.Add(new SqliteParameter(":min_ping", uid.session_data.min_ping)); - updatecmd.Parameters.Add(new SqliteParameter(":max_ping", uid.session_data.max_ping)); - updatecmd.Parameters.Add(new SqliteParameter(":mode_ping", uid.session_data.mode_ping)); - updatecmd.Parameters.Add(new SqliteParameter(":regions_visited", uid.session_data.regions_visited)); - updatecmd.Parameters.Add(new SqliteParameter(":run_time", uid.session_data.run_time)); - updatecmd.Parameters.Add(new SqliteParameter(":avg_sim_fps", uid.session_data.avg_sim_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":min_sim_fps", uid.session_data.min_sim_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":max_sim_fps", uid.session_data.max_sim_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":mode_sim_fps", uid.session_data.mode_sim_fps)); - updatecmd.Parameters.Add(new SqliteParameter(":start_time", uid.session_data.start_time)); - updatecmd.Parameters.Add(new SqliteParameter(":client_version", uid.session_data.client_version)); - updatecmd.Parameters.Add(new SqliteParameter(":s_cpu", uid.session_data.s_cpu)); - updatecmd.Parameters.Add(new SqliteParameter(":s_gpu", uid.session_data.s_gpu)); - updatecmd.Parameters.Add(new SqliteParameter(":s_os", uid.session_data.s_os)); - updatecmd.Parameters.Add(new SqliteParameter(":s_ram", uid.session_data.s_ram)); - updatecmd.Parameters.Add(new SqliteParameter(":d_object_kb", uid.session_data.d_object_kb)); - updatecmd.Parameters.Add(new SqliteParameter(":d_texture_kb", uid.session_data.d_texture_kb)); - updatecmd.Parameters.Add(new SqliteParameter(":d_world_kb", uid.session_data.d_world_kb)); - updatecmd.Parameters.Add(new SqliteParameter(":n_in_kb", uid.session_data.n_in_kb)); - updatecmd.Parameters.Add(new SqliteParameter(":n_in_pk", uid.session_data.n_in_pk)); - updatecmd.Parameters.Add(new SqliteParameter(":n_out_kb", uid.session_data.n_out_kb)); - updatecmd.Parameters.Add(new SqliteParameter(":n_out_pk", uid.session_data.n_out_pk)); - updatecmd.Parameters.Add(new SqliteParameter(":f_dropped", uid.session_data.f_dropped)); - updatecmd.Parameters.Add(new SqliteParameter(":f_failed_resends", uid.session_data.f_failed_resends)); - updatecmd.Parameters.Add(new SqliteParameter(":f_invalid", uid.session_data.f_invalid)); - - updatecmd.Parameters.Add(new SqliteParameter(":f_off_circuit", uid.session_data.f_off_circuit)); - updatecmd.Parameters.Add(new SqliteParameter(":f_resent", uid.session_data.f_resent)); - updatecmd.Parameters.Add(new SqliteParameter(":f_send_packet", uid.session_data.f_send_packet)); - - updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":agent_key", uid.session_data.agent_id.ToString())); - updatecmd.Parameters.Add(new SqliteParameter(":region_key", uid.session_data.region_id.ToString())); -// m_log.Debug("UPDATE"); - - int result = updatecmd.ExecuteNonQuery(); - - if (result == 0) + using (SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_UPDATE, db)) { -// m_log.Debug("INSERT"); - updatecmd.CommandText = SQL_STATS_TABLE_INSERT; - try - { - updatecmd.ExecuteNonQuery(); - } - catch (SqliteExecutionException) - { - m_log.Warn("[WEB STATS MODULE]: failed to write stats to storage Execution Exception"); - } - catch (SqliteSyntaxException) - { - m_log.Warn("[WEB STATS MODULE]: failed to write stats to storage SQL Syntax Exception"); - } + updatecmd.Parameters.Add(new SqliteParameter(":session_id", uid.session_data.session_id.ToString())); + updatecmd.Parameters.Add(new SqliteParameter(":agent_id", uid.session_data.agent_id.ToString())); + updatecmd.Parameters.Add(new SqliteParameter(":region_id", uid.session_data.region_id.ToString())); + updatecmd.Parameters.Add(new SqliteParameter(":last_updated", (int) uid.session_data.last_updated)); + updatecmd.Parameters.Add(new SqliteParameter(":remote_ip", uid.session_data.remote_ip)); + updatecmd.Parameters.Add(new SqliteParameter(":name_f", uid.session_data.name_f)); + updatecmd.Parameters.Add(new SqliteParameter(":name_l", uid.session_data.name_l)); + updatecmd.Parameters.Add(new SqliteParameter(":avg_agents_in_view", uid.session_data.avg_agents_in_view)); + updatecmd.Parameters.Add(new SqliteParameter(":min_agents_in_view", + (int) uid.session_data.min_agents_in_view)); + updatecmd.Parameters.Add(new SqliteParameter(":max_agents_in_view", + (int) uid.session_data.max_agents_in_view)); + updatecmd.Parameters.Add(new SqliteParameter(":mode_agents_in_view", + (int) uid.session_data.mode_agents_in_view)); + updatecmd.Parameters.Add(new SqliteParameter(":avg_fps", uid.session_data.avg_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":min_fps", uid.session_data.min_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":max_fps", uid.session_data.max_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":mode_fps", uid.session_data.mode_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":a_language", uid.session_data.a_language)); + updatecmd.Parameters.Add(new SqliteParameter(":mem_use", uid.session_data.mem_use)); + updatecmd.Parameters.Add(new SqliteParameter(":meters_traveled", uid.session_data.meters_traveled)); + updatecmd.Parameters.Add(new SqliteParameter(":avg_ping", uid.session_data.avg_ping)); + updatecmd.Parameters.Add(new SqliteParameter(":min_ping", uid.session_data.min_ping)); + updatecmd.Parameters.Add(new SqliteParameter(":max_ping", uid.session_data.max_ping)); + updatecmd.Parameters.Add(new SqliteParameter(":mode_ping", uid.session_data.mode_ping)); + updatecmd.Parameters.Add(new SqliteParameter(":regions_visited", uid.session_data.regions_visited)); + updatecmd.Parameters.Add(new SqliteParameter(":run_time", uid.session_data.run_time)); + updatecmd.Parameters.Add(new SqliteParameter(":avg_sim_fps", uid.session_data.avg_sim_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":min_sim_fps", uid.session_data.min_sim_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":max_sim_fps", uid.session_data.max_sim_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":mode_sim_fps", uid.session_data.mode_sim_fps)); + updatecmd.Parameters.Add(new SqliteParameter(":start_time", uid.session_data.start_time)); + updatecmd.Parameters.Add(new SqliteParameter(":client_version", uid.session_data.client_version)); + updatecmd.Parameters.Add(new SqliteParameter(":s_cpu", uid.session_data.s_cpu)); + updatecmd.Parameters.Add(new SqliteParameter(":s_gpu", uid.session_data.s_gpu)); + updatecmd.Parameters.Add(new SqliteParameter(":s_os", uid.session_data.s_os)); + updatecmd.Parameters.Add(new SqliteParameter(":s_ram", uid.session_data.s_ram)); + updatecmd.Parameters.Add(new SqliteParameter(":d_object_kb", uid.session_data.d_object_kb)); + updatecmd.Parameters.Add(new SqliteParameter(":d_texture_kb", uid.session_data.d_texture_kb)); + updatecmd.Parameters.Add(new SqliteParameter(":d_world_kb", uid.session_data.d_world_kb)); + updatecmd.Parameters.Add(new SqliteParameter(":n_in_kb", uid.session_data.n_in_kb)); + updatecmd.Parameters.Add(new SqliteParameter(":n_in_pk", uid.session_data.n_in_pk)); + updatecmd.Parameters.Add(new SqliteParameter(":n_out_kb", uid.session_data.n_out_kb)); + updatecmd.Parameters.Add(new SqliteParameter(":n_out_pk", uid.session_data.n_out_pk)); + updatecmd.Parameters.Add(new SqliteParameter(":f_dropped", uid.session_data.f_dropped)); + updatecmd.Parameters.Add(new SqliteParameter(":f_failed_resends", uid.session_data.f_failed_resends)); + updatecmd.Parameters.Add(new SqliteParameter(":f_invalid", uid.session_data.f_invalid)); + + updatecmd.Parameters.Add(new SqliteParameter(":f_off_circuit", uid.session_data.f_off_circuit)); + updatecmd.Parameters.Add(new SqliteParameter(":f_resent", uid.session_data.f_resent)); + updatecmd.Parameters.Add(new SqliteParameter(":f_send_packet", uid.session_data.f_send_packet)); + + updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString())); + updatecmd.Parameters.Add(new SqliteParameter(":agent_key", uid.session_data.agent_id.ToString())); + updatecmd.Parameters.Add(new SqliteParameter(":region_key", uid.session_data.region_id.ToString())); +// m_log.DebugFormat("[WEB STATS MODULE]: Database stats update for {0}", uid.session_data.agent_id); + + int result = updatecmd.ExecuteNonQuery(); + + if (result == 0) + { +// m_log.DebugFormat("[WEB STATS MODULE]: Database stats insert for {0}", uid.session_data.agent_id); + + updatecmd.CommandText = SQL_STATS_TABLE_INSERT; + + try + { + updatecmd.ExecuteNonQuery(); + } + catch (Exception e) + { + m_log.WarnFormat( + "[WEB STATS MODULE]: failed to write stats for {0}, storage Execution Exception {1}{2}", + uid.session_data.agent_id, e.Message, e.StackTrace); + } + } } } } From 40c838896c18a9ee0283386cdcdc13adec5ae3d6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 29 Feb 2012 00:33:17 +0000 Subject: [PATCH 05/25] Use correct casing of RegionSettings.Sandbox in the various database modules. MySQL and MSSQL have it as Sandbox, sqlite as sandbox. In various different places in every plugin the wrong casing is used... Consistency, who needs it? Or one day sqlite can change to Sandbox. --- OpenSim/Data/MSSQL/MSSQLSimulationData.cs | 4 ++-- OpenSim/Data/MySQL/MySQLSimulationData.cs | 2 +- OpenSim/Data/SQLite/SQLiteSimulationData.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index e58620a7a0..d6b1561055 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs @@ -1367,7 +1367,7 @@ VALUES newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]); newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]); newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]); - newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]); + newSettings.Sandbox = Convert.ToBoolean(row["Sandbox"]); newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]); newSettings.SunPosition = Convert.ToDouble(row["sun_position"]); newSettings.SunVector = new Vector3( @@ -1782,7 +1782,7 @@ VALUES parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit)); parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit)); parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun)); - parameters.Add(_Database.CreateParameter("sandbox", settings.Sandbox)); + parameters.Add(_Database.CreateParameter("Sandbox", settings.Sandbox)); parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun)); parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition)); parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X)); diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index 7c995ad4c4..381a514bea 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -1283,7 +1283,7 @@ namespace OpenSim.Data.MySQL newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]); newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]); newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]); - newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]); + newSettings.Sandbox = Convert.ToBoolean(row["Sandbox"]); newSettings.SunVector = new Vector3 ( Convert.ToSingle(row["sunvectorx"]), Convert.ToSingle(row["sunvectory"]), diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 186a58622d..7e7c08a74f 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -2157,7 +2157,7 @@ namespace OpenSim.Data.SQLite row["terrain_raise_limit"] = settings.TerrainRaiseLimit; row["terrain_lower_limit"] = settings.TerrainLowerLimit; row["use_estate_sun"] = settings.UseEstateSun; - row["Sandbox"] = settings.Sandbox; // database uses upper case S for sandbox + row["sandbox"] = settings.Sandbox; // unlike other database modules, sqlite uses a lower case s for sandbox! row["sunvectorx"] = settings.SunVector.X; row["sunvectory"] = settings.SunVector.Y; row["sunvectorz"] = settings.SunVector.Z; From a181fae72276073d7b3cd9c15e1448a3fabbb8f9 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 29 Feb 2012 03:00:56 +0000 Subject: [PATCH 06/25] Don't start pCampbot if the user doesn't supply bot firstname, lastname stub and password --- OpenSim/Tools/pCampBot/pCampBot.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs index a73fcbec8f..ec5ad04fce 100644 --- a/OpenSim/Tools/pCampBot/pCampBot.cs +++ b/OpenSim/Tools/pCampBot/pCampBot.cs @@ -56,6 +56,10 @@ namespace pCampBot { Help(); } + else if (config.Get("firstname") == null || config.Get("lastname") == null || config.Get("password") == null) + { + Console.WriteLine("ERROR: You must supply a firstname, lastname and password for the bots."); + } else { int botcount = config.GetInt("botcount", 1); From 9f597c2d423a80279c4aed042be8a991eedefa21 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Wed, 29 Feb 2012 14:37:52 -0500 Subject: [PATCH 07/25] Fix authentication for OpenID provider --- .../AuthenticationService/PasswordAuthenticationService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs index 48eb3f8efe..da19b2ec41 100644 --- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs @@ -78,9 +78,9 @@ namespace OpenSim.Services.AuthenticationService } else { - string hashed = Util.Md5Hash(password + ":" + data.Data["passwordSalt"].ToString()); + string hashed = Util.Md5Hash(Util.Md5Hash(password) + ":" + data.Data["passwordSalt"].ToString()); - //m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}", password, hashed, data.Data["passwordHash"].ToString()); + // m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}; passonly {3}", password, hashed, data.Data["passwordHash"].ToString(), hashed2); if (data.Data["passwordHash"].ToString() == hashed) { From 1a54e769488c9d2eaaaa7e65e0956e7a7bac789a Mon Sep 17 00:00:00 2001 From: BlueWall Date: Wed, 29 Feb 2012 14:54:06 -0500 Subject: [PATCH 08/25] Trigger a build --- README.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/README.txt b/README.txt index 72702a231d..a5dec245c4 100644 --- a/README.txt +++ b/README.txt @@ -128,3 +128,4 @@ OpenSim, as well as how to report bugs, and participate in the OpenSim project can always be found at http://opensimulator.org. Thanks for trying OpenSim, we hope it is a pleasant experience. + From 69c999033b4d5772c8eed0a90d5f9237785224ff Mon Sep 17 00:00:00 2001 From: BlueWall Date: Wed, 29 Feb 2012 15:52:15 -0500 Subject: [PATCH 09/25] Revert "Fix authentication for OpenID provider" This reverts commit 9f597c2d423a80279c4aed042be8a991eedefa21. Fixing OpenID causes issues with other parts of the code. --- .../AuthenticationService/PasswordAuthenticationService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs index da19b2ec41..48eb3f8efe 100644 --- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs @@ -78,9 +78,9 @@ namespace OpenSim.Services.AuthenticationService } else { - string hashed = Util.Md5Hash(Util.Md5Hash(password) + ":" + data.Data["passwordSalt"].ToString()); + string hashed = Util.Md5Hash(password + ":" + data.Data["passwordSalt"].ToString()); - // m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}; passonly {3}", password, hashed, data.Data["passwordHash"].ToString(), hashed2); + //m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}", password, hashed, data.Data["passwordHash"].ToString()); if (data.Data["passwordHash"].ToString() == hashed) { From 1e95b01f13044703c6737a0aee84ae3ac998534c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 29 Feb 2012 21:51:46 +0000 Subject: [PATCH 10/25] Extend distsrc target to cleanup the files generated by running prebuild --- .nant/local.include | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.nant/local.include b/.nant/local.include index 7d1681011b..6d3e97228f 100644 --- a/.nant/local.include +++ b/.nant/local.include @@ -8,6 +8,24 @@ + + + + + + + + + + + + + + + + + + From aabbbb32ffd353ece2addf39c64f3ff3e15ca7d4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 29 Feb 2012 23:45:14 +0000 Subject: [PATCH 11/25] Flick master up to 0.7.4 --- OpenSim/Framework/Servers/VersionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index f30cb7a4c0..7a5d7158d6 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs @@ -29,7 +29,7 @@ namespace OpenSim { public class VersionInfo { - private const string VERSION_NUMBER = "0.7.3"; + private const string VERSION_NUMBER = "0.7.4"; private const Flavour VERSION_FLAVOUR = Flavour.Dev; public enum Flavour From 255afbf08a8829d05ea7fb24ad9d21e397d53428 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 1 Mar 2012 02:11:15 +0000 Subject: [PATCH 12/25] Remove more now unused third party libraries. --- bin/Google.ProtocolBuffers.dll | Bin 246784 -> 0 bytes bin/Iesi.Collections.dll | Bin 32768 -> 0 bytes bin/Kds.Serialization.dll | Bin 40960 -> 0 bytes bin/MonoXnaCompactMaths.dll | Bin 36864 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 bin/Google.ProtocolBuffers.dll delete mode 100755 bin/Iesi.Collections.dll delete mode 100755 bin/Kds.Serialization.dll delete mode 100755 bin/MonoXnaCompactMaths.dll diff --git a/bin/Google.ProtocolBuffers.dll b/bin/Google.ProtocolBuffers.dll deleted file mode 100755 index 666aa935253631b8aa45dc3d0b42ad2396d9cb45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246784 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%0D#buaGte-MiBwhk1Efy+ycYoXYN!9d)gi<}wXP^> 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 PkfuY!{_CIr?-2OkF$&d0 diff --git a/bin/Iesi.Collections.dll b/bin/Iesi.Collections.dll deleted file mode 100755 index 107c362ce042656e1da7d06154aa43c73efa1865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 PpnyODfdT^m-4XbI;%mc* diff --git a/bin/Kds.Serialization.dll b/bin/Kds.Serialization.dll deleted file mode 100755 index 7f03277c73e62d8b6b300b6cf50ad24274a76d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 diff --git a/bin/MonoXnaCompactMaths.dll b/bin/MonoXnaCompactMaths.dll deleted file mode 100755 index 9fe8334969fccacf7e698e25374010997c28b2ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 From 0007711eb5947d292f10325dd4af640ece79ea2d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 1 Mar 2012 03:23:10 +0000 Subject: [PATCH 13/25] Use a fully stubbed out MockConsole for unit tests rather than inheriting from CommandConsole. This is so that the static MainConsole.Instance doesn't retain references to methods registered by scene and other modules to service commands. This prevents the scene from being garbage collected at the end of a test. This is not the final thing preventing GC - next up is the timer started by SimStatsReporter that holds a reference to Scene that prevents end of test gc. --- OpenSim/Framework/Console/MockConsole.cs | 59 ++++++++++++-------- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 2 +- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/OpenSim/Framework/Console/MockConsole.cs b/OpenSim/Framework/Console/MockConsole.cs index a29b370857..4d8751f5f6 100644 --- a/OpenSim/Framework/Console/MockConsole.cs +++ b/OpenSim/Framework/Console/MockConsole.cs @@ -29,6 +29,7 @@ using System; using System.Threading; using System.Collections.Generic; using System.Text; +using System.Xml; namespace OpenSim.Framework.Console { @@ -37,28 +38,42 @@ namespace OpenSim.Framework.Console /// Don't use this except for Unit Testing or you're in for a world of hurt when the /// sim gets to ReadLine /// - public class MockConsole : CommandConsole + public class MockConsole : ICommandConsole { - public MockConsole(string defaultPrompt) : base(defaultPrompt) - { - } - public override void Output(string text) - { - } - public override void Output(string text, string level) - { - } + private MockCommands m_commands = new MockCommands(); - public override string ReadLine(string p, bool isCommand, bool e) - { - //Thread.CurrentThread.Join(1000); - return string.Empty; - } - public override void UnlockOutput() - { - } - public override void LockOutput() - { - } + public ICommands Commands { get { return m_commands; } } + + public void Prompt() {} + + public void RunCommand(string cmd) {} + + public string ReadLine(string p, bool isCommand, bool e) { return ""; } + + public object ConsoleScene { get { return null; } } + + public void Output(string text, string level) {} + public void Output(string text) {} + public void OutputFormat(string format, params object[] components) {} + + public string CmdPrompt(string p) { return ""; } + public string CmdPrompt(string p, string def) { return ""; } + public string CmdPrompt(string p, List excludedCharacters) { return ""; } + public string CmdPrompt(string p, string def, List excludedCharacters) { return ""; } + + public string CmdPrompt(string prompt, string defaultresponse, List options) { return ""; } + + public string PasswdPrompt(string p) { return ""; } } -} + + public class MockCommands : ICommands + { + public void FromXml(XmlElement root, CommandDelegate fn) {} + public List GetHelp(string[] cmd) { return null; } + public void AddCommand(string module, bool shared, string command, string help, string longhelp, CommandDelegate fn) {} + public void AddCommand(string module, bool shared, string command, string help, string longhelp, string descriptivehelp, CommandDelegate fn) {} + public string[] FindNextOption(string[] cmd, bool term) { return null; } + public string[] Resolve(string[] cmd) { return null; } + public XmlElement GetXml(XmlDocument doc) { return null; } + } +} \ No newline at end of file diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index aa904aad9c..8a69d7c21b 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -113,7 +113,7 @@ namespace OpenSim.Tests.Common Console.WriteLine("Setting up test scene {0}", name); // We must set up a console otherwise setup of some modules may fail - MainConsole.Instance = new MockConsole("TEST PROMPT"); + MainConsole.Instance = new MockConsole(); RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "127.0.0.1"); regInfo.RegionName = name; From a2b0ed537ebb539e17491ea368903a346b1bed56 Mon Sep 17 00:00:00 2001 From: BlueWall Date: Thu, 1 Mar 2012 14:18:48 -0500 Subject: [PATCH 14/25] Fix indexing on string trim Thanks to zadark for pointing this out, smxy for deciphering the ?: operator and Plugh for the fix \o/ yay for IRC --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c5392b590a..00035154d1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4039,7 +4039,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Vector3 av3 = new Vector3(Util.Clip((float)color.x, 0.0f, 1.0f), Util.Clip((float)color.y, 0.0f, 1.0f), Util.Clip((float)color.z, 0.0f, 1.0f)); - m_host.SetText(text.Length > 254 ? text.Remove(255) : text, av3, Util.Clip((float)alpha, 0.0f, 1.0f)); + m_host.SetText(text.Length > 254 ? text.Remove(254) : text, av3, Util.Clip((float)alpha, 0.0f, 1.0f)); //m_host.ParentGroup.HasGroupChanged = true; //m_host.ParentGroup.ScheduleGroupForFullUpdate(); } From 8a375f3c30302c4a7ace1afb05a8b49fbb415640 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 1 Mar 2012 14:49:49 -0800 Subject: [PATCH 15/25] Adds an OSSL command for regular expression-based string replacement. Parameters are osReplaceString(string source, string patter, string replace, integer count, integer start) The count parameter specifies the total number of replacements to make, -1 makes all replacements. --- .../Shared/Api/Implementation/OSSL_Api.cs | 25 +++++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Shared/Api/Runtime/OSSL_Stub.cs | 6 +++++ 3 files changed, 32 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index ff1f5fddff..8edd1465f0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2160,6 +2160,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return result; } + public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) + { + CheckThreatLevel(ThreatLevel.High, "osReplaceString"); + m_host.AddScriptLPS(1); + + // Normalize indices (if negative). + // After normlaization they may still be + // negative, but that is now relative to + // the start, rather than the end, of the + // sequence. + if (start < 0) + { + start = src.Length + start; + } + + if (start < 0 || start >= src.Length) + { + return src; + } + + // Find matches beginning at start position + Regex matcher = new Regex(pattern); + return matcher.Replace(src,replace,count,start); + } + public string osLoadedCreationDate() { CheckThreatLevel(ThreatLevel.Low, "osLoadedCreationDate"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index dbc1dfc804..82a6caf282 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -165,6 +165,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_String osFormatString(string str, LSL_List strings); LSL_List osMatchString(string src, string pattern, int start); + LSL_String osReplaceString(string src, string pattern, string replace, int count, int start); // Information about data loaded into the region string osLoadedCreationDate(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index cc8d417d64..4341246f07 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -472,6 +472,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osMatchString(src, pattern, start); } + public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) + { + return m_OSSL_Functions.osReplaceString(src,pattern,replace,count,start); + } + + // Information about data loaded into the region public string osLoadedCreationDate() { From dcfd05c8eaa4550d9be4c673d660497da1e035c8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 00:22:23 +0000 Subject: [PATCH 16/25] lock SenseRepeatListLock when added a new sensor during script reconstitution. This is already being done in the other place where a sensor is added. Adding a sensor whilst another thread is iterating over the sensor list can cause a concurrency exception. --- .../Shared/Api/Implementation/Plugins/SensorRepeat.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 5c1bdff9db..8383c7f37e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -635,7 +635,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); - SenseRepeaters.Add(ts); + lock (SenseRepeatListLock) + SenseRepeaters.Add(ts); + idx += 6; } } From d8c4985527f1ffdea0f21714808522a350d85013 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 00:28:37 +0000 Subject: [PATCH 17/25] Move SenseRepeaters.Count check inside the SenseRepeatListLock. No methods in the List class are thread safe in the MS specification/documentation --- .../Shared/Api/Implementation/Plugins/SensorRepeat.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 8383c7f37e..fbb7c39265 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -157,12 +157,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins public void CheckSenseRepeaterEvents() { - // Nothing to do here? - if (SenseRepeaters.Count == 0) - return; - lock (SenseRepeatListLock) { + // Nothing to do here? + if (SenseRepeaters.Count == 0) + return; + // Go through all timers foreach (SenseRepeatClass ts in SenseRepeaters) { From 94971bf3b9fd53b571701e7d9a3a94628763da71 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 01:31:28 +0000 Subject: [PATCH 18/25] Provide feedback on bot login states in pCampbot --- OpenSim/Tools/pCampBot/Bot.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index 0bd0bcc5f3..da090dda64 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs @@ -420,6 +420,8 @@ namespace pCampBot public void Network_LoginProgress(object sender, LoginProgressEventArgs args) { + m_log.DebugFormat("[BOT]: Bot {0} {1} in Network_LoginProcess", Name, args.Status); + if (args.Status == LoginStatus.Success) { if (OnConnected != null) @@ -431,10 +433,15 @@ namespace pCampBot public void Network_SimConnected(object sender, SimConnectedEventArgs args) { + m_log.DebugFormat( + "[BOT]: Bot {0} connected to {1} at {2}", Name, args.Simulator.Name, args.Simulator.IPEndPoint); } public void Network_OnDisconnected(object sender, DisconnectedEventArgs args) { + m_log.DebugFormat( + "[BOT]: Bot {0} disconnected reason {1}, message {2}", Name, args.Reason, args.Message); + // m_log.ErrorFormat("Fired Network_OnDisconnected"); // if ( From ec48a2f32ba991b89705b8212b0df8a79e961156 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 01:54:48 +0000 Subject: [PATCH 19/25] minor: Rename pCampbot console prompt to "pCampbot" rather than "Region" --- OpenSim/Tools/pCampBot/BotManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index 6481e97eb7..0f501b788b 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -266,7 +266,7 @@ namespace pCampBot /// protected CommandConsole CreateConsole() { - return new LocalConsole("Region"); + return new LocalConsole("pCampbot"); } private void HandleShutdown(string module, string[] cmd) From e8779cd9e54416349e67d9e5c48b35bab43b69e9 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 1 Mar 2012 19:22:05 -0800 Subject: [PATCH 20/25] In ScenePresence, removed several private variables used to store public parameters. They were only used by the get/set and make code harder to refactor. --- .../Region/Framework/Scenes/ScenePresence.cs | 152 +++++------------- 1 file changed, 44 insertions(+), 108 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 40c8d0600a..e982bfe7c2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -341,15 +341,9 @@ namespace OpenSim.Region.Framework.Scenes /// /// Position of agent's camera in world (region cordinates) /// - protected Vector3 m_lastCameraPosition; - - protected Vector3 m_CameraPosition; - - public Vector3 CameraPosition - { - get { return m_CameraPosition; } - private set { m_CameraPosition = value; } - } + protected Vector3 m_lastCameraPosition; + + public Vector3 CameraPosition { get; set; } public Quaternion CameraRotation { @@ -358,29 +352,10 @@ namespace OpenSim.Region.Framework.Scenes // Use these three vectors to figure out what the agent is looking at // Convert it to a Matrix and/or Quaternion - // - protected Vector3 m_CameraAtAxis; - protected Vector3 m_CameraLeftAxis; - protected Vector3 m_CameraUpAxis; - - public Vector3 CameraAtAxis - { - get { return m_CameraAtAxis; } - private set { m_CameraAtAxis = value; } - } - - - public Vector3 CameraLeftAxis - { - get { return m_CameraLeftAxis; } - private set { m_CameraLeftAxis = value; } - } - - public Vector3 CameraUpAxis - { - get { return m_CameraUpAxis; } - private set { m_CameraUpAxis = value; } - } + // + public Vector3 CameraAtAxis { get; set; } + public Vector3 CameraLeftAxis { get; set; } + public Vector3 CameraUpAxis { get; set; } public Vector3 Lookat { @@ -396,33 +371,15 @@ namespace OpenSim.Region.Framework.Scenes } #endregion - public readonly string Firstname; - public readonly string Lastname; + public string Firstname { get; private set; } + public string Lastname { get; private set; } + + public string Grouptitle { get; set; } - private string m_grouptitle; - - public string Grouptitle - { - get { return m_grouptitle; } - set { m_grouptitle = value; } - } - - // Agent's Draw distance. - protected float m_DrawDistance; - - public float DrawDistance - { - get { return m_DrawDistance; } - private set { m_DrawDistance = value; } - } - - protected bool m_allowMovement = true; - - public bool AllowMovement - { - get { return m_allowMovement; } - set { m_allowMovement = value; } - } + // Agent's Draw distance. + public float DrawDistance { get; set; } + + public bool AllowMovement { get; set; } private bool m_setAlwaysRun; @@ -447,15 +404,9 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor.SetAlwaysRun = value; } } - } - - private byte m_state; - - public byte State - { - get { return m_state; } - set { m_state = value; } - } + } + + public byte State { get; set; } private AgentManager.ControlFlags m_AgentControlFlags; @@ -463,31 +414,16 @@ namespace OpenSim.Region.Framework.Scenes { get { return (uint)m_AgentControlFlags; } set { m_AgentControlFlags = (AgentManager.ControlFlags)value; } - } - - /// - /// This works out to be the ClientView object associated with this avatar, or it's client connection manager - /// - private IClientAPI m_controllingClient; - - public IClientAPI ControllingClient - { - get { return m_controllingClient; } - private set { m_controllingClient = value; } - } + } + + public IClientAPI ControllingClient { get; set; } public IClientCore ClientView - { - get { return (IClientCore) m_controllingClient; } - } - - protected Vector3 m_parentPosition; - - public Vector3 ParentPosition - { - get { return m_parentPosition; } - set { m_parentPosition = value; } - } + { + get { return (IClientCore)ControllingClient; } + } + + public Vector3 ParentPosition { get; set; } /// /// Position of this avatar relative to the region the avatar is in @@ -825,18 +761,18 @@ namespace OpenSim.Region.Framework.Scenes private Vector3[] GetWalkDirectionVectors() { - Vector3[] vector = new Vector3[11]; - vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD - vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK + Vector3[] vector = new Vector3[11]; + vector[0] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD + vector[1] = new Vector3(-CameraUpAxis.Z, 0f, CameraAtAxis.Z); //BACK vector[2] = Vector3.UnitY; //LEFT - vector[3] = -Vector3.UnitY; //RIGHT - vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP - vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN - vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE - vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE + vector[3] = -Vector3.UnitY; //RIGHT + vector[4] = new Vector3(CameraAtAxis.Z, 0f, CameraUpAxis.Z); //UP + vector[5] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN + vector[6] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD_NUDGE + vector[7] = new Vector3(-CameraUpAxis.Z, 0f, CameraAtAxis.Z); //BACK_NUDGE vector[8] = Vector3.UnitY; //LEFT_NUDGE - vector[9] = -Vector3.UnitY; //RIGHT_NUDGE - vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE + vector[9] = -Vector3.UnitY; //RIGHT_NUDGE + vector[10] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN_NUDGE return vector; } @@ -1333,7 +1269,7 @@ namespace OpenSim.Region.Framework.Scenes // Convert it to a Matrix and/or Quaternion CameraAtAxis = agentData.CameraAtAxis; CameraLeftAxis = agentData.CameraLeftAxis; - m_CameraUpAxis = agentData.CameraUpAxis; + CameraUpAxis = agentData.CameraUpAxis; // The Agent's Draw distance setting // When we get to the point of re-computing neighbors everytime this @@ -1343,9 +1279,9 @@ namespace OpenSim.Region.Framework.Scenes DrawDistance = Scene.DefaultDrawDistance; // Check if Client has camera in 'follow cam' or 'build' mode. - Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation); - - m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f) + Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation); + + m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f) && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; @@ -3077,8 +3013,8 @@ namespace OpenSim.Region.Framework.Scenes cAgent.Velocity = m_velocity; cAgent.Center = CameraPosition; cAgent.AtAxis = CameraAtAxis; - cAgent.LeftAxis = CameraLeftAxis; - cAgent.UpAxis = m_CameraUpAxis; + cAgent.LeftAxis = CameraLeftAxis; + cAgent.UpAxis = CameraUpAxis; cAgent.Far = DrawDistance; @@ -3163,8 +3099,8 @@ namespace OpenSim.Region.Framework.Scenes m_velocity = cAgent.Velocity; CameraPosition = cAgent.Center; CameraAtAxis = cAgent.AtAxis; - CameraLeftAxis = cAgent.LeftAxis; - m_CameraUpAxis = cAgent.UpAxis; + CameraLeftAxis = cAgent.LeftAxis; + CameraUpAxis = cAgent.UpAxis; // When we get to the point of re-computing neighbors everytime this // changes, then start using the agent's drawdistance rather than the From 8fccd2b55514a373bf127b49a729d047240c9701 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 1 Mar 2012 19:55:51 -0800 Subject: [PATCH 21/25] Send the right name and creation date on the BasicProfileModule. --- .../Avatar/Profile/BasicProfileModule.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs index eb1e4b5f13..8101ca21c3 100644 --- a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs @@ -150,7 +150,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile string skillsText = String.Empty; string languages = String.Empty; - Byte[] charterMember = Utils.StringToBytes("Avatar"); + UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, avatarID); + + string name = "Avatar"; + int created = 0; + if (account != null) + { + name = account.FirstName + " " + account.LastName; + created = account.Created; + } + Byte[] charterMember = Utils.StringToBytes(name); profileUrl = "No profile data"; aboutText = string.Empty; @@ -160,7 +169,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile partner = UUID.Zero; remoteClient.SendAvatarProperties(avatarID, aboutText, - Util.ToDateTime(0).ToString( + Util.ToDateTime(created).ToString( "M/d/yyyy", CultureInfo.InvariantCulture), charterMember, firstLifeAboutText, (uint)(0 & 0xff), From 6e3523e25e8d5538ed63984241093c1cfb6f2388 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 04:08:07 +0000 Subject: [PATCH 22/25] minor: remove mono compiler warning --- OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index e4b607daaf..e16903c47c 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -65,8 +65,7 @@ namespace OpenSim.Region.Framework.Tests // Create an object embedded inside the first UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); - TaskInventoryItem taskSceneObjectItem - = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID); + TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID); TaskInventoryItem addedItem = sop1.Inventory.GetInventoryItem(taskSceneObjectItemId); Assert.That(addedItem.ItemID, Is.EqualTo(taskSceneObjectItemId)); From 8d249f8456f6bf70f4d81098007a02b1ede5587e Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Fri, 2 Mar 2012 09:19:13 -0800 Subject: [PATCH 23/25] ScenePresence line endings and fix AllowMovement default to true. --- .../Region/Framework/Scenes/ScenePresence.cs | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index e982bfe7c2..ec6bb89684 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -341,8 +341,8 @@ namespace OpenSim.Region.Framework.Scenes /// /// Position of agent's camera in world (region cordinates) /// - protected Vector3 m_lastCameraPosition; - + protected Vector3 m_lastCameraPosition; + public Vector3 CameraPosition { get; set; } public Quaternion CameraRotation @@ -352,9 +352,9 @@ namespace OpenSim.Region.Framework.Scenes // Use these three vectors to figure out what the agent is looking at // Convert it to a Matrix and/or Quaternion - // - public Vector3 CameraAtAxis { get; set; } - public Vector3 CameraLeftAxis { get; set; } + // + public Vector3 CameraAtAxis { get; set; } + public Vector3 CameraLeftAxis { get; set; } public Vector3 CameraUpAxis { get; set; } public Vector3 Lookat @@ -371,14 +371,14 @@ namespace OpenSim.Region.Framework.Scenes } #endregion - public string Firstname { get; private set; } - public string Lastname { get; private set; } - + public string Firstname { get; private set; } + public string Lastname { get; private set; } + public string Grouptitle { get; set; } - // Agent's Draw distance. - public float DrawDistance { get; set; } - + // Agent's Draw distance. + public float DrawDistance { get; set; } + public bool AllowMovement { get; set; } private bool m_setAlwaysRun; @@ -404,8 +404,8 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor.SetAlwaysRun = value; } } - } - + } + public byte State { get; set; } private AgentManager.ControlFlags m_AgentControlFlags; @@ -414,15 +414,15 @@ namespace OpenSim.Region.Framework.Scenes { get { return (uint)m_AgentControlFlags; } set { m_AgentControlFlags = (AgentManager.ControlFlags)value; } - } - + } + public IClientAPI ControllingClient { get; set; } public IClientCore ClientView - { + { get { return (IClientCore)ControllingClient; } - } - + } + public Vector3 ParentPosition { get; set; } /// @@ -683,7 +683,7 @@ namespace OpenSim.Region.Framework.Scenes IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type) { AttachmentsSyncLock = new Object(); - + AllowMovement = true; IsChildAgent = true; m_sendCourseLocationsMethod = SendCoarseLocationsDefault; Animator = new ScenePresenceAnimator(this); @@ -761,17 +761,17 @@ namespace OpenSim.Region.Framework.Scenes private Vector3[] GetWalkDirectionVectors() { - Vector3[] vector = new Vector3[11]; - vector[0] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD + Vector3[] vector = new Vector3[11]; + vector[0] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD vector[1] = new Vector3(-CameraUpAxis.Z, 0f, CameraAtAxis.Z); //BACK vector[2] = Vector3.UnitY; //LEFT - vector[3] = -Vector3.UnitY; //RIGHT - vector[4] = new Vector3(CameraAtAxis.Z, 0f, CameraUpAxis.Z); //UP - vector[5] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN - vector[6] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD_NUDGE + vector[3] = -Vector3.UnitY; //RIGHT + vector[4] = new Vector3(CameraAtAxis.Z, 0f, CameraUpAxis.Z); //UP + vector[5] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN + vector[6] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD_NUDGE vector[7] = new Vector3(-CameraUpAxis.Z, 0f, CameraAtAxis.Z); //BACK_NUDGE vector[8] = Vector3.UnitY; //LEFT_NUDGE - vector[9] = -Vector3.UnitY; //RIGHT_NUDGE + vector[9] = -Vector3.UnitY; //RIGHT_NUDGE vector[10] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN_NUDGE return vector; } @@ -1279,8 +1279,8 @@ namespace OpenSim.Region.Framework.Scenes DrawDistance = Scene.DefaultDrawDistance; // Check if Client has camera in 'follow cam' or 'build' mode. - Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation); - + Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation); + m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f) && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; @@ -3013,7 +3013,7 @@ namespace OpenSim.Region.Framework.Scenes cAgent.Velocity = m_velocity; cAgent.Center = CameraPosition; cAgent.AtAxis = CameraAtAxis; - cAgent.LeftAxis = CameraLeftAxis; + cAgent.LeftAxis = CameraLeftAxis; cAgent.UpAxis = CameraUpAxis; cAgent.Far = DrawDistance; @@ -3099,7 +3099,7 @@ namespace OpenSim.Region.Framework.Scenes m_velocity = cAgent.Velocity; CameraPosition = cAgent.Center; CameraAtAxis = cAgent.AtAxis; - CameraLeftAxis = cAgent.LeftAxis; + CameraLeftAxis = cAgent.LeftAxis; CameraUpAxis = cAgent.UpAxis; // When we get to the point of re-computing neighbors everytime this From 089fd61a3b27faa2479f6b56c6d0dc1cf14774a2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 22:43:24 +0000 Subject: [PATCH 24/25] Allow a script to receive events if its root prim is in an area where it's allowed to run rather than checking its own prim. This allows scripts to run in child prims that are outside region boundaries. This is an interim patch applied from http://opensimulator.org/mantis/view.php?id=5899 though it does not resolve that bug Thanks tglion! --- OpenSim/Region/Framework/Scenes/Scene.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 9bca654d12..f45a08ceb1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4162,10 +4162,7 @@ namespace OpenSim.Region.Framework.Scenes // their scripts will actually run. // -- Leaf, Tue Aug 12 14:17:05 EDT 2008 SceneObjectPart parent = part.ParentGroup.RootPart; - if (part.ParentGroup.IsAttachment) - return ScriptDanger(parent, parent.GetWorldPosition()); - else - return ScriptDanger(part, part.GetWorldPosition()); + return ScriptDanger(parent, parent.GetWorldPosition()); } else { From c2c102d33e46d0ed651198e0e9b7459423516660 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 2 Mar 2012 22:52:26 +0000 Subject: [PATCH 25/25] Remove outdated comment about checking attachment prims in Scene.PipeEventsForScript() --- OpenSim/Region/Framework/Scenes/Scene.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index f45a08ceb1..a01b851914 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4156,11 +4156,9 @@ namespace OpenSim.Region.Framework.Scenes public bool PipeEventsForScript(uint localID) { SceneObjectPart part = GetSceneObjectPart(localID); + if (part != null) { - // Changed so that child prims of attachments return ScriptDanger for their parent, so that - // their scripts will actually run. - // -- Leaf, Tue Aug 12 14:17:05 EDT 2008 SceneObjectPart parent = part.ParentGroup.RootPart; return ScriptDanger(parent, parent.GetWorldPosition()); }