aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMichael Heilmann2015-05-19 14:40:49 -0400
committerMichael Heilmann2015-05-19 14:40:49 -0400
commit714c082ca856a18292cee345d2b875006c41a6d5 (patch)
treefdade1a62aabdf4138f6cbbcbf03bdc9be2ca3c2
parentMerge pull request #5 from gamucf/moses.metricsPhase1 (diff)
parentMerge branch 'master' of https://github.com/M-O-S-E-S/opensim into moses.metr... (diff)
downloadopensim-SC_OLD-714c082ca856a18292cee345d2b875006c41a6d5.zip
opensim-SC_OLD-714c082ca856a18292cee345d2b875006c41a6d5.tar.gz
opensim-SC_OLD-714c082ca856a18292cee345d2b875006c41a6d5.tar.bz2
opensim-SC_OLD-714c082ca856a18292cee345d2b875006c41a6d5.tar.xz
Merge pull request #7 from gamucf/moses.metricsPhase2
Moses.metrics phase2
-rwxr-xr-x[-rw-r--r--]OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs52
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs1399
-rwxr-xr-x[-rw-r--r--]OpenSim/Region/Framework/Scenes/SceneGraph.cs59
-rwxr-xr-xOpenSim/Region/Framework/Scenes/SimStatsReporter.cs219
-rwxr-xr-x[-rw-r--r--]OpenSim/Region/ScriptEngine/XEngine/XEngine.cs36
-rwxr-xr-x[-rw-r--r--]bin/LukeSkywalker.IPNetwork.dllbin18432 -> 18432 bytes
-rwxr-xr-x[-rw-r--r--]bin/OpenSimDefaults.ini2
7 files changed, 1014 insertions, 753 deletions
diff --git a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs
index f6f458d..e4df7ee 100644..100755
--- a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs
+++ b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Diagnostics;
30using System.Linq; 31using System.Linq;
31using System.Text; 32using System.Text;
32using OpenMetaverse; 33using OpenMetaverse;
@@ -71,6 +72,11 @@ namespace OpenSim.Framework.Monitoring
71 private volatile float pendingUploads; 72 private volatile float pendingUploads;
72 private volatile float activeScripts; 73 private volatile float activeScripts;
73 private volatile float scriptLinesPerSecond; 74 private volatile float scriptLinesPerSecond;
75 private volatile float m_frameDilation;
76 private volatile float m_usersLoggingIn;
77 private volatile float m_totalGeoPrims;
78 private volatile float m_totalMeshes;
79 private volatile float m_inUseThreads;
74 80
75// /// <summary> 81// /// <summary>
76// /// These statistics are being collected by push rather than pull. Pull would be simpler, but I had the 82// /// These statistics are being collected by push rather than pull. Pull would be simpler, but I had the
@@ -249,6 +255,10 @@ namespace OpenSim.Framework.Monitoring
249 { 255 {
250 // FIXME: SimStats shouldn't allow an arbitrary stat packing order (which is inherited from the original 256 // FIXME: SimStats shouldn't allow an arbitrary stat packing order (which is inherited from the original
251 // SimStatsPacket that was being used). 257 // SimStatsPacket that was being used).
258
259 // For an unknown reason the original designers decided not to
260 // include the spare MS statistic inside of this class, this is
261 // located inside the StatsBlock at location 21, thus it is skipped
252 timeDilation = stats.StatsBlock[0].StatValue; 262 timeDilation = stats.StatsBlock[0].StatValue;
253 simFps = stats.StatsBlock[1].StatValue; 263 simFps = stats.StatsBlock[1].StatValue;
254 physicsFps = stats.StatsBlock[2].StatValue; 264 physicsFps = stats.StatsBlock[2].StatValue;
@@ -270,6 +280,11 @@ namespace OpenSim.Framework.Monitoring
270 pendingUploads = stats.StatsBlock[18].StatValue; 280 pendingUploads = stats.StatsBlock[18].StatValue;
271 activeScripts = stats.StatsBlock[19].StatValue; 281 activeScripts = stats.StatsBlock[19].StatValue;
272 scriptLinesPerSecond = stats.StatsBlock[20].StatValue; 282 scriptLinesPerSecond = stats.StatsBlock[20].StatValue;
283 m_frameDilation = stats.StatsBlock[22].StatValue;
284 m_usersLoggingIn = stats.StatsBlock[23].StatValue;
285 m_totalGeoPrims = stats.StatsBlock[24].StatValue;
286 m_totalMeshes = stats.StatsBlock[25].StatValue;
287 m_inUseThreads = stats.StatsBlock[26].StatValue;
273 } 288 }
274 289
275 /// <summary> 290 /// <summary>
@@ -407,6 +422,27 @@ Asset service request failures: {3}" + Environment.NewLine,
407 /// <returns></returns> 422 /// <returns></returns>
408 public override OSDMap OReport(string uptime, string version) 423 public override OSDMap OReport(string uptime, string version)
409 { 424 {
425 // Get the amount of physical memory, allocated with the instance of this program, in kilobytes;
426 // the working set is the set of memory pages currently visible to this program in physical RAM
427 // memory and includes both shared (e.g. system libraries) and private data
428 double memUsage = Process.GetCurrentProcess().WorkingSet64 / 1024.0;
429
430 // Get the number of threads from the system that are currently
431 // running
432 int numberThreadsRunning = 0;
433 foreach (ProcessThread currentThread in
434 Process.GetCurrentProcess().Threads)
435 {
436 // A known issue with the current process .Threads property is
437 // that it can return null threads, thus don't count those as
438 // running threads and prevent the program function from failing
439 if (currentThread != null &&
440 currentThread.ThreadState == ThreadState.Running)
441 {
442 numberThreadsRunning++;
443 }
444 }
445
410 OSDMap args = new OSDMap(30); 446 OSDMap args = new OSDMap(30);
411// args["AssetsInCache"] = OSD.FromString (String.Format ("{0:0.##}", AssetsInCache)); 447// args["AssetsInCache"] = OSD.FromString (String.Format ("{0:0.##}", AssetsInCache));
412// args["TimeAfterCacheMiss"] = OSD.FromString (String.Format ("{0:0.##}", 448// args["TimeAfterCacheMiss"] = OSD.FromString (String.Format ("{0:0.##}",
@@ -443,6 +479,22 @@ Asset service request failures: {3}" + Environment.NewLine,
443 args["Memory"] = OSD.FromString (base.XReport (uptime, version)); 479 args["Memory"] = OSD.FromString (base.XReport (uptime, version));
444 args["Uptime"] = OSD.FromString (uptime); 480 args["Uptime"] = OSD.FromString (uptime);
445 args["Version"] = OSD.FromString (version); 481 args["Version"] = OSD.FromString (version);
482
483 args["FrameDilatn"] = OSD.FromString(String.Format("{0:0.##}", m_frameDilation));
484 args["Logging in Users"] = OSD.FromString(String.Format("{0:0.##}",
485 m_usersLoggingIn));
486 args["GeoPrims"] = OSD.FromString(String.Format("{0:0.##}",
487 m_totalGeoPrims));
488 args["Mesh Objects"] = OSD.FromString(String.Format("{0:0.##}",
489 m_totalMeshes));
490 args["XEngine Thread Count"] = OSD.FromString(String.Format("{0:0.##}",
491 m_inUseThreads));
492 args["Util Thread Count"] = OSD.FromString(String.Format("{0:0.##}",
493 Util.GetSmartThreadPoolInfo().InUseThreads));
494 args["System Thread Count"] = OSD.FromString(String.Format(
495 "{0:0.##}", numberThreadsRunning));
496 args["ProcMem"] = OSD.FromString(String.Format("{0:#,###,###.##}",
497 memUsage));
446 498
447 return args; 499 return args;
448 } 500 }
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 438dce9..31900ec 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1,29 +1,29 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2* Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4*
5 * Redistribution and use in source and binary forms, with or without 5* Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6* modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright 7* * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8* notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright 9* * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10* notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11* documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the 12* * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products 13* names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission. 14* derived from this software without specific prior written permission.
15 * 15*
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY 16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26*/
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
@@ -48,7 +48,7 @@ using OpenSim.Region.Framework.Interfaces;
48using OpenSim.Region.Framework.Scenes.Scripting; 48using OpenSim.Region.Framework.Scenes.Scripting;
49using OpenSim.Region.Framework.Scenes.Serialization; 49using OpenSim.Region.Framework.Scenes.Serialization;
50using OpenSim.Region.Physics.Manager; 50using OpenSim.Region.Physics.Manager;
51using Timer=System.Timers.Timer; 51using Timer = System.Timers.Timer;
52using TPFlags = OpenSim.Framework.Constants.TeleportFlags; 52using TPFlags = OpenSim.Framework.Constants.TeleportFlags;
53using GridRegion = OpenSim.Services.Interfaces.GridRegion; 53using GridRegion = OpenSim.Services.Interfaces.GridRegion;
54using PermissionMask = OpenSim.Framework.PermissionMask; 54using PermissionMask = OpenSim.Framework.PermissionMask;
@@ -64,6 +64,8 @@ namespace OpenSim.Region.Framework.Scenes
64 64
65 public const int m_defaultNumberFramesStored = 10; 65 public const int m_defaultNumberFramesStored = 10;
66 66
67 public const int m_defaultNumberFramesStored = 10;
68
67 public delegate void SynchronizeSceneHandler(Scene scene); 69 public delegate void SynchronizeSceneHandler(Scene scene);
68 70
69 #region Fields 71 #region Fields
@@ -105,9 +107,9 @@ namespace OpenSim.Region.Framework.Scenes
105 /// <summary> 107 /// <summary>
106 /// If false then physical objects are disabled, though collisions will continue as normal. 108 /// If false then physical objects are disabled, though collisions will continue as normal.
107 /// </summary> 109 /// </summary>
108 public bool PhysicsEnabled 110 public bool PhysicsEnabled
109 { 111 {
110 get 112 get
111 { 113 {
112 return m_physicsEnabled; 114 return m_physicsEnabled;
113 } 115 }
@@ -121,8 +123,8 @@ namespace OpenSim.Region.Framework.Scenes
121 IPhysicsParameters physScene = PhysicsScene as IPhysicsParameters; 123 IPhysicsParameters physScene = PhysicsScene as IPhysicsParameters;
122 124
123 if (physScene != null) 125 if (physScene != null)
124 physScene.SetPhysicsParameter( 126 physScene.SetPhysicsParameter(
125 "Active", m_physicsEnabled.ToString(), PhysParameterEntry.APPLY_TO_NONE); 127 "Active", m_physicsEnabled.ToString(), PhysParameterEntry.APPLY_TO_NONE);
126 } 128 }
127 } 129 }
128 } 130 }
@@ -132,10 +134,10 @@ namespace OpenSim.Region.Framework.Scenes
132 /// <summary> 134 /// <summary>
133 /// If false then scripts are not enabled on the smiulator 135 /// If false then scripts are not enabled on the smiulator
134 /// </summary> 136 /// </summary>
135 public bool ScriptsEnabled 137 public bool ScriptsEnabled
136 { 138 {
137 get { return m_scripts_enabled; } 139 get { return m_scripts_enabled; }
138 set 140 set
139 { 141 {
140 if (m_scripts_enabled != value) 142 if (m_scripts_enabled != value)
141 { 143 {
@@ -147,13 +149,13 @@ namespace OpenSim.Region.Framework.Scenes
147 foreach (EntityBase ent in entities) 149 foreach (EntityBase ent in entities)
148 { 150 {
149 if (ent is SceneObjectGroup) 151 if (ent is SceneObjectGroup)
150 ((SceneObjectGroup)ent).RemoveScriptInstances(false); 152 ((SceneObjectGroup)ent).RemoveScriptInstances(false);
151 } 153 }
152 } 154 }
153 else 155 else
154 { 156 {
155 m_log.Info("Starting all Scripts in Scene"); 157 m_log.Info("Starting all Scripts in Scene");
156 158
157 EntityBase[] entities = Entities.GetEntities(); 159 EntityBase[] entities = Entities.GetEntities();
158 foreach (EntityBase ent in entities) 160 foreach (EntityBase ent in entities)
159 { 161 {
@@ -238,8 +240,8 @@ namespace OpenSim.Region.Framework.Scenes
238 /// <summary> 240 /// <summary>
239 /// Temporarily setting to trigger appearance resends at 60 second intervals. 241 /// Temporarily setting to trigger appearance resends at 60 second intervals.
240 /// </summary> 242 /// </summary>
241 public bool SendPeriodicAppearanceUpdates { get; set; } 243 public bool SendPeriodicAppearanceUpdates { get; set; }
242 244
243 /// <summary> 245 /// <summary>
244 /// How much a root agent has to change position before updates are sent to viewers. 246 /// How much a root agent has to change position before updates are sent to viewers.
245 /// </summary> 247 /// </summary>
@@ -266,10 +268,11 @@ namespace OpenSim.Region.Framework.Scenes
266 public int ChildTerseUpdatePeriod { get; set; } 268 public int ChildTerseUpdatePeriod { get; set; }
267 269
268 protected float m_defaultDrawDistance = 255.0f; 270 protected float m_defaultDrawDistance = 255.0f;
269 public float DefaultDrawDistance 271 public float DefaultDrawDistance
270 { 272 {
271 // get { return m_defaultDrawDistance; } 273 // get { return m_defaultDrawDistance; }
272 get { 274 get
275 {
273 if (RegionInfo != null) 276 if (RegionInfo != null)
274 { 277 {
275 float largestDimension = Math.Max(RegionInfo.RegionSizeX, RegionInfo.RegionSizeY); 278 float largestDimension = Math.Max(RegionInfo.RegionSizeX, RegionInfo.RegionSizeY);
@@ -282,7 +285,7 @@ namespace OpenSim.Region.Framework.Scenes
282 285
283 private List<string> m_AllowedViewers = new List<string>(); 286 private List<string> m_AllowedViewers = new List<string>();
284 private List<string> m_BannedViewers = new List<string>(); 287 private List<string> m_BannedViewers = new List<string>();
285 288
286 // TODO: need to figure out how allow client agents but deny 289 // TODO: need to figure out how allow client agents but deny
287 // root agents when ACL denies access to root agent 290 // root agents when ACL denies access to root agent
288 public bool m_strictAccessControl = true; 291 public bool m_strictAccessControl = true;
@@ -369,15 +372,15 @@ namespace OpenSim.Region.Framework.Scenes
369 /// One can tweak this number to experiment. One current effect of reducing it is to make avatar animations 372 /// One can tweak this number to experiment. One current effect of reducing it is to make avatar animations
370 /// occur too quickly (viewer 1) or with even more slide (viewer 2). 373 /// occur too quickly (viewer 1) or with even more slide (viewer 2).
371 /// </remarks> 374 /// </remarks>
372 public int MinFrameTicks 375 public int MinFrameTicks
373 { 376 {
374 get { return m_minFrameTicks; } 377 get { return m_minFrameTicks; }
375 private set 378 private set
376 { 379 {
377 m_minFrameTicks = value; 380 m_minFrameTicks = value;
378 MinFrameSeconds = (float)m_minFrameTicks / 1000; 381 MinFrameSeconds = (float)m_minFrameTicks / 1000;
379 } 382 }
380 } 383 }
381 private int m_minFrameTicks; 384 private int m_minFrameTicks;
382 385
383 /// <summary> 386 /// <summary>
@@ -405,7 +408,7 @@ namespace OpenSim.Region.Framework.Scenes
405 private int m_update_events = 1; 408 private int m_update_events = 1;
406 private int m_update_backup = 200; 409 private int m_update_backup = 200;
407 private int m_update_terrain = 50; 410 private int m_update_terrain = 50;
408// private int m_update_land = 1; 411 // private int m_update_land = 1;
409 private int m_update_coarse_locations = 50; 412 private int m_update_coarse_locations = 50;
410 private int m_update_temp_cleaning = 180; 413 private int m_update_temp_cleaning = 180;
411 414
@@ -436,7 +439,7 @@ namespace OpenSim.Region.Framework.Scenes
436 /// asynchronously from the update loop. 439 /// asynchronously from the update loop.
437 /// </summary> 440 /// </summary>
438 private bool m_cleaningTemps = false; 441 private bool m_cleaningTemps = false;
439 442
440 /// <summary> 443 /// <summary>
441 /// Used to control main scene thread looping time when not updating via timer. 444 /// Used to control main scene thread looping time when not updating via timer.
442 /// </summary> 445 /// </summary>
@@ -491,7 +494,7 @@ namespace OpenSim.Region.Framework.Scenes
491 if (value) 494 if (value)
492 { 495 {
493 if (!m_active) 496 if (!m_active)
494 Start(false); 497 Start(false);
495 } 498 }
496 else 499 else
497 { 500 {
@@ -528,6 +531,13 @@ namespace OpenSim.Region.Framework.Scenes
528 get { return m_sceneGraph.PhysicsScene.TimeDilation; } 531 get { return m_sceneGraph.PhysicsScene.TimeDilation; }
529 } 532 }
530 533
534 public void setThreadCount(int inUseThreads)
535 {
536 // Just pass the thread count information on its way as the Scene
537 // does not require the value for anything at this time
538 StatsReporter.SetThreadCount(inUseThreads);
539 }
540
531 public SceneCommunicationService SceneGridService 541 public SceneCommunicationService SceneGridService
532 { 542 {
533 get { return m_sceneGridService; } 543 get { return m_sceneGridService; }
@@ -586,7 +596,7 @@ namespace OpenSim.Region.Framework.Scenes
586 return m_AssetService; 596 return m_AssetService;
587 } 597 }
588 } 598 }
589 599
590 public IAuthorizationService AuthorizationService 600 public IAuthorizationService AuthorizationService
591 { 601 {
592 get 602 get
@@ -647,7 +657,7 @@ namespace OpenSim.Region.Framework.Scenes
647 get 657 get
648 { 658 {
649 if (m_LibraryService == null) 659 if (m_LibraryService == null)
650 m_LibraryService = RequestModuleInterface<ILibraryService>(); 660 m_LibraryService = RequestModuleInterface<ILibraryService>();
651 661
652 return m_LibraryService; 662 return m_LibraryService;
653 } 663 }
@@ -658,7 +668,7 @@ namespace OpenSim.Region.Framework.Scenes
658 get 668 get
659 { 669 {
660 if (m_simulationService == null) 670 if (m_simulationService == null)
661 m_simulationService = RequestModuleInterface<ISimulationService>(); 671 m_simulationService = RequestModuleInterface<ISimulationService>();
662 672
663 return m_simulationService; 673 return m_simulationService;
664 } 674 }
@@ -669,7 +679,7 @@ namespace OpenSim.Region.Framework.Scenes
669 get 679 get
670 { 680 {
671 if (m_AuthenticationService == null) 681 if (m_AuthenticationService == null)
672 m_AuthenticationService = RequestModuleInterface<IAuthenticationService>(); 682 m_AuthenticationService = RequestModuleInterface<IAuthenticationService>();
673 return m_AuthenticationService; 683 return m_AuthenticationService;
674 } 684 }
675 } 685 }
@@ -679,7 +689,7 @@ namespace OpenSim.Region.Framework.Scenes
679 get 689 get
680 { 690 {
681 if (m_PresenceService == null) 691 if (m_PresenceService == null)
682 m_PresenceService = RequestModuleInterface<IPresenceService>(); 692 m_PresenceService = RequestModuleInterface<IPresenceService>();
683 return m_PresenceService; 693 return m_PresenceService;
684 } 694 }
685 } 695 }
@@ -689,7 +699,7 @@ namespace OpenSim.Region.Framework.Scenes
689 get 699 get
690 { 700 {
691 if (m_UserAccountService == null) 701 if (m_UserAccountService == null)
692 m_UserAccountService = RequestModuleInterface<IUserAccountService>(); 702 m_UserAccountService = RequestModuleInterface<IUserAccountService>();
693 return m_UserAccountService; 703 return m_UserAccountService;
694 } 704 }
695 } 705 }
@@ -699,7 +709,7 @@ namespace OpenSim.Region.Framework.Scenes
699 get 709 get
700 { 710 {
701 if (m_AvatarService == null) 711 if (m_AvatarService == null)
702 m_AvatarService = RequestModuleInterface<IAvatarService>(); 712 m_AvatarService = RequestModuleInterface<IAvatarService>();
703 return m_AvatarService; 713 return m_AvatarService;
704 } 714 }
705 } 715 }
@@ -709,7 +719,7 @@ namespace OpenSim.Region.Framework.Scenes
709 get 719 get
710 { 720 {
711 if (m_GridUserService == null) 721 if (m_GridUserService == null)
712 m_GridUserService = RequestModuleInterface<IGridUserService>(); 722 m_GridUserService = RequestModuleInterface<IGridUserService>();
713 return m_GridUserService; 723 return m_GridUserService;
714 } 724 }
715 } 725 }
@@ -723,7 +733,7 @@ namespace OpenSim.Region.Framework.Scenes
723 { 733 {
724 get { return m_AvatarFactory; } 734 get { return m_AvatarFactory; }
725 } 735 }
726 736
727 public ICapabilitiesModule CapsModule 737 public ICapabilitiesModule CapsModule
728 { 738 {
729 get { return m_capsModule; } 739 get { return m_capsModule; }
@@ -789,18 +799,20 @@ namespace OpenSim.Region.Framework.Scenes
789 get { return m_sceneGraph.Entities; } 799 get { return m_sceneGraph.Entities; }
790 } 800 }
791 801
792 802
793 // used in sequence see: SpawnPoint() 803 // used in sequence see: SpawnPoint()
794 private int m_SpawnPoint; 804 private int m_SpawnPoint;
795 // can be closest/random/sequence 805 // can be closest/random/sequence
796 public string SpawnPointRouting 806 public string SpawnPointRouting
797 { 807 {
798 get; private set; 808 get;
809 private set;
799 } 810 }
800 // allow landmarks to pass 811 // allow landmarks to pass
801 public bool TelehubAllowLandmarks 812 public bool TelehubAllowLandmarks
802 { 813 {
803 get; private set; 814 get;
815 private set;
804 } 816 }
805 817
806 #endregion Properties 818 #endregion Properties
@@ -808,10 +820,10 @@ namespace OpenSim.Region.Framework.Scenes
808 #region Constructors 820 #region Constructors
809 821
810 public Scene(RegionInfo regInfo, AgentCircuitManager authen, PhysicsScene physicsScene, 822 public Scene(RegionInfo regInfo, AgentCircuitManager authen, PhysicsScene physicsScene,
811 SceneCommunicationService sceneGridService, 823 SceneCommunicationService sceneGridService,
812 ISimulationDataService simDataService, IEstateDataService estateDataService, 824 ISimulationDataService simDataService, IEstateDataService estateDataService,
813 IConfigSource config, string simulatorVersion) 825 IConfigSource config, string simulatorVersion)
814 : this(regInfo, physicsScene) 826 : this(regInfo, physicsScene)
815 { 827 {
816 m_config = config; 828 m_config = config;
817 MinFrameTicks = 89; 829 MinFrameTicks = 89;
@@ -868,20 +880,20 @@ namespace OpenSim.Region.Framework.Scenes
868 } 880 }
869 881
870 if (updatedTerrainTextures) 882 if (updatedTerrainTextures)
871 rs.Save(); 883 rs.Save();
872 884
873 RegionInfo.RegionSettings = rs; 885 RegionInfo.RegionSettings = rs;
874 886
875 if (estateDataService != null) 887 if (estateDataService != null)
876 RegionInfo.EstateSettings = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false); 888 RegionInfo.EstateSettings = estateDataService.LoadEstateSettings(RegionInfo.RegionID, false);
877 889
878 #endregion Region Settings 890 #endregion Region Settings
879 891
880 //Bind Storage Manager functions to some land manager functions for this scene 892 //Bind Storage Manager functions to some land manager functions for this scene
881 EventManager.OnLandObjectAdded += 893 EventManager.OnLandObjectAdded +=
882 new EventManager.LandObjectAdded(simDataService.StoreLandObject); 894 new EventManager.LandObjectAdded(simDataService.StoreLandObject);
883 EventManager.OnLandObjectRemoved += 895 EventManager.OnLandObjectRemoved +=
884 new EventManager.LandObjectRemoved(simDataService.RemoveLandObject); 896 new EventManager.LandObjectRemoved(simDataService.RemoveLandObject);
885 897
886 RegisterDefaultSceneEvents(); 898 RegisterDefaultSceneEvents();
887 899
@@ -906,8 +918,8 @@ namespace OpenSim.Region.Framework.Scenes
906 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); 918 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
907 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup); 919 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
908 if (!UseBackup) 920 if (!UseBackup)
909 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); 921 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
910 922
911 //Animation states 923 //Animation states
912 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); 924 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
913 925
@@ -961,10 +973,10 @@ namespace OpenSim.Region.Framework.Scenes
961 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 973 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
962 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 974 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
963 m_dontPersistBefore = 975 m_dontPersistBefore =
964 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); 976 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
965 m_dontPersistBefore *= 10000000; 977 m_dontPersistBefore *= 10000000;
966 m_persistAfter = 978 m_persistAfter =
967 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE); 979 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
968 m_persistAfter *= 10000000; 980 m_persistAfter *= 10000000;
969 981
970 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 982 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
@@ -976,8 +988,8 @@ namespace OpenSim.Region.Framework.Scenes
976 988
977 string[] possibleMapConfigSections = new string[] { "Map", "Startup" }; 989 string[] possibleMapConfigSections = new string[] { "Map", "Startup" };
978 990
979 m_generateMaptiles 991 m_generateMaptiles
980 = Util.GetConfigVarFromSections<bool>(config, "GenerateMaptiles", possibleMapConfigSections, true); 992 = Util.GetConfigVarFromSections<bool>(config, "GenerateMaptiles", possibleMapConfigSections, true);
981 993
982 if (m_generateMaptiles) 994 if (m_generateMaptiles)
983 { 995 {
@@ -993,9 +1005,9 @@ namespace OpenSim.Region.Framework.Scenes
993 } 1005 }
994 else 1006 else
995 { 1007 {
996 string tile 1008 string tile
997 = Util.GetConfigVarFromSections<string>( 1009 = Util.GetConfigVarFromSections<string>(
998 config, "MaptileStaticUUID", possibleMapConfigSections, UUID.Zero.ToString()); 1010 config, "MaptileStaticUUID", possibleMapConfigSections, UUID.Zero.ToString());
999 1011
1000 UUID tileID; 1012 UUID tileID;
1001 1013
@@ -1012,9 +1024,9 @@ namespace OpenSim.Region.Framework.Scenes
1012 1024
1013 string[] possibleAccessControlConfigSections = new string[] { "AccessControl", "Startup" }; 1025 string[] possibleAccessControlConfigSections = new string[] { "AccessControl", "Startup" };
1014 1026
1015 string grant 1027 string grant
1016 = Util.GetConfigVarFromSections<string>( 1028 = Util.GetConfigVarFromSections<string>(
1017 config, "AllowedClients", possibleAccessControlConfigSections, ""); 1029 config, "AllowedClients", possibleAccessControlConfigSections, "");
1018 1030
1019 if (grant.Length > 0) 1031 if (grant.Length > 0)
1020 { 1032 {
@@ -1024,9 +1036,9 @@ namespace OpenSim.Region.Framework.Scenes
1024 } 1036 }
1025 } 1037 }
1026 1038
1027 grant 1039 grant
1028 = Util.GetConfigVarFromSections<string>( 1040 = Util.GetConfigVarFromSections<string>(
1029 config, "BannedClients", possibleAccessControlConfigSections, ""); 1041 config, "BannedClients", possibleAccessControlConfigSections, "");
1030 1042
1031 if (grant.Length > 0) 1043 if (grant.Length > 0)
1032 { 1044 {
@@ -1037,27 +1049,27 @@ namespace OpenSim.Region.Framework.Scenes
1037 } 1049 }
1038 1050
1039 if (startupConfig.Contains("MinFrameTime")) 1051 if (startupConfig.Contains("MinFrameTime"))
1040 MinFrameTicks = (int)(startupConfig.GetFloat("MinFrameTime") * 1000); 1052 MinFrameTicks = (int)(startupConfig.GetFloat("MinFrameTime") * 1000);
1041 1053
1042 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup); 1054 m_update_backup = startupConfig.GetInt("UpdateStorageEveryNFrames", m_update_backup);
1043 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations); 1055 m_update_coarse_locations = startupConfig.GetInt("UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations);
1044 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement); 1056 m_update_entitymovement = startupConfig.GetInt("UpdateEntityMovementEveryNFrames", m_update_entitymovement);
1045 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events); 1057 m_update_events = startupConfig.GetInt("UpdateEventsEveryNFrames", m_update_events);
1046 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects); 1058 m_update_objects = startupConfig.GetInt("UpdateObjectsEveryNFrames", m_update_objects);
1047 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics); 1059 m_update_physics = startupConfig.GetInt("UpdatePhysicsEveryNFrames", m_update_physics);
1048 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences); 1060 m_update_presences = startupConfig.GetInt("UpdateAgentsEveryNFrames", m_update_presences);
1049 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain); 1061 m_update_terrain = startupConfig.GetInt("UpdateTerrainEveryNFrames", m_update_terrain);
1050 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNSeconds", m_update_temp_cleaning); 1062 m_update_temp_cleaning = startupConfig.GetInt("UpdateTempCleaningEveryNSeconds", m_update_temp_cleaning);
1051 } 1063 }
1052 1064
1053 // FIXME: Ultimately this should be in a module. 1065 // FIXME: Ultimately this should be in a module.
1054 SendPeriodicAppearanceUpdates = false; 1066 SendPeriodicAppearanceUpdates = false;
1055 1067
1056 IConfig appearanceConfig = m_config.Configs["Appearance"]; 1068 IConfig appearanceConfig = m_config.Configs["Appearance"];
1057 if (appearanceConfig != null) 1069 if (appearanceConfig != null)
1058 { 1070 {
1059 SendPeriodicAppearanceUpdates 1071 SendPeriodicAppearanceUpdates
1060 = appearanceConfig.GetBoolean("ResendAppearanceUpdates", SendPeriodicAppearanceUpdates); 1072 = appearanceConfig.GetBoolean("ResendAppearanceUpdates", SendPeriodicAppearanceUpdates);
1061 } 1073 }
1062 1074
1063 #endregion Region Config 1075 #endregion Region Config
@@ -1085,32 +1097,40 @@ namespace OpenSim.Region.Framework.Scenes
1085 UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time; 1097 UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time;
1086 } 1098 }
1087 1099
1088 IsReprioritizationEnabled 1100 IsReprioritizationEnabled
1089 = interestConfig.GetBoolean("ReprioritizationEnabled", IsReprioritizationEnabled); 1101 = interestConfig.GetBoolean("ReprioritizationEnabled", IsReprioritizationEnabled);
1090 ReprioritizationInterval 1102 ReprioritizationInterval
1091 = interestConfig.GetDouble("ReprioritizationInterval", ReprioritizationInterval); 1103 = interestConfig.GetDouble("ReprioritizationInterval", ReprioritizationInterval);
1092 RootReprioritizationDistance 1104 RootReprioritizationDistance
1093 = interestConfig.GetDouble("RootReprioritizationDistance", RootReprioritizationDistance); 1105 = interestConfig.GetDouble("RootReprioritizationDistance", RootReprioritizationDistance);
1094 ChildReprioritizationDistance 1106 ChildReprioritizationDistance
1095 = interestConfig.GetDouble("ChildReprioritizationDistance", ChildReprioritizationDistance); 1107 = interestConfig.GetDouble("ChildReprioritizationDistance", ChildReprioritizationDistance);
1096 1108
1097 RootTerseUpdatePeriod = interestConfig.GetInt("RootTerseUpdatePeriod", RootTerseUpdatePeriod); 1109 RootTerseUpdatePeriod = interestConfig.GetInt("RootTerseUpdatePeriod", RootTerseUpdatePeriod);
1098 ChildTerseUpdatePeriod = interestConfig.GetInt("ChildTerseUpdatePeriod", ChildTerseUpdatePeriod); 1110 ChildTerseUpdatePeriod = interestConfig.GetInt("ChildTerseUpdatePeriod", ChildTerseUpdatePeriod);
1099 1111
1100 RootPositionUpdateTolerance 1112 RootPositionUpdateTolerance
1101 = interestConfig.GetFloat("RootPositionUpdateTolerance", RootPositionUpdateTolerance); 1113 = interestConfig.GetFloat("RootPositionUpdateTolerance", RootPositionUpdateTolerance);
1102 RootRotationUpdateTolerance 1114 RootRotationUpdateTolerance
1103 = interestConfig.GetFloat("RootRotationUpdateTolerance", RootRotationUpdateTolerance); 1115 = interestConfig.GetFloat("RootRotationUpdateTolerance", RootRotationUpdateTolerance);
1104 RootVelocityUpdateTolerance 1116 RootVelocityUpdateTolerance
1105 = interestConfig.GetFloat("RootVelocityUpdateTolerance", RootVelocityUpdateTolerance); 1117 = interestConfig.GetFloat("RootVelocityUpdateTolerance", RootVelocityUpdateTolerance);
1106 } 1118 }
1107 1119
1108 m_log.DebugFormat("[SCENE]: Using the {0} prioritization scheme", UpdatePrioritizationScheme); 1120 m_log.DebugFormat("[SCENE]: Using the {0} prioritization scheme", UpdatePrioritizationScheme);
1109 1121
1110 #endregion Interest Management 1122 #endregion Interest Management
1111 1123
1124 // The timer used by the Stopwatch class depends on the system hardware and operating system; inform
1125 // if the timer is based on a high-resolution performance counter or based on the system timer;
1126 // the performance counter will provide a more precise time than the system timer
1127 if (Stopwatch.IsHighResolution)
1128 m_log.InfoFormat("[SCENE]: Using high-resolution performance counter for statistics.");
1129 else
1130 m_log.InfoFormat("[SCENE]: Using system timer for statistics.");
1131
1112 // Acquire the statistics section of the OpenSim.ini file located 1132 // Acquire the statistics section of the OpenSim.ini file located
1113 // in the bin directory 1133 // in the bin directory
1114 IConfig statisticsConfig = m_config.Configs["Statistics"]; 1134 IConfig statisticsConfig = m_config.Configs["Statistics"];
1115 1135
1116 // Confirm that the statistics section existed in the configuration 1136 // Confirm that the statistics section existed in the configuration
@@ -1118,9 +1138,9 @@ namespace OpenSim.Region.Framework.Scenes
1118 if (statisticsConfig != null) 1138 if (statisticsConfig != null)
1119 { 1139 {
1120 // Create the StatsReporter using the number of frames to store 1140 // Create the StatsReporter using the number of frames to store
1121 // for the frame time statistics, or 10 frames if the config 1141 // for the frame time statistics, or 10 frames if the config
1122 // file doesn't contain a value 1142 // file doesn't contain a value
1123 StatsReporter = new SimStatsReporter(this, 1143 StatsReporter = new SimStatsReporter(this,
1124 statisticsConfig.GetInt("NumberOfFrames", 1144 statisticsConfig.GetInt("NumberOfFrames",
1125 m_defaultNumberFramesStored)); 1145 m_defaultNumberFramesStored));
1126 } 1146 }
@@ -1130,14 +1150,15 @@ namespace OpenSim.Region.Framework.Scenes
1130 // 10 frames stored for the frame time statistics 1150 // 10 frames stored for the frame time statistics
1131 StatsReporter = new SimStatsReporter(this); 1151 StatsReporter = new SimStatsReporter(this);
1132 } 1152 }
1133 1153
1134 StatsReporter.OnSendStatsResult += SendSimStatsPackets; 1154 StatsReporter.OnSendStatsResult += SendSimStatsPackets;
1135 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; 1155 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
1136 1156
1137 } 1157 }
1138 1158
1139 public Scene(RegionInfo regInfo, PhysicsScene physicsScene) : base(regInfo) 1159 public Scene(RegionInfo regInfo, PhysicsScene physicsScene)
1140 { 1160 : base(regInfo)
1161 {
1141 m_sceneGraph = new SceneGraph(this); 1162 m_sceneGraph = new SceneGraph(this);
1142 m_sceneGraph.PhysicsScene = physicsScene; 1163 m_sceneGraph.PhysicsScene = physicsScene;
1143 1164
@@ -1147,11 +1168,11 @@ namespace OpenSim.Region.Framework.Scenes
1147 // 1168 //
1148 // Out of memory 1169 // Out of memory
1149 // Operating system has killed the plugin 1170 // Operating system has killed the plugin
1150 m_sceneGraph.UnRecoverableError 1171 m_sceneGraph.UnRecoverableError
1151 += () => 1172 += () =>
1152 { 1173 {
1153 m_log.ErrorFormat("[SCENE]: Restarting region {0} due to unrecoverable physics crash", Name); 1174 m_log.ErrorFormat("[SCENE]: Restarting region {0} due to unrecoverable physics crash", Name);
1154 RestartNow(); 1175 RestartNow();
1155 }; 1176 };
1156 1177
1157 PhysicalPrims = true; 1178 PhysicalPrims = true;
@@ -1196,7 +1217,7 @@ namespace OpenSim.Region.Framework.Scenes
1196 IDialogModule dm = RequestModuleInterface<IDialogModule>(); 1217 IDialogModule dm = RequestModuleInterface<IDialogModule>();
1197 1218
1198 if (dm != null) 1219 if (dm != null)
1199 m_eventManager.OnPermissionError += dm.SendAlertToUser; 1220 m_eventManager.OnPermissionError += dm.SendAlertToUser;
1200 1221
1201 m_eventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement; 1222 m_eventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement;
1202 } 1223 }
@@ -1226,7 +1247,7 @@ namespace OpenSim.Region.Framework.Scenes
1226 //int resultY = Math.Abs((int)ycell - (int)RegionInfo.RegionLocY); 1247 //int resultY = Math.Abs((int)ycell - (int)RegionInfo.RegionLocY);
1227 //if (resultX <= 1 && resultY <= 1) 1248 //if (resultX <= 1 && resultY <= 1)
1228 float dist = (float)Math.Max(DefaultDrawDistance, 1249 float dist = (float)Math.Max(DefaultDrawDistance,
1229 (float)Math.Max(RegionInfo.RegionSizeX, RegionInfo.RegionSizeY)); 1250 (float)Math.Max(RegionInfo.RegionSizeX, RegionInfo.RegionSizeY));
1230 uint newRegionX, newRegionY, thisRegionX, thisRegionY; 1251 uint newRegionX, newRegionY, thisRegionX, thisRegionY;
1231 Util.RegionHandleToRegionLoc(otherRegion.RegionHandle, out newRegionX, out newRegionY); 1252 Util.RegionHandleToRegionLoc(otherRegion.RegionHandle, out newRegionX, out newRegionY);
1232 Util.RegionHandleToRegionLoc(RegionInfo.RegionHandle, out thisRegionX, out thisRegionY); 1253 Util.RegionHandleToRegionLoc(RegionInfo.RegionHandle, out thisRegionX, out thisRegionY);
@@ -1250,7 +1271,7 @@ namespace OpenSim.Region.Framework.Scenes
1250 old.Add(otherRegion.RegionHandle); 1271 old.Add(otherRegion.RegionHandle);
1251 agent.DropOldNeighbours(old); 1272 agent.DropOldNeighbours(old);
1252 if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) 1273 if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc)
1253 EntityTransferModule.EnableChildAgent(agent, otherRegion); 1274 EntityTransferModule.EnableChildAgent(agent, otherRegion);
1254 }); 1275 });
1255 } 1276 }
1256 catch (NullReferenceException) 1277 catch (NullReferenceException)
@@ -1263,8 +1284,8 @@ namespace OpenSim.Region.Framework.Scenes
1263 else 1284 else
1264 { 1285 {
1265 m_log.InfoFormat( 1286 m_log.InfoFormat(
1266 "[SCENE]: Got notice about far away Region: {0} at ({1}, {2})", 1287 "[SCENE]: Got notice about far away Region: {0} at ({1}, {2})",
1267 otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY); 1288 otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY);
1268 } 1289 }
1269 } 1290 }
1270 } 1291 }
@@ -1342,7 +1363,7 @@ namespace OpenSim.Region.Framework.Scenes
1342 ForEachRootScenePresence(delegate(ScenePresence agent) 1363 ForEachRootScenePresence(delegate(ScenePresence agent)
1343 { 1364 {
1344 if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) 1365 if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc)
1345 EntityTransferModule.EnableChildAgent(agent, r); 1366 EntityTransferModule.EnableChildAgent(agent, r);
1346 }); 1367 });
1347 } 1368 }
1348 catch (NullReferenceException) 1369 catch (NullReferenceException)
@@ -1380,14 +1401,14 @@ namespace OpenSim.Region.Framework.Scenes
1380 1401
1381 // Kick all ROOT agents with the message, 'The simulator is going down' 1402 // Kick all ROOT agents with the message, 'The simulator is going down'
1382 ForEachScenePresence(delegate(ScenePresence avatar) 1403 ForEachScenePresence(delegate(ScenePresence avatar)
1383 { 1404 {
1384 avatar.RemoveNeighbourRegion(RegionInfo.RegionHandle); 1405 avatar.RemoveNeighbourRegion(RegionInfo.RegionHandle);
1385 1406
1386 if (!avatar.IsChildAgent) 1407 if (!avatar.IsChildAgent)
1387 avatar.ControllingClient.Kick("The simulator is going down."); 1408 avatar.ControllingClient.Kick("The simulator is going down.");
1388 1409
1389 avatar.ControllingClient.SendShutdownConnectionNotice(); 1410 avatar.ControllingClient.SendShutdownConnectionNotice();
1390 }); 1411 });
1391 1412
1392 // Stop updating the scene objects and agents. 1413 // Stop updating the scene objects and agents.
1393 m_shuttingDown = true; 1414 m_shuttingDown = true;
@@ -1406,7 +1427,7 @@ namespace OpenSim.Region.Framework.Scenes
1406 m_sceneGraph.Close(); 1427 m_sceneGraph.Close();
1407 1428
1408 if (!GridService.DeregisterRegion(RegionInfo.RegionID)) 1429 if (!GridService.DeregisterRegion(RegionInfo.RegionID))
1409 m_log.WarnFormat("[SCENE]: Deregister from grid failed for region {0}", Name); 1430 m_log.WarnFormat("[SCENE]: Deregister from grid failed for region {0}", Name);
1410 1431
1411 base.Close(); 1432 base.Close();
1412 1433
@@ -1437,12 +1458,12 @@ namespace OpenSim.Region.Framework.Scenes
1437 public void Start(bool startScripts) 1458 public void Start(bool startScripts)
1438 { 1459 {
1439 if (IsRunning) 1460 if (IsRunning)
1440 return; 1461 return;
1441 1462
1442 m_isRunning = true; 1463 m_isRunning = true;
1443 m_active = true; 1464 m_active = true;
1444 1465
1445// m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); 1466 // m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName);
1446 if (m_heartbeatThread != null) 1467 if (m_heartbeatThread != null)
1447 { 1468 {
1448 m_heartbeatThread.Abort(); 1469 m_heartbeatThread.Abort();
@@ -1450,8 +1471,8 @@ namespace OpenSim.Region.Framework.Scenes
1450 } 1471 }
1451 1472
1452 m_heartbeatThread 1473 m_heartbeatThread
1453 = WorkManager.StartThread( 1474 = WorkManager.StartThread(
1454 Heartbeat, string.Format("Heartbeat-({0})", RegionInfo.RegionName.Replace(" ", "_")), ThreadPriority.Normal, false, false); 1475 Heartbeat, string.Format("Heartbeat-({0})", RegionInfo.RegionName.Replace(" ", "_")), ThreadPriority.Normal, false, false);
1455 1476
1456 StartScripts(); 1477 StartScripts();
1457 } 1478 }
@@ -1492,7 +1513,7 @@ namespace OpenSim.Region.Framework.Scenes
1492 Update(1); 1513 Update(1);
1493 1514
1494 WorkManager.StartThread( 1515 WorkManager.StartThread(
1495 Maintenance, string.Format("Maintenance ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, true); 1516 Maintenance, string.Format("Maintenance ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, true);
1496 1517
1497 Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; 1518 Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true;
1498 m_lastFrameTick = Util.EnvironmentTickCount(); 1519 m_lastFrameTick = Util.EnvironmentTickCount();
@@ -1516,15 +1537,15 @@ namespace OpenSim.Region.Framework.Scenes
1516 private volatile bool m_isTimerUpdateRunning; 1537 private volatile bool m_isTimerUpdateRunning;
1517 1538
1518 private void Update(object sender, ElapsedEventArgs e) 1539 private void Update(object sender, ElapsedEventArgs e)
1519 { 1540 {
1520 if (m_isTimerUpdateRunning) 1541 if (m_isTimerUpdateRunning)
1521 return; 1542 return;
1522 1543
1523 m_isTimerUpdateRunning = true; 1544 m_isTimerUpdateRunning = true;
1524 1545
1525 // If the last frame did not complete on time, then immediately start the next update on the same thread 1546 // If the last frame did not complete on time, then immediately start the next update on the same thread
1526 // and ignore further timed updates until we have a frame that had spare time. 1547 // and ignore further timed updates until we have a frame that had spare time.
1527 while (!Update(1) && Active) {} 1548 while (!Update(1) && Active) { }
1528 1549
1529 if (!Active || m_shuttingDown) 1550 if (!Active || m_shuttingDown)
1530 { 1551 {
@@ -1550,7 +1571,7 @@ namespace OpenSim.Region.Framework.Scenes
1550 int previousMaintenanceTick; 1571 int previousMaintenanceTick;
1551 1572
1552 if (runs >= 0) 1573 if (runs >= 0)
1553 endRun = MaintenanceRun + runs; 1574 endRun = MaintenanceRun + runs;
1554 1575
1555 List<Vector3> coarseLocations; 1576 List<Vector3> coarseLocations;
1556 List<UUID> avatarUUIDs; 1577 List<UUID> avatarUUIDs;
@@ -1560,7 +1581,7 @@ namespace OpenSim.Region.Framework.Scenes
1560 runtc = Util.EnvironmentTickCount(); 1581 runtc = Util.EnvironmentTickCount();
1561 ++MaintenanceRun; 1582 ++MaintenanceRun;
1562 1583
1563// m_log.DebugFormat("[SCENE]: Maintenance run {0} in {1}", MaintenanceRun, Name); 1584 // m_log.DebugFormat("[SCENE]: Maintenance run {0} in {1}", MaintenanceRun, Name);
1564 1585
1565 // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client) 1586 // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client)
1566 if (MaintenanceRun % (m_update_coarse_locations / 10) == 0) 1587 if (MaintenanceRun % (m_update_coarse_locations / 10) == 0)
@@ -1575,7 +1596,7 @@ namespace OpenSim.Region.Framework.Scenes
1575 1596
1576 if (SendPeriodicAppearanceUpdates && MaintenanceRun % 60 == 0) 1597 if (SendPeriodicAppearanceUpdates && MaintenanceRun % 60 == 0)
1577 { 1598 {
1578// m_log.DebugFormat("[SCENE]: Sending periodic appearance updates"); 1599 // m_log.DebugFormat("[SCENE]: Sending periodic appearance updates");
1579 1600
1580 if (AvatarFactory != null) 1601 if (AvatarFactory != null)
1581 { 1602 {
@@ -1586,14 +1607,14 @@ namespace OpenSim.Region.Framework.Scenes
1586 // Delete temp-on-rez stuff 1607 // Delete temp-on-rez stuff
1587 if (MaintenanceRun % m_update_temp_cleaning == 0 && !m_cleaningTemps) 1608 if (MaintenanceRun % m_update_temp_cleaning == 0 && !m_cleaningTemps)
1588 { 1609 {
1589// m_log.DebugFormat("[SCENE]: Running temp-on-rez cleaning in {0}", Name); 1610 // m_log.DebugFormat("[SCENE]: Running temp-on-rez cleaning in {0}", Name);
1590 tmpMS = Util.EnvironmentTickCount(); 1611 tmpMS = Util.EnvironmentTickCount();
1591 m_cleaningTemps = true; 1612 m_cleaningTemps = true;
1592 1613
1593 WorkManager.RunInThread( 1614 WorkManager.RunInThread(
1594 delegate { CleanTempObjects(); m_cleaningTemps = false; }, 1615 delegate { CleanTempObjects(); m_cleaningTemps = false; },
1595 null, 1616 null,
1596 string.Format("CleanTempObjects ({0})", Name)); 1617 string.Format("CleanTempObjects ({0})", Name));
1597 1618
1598 tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS); 1619 tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS);
1599 } 1620 }
@@ -1604,19 +1625,19 @@ namespace OpenSim.Region.Framework.Scenes
1604 m_lastMaintenanceTick = Util.EnvironmentTickCount(); 1625 m_lastMaintenanceTick = Util.EnvironmentTickCount();
1605 runtc = Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, runtc); 1626 runtc = Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, runtc);
1606 runtc = MinMaintenanceTicks - runtc; 1627 runtc = MinMaintenanceTicks - runtc;
1607 1628
1608 if (runtc > 0) 1629 if (runtc > 0)
1609 m_maintenanceWaitEvent.WaitOne(runtc); 1630 m_maintenanceWaitEvent.WaitOne(runtc);
1610 1631
1611 // Optionally warn if a frame takes double the amount of time that it should. 1632 // Optionally warn if a frame takes double the amount of time that it should.
1612 if (DebugUpdates 1633 if (DebugUpdates
1613 && Util.EnvironmentTickCountSubtract( 1634 && Util.EnvironmentTickCountSubtract(
1614 m_lastMaintenanceTick, previousMaintenanceTick) > MinMaintenanceTicks * 2) 1635 m_lastMaintenanceTick, previousMaintenanceTick) > MinMaintenanceTicks * 2)
1615 m_log.WarnFormat( 1636 m_log.WarnFormat(
1616 "[SCENE]: Maintenance took {0} ms (desired max {1} ms) in {2}", 1637 "[SCENE]: Maintenance took {0} ms (desired max {1} ms) in {2}",
1617 Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, previousMaintenanceTick), 1638 Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, previousMaintenanceTick),
1618 MinMaintenanceTicks, 1639 MinMaintenanceTicks,
1619 RegionInfo.RegionName); 1640 RegionInfo.RegionName);
1620 } 1641 }
1621 } 1642 }
1622 1643
@@ -1625,14 +1646,14 @@ namespace OpenSim.Region.Framework.Scenes
1625 long? endFrame = null; 1646 long? endFrame = null;
1626 1647
1627 if (frames >= 0) 1648 if (frames >= 0)
1628 endFrame = Frame + frames; 1649 endFrame = Frame + frames;
1629 1650
1630 float physicsFPS = 0f; 1651 float physicsFPS = 0f;
1631 int previousFrameTick, tmpMS; 1652 int previousFrameTick, tmpMS;
1632 1653
1633 // These variables will be used to save the precise frame time using the 1654 // These variables will be used to save the precise frame time using the
1634 // Stopwatch class of Microsoft SDK; the times are recorded at the start 1655 // Stopwatch class of Microsoft SDK; the times are recorded at the start
1635 // and end of a particular section of code, and then used to calculate 1656 // and end of a parcticular section of code, and then used to calculate
1636 // the frame times, which are the sums of the sections for each given name 1657 // the frame times, which are the sums of the sections for each given name
1637 double preciseTotalFrameTime = 0.0; 1658 double preciseTotalFrameTime = 0.0;
1638 double preciseSimFrameTime = 0.0; 1659 double preciseSimFrameTime = 0.0;
@@ -1644,12 +1665,12 @@ namespace OpenSim.Region.Framework.Scenes
1644 // Begin the stopwatch to keep track of the time that the frame 1665 // Begin the stopwatch to keep track of the time that the frame
1645 // started running to determine how long the frame took to complete 1666 // started running to determine how long the frame took to complete
1646 totalFrameStopwatch.Start(); 1667 totalFrameStopwatch.Start();
1647 1668
1648 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame)) 1669 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame))
1649 { 1670 {
1650 ++Frame; 1671 ++Frame;
1651 1672
1652// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); 1673 // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
1653 1674
1654 agentMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; 1675 agentMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0;
1655 1676
@@ -1670,48 +1691,56 @@ namespace OpenSim.Region.Framework.Scenes
1670 // at this point in time, the precise values all begin 1691 // at this point in time, the precise values all begin
1671 // with the keyword precise 1692 // with the keyword precise
1672 tmpMS = Util.EnvironmentTickCount(); 1693 tmpMS = Util.EnvironmentTickCount();
1673
1674 simFrameStopwatch.Start(); 1694 simFrameStopwatch.Start();
1675 UpdateTerrain(); 1695 UpdateTerrain();
1676 1696
1677 // Get the simulation frame time that the avatar force 1697 // Get the simulation frame time that the avatar force
1678 // input took 1698 // input took
1679 simFrameStopwatch.Stop(); 1699 simFrameStopwatch.Stop();
1680 preciseSimFrameTime = 1700 preciseSimFrameTime =
1681 simFrameStopwatch.Elapsed.TotalMilliseconds; 1701 simFrameStopwatch.Elapsed.TotalMilliseconds;
1682 terrainMS = Util.EnvironmentTickCountSubtract(tmpMS); 1702 terrainMS = Util.EnvironmentTickCountSubtract(tmpMS);
1683 } 1703 }
1684 1704
1705 // At several points inside the code there was a need to
1706 // create a more precise measurement of time elapsed. This
1707 // led to the addition of variables that have a similar
1708 // function and thus remain tightly connected to their
1709 // original counterparts. However, the original code is
1710 // not receiving comments from our group because we don't
1711 // feel right modifying the code to that degree at this
1712 // point in time, the precise values all begin with the
1713 // keyword precise
1714
1685 tmpMS = Util.EnvironmentTickCount(); 1715 tmpMS = Util.EnvironmentTickCount();
1686 1716
1687 // Begin the stopwatch to track the time to prepare physics 1717 // Begin the stopwatch to track the time to prepare physics
1688 physicsFrameStopwatch.Start(); 1718 physicsFrameStopwatch.Start();
1689 if (PhysicsEnabled && Frame % m_update_physics == 0) 1719 if (PhysicsEnabled && Frame % m_update_physics == 0)
1690 m_sceneGraph.UpdatePreparePhysics(); 1720 m_sceneGraph.UpdatePreparePhysics();
1691 1721
1692 // Get the time it took to prepare the physics, this 1722 // Get the time it took to prepare the physics, this
1693 // would report the most precise time that physics was 1723 // would report the most precise time that physics was
1694 // running on the machine and should the physics not be 1724 // running on the machine and should the physics not be
1695 // enabled will report the time it took to check if physics 1725 // enabled will report the time it took to check if physics
1696 // was enabled 1726 // was enabled
1697 physicsFrameStopwatch.Stop(); 1727 physicsFrameStopwatch.Stop();
1698 precisePhysicsFrameTime = 1728 precisePhysicsFrameTime = physicsFrameStopwatch.Elapsed.TotalMilliseconds;
1699 physicsFrameStopwatch.Elapsed.TotalMilliseconds;
1700 physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS); 1729 physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS);
1701 1730
1702 // Apply any pending avatar force input to the avatar's velocity 1731 // Apply any pending avatar force input to the avatar's velocity
1703 tmpMS = Util.EnvironmentTickCount(); 1732 tmpMS = Util.EnvironmentTickCount();
1704 simFrameStopwatch.Restart(); 1733 simFrameStopwatch.Restart();
1705 if (Frame % m_update_entitymovement == 0) 1734 if (Frame % m_update_entitymovement == 0)
1706 m_sceneGraph.UpdateScenePresenceMovement(); 1735 m_sceneGraph.UpdateScenePresenceMovement();
1707 1736
1708 // Get the simulation frame time that the avatar force input 1737 // Get the simulation frame time that the avatar force input
1709 // took 1738 // took
1710 simFrameStopwatch.Stop(); 1739 simFrameStopwatch.Stop();
1711 preciseSimFrameTime += 1740 preciseSimFrameTime +=
1712 simFrameStopwatch.Elapsed.TotalMilliseconds; 1741 simFrameStopwatch.Elapsed.TotalMilliseconds;
1713 agentMS = Util.EnvironmentTickCountSubtract(tmpMS); 1742 agentMS = Util.EnvironmentTickCountSubtract(tmpMS);
1714 1743
1715 // Perform the main physics update. This will do the actual work of moving objects and avatars according to their 1744 // Perform the main physics update. This will do the actual work of moving objects and avatars according to their
1716 // velocity 1745 // velocity
1717 tmpMS = Util.EnvironmentTickCount(); 1746 tmpMS = Util.EnvironmentTickCount();
@@ -1719,63 +1748,61 @@ namespace OpenSim.Region.Framework.Scenes
1719 if (Frame % m_update_physics == 0) 1748 if (Frame % m_update_physics == 0)
1720 { 1749 {
1721 if (PhysicsEnabled) 1750 if (PhysicsEnabled)
1722 physicsFPS = m_sceneGraph.UpdatePhysics(MinFrameSeconds); 1751 physicsFPS = m_sceneGraph.UpdatePhysics(MinFrameSeconds);
1723 1752
1724 if (SynchronizeScene != null) 1753 if (SynchronizeScene != null)
1725 SynchronizeScene(this); 1754 SynchronizeScene(this);
1726 } 1755 }
1727 1756
1728 // Add the main physics update time to the prepare physics 1757 // Add the main physics update time to the prepare physics time
1729 // time
1730 physicsFrameStopwatch.Stop(); 1758 physicsFrameStopwatch.Stop();
1731 precisePhysicsFrameTime += 1759 precisePhysicsFrameTime += physicsFrameStopwatch.Elapsed.TotalMilliseconds;
1732 physicsFrameStopwatch.Elapsed.TotalMilliseconds;
1733 physicsMS = Util.EnvironmentTickCountSubtract(tmpMS); 1760 physicsMS = Util.EnvironmentTickCountSubtract(tmpMS);
1734 1761
1735 // Start the stopwatch for the remainder of the simulation 1762 // Start the stopwatch for the remainder of the simulation
1736 simFrameStopwatch.Restart(); 1763 simFrameStopwatch.Restart();
1737 tmpMS = Util.EnvironmentTickCount(); 1764 tmpMS = Util.EnvironmentTickCount();
1738 1765
1739 // Check if any objects have reached their targets 1766 // Check if any objects have reached their targets
1740 CheckAtTargets(); 1767 CheckAtTargets();
1741 1768
1742 // Update SceneObjectGroups that have scheduled themselves for updates 1769 // Update SceneObjectGroups that have scheduled themselves for updates
1743 // Objects queue their updates onto all scene presences 1770 // Objects queue their updates onto all scene presences
1744 if (Frame % m_update_objects == 0) 1771 if (Frame % m_update_objects == 0)
1745 m_sceneGraph.UpdateObjectGroups(); 1772 m_sceneGraph.UpdateObjectGroups();
1746 1773
1747 // Run through all ScenePresences looking for updates 1774 // Run through all ScenePresences looking for updates
1748 // Presence updates and queued object updates for each presence are sent to clients 1775 // Presence updates and queued object updates for each presence are sent to clients
1749 if (Frame % m_update_presences == 0) 1776 if (Frame % m_update_presences == 0)
1750 m_sceneGraph.UpdatePresences(); 1777 m_sceneGraph.UpdatePresences();
1751 1778
1752 agentMS += Util.EnvironmentTickCountSubtract(tmpMS); 1779 agentMS += Util.EnvironmentTickCountSubtract(tmpMS);
1753 1780
1754 if (Frame % m_update_events == 0) 1781 if (Frame % m_update_events == 0)
1755 { 1782 {
1756 tmpMS = Util.EnvironmentTickCount(); 1783 tmpMS = Util.EnvironmentTickCount();
1757 UpdateEvents(); 1784 UpdateEvents();
1758 eventMS = Util.EnvironmentTickCountSubtract(tmpMS); 1785 eventMS = Util.EnvironmentTickCountSubtract(tmpMS);
1759 } 1786 }
1760 1787
1761 if (PeriodicBackup && Frame % m_update_backup == 0) 1788 if (PeriodicBackup && Frame % m_update_backup == 0)
1762 { 1789 {
1763 tmpMS = Util.EnvironmentTickCount(); 1790 tmpMS = Util.EnvironmentTickCount();
1764 UpdateStorageBackup(); 1791 UpdateStorageBackup();
1765 backupMS = Util.EnvironmentTickCountSubtract(tmpMS); 1792 backupMS = Util.EnvironmentTickCountSubtract(tmpMS);
1766 } 1793 }
1767 1794
1768 //if (Frame % m_update_land == 0) 1795 //if (Frame % m_update_land == 0)
1769 //{ 1796 //{
1770 // int ldMS = Util.EnvironmentTickCount(); 1797 // int ldMS = Util.EnvironmentTickCount();
1771 // UpdateLand(); 1798 // UpdateLand();
1772 // landMS = Util.EnvironmentTickCountSubtract(ldMS); 1799 // landMS = Util.EnvironmentTickCountSubtract(ldMS);
1773 //} 1800 //}
1774 1801
1775 if (!LoginsEnabled && Frame == 20) 1802 if (!LoginsEnabled && Frame == 20)
1776 { 1803 {
1777 // m_log.DebugFormat("{0} {1} {2}", LoginsDisabled, m_sceneGraph.GetActiveScriptsCount(), LoginLock); 1804 // m_log.DebugFormat("{0} {1} {2}", LoginsDisabled, m_sceneGraph.GetActiveScriptsCount(), LoginLock);
1778 1805
1779 // In 99.9% of cases it is a bad idea to manually force garbage collection. However, 1806 // In 99.9% of cases it is a bad idea to manually force garbage collection. However,
1780 // this is a rare case where we know we have just went through a long cycle of heap 1807 // this is a rare case where we know we have just went through a long cycle of heap
1781 // allocations, and there is no more work to be done until someone logs in 1808 // allocations, and there is no more work to be done until someone logs in
@@ -1790,7 +1817,7 @@ namespace OpenSim.Region.Framework.Scenes
1790 } 1817 }
1791 1818
1792 m_sceneGridService.InformNeighborsThatRegionisUp( 1819 m_sceneGridService.InformNeighborsThatRegionisUp(
1793 RequestModuleInterface<INeighbourService>(), RegionInfo); 1820 RequestModuleInterface<INeighbourService>(), RegionInfo);
1794 1821
1795 // Region ready should always be set 1822 // Region ready should always be set
1796 Ready = true; 1823 Ready = true;
@@ -1801,7 +1828,7 @@ namespace OpenSim.Region.Framework.Scenes
1801 if (m_sceneGraph.GetActiveScriptsCount() == 0) 1828 if (m_sceneGraph.GetActiveScriptsCount() == 0)
1802 { 1829 {
1803 // In this case, we leave it to the IRegionReadyModule to enable logins 1830 // In this case, we leave it to the IRegionReadyModule to enable logins
1804 1831
1805 // LoginLock can currently only be set by a region module implementation. 1832 // LoginLock can currently only be set by a region module implementation.
1806 // If somehow this hasn't been done then the quickest way to bugfix is to see the 1833 // If somehow this hasn't been done then the quickest way to bugfix is to see the
1807 // NullReferenceException 1834 // NullReferenceException
@@ -1814,18 +1841,18 @@ namespace OpenSim.Region.Framework.Scenes
1814 catch (Exception e) 1841 catch (Exception e)
1815 { 1842 {
1816 m_log.ErrorFormat( 1843 m_log.ErrorFormat(
1817 "[SCENE]: Failed on region {0} with exception {1}{2}", 1844 "[SCENE]: Failed on region {0} with exception {1}{2}",
1818 RegionInfo.RegionName, e.Message, e.StackTrace); 1845 RegionInfo.RegionName, e.Message, e.StackTrace);
1819 } 1846 }
1820 1847
1821 EventManager.TriggerRegionHeartbeatEnd(this); 1848 EventManager.TriggerRegionHeartbeatEnd(this);
1822 otherMS = eventMS + backupMS + terrainMS + landMS; 1849 otherMS = eventMS + backupMS + terrainMS + landMS;
1823 1850
1824 // Get the elapsed time for the simulation frame 1851 // Get the elapsed time for the simulation frame
1825 simFrameStopwatch.Stop(); 1852 simFrameStopwatch.Stop();
1826 preciseSimFrameTime += 1853 preciseSimFrameTime +=
1827 simFrameStopwatch.Elapsed.TotalMilliseconds; 1854 simFrameStopwatch.Elapsed.TotalMilliseconds;
1828 1855
1829 if (!UpdateOnTimer) 1856 if (!UpdateOnTimer)
1830 { 1857 {
1831 Watchdog.UpdateThread(); 1858 Watchdog.UpdateThread();
@@ -1833,9 +1860,9 @@ namespace OpenSim.Region.Framework.Scenes
1833 spareMS = MinFrameTicks - Util.EnvironmentTickCountSubtract(m_lastFrameTick); 1860 spareMS = MinFrameTicks - Util.EnvironmentTickCountSubtract(m_lastFrameTick);
1834 1861
1835 if (spareMS > 0) 1862 if (spareMS > 0)
1836 m_updateWaitEvent.WaitOne(spareMS); 1863 m_updateWaitEvent.WaitOne(spareMS);
1837 else 1864 else
1838 spareMS = 0; 1865 spareMS = 0;
1839 } 1866 }
1840 else 1867 else
1841 { 1868 {
@@ -1844,15 +1871,15 @@ namespace OpenSim.Region.Framework.Scenes
1844 1871
1845 // Get the total frame time 1872 // Get the total frame time
1846 totalFrameStopwatch.Stop(); 1873 totalFrameStopwatch.Stop();
1847 preciseTotalFrameTime = 1874 preciseTotalFrameTime =
1848 totalFrameStopwatch.Elapsed.TotalMilliseconds; 1875 totalFrameStopwatch.Elapsed.TotalMilliseconds;
1849 1876
1850 // Restart the stopwatch for the total time of the next frame 1877 // Restart the stopwatch for the total time of the next frame
1851 totalFrameStopwatch.Restart(); 1878 totalFrameStopwatch.Restart();
1852 1879
1853 previousFrameTick = m_lastFrameTick; 1880 previousFrameTick = m_lastFrameTick;
1854 frameMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick); 1881 frameMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick);
1855 m_lastFrameTick = Util.EnvironmentTickCount(); 1882 m_lastFrameTick = Util.EnvironmentTickCount();
1856 1883
1857 // if (Frame%m_update_avatars == 0) 1884 // if (Frame%m_update_avatars == 0)
1858 // UpdateInWorldTime(); 1885 // UpdateInWorldTime();
@@ -1869,37 +1896,40 @@ namespace OpenSim.Region.Framework.Scenes
1869 1896
1870 // Send the correct time values to the stats reporter for the 1897 // Send the correct time values to the stats reporter for the
1871 // frame times 1898 // frame times
1872 StatsReporter.addFrameTimeMilliseconds(preciseTotalFrameTime, 1899 StatsReporter.addFrameTimeMilliseconds(preciseTotalFrameTime,
1873 preciseSimFrameTime, precisePhysicsFrameTime, 0.0); 1900 preciseSimFrameTime, precisePhysicsFrameTime, 0.0);
1874 1901
1875 // Send the correct number of frames that the physics library 1902 // Send the correct number of frames that the physics library
1876 // has processed to the stats reporter 1903 // has processed to the stats reporter
1877 StatsReporter.addPhysicsFrame(1); 1904 StatsReporter.addPhysicsFrame(1);
1878 1905
1879 // Optionally warn if a frame takes double the amount of time that it should. 1906 // Optionally warn if a frame takes double the amount of time that it should.
1880 if (DebugUpdates 1907 if (DebugUpdates
1881 && Util.EnvironmentTickCountSubtract( 1908 && Util.EnvironmentTickCountSubtract(
1882 m_lastFrameTick, previousFrameTick) > MinFrameTicks * 2) 1909 m_lastFrameTick, previousFrameTick) > MinFrameTicks * 2)
1883 m_log.WarnFormat( 1910 m_log.WarnFormat(
1884 "[SCENE]: Frame took {0} ms (desired max {1} ms) in {2}", 1911 "[SCENE]: Frame took {0} ms (desired max {1} ms) in {2}",
1885 Util.EnvironmentTickCountSubtract(m_lastFrameTick, previousFrameTick), 1912 Util.EnvironmentTickCountSubtract(m_lastFrameTick, previousFrameTick),
1886 MinFrameTicks, 1913 MinFrameTicks,
1887 RegionInfo.RegionName); 1914 RegionInfo.RegionName);
1888 } 1915 }
1889 1916
1917 // Finished updating scene frame, so stop the total frame's Stopwatch
1918 totalFrameStopwatch.Stop();
1919
1890 return spareMS >= 0; 1920 return spareMS >= 0;
1891 } 1921 }
1892 1922
1893 public void AddGroupTarget(SceneObjectGroup grp) 1923 public void AddGroupTarget(SceneObjectGroup grp)
1894 { 1924 {
1895 lock (m_groupsWithTargets) 1925 lock (m_groupsWithTargets)
1896 m_groupsWithTargets[grp.UUID] = grp; 1926 m_groupsWithTargets[grp.UUID] = grp;
1897 } 1927 }
1898 1928
1899 public void RemoveGroupTarget(SceneObjectGroup grp) 1929 public void RemoveGroupTarget(SceneObjectGroup grp)
1900 { 1930 {
1901 lock (m_groupsWithTargets) 1931 lock (m_groupsWithTargets)
1902 m_groupsWithTargets.Remove(grp.UUID); 1932 m_groupsWithTargets.Remove(grp.UUID);
1903 } 1933 }
1904 1934
1905 private void CheckAtTargets() 1935 private void CheckAtTargets()
@@ -1909,13 +1939,13 @@ namespace OpenSim.Region.Framework.Scenes
1909 lock (m_groupsWithTargets) 1939 lock (m_groupsWithTargets)
1910 { 1940 {
1911 if (m_groupsWithTargets.Count != 0) 1941 if (m_groupsWithTargets.Count != 0)
1912 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values); 1942 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values);
1913 } 1943 }
1914 1944
1915 if (objs != null) 1945 if (objs != null)
1916 { 1946 {
1917 foreach (SceneObjectGroup entry in objs) 1947 foreach (SceneObjectGroup entry in objs)
1918 entry.checkAtTargets(); 1948 entry.checkAtTargets();
1919 } 1949 }
1920 } 1950 }
1921 1951
@@ -1958,7 +1988,7 @@ namespace OpenSim.Region.Framework.Scenes
1958 { 1988 {
1959 m_eventManager.TriggerOnFrame(); 1989 m_eventManager.TriggerOnFrame();
1960 } 1990 }
1961 1991
1962 /// <summary> 1992 /// <summary>
1963 /// Backup the scene. 1993 /// Backup the scene.
1964 /// </summary> 1994 /// </summary>
@@ -1998,13 +2028,13 @@ namespace OpenSim.Region.Framework.Scenes
1998 // We must fill in a null-terminated 'empty' string here since bytes[0] will crash viewer 3. 2028 // We must fill in a null-terminated 'empty' string here since bytes[0] will crash viewer 3.
1999 msg.binaryBucket = Util.StringToBytes256("\0"); 2029 msg.binaryBucket = Util.StringToBytes256("\0");
2000 if (ret.Value.count > 1) 2030 if (ret.Value.count > 1)
2001 msg.message = string.Format("Your {0} objects were returned from {1} in region {2} due to {3}", ret.Value.count, ret.Value.location.ToString(), RegionInfo.RegionName, ret.Value.reason); 2031 msg.message = string.Format("Your {0} objects were returned from {1} in region {2} due to {3}", ret.Value.count, ret.Value.location.ToString(), RegionInfo.RegionName, ret.Value.reason);
2002 else 2032 else
2003 msg.message = string.Format("Your object {0} was returned from {1} in region {2} due to {3}", ret.Value.objectName, ret.Value.location.ToString(), RegionInfo.RegionName, ret.Value.reason); 2033 msg.message = string.Format("Your object {0} was returned from {1} in region {2} due to {3}", ret.Value.objectName, ret.Value.location.ToString(), RegionInfo.RegionName, ret.Value.reason);
2004 2034
2005 IMessageTransferModule tr = RequestModuleInterface<IMessageTransferModule>(); 2035 IMessageTransferModule tr = RequestModuleInterface<IMessageTransferModule>();
2006 if (tr != null) 2036 if (tr != null)
2007 tr.SendInstantMessage(msg, delegate(bool success) {}); 2037 tr.SendInstantMessage(msg, delegate(bool success) { });
2008 } 2038 }
2009 m_returns.Clear(); 2039 m_returns.Clear();
2010 } 2040 }
@@ -2095,7 +2125,7 @@ namespace OpenSim.Region.Framework.Scenes
2095 IConfig terrainConfig = m_config.Configs["Terrain"]; 2125 IConfig terrainConfig = m_config.Configs["Terrain"];
2096 String m_InitialTerrain = "pinhead-island"; 2126 String m_InitialTerrain = "pinhead-island";
2097 if (terrainConfig != null) 2127 if (terrainConfig != null)
2098 m_InitialTerrain = terrainConfig.GetString("InitialTerrain", m_InitialTerrain); 2128 m_InitialTerrain = terrainConfig.GetString("InitialTerrain", m_InitialTerrain);
2099 2129
2100 m_log.InfoFormat("[TERRAIN]: No default terrain. Generating a new terrain {0}.", m_InitialTerrain); 2130 m_log.InfoFormat("[TERRAIN]: No default terrain. Generating a new terrain {0}.", m_InitialTerrain);
2101 Heightmap = new TerrainChannel(m_InitialTerrain, (int)RegionInfo.RegionSizeX, (int)RegionInfo.RegionSizeY, (int)RegionInfo.RegionSizeZ); 2131 Heightmap = new TerrainChannel(m_InitialTerrain, (int)RegionInfo.RegionSizeX, (int)RegionInfo.RegionSizeY, (int)RegionInfo.RegionSizeZ);
@@ -2110,11 +2140,11 @@ namespace OpenSim.Region.Framework.Scenes
2110 catch (IOException e) 2140 catch (IOException e)
2111 { 2141 {
2112 m_log.WarnFormat( 2142 m_log.WarnFormat(
2113 "[TERRAIN]: Scene.cs: LoadWorldMap() - Regenerating as failed with exception {0}{1}", 2143 "[TERRAIN]: Scene.cs: LoadWorldMap() - Regenerating as failed with exception {0}{1}",
2114 e.Message, e.StackTrace); 2144 e.Message, e.StackTrace);
2115 2145
2116 // Non standard region size. If there's an old terrain in the database, it might read past the buffer 2146 // Non standard region size. If there's an old terrain in the database, it might read past the buffer
2117 #pragma warning disable 0162 2147#pragma warning disable 0162
2118 if ((int)Constants.RegionSize != 256) 2148 if ((int)Constants.RegionSize != 256)
2119 { 2149 {
2120 Heightmap = new TerrainChannel(); 2150 Heightmap = new TerrainChannel();
@@ -2125,7 +2155,7 @@ namespace OpenSim.Region.Framework.Scenes
2125 catch (Exception e) 2155 catch (Exception e)
2126 { 2156 {
2127 m_log.WarnFormat( 2157 m_log.WarnFormat(
2128 "[TERRAIN]: Scene.cs: LoadWorldMap() - Failed with exception {0}{1}", e.Message, e.StackTrace); 2158 "[TERRAIN]: Scene.cs: LoadWorldMap() - Failed with exception {0}{1}", e.Message, e.StackTrace);
2129 } 2159 }
2130 } 2160 }
2131 2161
@@ -2142,18 +2172,18 @@ namespace OpenSim.Region.Framework.Scenes
2142 //// stored in the GridService, because that's what the world map module uses 2172 //// stored in the GridService, because that's what the world map module uses
2143 //// to send the map image UUIDs (of other regions) to the viewer... 2173 //// to send the map image UUIDs (of other regions) to the viewer...
2144 if (m_generateMaptiles) 2174 if (m_generateMaptiles)
2145 RegenerateMaptile(); 2175 RegenerateMaptile();
2146 2176
2147 GridRegion region = new GridRegion(RegionInfo); 2177 GridRegion region = new GridRegion(RegionInfo);
2148 string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); 2178 string error = GridService.RegisterRegion(RegionInfo.ScopeID, region);
2149// m_log.DebugFormat("[SCENE]: RegisterRegionWithGrid. name={0},id={1},loc=<{2},{3}>,size=<{4},{5}>", 2179 // m_log.DebugFormat("[SCENE]: RegisterRegionWithGrid. name={0},id={1},loc=<{2},{3}>,size=<{4},{5}>",
2150// m_regionName, 2180 // m_regionName,
2151// RegionInfo.RegionID, 2181 // RegionInfo.RegionID,
2152// RegionInfo.RegionLocX, RegionInfo.RegionLocY, 2182 // RegionInfo.RegionLocX, RegionInfo.RegionLocY,
2153// RegionInfo.RegionSizeX, RegionInfo.RegionSizeY); 2183 // RegionInfo.RegionSizeX, RegionInfo.RegionSizeY);
2154 2184
2155 if (error != String.Empty) 2185 if (error != String.Empty)
2156 throw new Exception(error); 2186 throw new Exception(error);
2157 } 2187 }
2158 2188
2159 #endregion 2189 #endregion
@@ -2212,7 +2242,7 @@ namespace OpenSim.Region.Framework.Scenes
2212 rootPart.TrimPermissions(); 2242 rootPart.TrimPermissions();
2213 2243
2214 // Don't do this here - it will get done later on when sculpt data is loaded. 2244 // Don't do this here - it will get done later on when sculpt data is loaded.
2215// group.CheckSculptAndLoad(); 2245 // group.CheckSculptAndLoad();
2216 } 2246 }
2217 2247
2218 LoadingPrims = false; 2248 LoadingPrims = false;
@@ -2222,15 +2252,15 @@ namespace OpenSim.Region.Framework.Scenes
2222 public bool SupportsRayCastFiltered() 2252 public bool SupportsRayCastFiltered()
2223 { 2253 {
2224 if (PhysicsScene == null) 2254 if (PhysicsScene == null)
2225 return false; 2255 return false;
2226 return PhysicsScene.SupportsRaycastWorldFiltered(); 2256 return PhysicsScene.SupportsRaycastWorldFiltered();
2227 } 2257 }
2228 2258
2229 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter) 2259 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
2230 { 2260 {
2231 if (PhysicsScene == null) 2261 if (PhysicsScene == null)
2232 return null; 2262 return null;
2233 return PhysicsScene.RaycastWorld(position, direction, length, Count,filter); 2263 return PhysicsScene.RaycastWorld(position, direction, length, Count, filter);
2234 } 2264 }
2235 2265
2236 /// <summary> 2266 /// <summary>
@@ -2298,7 +2328,7 @@ namespace OpenSim.Region.Framework.Scenes
2298 //And in cases when we weren't rezzing from inventory we were re-adding the 0.25 straight after calling this method 2328 //And in cases when we weren't rezzing from inventory we were re-adding the 0.25 straight after calling this method
2299 // Un-offset the prim (it gets offset later by the consumer method) 2329 // Un-offset the prim (it gets offset later by the consumer method)
2300 //pos.Z -= 0.25F; 2330 //pos.Z -= 0.25F;
2301 2331
2302 } 2332 }
2303 2333
2304 return pos; 2334 return pos;
@@ -2315,7 +2345,7 @@ namespace OpenSim.Region.Framework.Scenes
2315 if (ei.HitTF) 2345 if (ei.HitTF)
2316 { 2346 {
2317 pos = ei.ipoint; 2347 pos = ei.ipoint;
2318 } 2348 }
2319 else 2349 else
2320 { 2350 {
2321 // fall back to our stupid functionality 2351 // fall back to our stupid functionality
@@ -2351,8 +2381,8 @@ namespace OpenSim.Region.Framework.Scenes
2351 /// <param name="RayTargetID"></param> 2381 /// <param name="RayTargetID"></param>
2352 /// <param name="RayEndIsIntersection"></param> 2382 /// <param name="RayEndIsIntersection"></param>
2353 public virtual void AddNewPrim(UUID ownerID, UUID groupID, Vector3 RayEnd, Quaternion rot, PrimitiveBaseShape shape, 2383 public virtual void AddNewPrim(UUID ownerID, UUID groupID, Vector3 RayEnd, Quaternion rot, PrimitiveBaseShape shape,
2354 byte bypassRaycast, Vector3 RayStart, UUID RayTargetID, 2384 byte bypassRaycast, Vector3 RayStart, UUID RayTargetID,
2355 byte RayEndIsIntersection) 2385 byte RayEndIsIntersection)
2356 { 2386 {
2357 Vector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection, true, new Vector3(0.5f, 0.5f, 0.5f), false); 2387 Vector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection, true, new Vector3(0.5f, 0.5f, 0.5f), false);
2358 2388
@@ -2367,18 +2397,18 @@ namespace OpenSim.Region.Framework.Scenes
2367 { 2397 {
2368 IClientAPI client = null; 2398 IClientAPI client = null;
2369 if (TryGetClient(ownerID, out client)) 2399 if (TryGetClient(ownerID, out client))
2370 client.SendAlertMessage("You cannot create objects here."); 2400 client.SendAlertMessage("You cannot create objects here.");
2371 } 2401 }
2372 } 2402 }
2373 2403
2374 public virtual SceneObjectGroup AddNewPrim( 2404 public virtual SceneObjectGroup AddNewPrim(
2375 UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) 2405 UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
2376 { 2406 {
2377 //m_log.DebugFormat( 2407 //m_log.DebugFormat(
2378 // "[SCENE]: Scene.AddNewPrim() pcode {0} called for {1} in {2}", shape.PCode, ownerID, RegionInfo.RegionName); 2408 // "[SCENE]: Scene.AddNewPrim() pcode {0} called for {1} in {2}", shape.PCode, ownerID, RegionInfo.RegionName);
2379 2409
2380 SceneObjectGroup sceneObject = null; 2410 SceneObjectGroup sceneObject = null;
2381 2411
2382 // If an entity creator has been registered for this prim type then use that 2412 // If an entity creator has been registered for this prim type then use that
2383 if (m_entityCreators.ContainsKey((PCode)shape.PCode)) 2413 if (m_entityCreators.ContainsKey((PCode)shape.PCode))
2384 { 2414 {
@@ -2393,13 +2423,13 @@ namespace OpenSim.Region.Framework.Scenes
2393 } 2423 }
2394 2424
2395 if (UserManagementModule != null) 2425 if (UserManagementModule != null)
2396 sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID); 2426 sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID);
2397 2427
2398 sceneObject.ScheduleGroupForFullUpdate(); 2428 sceneObject.ScheduleGroupForFullUpdate();
2399 2429
2400 return sceneObject; 2430 return sceneObject;
2401 } 2431 }
2402 2432
2403 /// <summary> 2433 /// <summary>
2404 /// Add an object into the scene that has come from storage 2434 /// Add an object into the scene that has come from storage
2405 /// </summary> 2435 /// </summary>
@@ -2421,7 +2451,7 @@ namespace OpenSim.Region.Framework.Scenes
2421 /// true if the object was added, false if an object with the same uuid was already in the scene 2451 /// true if the object was added, false if an object with the same uuid was already in the scene
2422 /// </returns> 2452 /// </returns>
2423 public bool AddRestoredSceneObject( 2453 public bool AddRestoredSceneObject(
2424 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates) 2454 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
2425 { 2455 {
2426 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates)) 2456 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates))
2427 { 2457 {
@@ -2432,7 +2462,7 @@ namespace OpenSim.Region.Framework.Scenes
2432 return false; 2462 return false;
2433 2463
2434 } 2464 }
2435 2465
2436 /// <summary> 2466 /// <summary>
2437 /// Add an object into the scene that has come from storage 2467 /// Add an object into the scene that has come from storage
2438 /// </summary> 2468 /// </summary>
@@ -2450,7 +2480,7 @@ namespace OpenSim.Region.Framework.Scenes
2450 /// true if the object was added, false if an object with the same uuid was already in the scene 2480 /// true if the object was added, false if an object with the same uuid was already in the scene
2451 /// </returns> 2481 /// </returns>
2452 public bool AddRestoredSceneObject( 2482 public bool AddRestoredSceneObject(
2453 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) 2483 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
2454 { 2484 {
2455 return AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true); 2485 return AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true);
2456 } 2486 }
@@ -2468,7 +2498,7 @@ namespace OpenSim.Region.Framework.Scenes
2468 { 2498 {
2469 return AddNewSceneObject(sceneObject, attachToBackup, true); 2499 return AddNewSceneObject(sceneObject, attachToBackup, true);
2470 } 2500 }
2471 2501
2472 /// <summary> 2502 /// <summary>
2473 /// Add a newly created object to the scene 2503 /// Add a newly created object to the scene
2474 /// </summary> 2504 /// </summary>
@@ -2483,16 +2513,16 @@ namespace OpenSim.Region.Framework.Scenes
2483 /// </param> 2513 /// </param>
2484 /// <returns>true if the object was added. false if not</returns> 2514 /// <returns>true if the object was added. false if not</returns>
2485 public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) 2515 public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
2486 { 2516 {
2487 if (m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates)) 2517 if (m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates))
2488 { 2518 {
2489 EventManager.TriggerObjectAddedToScene(sceneObject); 2519 EventManager.TriggerObjectAddedToScene(sceneObject);
2490 return true; 2520 return true;
2491 } 2521 }
2492 2522
2493 return false; 2523 return false;
2494 } 2524 }
2495 2525
2496 /// <summary> 2526 /// <summary>
2497 /// Add a newly created object to the scene. 2527 /// Add a newly created object to the scene.
2498 /// </summary> 2528 /// </summary>
@@ -2506,10 +2536,10 @@ namespace OpenSim.Region.Framework.Scenes
2506 /// <param name="vel">Velocity of the object. This parameter only has an effect if the object is physical</param> 2536 /// <param name="vel">Velocity of the object. This parameter only has an effect if the object is physical</param>
2507 /// <returns></returns> 2537 /// <returns></returns>
2508 public bool AddNewSceneObject( 2538 public bool AddNewSceneObject(
2509 SceneObjectGroup sceneObject, bool attachToBackup, Vector3? pos, Quaternion? rot, Vector3 vel) 2539 SceneObjectGroup sceneObject, bool attachToBackup, Vector3? pos, Quaternion? rot, Vector3 vel)
2510 { 2540 {
2511 if (m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, pos, rot, vel)) 2541 if (m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, pos, rot, vel))
2512 { 2542 {
2513 EventManager.TriggerObjectAddedToScene(sceneObject); 2543 EventManager.TriggerObjectAddedToScene(sceneObject);
2514 return true; 2544 return true;
2515 } 2545 }
@@ -2531,7 +2561,7 @@ namespace OpenSim.Region.Framework.Scenes
2531 { 2561 {
2532 SceneObjectGroup sog = (SceneObjectGroup)e; 2562 SceneObjectGroup sog = (SceneObjectGroup)e;
2533 if (!sog.IsAttachment) 2563 if (!sog.IsAttachment)
2534 DeleteSceneObject((SceneObjectGroup)e, false); 2564 DeleteSceneObject((SceneObjectGroup)e, false);
2535 } 2565 }
2536 } 2566 }
2537 } 2567 }
@@ -2557,13 +2587,13 @@ namespace OpenSim.Region.Framework.Scenes
2557 /// <param name="silent">Suppress broadcasting changes to other clients.</param> 2587 /// <param name="silent">Suppress broadcasting changes to other clients.</param>
2558 /// <param name="removeScripts">If true, then scripts are removed. If false, then they are only stopped.</para> 2588 /// <param name="removeScripts">If true, then scripts are removed. If false, then they are only stopped.</para>
2559 public void DeleteSceneObject(SceneObjectGroup group, bool silent, bool removeScripts) 2589 public void DeleteSceneObject(SceneObjectGroup group, bool silent, bool removeScripts)
2560 { 2590 {
2561// m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID); 2591 // m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID);
2562 2592
2563 if (removeScripts) 2593 if (removeScripts)
2564 group.RemoveScriptInstances(true); 2594 group.RemoveScriptInstances(true);
2565 else 2595 else
2566 group.StopScriptInstances(); 2596 group.StopScriptInstances();
2567 2597
2568 SceneObjectPart[] partList = group.Parts; 2598 SceneObjectPart[] partList = group.Parts;
2569 2599
@@ -2593,7 +2623,7 @@ namespace OpenSim.Region.Framework.Scenes
2593 2623
2594 group.DeleteGroupFromScene(silent); 2624 group.DeleteGroupFromScene(silent);
2595 2625
2596// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2626 // m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2597 } 2627 }
2598 2628
2599 /// <summary> 2629 /// <summary>
@@ -2613,12 +2643,12 @@ namespace OpenSim.Region.Framework.Scenes
2613 // database update, because RemoveObject() works by searching on the SceneGroupID. 2643 // database update, because RemoveObject() works by searching on the SceneGroupID.
2614 // This is an expensive thing to do so only do it if absolutely necessary. 2644 // This is an expensive thing to do so only do it if absolutely necessary.
2615 if (so.GroupContainsForeignPrims) 2645 if (so.GroupContainsForeignPrims)
2616 ForceSceneObjectBackup(so); 2646 ForceSceneObjectBackup(so);
2617 2647
2618 so.DetachFromBackup(); 2648 so.DetachFromBackup();
2619 SimulationDataService.RemoveObject(so.UUID, RegionInfo.RegionID); 2649 SimulationDataService.RemoveObject(so.UUID, RegionInfo.RegionID);
2620 } 2650 }
2621 2651
2622 // We need to keep track of this state in case this group is still queued for further backup. 2652 // We need to keep track of this state in case this group is still queued for further backup.
2623 so.IsDeleted = true; 2653 so.IsDeleted = true;
2624 2654
@@ -2638,9 +2668,9 @@ namespace OpenSim.Region.Framework.Scenes
2638 public void CrossPrimGroupIntoNewRegion(Vector3 attemptedPosition, SceneObjectGroup grp, bool silent) 2668 public void CrossPrimGroupIntoNewRegion(Vector3 attemptedPosition, SceneObjectGroup grp, bool silent)
2639 { 2669 {
2640 if (grp == null) 2670 if (grp == null)
2641 return; 2671 return;
2642 if (grp.IsDeleted) 2672 if (grp.IsDeleted)
2643 return; 2673 return;
2644 2674
2645 if (grp.RootPart.DIE_AT_EDGE) 2675 if (grp.RootPart.DIE_AT_EDGE)
2646 { 2676 {
@@ -2674,7 +2704,7 @@ namespace OpenSim.Region.Framework.Scenes
2674 } 2704 }
2675 2705
2676 if (EntityTransferModule != null) 2706 if (EntityTransferModule != null)
2677 EntityTransferModule.Cross(grp, attemptedPosition, silent); 2707 EntityTransferModule.Cross(grp, attemptedPosition, silent);
2678 } 2708 }
2679 2709
2680 // Simple test to see if a position is in the current region. 2710 // Simple test to see if a position is in the current region.
@@ -2687,14 +2717,14 @@ namespace OpenSim.Region.Framework.Scenes
2687 int xx = (int)Math.Floor(pos.X); 2717 int xx = (int)Math.Floor(pos.X);
2688 int yy = (int)Math.Floor(pos.Y); 2718 int yy = (int)Math.Floor(pos.Y);
2689 if (xx < 0 || yy < 0) 2719 if (xx < 0 || yy < 0)
2690 return false; 2720 return false;
2691 2721
2692 IRegionCombinerModule regionCombinerModule = RequestModuleInterface<IRegionCombinerModule>(); 2722 IRegionCombinerModule regionCombinerModule = RequestModuleInterface<IRegionCombinerModule>();
2693 if (regionCombinerModule == null) 2723 if (regionCombinerModule == null)
2694 { 2724 {
2695 // Regular region. Just check for region size 2725 // Regular region. Just check for region size
2696 if (xx < RegionInfo.RegionSizeX && yy < RegionInfo.RegionSizeY ) 2726 if (xx < RegionInfo.RegionSizeX && yy < RegionInfo.RegionSizeY)
2697 ret = true; 2727 ret = true;
2698 } 2728 }
2699 else 2729 else
2700 { 2730 {
@@ -2728,7 +2758,7 @@ namespace OpenSim.Region.Framework.Scenes
2728 } 2758 }
2729 2759
2730 if (!EntityTransferModule.HandleIncomingSceneObject(newObject, newPosition)) 2760 if (!EntityTransferModule.HandleIncomingSceneObject(newObject, newPosition))
2731 return false; 2761 return false;
2732 2762
2733 // Do this as late as possible so that listeners have full access to the incoming object 2763 // Do this as late as possible so that listeners have full access to the incoming object
2734 EventManager.TriggerOnIncomingSceneObject(newObject); 2764 EventManager.TriggerOnIncomingSceneObject(newObject);
@@ -2749,13 +2779,13 @@ namespace OpenSim.Region.Framework.Scenes
2749 // 2779 //
2750 SceneObjectPart[] parts = sceneObject.Parts; 2780 SceneObjectPart[] parts = sceneObject.Parts;
2751 for (int i = 0; i < parts.Length; i++) 2781 for (int i = 0; i < parts.Length; i++)
2752 parts[i].LocalId = 0; 2782 parts[i].LocalId = 0;
2753 2783
2754 if (sceneObject.IsAttachmentCheckFull()) // Attachment 2784 if (sceneObject.IsAttachmentCheckFull()) // Attachment
2755 { 2785 {
2756 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); 2786 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
2757 sceneObject.RootPart.AddFlag(PrimFlags.Phantom); 2787 sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
2758 2788
2759 // Don't sent a full update here because this will cause full updates to be sent twice for 2789 // Don't sent a full update here because this will cause full updates to be sent twice for
2760 // attachments on region crossings, resulting in viewer glitches. 2790 // attachments on region crossings, resulting in viewer glitches.
2761 AddRestoredSceneObject(sceneObject, false, false, false); 2791 AddRestoredSceneObject(sceneObject, false, false, false);
@@ -2770,10 +2800,10 @@ namespace OpenSim.Region.Framework.Scenes
2770 { 2800 {
2771 SceneObjectGroup grp = sceneObject; 2801 SceneObjectGroup grp = sceneObject;
2772 2802
2773// m_log.DebugFormat( 2803 // m_log.DebugFormat(
2774// "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); 2804 // "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID);
2775// m_log.DebugFormat( 2805 // m_log.DebugFormat(
2776// "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); 2806 // "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2777 2807
2778 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2808 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2779 2809
@@ -2781,7 +2811,7 @@ namespace OpenSim.Region.Framework.Scenes
2781 // information that this is due to a teleport/border cross rather than an ordinary attachment. 2811 // information that this is due to a teleport/border cross rather than an ordinary attachment.
2782 // We currently do this in Scene.MakeRootAgent() instead. 2812 // We currently do this in Scene.MakeRootAgent() instead.
2783 if (AttachmentsModule != null) 2813 if (AttachmentsModule != null)
2784 AttachmentsModule.AttachObject(sp, grp, 0, false, false, true); 2814 AttachmentsModule.AttachObject(sp, grp, 0, false, false, true);
2785 } 2815 }
2786 else 2816 else
2787 { 2817 {
@@ -2807,6 +2837,9 @@ namespace OpenSim.Region.Framework.Scenes
2807 bool vialogin; 2837 bool vialogin;
2808 bool reallyNew = true; 2838 bool reallyNew = true;
2809 2839
2840 // Update the number of users attempting to login
2841 StatsReporter.UpdateUsersLoggingIn(true);
2842
2810 // Validation occurs in LLUDPServer 2843 // Validation occurs in LLUDPServer
2811 // 2844 //
2812 // XXX: A race condition exists here where two simultaneous calls to AddNewAgent can interfere with 2845 // XXX: A race condition exists here where two simultaneous calls to AddNewAgent can interfere with
@@ -2827,11 +2860,11 @@ namespace OpenSim.Region.Framework.Scenes
2827 lock (aCircuit) 2860 lock (aCircuit)
2828 { 2861 {
2829 vialogin 2862 vialogin
2830 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 2863 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2831 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2864 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2832 2865
2833 // CheckHeartbeat(); 2866 // CheckHeartbeat();
2834 2867
2835 sp = GetScenePresence(client.AgentId); 2868 sp = GetScenePresence(client.AgentId);
2836 2869
2837 // XXX: Not sure how good it is to add a new client if a scene presence already exists. Possibly this 2870 // XXX: Not sure how good it is to add a new client if a scene presence already exists. Possibly this
@@ -2841,9 +2874,9 @@ namespace OpenSim.Region.Framework.Scenes
2841 if (sp == null) 2874 if (sp == null)
2842 { 2875 {
2843 m_log.DebugFormat( 2876 m_log.DebugFormat(
2844 "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}", 2877 "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}",
2845 client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos); 2878 client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos);
2846 2879
2847 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); 2880 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
2848 2881
2849 // We must set this here so that TriggerOnNewClient and TriggerOnClientLogin can determine whether the 2882 // We must set this here so that TriggerOnNewClient and TriggerOnClientLogin can determine whether the
@@ -2860,7 +2893,7 @@ namespace OpenSim.Region.Framework.Scenes
2860 m_clientManager.Add(client); 2893 m_clientManager.Add(client);
2861 SubscribeToClientEvents(client); 2894 SubscribeToClientEvents(client);
2862 m_eventManager.TriggerOnNewPresence(sp); 2895 m_eventManager.TriggerOnNewPresence(sp);
2863 2896
2864 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags; 2897 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
2865 } 2898 }
2866 else 2899 else
@@ -2873,24 +2906,28 @@ namespace OpenSim.Region.Framework.Scenes
2873 client.SceneAgent = sp; 2906 client.SceneAgent = sp;
2874 2907
2875 m_log.WarnFormat( 2908 m_log.WarnFormat(
2876 "[SCENE]: Already found {0} scene presence for {1} in {2} when asked to add new scene presence", 2909 "[SCENE]: Already found {0} scene presence for {1} in {2} when asked to add new scene presence",
2877 sp.IsChildAgent ? "child" : "root", sp.Name, RegionInfo.RegionName); 2910 sp.IsChildAgent ? "child" : "root", sp.Name, RegionInfo.RegionName);
2878 2911
2879 reallyNew = false; 2912 reallyNew = false;
2880 } 2913 }
2881 2914
2882 // This is currently also being done earlier in NewUserConnection for real users to see if this 2915 // This is currently also being done earlier in NewUserConnection for real users to see if this
2883 // resolves problems where HG agents are occasionally seen by others as "Unknown user" in chat and other 2916 // resolves problems where HG agents are occasionally seen by others as "Unknown user" in chat and other
2884 // places. However, we still need to do it here for NPCs. 2917 // places. However, we still need to do it here for NPCs.
2885 CacheUserName(sp, aCircuit); 2918 CacheUserName(sp, aCircuit);
2886 2919
2887 if (reallyNew) 2920 if (reallyNew)
2888 EventManager.TriggerOnNewClient(client); 2921 EventManager.TriggerOnNewClient(client);
2889 2922
2890 if (vialogin) 2923 if (vialogin)
2891 EventManager.TriggerOnClientLogin(client); 2924 EventManager.TriggerOnClientLogin(client);
2892 } 2925 }
2893 2926
2927 // User has logged into the scene so update the list of users logging
2928 // in
2929 StatsReporter.UpdateUsersLoggingIn(false);
2930
2894 m_LastLogin = Util.EnvironmentTickCount(); 2931 m_LastLogin = Util.EnvironmentTickCount();
2895 2932
2896 return sp; 2933 return sp;
@@ -2903,9 +2940,9 @@ namespace OpenSim.Region.Framework.Scenes
2903 { 2940 {
2904 AgentCircuitData circuit = AuthenticateHandler.GetAgentCircuitData(agentID); 2941 AgentCircuitData circuit = AuthenticateHandler.GetAgentCircuitData(agentID);
2905 if (circuit != null && circuit.ServiceURLs != null && circuit.ServiceURLs.ContainsKey("HomeURI")) 2942 if (circuit != null && circuit.ServiceURLs != null && circuit.ServiceURLs.ContainsKey("HomeURI"))
2906 return circuit.ServiceURLs["HomeURI"].ToString(); 2943 return circuit.ServiceURLs["HomeURI"].ToString();
2907 else 2944 else
2908 return null; 2945 return null;
2909 } 2946 }
2910 2947
2911 /// <summary> 2948 /// <summary>
@@ -2928,7 +2965,7 @@ namespace OpenSim.Region.Framework.Scenes
2928 string homeURL = string.Empty; 2965 string homeURL = string.Empty;
2929 2966
2930 if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) 2967 if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
2931 homeURL = aCircuit.ServiceURLs["HomeURI"].ToString(); 2968 homeURL = aCircuit.ServiceURLs["HomeURI"].ToString();
2932 2969
2933 if (aCircuit.lastname.StartsWith("@")) 2970 if (aCircuit.lastname.StartsWith("@"))
2934 { 2971 {
@@ -2948,7 +2985,7 @@ namespace OpenSim.Region.Framework.Scenes
2948 private bool VerifyClient(AgentCircuitData aCircuit, System.Net.IPEndPoint ep, out bool vialogin) 2985 private bool VerifyClient(AgentCircuitData aCircuit, System.Net.IPEndPoint ep, out bool vialogin)
2949 { 2986 {
2950 vialogin = false; 2987 vialogin = false;
2951 2988
2952 // Do the verification here 2989 // Do the verification here
2953 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) 2990 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
2954 { 2991 {
@@ -2964,7 +3001,7 @@ namespace OpenSim.Region.Framework.Scenes
2964 return false; 3001 return false;
2965 } 3002 }
2966 else 3003 else
2967 m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned true", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); 3004 m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned true", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName);
2968 3005
2969 } 3006 }
2970 } 3007 }
@@ -2972,7 +3009,7 @@ namespace OpenSim.Region.Framework.Scenes
2972 else if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) 3009 else if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0)
2973 { 3010 {
2974 m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via regular login. Client IP verification not performed.", 3011 m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via regular login. Client IP verification not performed.",
2975 aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); 3012 aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName);
2976 vialogin = true; 3013 vialogin = true;
2977 } 3014 }
2978 3015
@@ -3016,7 +3053,7 @@ namespace OpenSim.Region.Framework.Scenes
3016 } 3053 }
3017 } 3054 }
3018 else 3055 else
3019 return true; 3056 return true;
3020 } 3057 }
3021 3058
3022 return false; 3059 return false;
@@ -3043,7 +3080,7 @@ namespace OpenSim.Region.Framework.Scenes
3043 { 3080 {
3044 client.OnRegionHandShakeReply += SendLayerData; 3081 client.OnRegionHandShakeReply += SendLayerData;
3045 } 3082 }
3046 3083
3047 public virtual void SubscribeToClientPrimEvents(IClientAPI client) 3084 public virtual void SubscribeToClientPrimEvents(IClientAPI client)
3048 { 3085 {
3049 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 3086 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
@@ -3053,7 +3090,7 @@ namespace OpenSim.Region.Framework.Scenes
3053 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 3090 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
3054 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 3091 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
3055 client.OnUpdatePrimSingleRotationPosition += m_sceneGraph.UpdatePrimSingleRotationPosition; 3092 client.OnUpdatePrimSingleRotationPosition += m_sceneGraph.UpdatePrimSingleRotationPosition;
3056 3093
3057 client.OnUpdatePrimScale += m_sceneGraph.UpdatePrimScale; 3094 client.OnUpdatePrimScale += m_sceneGraph.UpdatePrimScale;
3058 client.OnUpdatePrimGroupScale += m_sceneGraph.UpdatePrimGroupScale; 3095 client.OnUpdatePrimGroupScale += m_sceneGraph.UpdatePrimGroupScale;
3059 client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam; 3096 client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam;
@@ -3066,7 +3103,7 @@ namespace OpenSim.Region.Framework.Scenes
3066 client.OnSpinStart += m_sceneGraph.SpinStart; 3103 client.OnSpinStart += m_sceneGraph.SpinStart;
3067 client.OnSpinUpdate += m_sceneGraph.SpinObject; 3104 client.OnSpinUpdate += m_sceneGraph.SpinObject;
3068 client.OnDeRezObject += DeRezObjects; 3105 client.OnDeRezObject += DeRezObjects;
3069 3106
3070 client.OnObjectName += m_sceneGraph.PrimName; 3107 client.OnObjectName += m_sceneGraph.PrimName;
3071 client.OnObjectClickAction += m_sceneGraph.PrimClickAction; 3108 client.OnObjectClickAction += m_sceneGraph.PrimClickAction;
3072 client.OnObjectMaterial += m_sceneGraph.PrimMaterial; 3109 client.OnObjectMaterial += m_sceneGraph.PrimMaterial;
@@ -3078,7 +3115,7 @@ namespace OpenSim.Region.Framework.Scenes
3078 client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; 3115 client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily;
3079 client.OnObjectPermissions += HandleObjectPermissionsUpdate; 3116 client.OnObjectPermissions += HandleObjectPermissionsUpdate;
3080 client.OnGrabObject += ProcessObjectGrab; 3117 client.OnGrabObject += ProcessObjectGrab;
3081 client.OnGrabUpdate += ProcessObjectGrabUpdate; 3118 client.OnGrabUpdate += ProcessObjectGrabUpdate;
3082 client.OnDeGrabObject += ProcessObjectDeGrab; 3119 client.OnDeGrabObject += ProcessObjectDeGrab;
3083 client.OnUndo += m_sceneGraph.HandleUndo; 3120 client.OnUndo += m_sceneGraph.HandleUndo;
3084 client.OnRedo += m_sceneGraph.HandleRedo; 3121 client.OnRedo += m_sceneGraph.HandleRedo;
@@ -3139,7 +3176,7 @@ namespace OpenSim.Region.Framework.Scenes
3139 //client.OnNameFromUUIDRequest += HandleUUIDNameRequest; 3176 //client.OnNameFromUUIDRequest += HandleUUIDNameRequest;
3140 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; 3177 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest;
3141 } 3178 }
3142 3179
3143 public virtual void SubscribeToClientNetworkEvents(IClientAPI client) 3180 public virtual void SubscribeToClientNetworkEvents(IClientAPI client)
3144 { 3181 {
3145 client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats; 3182 client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats;
@@ -3300,7 +3337,7 @@ namespace OpenSim.Region.Framework.Scenes
3300 { 3337 {
3301 SceneObjectGroup copy = SceneGraph.DuplicateObject(originalPrim, offset, flags, AgentID, GroupID, Quaternion.Identity); 3338 SceneObjectGroup copy = SceneGraph.DuplicateObject(originalPrim, offset, flags, AgentID, GroupID, Quaternion.Identity);
3302 if (copy != null) 3339 if (copy != null)
3303 EventManager.TriggerObjectAddedToScene(copy); 3340 EventManager.TriggerObjectAddedToScene(copy);
3304 } 3341 }
3305 3342
3306 /// <summary> 3343 /// <summary>
@@ -3319,8 +3356,8 @@ namespace OpenSim.Region.Framework.Scenes
3319 /// <param name="CopyCenters">Position the object at the center of the face that it's colliding with</param> 3356 /// <param name="CopyCenters">Position the object at the center of the face that it's colliding with</param>
3320 /// <param name="CopyRotates">Rotate the object the same as the localID object</param> 3357 /// <param name="CopyRotates">Rotate the object the same as the localID object</param>
3321 public void doObjectDuplicateOnRay(uint localID, uint dupeFlags, UUID AgentID, UUID GroupID, 3358 public void doObjectDuplicateOnRay(uint localID, uint dupeFlags, UUID AgentID, UUID GroupID,
3322 UUID RayTargetObj, Vector3 RayEnd, Vector3 RayStart, 3359 UUID RayTargetObj, Vector3 RayEnd, Vector3 RayStart,
3323 bool BypassRaycast, bool RayEndIsIntersection, bool CopyCenters, bool CopyRotates) 3360 bool BypassRaycast, bool RayEndIsIntersection, bool CopyCenters, bool CopyRotates)
3324 { 3361 {
3325 Vector3 pos; 3362 Vector3 pos;
3326 const bool frontFacesOnly = true; 3363 const bool frontFacesOnly = true;
@@ -3381,7 +3418,7 @@ namespace OpenSim.Region.Framework.Scenes
3381 } 3418 }
3382 3419
3383 if (copy != null) 3420 if (copy != null)
3384 EventManager.TriggerObjectAddedToScene(copy); 3421 EventManager.TriggerObjectAddedToScene(copy);
3385 } 3422 }
3386 } 3423 }
3387 } 3424 }
@@ -3432,25 +3469,25 @@ namespace OpenSim.Region.Framework.Scenes
3432 if (acd == null) 3469 if (acd == null)
3433 { 3470 {
3434 m_log.ErrorFormat( 3471 m_log.ErrorFormat(
3435 "[SCENE]: No agent circuit found for {0} in {1}, aborting Scene.RemoveClient", agentID, Name); 3472 "[SCENE]: No agent circuit found for {0} in {1}, aborting Scene.RemoveClient", agentID, Name);
3436 3473
3437 return; 3474 return;
3438 } 3475 }
3439 3476
3440 // TODO: Can we now remove this lock? 3477 // TODO: Can we now remove this lock?
3441 lock (acd) 3478 lock (acd)
3442 { 3479 {
3443 bool isChildAgent = false; 3480 bool isChildAgent = false;
3444 3481
3445 ScenePresence avatar = GetScenePresence(agentID); 3482 ScenePresence avatar = GetScenePresence(agentID);
3446 3483
3447 // Shouldn't be necessary since RemoveClient() is currently only called by IClientAPI.Close() which 3484 // Shouldn't be necessary since RemoveClient() is currently only called by IClientAPI.Close() which
3448 // in turn is only called by Scene.IncomingCloseAgent() which checks whether the presence exists or not 3485 // in turn is only called by Scene.IncomingCloseAgent() which checks whether the presence exists or not
3449 // However, will keep for now just in case. 3486 // However, will keep for now just in case.
3450 if (avatar == null) 3487 if (avatar == null)
3451 { 3488 {
3452 m_log.ErrorFormat( 3489 m_log.ErrorFormat(
3453 "[SCENE]: Called RemoveClient() with agent ID {0} but no such presence is in the scene.", agentID); 3490 "[SCENE]: Called RemoveClient() with agent ID {0} but no such presence is in the scene.", agentID);
3454 m_authenticateHandler.RemoveCircuit(agentID); 3491 m_authenticateHandler.RemoveCircuit(agentID);
3455 3492
3456 return; 3493 return;
@@ -3461,9 +3498,9 @@ namespace OpenSim.Region.Framework.Scenes
3461 isChildAgent = avatar.IsChildAgent; 3498 isChildAgent = avatar.IsChildAgent;
3462 3499
3463 m_log.DebugFormat( 3500 m_log.DebugFormat(
3464 "[SCENE]: Removing {0} agent {1} {2} from {3}", 3501 "[SCENE]: Removing {0} agent {1} {2} from {3}",
3465 isChildAgent ? "child" : "root", avatar.Name, agentID, Name); 3502 isChildAgent ? "child" : "root", avatar.Name, agentID, Name);
3466 3503
3467 // Don't do this to root agents, it's not nice for the viewer 3504 // Don't do this to root agents, it's not nice for the viewer
3468 if (closeChildAgents && isChildAgent) 3505 if (closeChildAgents && isChildAgent)
3469 { 3506 {
@@ -3471,20 +3508,20 @@ namespace OpenSim.Region.Framework.Scenes
3471 // Let's do this via UDP 3508 // Let's do this via UDP
3472 avatar.ControllingClient.SendShutdownConnectionNotice(); 3509 avatar.ControllingClient.SendShutdownConnectionNotice();
3473 } 3510 }
3474 3511
3475 // Only applies to root agents. 3512 // Only applies to root agents.
3476 if (avatar.ParentID != 0) 3513 if (avatar.ParentID != 0)
3477 { 3514 {
3478 avatar.StandUp(); 3515 avatar.StandUp();
3479 } 3516 }
3480 3517
3481 m_sceneGraph.removeUserCount(!isChildAgent); 3518 m_sceneGraph.removeUserCount(!isChildAgent);
3482 3519
3483 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop 3520 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop
3484 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI 3521 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI
3485 if (closeChildAgents && CapsModule != null) 3522 if (closeChildAgents && CapsModule != null)
3486 CapsModule.RemoveCaps(agentID); 3523 CapsModule.RemoveCaps(agentID);
3487 3524
3488 if (closeChildAgents && !isChildAgent) 3525 if (closeChildAgents && !isChildAgent)
3489 { 3526 {
3490 List<ulong> regions = avatar.KnownRegionHandles; 3527 List<ulong> regions = avatar.KnownRegionHandles;
@@ -3493,10 +3530,10 @@ namespace OpenSim.Region.Framework.Scenes
3493 // This ends up being done asynchronously so that a logout isn't held up where there are many present but unresponsive neighbours. 3530 // This ends up being done asynchronously so that a logout isn't held up where there are many present but unresponsive neighbours.
3494 m_sceneGridService.SendCloseChildAgentConnections(agentID, acd.SessionID.ToString(), regions); 3531 m_sceneGridService.SendCloseChildAgentConnections(agentID, acd.SessionID.ToString(), regions);
3495 } 3532 }
3496 3533
3497 m_eventManager.TriggerClientClosed(agentID, this); 3534 m_eventManager.TriggerClientClosed(agentID, this);
3498 m_eventManager.TriggerOnRemovePresence(agentID); 3535 m_eventManager.TriggerOnRemovePresence(agentID);
3499 3536
3500 if (!isChildAgent) 3537 if (!isChildAgent)
3501 { 3538 {
3502 if (AttachmentsModule != null) 3539 if (AttachmentsModule != null)
@@ -3505,22 +3542,22 @@ namespace OpenSim.Region.Framework.Scenes
3505 } 3542 }
3506 3543
3507 ForEachClient( 3544 ForEachClient(
3508 delegate(IClientAPI client) 3545 delegate(IClientAPI client)
3509 { 3546 {
3510 //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway 3547 //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway
3511 try { client.SendKillObject(new List<uint> { avatar.LocalId }); } 3548 try { client.SendKillObject(new List<uint> { avatar.LocalId }); }
3512 catch (NullReferenceException) { } 3549 catch (NullReferenceException) { }
3513 }); 3550 });
3514 } 3551 }
3515 3552
3516 // It's possible for child agents to have transactions if changes are being made cross-border. 3553 // It's possible for child agents to have transactions if changes are being made cross-border.
3517 if (AgentTransactionsModule != null) 3554 if (AgentTransactionsModule != null)
3518 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); 3555 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID);
3519 } 3556 }
3520 catch (Exception e) 3557 catch (Exception e)
3521 { 3558 {
3522 m_log.Error( 3559 m_log.Error(
3523 string.Format("[SCENE]: Exception removing {0} from {1}. Cleaning up. Exception ", avatar.Name, Name), e); 3560 string.Format("[SCENE]: Exception removing {0} from {1}. Cleaning up. Exception ", avatar.Name, Name), e);
3524 } 3561 }
3525 finally 3562 finally
3526 { 3563 {
@@ -3532,13 +3569,13 @@ namespace OpenSim.Region.Framework.Scenes
3532 m_authenticateHandler.RemoveCircuit(agentID); 3569 m_authenticateHandler.RemoveCircuit(agentID);
3533 m_sceneGraph.RemoveScenePresence(agentID); 3570 m_sceneGraph.RemoveScenePresence(agentID);
3534 m_clientManager.Remove(agentID); 3571 m_clientManager.Remove(agentID);
3535 3572
3536 avatar.Close(); 3573 avatar.Close();
3537 } 3574 }
3538 catch (Exception e) 3575 catch (Exception e)
3539 { 3576 {
3540 m_log.Error( 3577 m_log.Error(
3541 string.Format("[SCENE]: Exception in final clean up of {0} in {1}. Exception ", avatar.Name, Name), e); 3578 string.Format("[SCENE]: Exception in final clean up of {0} in {1}. Exception ", avatar.Name, Name), e);
3542 } 3579 }
3543 } 3580 }
3544 } 3581 }
@@ -3584,7 +3621,7 @@ namespace OpenSim.Region.Framework.Scenes
3584 if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid 3621 if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid
3585 { 3622 {
3586 if (part.ParentGroup.RootPart != part) // Child part 3623 if (part.ParentGroup.RootPart != part) // Child part
3587 continue; 3624 continue;
3588 } 3625 }
3589 } 3626 }
3590 deleteIDs.Add(localID); 3627 deleteIDs.Add(localID);
@@ -3637,7 +3674,7 @@ namespace OpenSim.Region.Framework.Scenes
3637 public bool NewUserConnection(AgentCircuitData acd, uint teleportFlags, GridRegion source, out string reason, bool requirePresenceLookup) 3674 public bool NewUserConnection(AgentCircuitData acd, uint teleportFlags, GridRegion source, out string reason, bool requirePresenceLookup)
3638 { 3675 {
3639 bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || 3676 bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 ||
3640 (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); 3677 (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0);
3641 bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0); 3678 bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0);
3642 bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0); 3679 bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0);
3643 3680
@@ -3653,18 +3690,18 @@ namespace OpenSim.Region.Framework.Scenes
3653 // Don't disable this log message - it's too helpful 3690 // Don't disable this log message - it's too helpful
3654 string curViewer = Util.GetViewerName(acd); 3691 string curViewer = Util.GetViewerName(acd);
3655 m_log.DebugFormat( 3692 m_log.DebugFormat(
3656 "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9}. {10}", 3693 "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9}. {10}",
3657 RegionInfo.RegionName, 3694 RegionInfo.RegionName,
3658 (acd.child ? "child" : "root"), 3695 (acd.child ? "child" : "root"),
3659 acd.firstname, 3696 acd.firstname,
3660 acd.lastname, 3697 acd.lastname,
3661 acd.AgentID, 3698 acd.AgentID,
3662 acd.circuitcode, 3699 acd.circuitcode,
3663 acd.IPAddress, 3700 acd.IPAddress,
3664 curViewer, 3701 curViewer,
3665 ((TPFlags)teleportFlags).ToString(), 3702 ((TPFlags)teleportFlags).ToString(),
3666 acd.startpos, 3703 acd.startpos,
3667 (source == null) ? "" : string.Format("From region {0} ({1}){2}", source.RegionName, source.RegionID, (source.RawServerURI == null) ? "" : " @ " + source.ServerURI) 3704 (source == null) ? "" : string.Format("From region {0} ({1}){2}", source.RegionName, source.RegionID, (source.RawServerURI == null) ? "" : " @ " + source.ServerURI)
3668 ); 3705 );
3669 3706
3670 if (!LoginsEnabled) 3707 if (!LoginsEnabled)
@@ -3710,8 +3747,8 @@ namespace OpenSim.Region.Framework.Scenes
3710 if (ViewerDenied) 3747 if (ViewerDenied)
3711 { 3748 {
3712 m_log.DebugFormat( 3749 m_log.DebugFormat(
3713 "[SCENE]: Access denied for {0} {1} using {2}", 3750 "[SCENE]: Access denied for {0} {1} using {2}",
3714 acd.firstname, acd.lastname, curViewer); 3751 acd.firstname, acd.lastname, curViewer);
3715 reason = "Access denied, your viewer is banned by the region owner"; 3752 reason = "Access denied, your viewer is banned by the region owner";
3716 return false; 3753 return false;
3717 } 3754 }
@@ -3725,13 +3762,13 @@ namespace OpenSim.Region.Framework.Scenes
3725 3762
3726 // We need to ensure that we are not already removing the scene presence before we ask it not to be 3763 // We need to ensure that we are not already removing the scene presence before we ask it not to be
3727 // closed. 3764 // closed.
3728 if (sp != null && sp.IsChildAgent 3765 if (sp != null && sp.IsChildAgent
3729 && (sp.LifecycleState == ScenePresenceState.Running 3766 && (sp.LifecycleState == ScenePresenceState.Running
3730 || sp.LifecycleState == ScenePresenceState.PreRemove)) 3767 || sp.LifecycleState == ScenePresenceState.PreRemove))
3731 { 3768 {
3732 m_log.DebugFormat( 3769 m_log.DebugFormat(
3733 "[SCENE]: Reusing existing child scene presence for {0}, state {1} in {2}", 3770 "[SCENE]: Reusing existing child scene presence for {0}, state {1} in {2}",
3734 sp.Name, sp.LifecycleState, Name); 3771 sp.Name, sp.LifecycleState, Name);
3735 3772
3736 // In the case where, for example, an A B C D region layout, an avatar may 3773 // In the case where, for example, an A B C D region layout, an avatar may
3737 // teleport from A -> D, but then -> C before A has asked B to close its old child agent. When C 3774 // teleport from A -> D, but then -> C before A has asked B to close its old child agent. When C
@@ -3743,15 +3780,15 @@ namespace OpenSim.Region.Framework.Scenes
3743 // vulnerable to an issue when a viewer quits a region without sending a proper logout but then 3780 // vulnerable to an issue when a viewer quits a region without sending a proper logout but then
3744 // re-establishes the connection on a relogin. This could wrongly set the DoNotCloseAfterTeleport 3781 // re-establishes the connection on a relogin. This could wrongly set the DoNotCloseAfterTeleport
3745 // flag when no teleport had taken place (and hence no close was going to come). 3782 // flag when no teleport had taken place (and hence no close was going to come).
3746// if (!acd.ChildrenCapSeeds.ContainsKey(RegionInfo.RegionHandle)) 3783 // if (!acd.ChildrenCapSeeds.ContainsKey(RegionInfo.RegionHandle))
3747// { 3784 // {
3748// m_log.DebugFormat( 3785 // m_log.DebugFormat(
3749// "[SCENE]: Setting DoNotCloseAfterTeleport for child scene presence {0} in {1} because source will attempt close.", 3786 // "[SCENE]: Setting DoNotCloseAfterTeleport for child scene presence {0} in {1} because source will attempt close.",
3750// sp.Name, Name); 3787 // sp.Name, Name);
3751// 3788 //
3752// sp.DoNotCloseAfterTeleport = true; 3789 // sp.DoNotCloseAfterTeleport = true;
3753// } 3790 // }
3754// else if (EntityTransferModule.IsInTransit(sp.UUID)) 3791 // else if (EntityTransferModule.IsInTransit(sp.UUID))
3755 3792
3756 sp.LifecycleState = ScenePresenceState.Running; 3793 sp.LifecycleState = ScenePresenceState.Running;
3757 3794
@@ -3760,8 +3797,8 @@ namespace OpenSim.Region.Framework.Scenes
3760 sp.DoNotCloseAfterTeleport = true; 3797 sp.DoNotCloseAfterTeleport = true;
3761 3798
3762 m_log.DebugFormat( 3799 m_log.DebugFormat(
3763 "[SCENE]: Set DoNotCloseAfterTeleport for child scene presence {0} in {1} because this region will attempt end-of-teleport close from a previous close.", 3800 "[SCENE]: Set DoNotCloseAfterTeleport for child scene presence {0} in {1} because this region will attempt end-of-teleport close from a previous close.",
3764 sp.Name, Name); 3801 sp.Name, Name);
3765 } 3802 }
3766 } 3803 }
3767 } 3804 }
@@ -3775,21 +3812,21 @@ namespace OpenSim.Region.Framework.Scenes
3775 int pollsLeft = polls; 3812 int pollsLeft = polls;
3776 3813
3777 while (sp.LifecycleState == ScenePresenceState.Removing && pollsLeft-- > 0) 3814 while (sp.LifecycleState == ScenePresenceState.Removing && pollsLeft-- > 0)
3778 Thread.Sleep(pollInterval); 3815 Thread.Sleep(pollInterval);
3779 3816
3780 if (sp.LifecycleState == ScenePresenceState.Removing) 3817 if (sp.LifecycleState == ScenePresenceState.Removing)
3781 { 3818 {
3782 m_log.WarnFormat( 3819 m_log.WarnFormat(
3783 "[SCENE]: Agent {0} in {1} was still being removed after {2}s. Aborting NewUserConnection.", 3820 "[SCENE]: Agent {0} in {1} was still being removed after {2}s. Aborting NewUserConnection.",
3784 sp.Name, Name, polls * pollInterval / 1000); 3821 sp.Name, Name, polls * pollInterval / 1000);
3785 3822
3786 return false; 3823 return false;
3787 } 3824 }
3788 else if (polls != pollsLeft) 3825 else if (polls != pollsLeft)
3789 { 3826 {
3790 m_log.DebugFormat( 3827 m_log.DebugFormat(
3791 "[SCENE]: NewUserConnection for agent {0} in {1} had to wait {2}s for in-progress removal to complete on an old presence.", 3828 "[SCENE]: NewUserConnection for agent {0} in {1} had to wait {2}s for in-progress removal to complete on an old presence.",
3792 sp.Name, Name, polls * pollInterval / 1000); 3829 sp.Name, Name, polls * pollInterval / 1000);
3793 } 3830 }
3794 } 3831 }
3795 3832
@@ -3805,11 +3842,11 @@ namespace OpenSim.Region.Framework.Scenes
3805 // Or the same user is trying to be root twice here, won't work. 3842 // Or the same user is trying to be root twice here, won't work.
3806 // Kill it. 3843 // Kill it.
3807 m_log.WarnFormat( 3844 m_log.WarnFormat(
3808 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.", 3845 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.",
3809 sp.Name, sp.UUID, RegionInfo.RegionName); 3846 sp.Name, sp.UUID, RegionInfo.RegionName);
3810 3847
3811 if (sp.ControllingClient != null) 3848 if (sp.ControllingClient != null)
3812 CloseAgent(sp.UUID, true); 3849 CloseAgent(sp.UUID, true);
3813 3850
3814 sp = null; 3851 sp = null;
3815 } 3852 }
@@ -3824,7 +3861,7 @@ namespace OpenSim.Region.Framework.Scenes
3824 m_authenticateHandler.AddNewCircuit(acd.circuitcode, acd); 3861 m_authenticateHandler.AddNewCircuit(acd.circuitcode, acd);
3825 3862
3826 land = LandChannel.GetLandObject(acd.startpos.X, acd.startpos.Y); 3863 land = LandChannel.GetLandObject(acd.startpos.X, acd.startpos.Y);
3827 3864
3828 // On login test land permisions 3865 // On login test land permisions
3829 if (vialogin) 3866 if (vialogin)
3830 { 3867 {
@@ -3834,7 +3871,7 @@ namespace OpenSim.Region.Framework.Scenes
3834 return false; 3871 return false;
3835 } 3872 }
3836 } 3873 }
3837 3874
3838 if (sp == null) // We don't have an [child] agent here already 3875 if (sp == null) // We don't have an [child] agent here already
3839 { 3876 {
3840 if (requirePresenceLookup) 3877 if (requirePresenceLookup)
@@ -3850,13 +3887,13 @@ namespace OpenSim.Region.Framework.Scenes
3850 catch (Exception e) 3887 catch (Exception e)
3851 { 3888 {
3852 m_log.ErrorFormat( 3889 m_log.ErrorFormat(
3853 "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); 3890 "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace);
3854 3891
3855 m_authenticateHandler.RemoveCircuit(acd.circuitcode); 3892 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3856 return false; 3893 return false;
3857 } 3894 }
3858 } 3895 }
3859 3896
3860 try 3897 try
3861 { 3898 {
3862 if (!AuthorizeUser(acd, (vialogin ? false : SeeIntoRegion), out reason)) 3899 if (!AuthorizeUser(acd, (vialogin ? false : SeeIntoRegion), out reason))
@@ -3868,17 +3905,17 @@ namespace OpenSim.Region.Framework.Scenes
3868 catch (Exception e) 3905 catch (Exception e)
3869 { 3906 {
3870 m_log.ErrorFormat( 3907 m_log.ErrorFormat(
3871 "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace); 3908 "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace);
3872 3909
3873 m_authenticateHandler.RemoveCircuit(acd.circuitcode); 3910 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3874 return false; 3911 return false;
3875 } 3912 }
3876 3913
3877 m_log.InfoFormat( 3914 m_log.InfoFormat(
3878 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", 3915 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
3879 Name, (acd.child ? "child" : "root"), acd.firstname, acd.lastname, 3916 Name, (acd.child ? "child" : "root"), acd.firstname, acd.lastname,
3880 acd.AgentID, acd.circuitcode); 3917 acd.AgentID, acd.circuitcode);
3881 3918
3882 if (CapsModule != null) 3919 if (CapsModule != null)
3883 { 3920 {
3884 CapsModule.SetAgentCapsSeeds(acd); 3921 CapsModule.SetAgentCapsSeeds(acd);
@@ -3890,13 +3927,13 @@ namespace OpenSim.Region.Framework.Scenes
3890 // Let the SP know how we got here. This has a lot of interesting 3927 // Let the SP know how we got here. This has a lot of interesting
3891 // uses down the line. 3928 // uses down the line.
3892 sp.TeleportFlags = (TPFlags)teleportFlags; 3929 sp.TeleportFlags = (TPFlags)teleportFlags;
3893 3930
3894 if (sp.IsChildAgent) 3931 if (sp.IsChildAgent)
3895 { 3932 {
3896 m_log.DebugFormat( 3933 m_log.DebugFormat(
3897 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}", 3934 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}",
3898 acd.AgentID, RegionInfo.RegionName); 3935 acd.AgentID, RegionInfo.RegionName);
3899 3936
3900 sp.AdjustKnownSeeds(); 3937 sp.AdjustKnownSeeds();
3901 3938
3902 if (CapsModule != null) 3939 if (CapsModule != null)
@@ -3915,7 +3952,7 @@ namespace OpenSim.Region.Framework.Scenes
3915 3952
3916 if (vialogin) 3953 if (vialogin)
3917 { 3954 {
3918// CleanDroppedAttachments(); 3955 // CleanDroppedAttachments();
3919 3956
3920 // Make sure avatar position is in the region (why it wouldn't be is a mystery but do sanity checking) 3957 // Make sure avatar position is in the region (why it wouldn't be is a mystery but do sanity checking)
3921 if (acd.startpos.X < 0) acd.startpos.X = 1f; 3958 if (acd.startpos.X < 0) acd.startpos.X = 1f;
@@ -3923,14 +3960,14 @@ namespace OpenSim.Region.Framework.Scenes
3923 if (acd.startpos.Y < 0) acd.startpos.Y = 1f; 3960 if (acd.startpos.Y < 0) acd.startpos.Y = 1f;
3924 if (acd.startpos.Y >= RegionInfo.RegionSizeY) acd.startpos.Y = RegionInfo.RegionSizeY - 1f; 3961 if (acd.startpos.Y >= RegionInfo.RegionSizeY) acd.startpos.Y = RegionInfo.RegionSizeY - 1f;
3925 3962
3926// m_log.DebugFormat( 3963 // m_log.DebugFormat(
3927// "[SCENE]: Found telehub object {0} for new user connection {1} to {2}", 3964 // "[SCENE]: Found telehub object {0} for new user connection {1} to {2}",
3928// RegionInfo.RegionSettings.TelehubObject, acd.Name, Name); 3965 // RegionInfo.RegionSettings.TelehubObject, acd.Name, Name);
3929 3966
3930 // Honor Estate teleport routing via Telehubs excluding ViaHome and GodLike TeleportFlags 3967 // Honor Estate teleport routing via Telehubs excluding ViaHome and GodLike TeleportFlags
3931 if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && 3968 if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero &&
3932 RegionInfo.EstateSettings.AllowDirectTeleport == false && 3969 RegionInfo.EstateSettings.AllowDirectTeleport == false &&
3933 !viahome && !godlike) 3970 !viahome && !godlike)
3934 { 3971 {
3935 SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); 3972 SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject);
3936 3973
@@ -3942,15 +3979,15 @@ namespace OpenSim.Region.Framework.Scenes
3942 { 3979 {
3943 // We have multiple SpawnPoints, Route the agent to a random or sequential one 3980 // We have multiple SpawnPoints, Route the agent to a random or sequential one
3944 if (SpawnPointRouting == "random") 3981 if (SpawnPointRouting == "random")
3945 acd.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation( 3982 acd.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation(
3946 telehub.AbsolutePosition, 3983 telehub.AbsolutePosition,
3947 telehub.GroupRotation 3984 telehub.GroupRotation
3948 ); 3985 );
3949 else 3986 else
3950 acd.startpos = spawnpoints[SpawnPoint()].GetLocation( 3987 acd.startpos = spawnpoints[SpawnPoint()].GetLocation(
3951 telehub.AbsolutePosition, 3988 telehub.AbsolutePosition,
3952 telehub.GroupRotation 3989 telehub.GroupRotation
3953 ); 3990 );
3954 } 3991 }
3955 else if (spawnpoints.Count == 1) 3992 else if (spawnpoints.Count == 1)
3956 { 3993 {
@@ -3960,15 +3997,15 @@ namespace OpenSim.Region.Framework.Scenes
3960 else 3997 else
3961 { 3998 {
3962 m_log.DebugFormat( 3999 m_log.DebugFormat(
3963 "[SCENE]: No spawnpoints defined for telehub {0} for {1} in {2}. Continuing.", 4000 "[SCENE]: No spawnpoints defined for telehub {0} for {1} in {2}. Continuing.",
3964 RegionInfo.RegionSettings.TelehubObject, acd.Name, Name); 4001 RegionInfo.RegionSettings.TelehubObject, acd.Name, Name);
3965 } 4002 }
3966 } 4003 }
3967 else 4004 else
3968 { 4005 {
3969 m_log.DebugFormat( 4006 m_log.DebugFormat(
3970 "[SCENE]: No telehub {0} found to direct {1} in {2}. Continuing.", 4007 "[SCENE]: No telehub {0} found to direct {1} in {2}. Continuing.",
3971 RegionInfo.RegionSettings.TelehubObject, acd.Name, Name); 4008 RegionInfo.RegionSettings.TelehubObject, acd.Name, Name);
3972 } 4009 }
3973 4010
3974 // Final permissions check; this time we don't allow changing the position 4011 // Final permissions check; this time we don't allow changing the position
@@ -4005,7 +4042,7 @@ namespace OpenSim.Region.Framework.Scenes
4005 { 4042 {
4006 ILandObject land = LandChannel.GetLandObject(pos); 4043 ILandObject land = LandChannel.GetLandObject(pos);
4007 if (land == null) 4044 if (land == null)
4008 return true; 4045 return true;
4009 4046
4010 if (land.IsBannedFromLand(agentID) || land.IsRestrictedFromLand(agentID)) 4047 if (land.IsBannedFromLand(agentID) || land.IsRestrictedFromLand(agentID))
4011 { 4048 {
@@ -4019,21 +4056,21 @@ namespace OpenSim.Region.Framework.Scenes
4019 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY) 4056 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY)
4020 { 4057 {
4021 if (posX < 0) 4058 if (posX < 0)
4022 posX = 0; 4059 posX = 0;
4023 else if (posX >= (float)RegionInfo.RegionSizeX) 4060 else if (posX >= (float)RegionInfo.RegionSizeX)
4024 posX = (float)RegionInfo.RegionSizeX - 0.001f; 4061 posX = (float)RegionInfo.RegionSizeX - 0.001f;
4025 if (posY < 0) 4062 if (posY < 0)
4026 posY = 0; 4063 posY = 0;
4027 else if (posY >= (float)RegionInfo.RegionSizeY) 4064 else if (posY >= (float)RegionInfo.RegionSizeY)
4028 posY = (float)RegionInfo.RegionSizeY - 0.001f; 4065 posY = (float)RegionInfo.RegionSizeY - 0.001f;
4029 4066
4030 reason = String.Empty; 4067 reason = String.Empty;
4031 if (Permissions.IsGod(agentID)) 4068 if (Permissions.IsGod(agentID))
4032 return true; 4069 return true;
4033 4070
4034 ILandObject land = LandChannel.GetLandObject(posX, posY); 4071 ILandObject land = LandChannel.GetLandObject(posX, posY);
4035 if (land == null) 4072 if (land == null)
4036 return false; 4073 return false;
4037 4074
4038 bool banned = land.IsBannedFromLand(agentID); 4075 bool banned = land.IsBannedFromLand(agentID);
4039 bool restricted = land.IsRestrictedFromLand(agentID); 4076 bool restricted = land.IsRestrictedFromLand(agentID);
@@ -4057,7 +4094,7 @@ namespace OpenSim.Region.Framework.Scenes
4057 else 4094 else
4058 { 4095 {
4059 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", 4096 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
4060 RegionInfo.RegionName); 4097 RegionInfo.RegionName);
4061 } 4098 }
4062 return false; 4099 return false;
4063 } 4100 }
@@ -4108,15 +4145,15 @@ namespace OpenSim.Region.Framework.Scenes
4108 4145
4109 if (!m_strictAccessControl) return true; 4146 if (!m_strictAccessControl) return true;
4110 if (Permissions.IsGod(agent.AgentID)) return true; 4147 if (Permissions.IsGod(agent.AgentID)) return true;
4111 4148
4112 if (AuthorizationService != null) 4149 if (AuthorizationService != null)
4113 { 4150 {
4114 if (!AuthorizationService.IsAuthorizedForRegion( 4151 if (!AuthorizationService.IsAuthorizedForRegion(
4115 agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason)) 4152 agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason))
4116 { 4153 {
4117 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because: {4}", 4154 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because: {4}",
4118 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName, reason); 4155 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName, reason);
4119 4156
4120 return false; 4157 return false;
4121 } 4158 }
4122 } 4159 }
@@ -4132,9 +4169,9 @@ namespace OpenSim.Region.Framework.Scenes
4132 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID)) 4169 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID))
4133 { 4170 {
4134 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 4171 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
4135 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4172 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
4136 reason = String.Format("Denied access to region {0}: You have been banned from that region.", 4173 reason = String.Format("Denied access to region {0}: You have been banned from that region.",
4137 RegionInfo.RegionName); 4174 RegionInfo.RegionName);
4138 return false; 4175 return false;
4139 } 4176 }
4140 } 4177 }
@@ -4152,7 +4189,7 @@ namespace OpenSim.Region.Framework.Scenes
4152 if (GroupMembership != null) 4189 if (GroupMembership != null)
4153 { 4190 {
4154 for (int i = 0; i < GroupMembership.Length; i++) 4191 for (int i = 0; i < GroupMembership.Length; i++)
4155 agentGroups.Add(GroupMembership[i].GroupID); 4192 agentGroups.Add(GroupMembership[i].GroupID);
4156 } 4193 }
4157 else 4194 else
4158 { 4195 {
@@ -4180,13 +4217,13 @@ namespace OpenSim.Region.Framework.Scenes
4180 } 4217 }
4181 4218
4182 if (!RegionInfo.EstateSettings.PublicAccess && 4219 if (!RegionInfo.EstateSettings.PublicAccess &&
4183 !RegionInfo.EstateSettings.HasAccess(agent.AgentID) && 4220 !RegionInfo.EstateSettings.HasAccess(agent.AgentID) &&
4184 !groupAccess) 4221 !groupAccess)
4185 { 4222 {
4186 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate", 4223 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate",
4187 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4224 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
4188 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", 4225 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
4189 RegionInfo.RegionName); 4226 RegionInfo.RegionName);
4190 return false; 4227 return false;
4191 } 4228 }
4192 } 4229 }
@@ -4242,69 +4279,69 @@ namespace OpenSim.Region.Framework.Scenes
4242 return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc); 4279 return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc);
4243 } 4280 }
4244 4281
4245// /// <summary> 4282 // /// <summary>
4246// /// The Grid has requested that we log-off a user. Log them off. 4283 // /// The Grid has requested that we log-off a user. Log them off.
4247// /// </summary> 4284 // /// </summary>
4248// /// <param name="AvatarID">Unique ID of the avatar to log-off</param> 4285 // /// <param name="AvatarID">Unique ID of the avatar to log-off</param>
4249// /// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param> 4286 // /// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param>
4250// /// <param name="message">message to display to the user. Reason for being logged off</param> 4287 // /// <param name="message">message to display to the user. Reason for being logged off</param>
4251// public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) 4288 // public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message)
4252// { 4289 // {
4253// ScenePresence loggingOffUser = GetScenePresence(AvatarID); 4290 // ScenePresence loggingOffUser = GetScenePresence(AvatarID);
4254// if (loggingOffUser != null) 4291 // if (loggingOffUser != null)
4255// { 4292 // {
4256// UUID localRegionSecret = UUID.Zero; 4293 // UUID localRegionSecret = UUID.Zero;
4257// bool parsedsecret = UUID.TryParse(RegionInfo.regionSecret, out localRegionSecret); 4294 // bool parsedsecret = UUID.TryParse(RegionInfo.regionSecret, out localRegionSecret);
4258// 4295 //
4259// // Region Secret is used here in case a new sessionid overwrites an old one on the user server. 4296 // // Region Secret is used here in case a new sessionid overwrites an old one on the user server.
4260// // Will update the user server in a few revisions to use it. 4297 // // Will update the user server in a few revisions to use it.
4261// 4298 //
4262// if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) 4299 // if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret))
4263// { 4300 // {
4264// m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles); 4301 // m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles);
4265// loggingOffUser.ControllingClient.Kick(message); 4302 // loggingOffUser.ControllingClient.Kick(message);
4266// // Give them a second to receive the message! 4303 // // Give them a second to receive the message!
4267// Thread.Sleep(1000); 4304 // Thread.Sleep(1000);
4268// loggingOffUser.ControllingClient.Close(); 4305 // loggingOffUser.ControllingClient.Close();
4269// } 4306 // }
4270// else 4307 // else
4271// { 4308 // {
4272// m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate"); 4309 // m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate");
4273// } 4310 // }
4274// } 4311 // }
4275// else 4312 // else
4276// { 4313 // {
4277// m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString()); 4314 // m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString());
4278// } 4315 // }
4279// } 4316 // }
4280 4317
4281// /// <summary> 4318 // /// <summary>
4282// /// Triggered when an agent crosses into this sim. Also happens on initial login. 4319 // /// Triggered when an agent crosses into this sim. Also happens on initial login.
4283// /// </summary> 4320 // /// </summary>
4284// /// <param name="agentID"></param> 4321 // /// <param name="agentID"></param>
4285// /// <param name="position"></param> 4322 // /// <param name="position"></param>
4286// /// <param name="isFlying"></param> 4323 // /// <param name="isFlying"></param>
4287// public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) 4324 // public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying)
4288// { 4325 // {
4289// ScenePresence presence = GetScenePresence(agentID); 4326 // ScenePresence presence = GetScenePresence(agentID);
4290// if (presence != null) 4327 // if (presence != null)
4291// { 4328 // {
4292// try 4329 // try
4293// { 4330 // {
4294// presence.MakeRootAgent(position, isFlying); 4331 // presence.MakeRootAgent(position, isFlying);
4295// } 4332 // }
4296// catch (Exception e) 4333 // catch (Exception e)
4297// { 4334 // {
4298// m_log.ErrorFormat("[SCENE]: Unable to do agent crossing, exception {0}{1}", e.Message, e.StackTrace); 4335 // m_log.ErrorFormat("[SCENE]: Unable to do agent crossing, exception {0}{1}", e.Message, e.StackTrace);
4299// } 4336 // }
4300// } 4337 // }
4301// else 4338 // else
4302// { 4339 // {
4303// m_log.ErrorFormat( 4340 // m_log.ErrorFormat(
4304// "[SCENE]: Could not find presence for agent {0} crossing into scene {1}", 4341 // "[SCENE]: Could not find presence for agent {0} crossing into scene {1}",
4305// agentID, RegionInfo.RegionName); 4342 // agentID, RegionInfo.RegionName);
4306// } 4343 // }
4307// } 4344 // }
4308 4345
4309 /// <summary> 4346 /// <summary>
4310 /// We've got an update about an agent that sees into this region, 4347 /// We've got an update about an agent that sees into this region,
@@ -4316,15 +4353,15 @@ namespace OpenSim.Region.Framework.Scenes
4316 public virtual bool IncomingUpdateChildAgent(AgentData cAgentData) 4353 public virtual bool IncomingUpdateChildAgent(AgentData cAgentData)
4317 { 4354 {
4318 m_log.DebugFormat( 4355 m_log.DebugFormat(
4319 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); 4356 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName);
4320 4357
4321 // TODO: This check should probably be in QueryAccess(). 4358 // TODO: This check should probably be in QueryAccess().
4322 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, RegionInfo.RegionSizeX / 2, RegionInfo.RegionSizeY / 2); 4359 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, RegionInfo.RegionSizeX / 2, RegionInfo.RegionSizeY / 2);
4323 if (nearestParcel == null) 4360 if (nearestParcel == null)
4324 { 4361 {
4325 m_log.InfoFormat( 4362 m_log.InfoFormat(
4326 "[SCENE]: Denying root agent entry to {0} in {1}: no allowed parcel", 4363 "[SCENE]: Denying root agent entry to {0} in {1}: no allowed parcel",
4327 cAgentData.AgentID, RegionInfo.RegionName); 4364 cAgentData.AgentID, RegionInfo.RegionName);
4328 4365
4329 return false; 4366 return false;
4330 } 4367 }
@@ -4340,11 +4377,11 @@ namespace OpenSim.Region.Framework.Scenes
4340 if (cAgentData.SessionID != sp.ControllingClient.SessionId) 4377 if (cAgentData.SessionID != sp.ControllingClient.SessionId)
4341 { 4378 {
4342 m_log.WarnFormat( 4379 m_log.WarnFormat(
4343 "[SCENE]: Attempt to update agent {0} with invalid session id {1} (possibly from simulator in older version; tell them to update).", 4380 "[SCENE]: Attempt to update agent {0} with invalid session id {1} (possibly from simulator in older version; tell them to update).",
4344 sp.UUID, cAgentData.SessionID); 4381 sp.UUID, cAgentData.SessionID);
4345 4382
4346 Console.WriteLine(String.Format("[SCENE]: Attempt to update agent {0} ({1}) with invalid session id {2}", 4383 Console.WriteLine(String.Format("[SCENE]: Attempt to update agent {0} ({1}) with invalid session id {2}",
4347 sp.UUID, sp.ControllingClient.SessionId, cAgentData.SessionID)); 4384 sp.UUID, sp.ControllingClient.SessionId, cAgentData.SessionID));
4348 } 4385 }
4349 4386
4350 sp.UpdateChildAgent(cAgentData); 4387 sp.UpdateChildAgent(cAgentData);
@@ -4353,19 +4390,19 @@ namespace OpenSim.Region.Framework.Scenes
4353 if (cAgentData.SenderWantsToWaitForRoot) 4390 if (cAgentData.SenderWantsToWaitForRoot)
4354 { 4391 {
4355 while (sp.IsChildAgent && ntimes-- > 0) 4392 while (sp.IsChildAgent && ntimes-- > 0)
4356 Thread.Sleep(1000); 4393 Thread.Sleep(1000);
4357 4394
4358 if (sp.IsChildAgent) 4395 if (sp.IsChildAgent)
4359 m_log.WarnFormat( 4396 m_log.WarnFormat(
4360 "[SCENE]: Found presence {0} {1} unexpectedly still child in {2}", 4397 "[SCENE]: Found presence {0} {1} unexpectedly still child in {2}",
4361 sp.Name, sp.UUID, Name); 4398 sp.Name, sp.UUID, Name);
4362 else 4399 else
4363 m_log.InfoFormat( 4400 m_log.InfoFormat(
4364 "[SCENE]: Found presence {0} {1} as root in {2} after {3} waits", 4401 "[SCENE]: Found presence {0} {1} as root in {2} after {3} waits",
4365 sp.Name, sp.UUID, Name, 20 - ntimes); 4402 sp.Name, sp.UUID, Name, 20 - ntimes);
4366 4403
4367 if (sp.IsChildAgent) 4404 if (sp.IsChildAgent)
4368 return false; 4405 return false;
4369 } 4406 }
4370 4407
4371 return true; 4408 return true;
@@ -4382,17 +4419,17 @@ namespace OpenSim.Region.Framework.Scenes
4382 /// <returns>true if we handled it.</returns> 4419 /// <returns>true if we handled it.</returns>
4383 public virtual bool IncomingUpdateChildAgent(AgentPosition cAgentData) 4420 public virtual bool IncomingUpdateChildAgent(AgentPosition cAgentData)
4384 { 4421 {
4385// m_log.DebugFormat( 4422 // m_log.DebugFormat(
4386// "[SCENE PRESENCE]: IncomingChildAgentDataUpdate POSITION for {0} in {1}, position {2}", 4423 // "[SCENE PRESENCE]: IncomingChildAgentDataUpdate POSITION for {0} in {1}, position {2}",
4387// cAgentData.AgentID, Name, cAgentData.Position); 4424 // cAgentData.AgentID, Name, cAgentData.Position);
4388 4425
4389 ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID); 4426 ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID);
4390 if (childAgentUpdate != null) 4427 if (childAgentUpdate != null)
4391 { 4428 {
4392// if (childAgentUpdate.ControllingClient.SessionId != cAgentData.SessionID) 4429 // if (childAgentUpdate.ControllingClient.SessionId != cAgentData.SessionID)
4393// // Only warn for now 4430 // // Only warn for now
4394// m_log.WarnFormat("[SCENE]: Attempt at updating position of agent {0} with invalid session id {1}. Neighbor running older version?", 4431 // m_log.WarnFormat("[SCENE]: Attempt at updating position of agent {0} with invalid session id {1}. Neighbor running older version?",
4395// childAgentUpdate.UUID, cAgentData.SessionID); 4432 // childAgentUpdate.UUID, cAgentData.SessionID);
4396 4433
4397 // I can't imagine *yet* why we would get an update if the agent is a root agent.. 4434 // I can't imagine *yet* why we would get an update if the agent is a root agent..
4398 // however to avoid a race condition crossing borders.. 4435 // however to avoid a race condition crossing borders..
@@ -4424,12 +4461,12 @@ namespace OpenSim.Region.Framework.Scenes
4424 int ntimes = 20; 4461 int ntimes = 20;
4425 ScenePresence sp = null; 4462 ScenePresence sp = null;
4426 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0)) 4463 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0))
4427 Thread.Sleep(1000); 4464 Thread.Sleep(1000);
4428 4465
4429 if (sp == null) 4466 if (sp == null)
4430 m_log.WarnFormat( 4467 m_log.WarnFormat(
4431 "[SCENE PRESENCE]: Did not find presence with id {0} in {1} before timeout", 4468 "[SCENE PRESENCE]: Did not find presence with id {0} in {1} before timeout",
4432 agentID, RegionInfo.RegionName); 4469 agentID, RegionInfo.RegionName);
4433 4470
4434 return sp; 4471 return sp;
4435 } 4472 }
@@ -4451,8 +4488,8 @@ namespace OpenSim.Region.Framework.Scenes
4451 if (acd == null) 4488 if (acd == null)
4452 { 4489 {
4453 m_log.DebugFormat( 4490 m_log.DebugFormat(
4454 "[SCENE]: Request to close agent {0} but no such agent in scene {1}. May have been closed previously.", 4491 "[SCENE]: Request to close agent {0} but no such agent in scene {1}. May have been closed previously.",
4455 agentID, Name); 4492 agentID, Name);
4456 4493
4457 return false; 4494 return false;
4458 } 4495 }
@@ -4464,8 +4501,8 @@ namespace OpenSim.Region.Framework.Scenes
4464 else 4501 else
4465 { 4502 {
4466 m_log.WarnFormat( 4503 m_log.WarnFormat(
4467 "[SCENE]: Request to close agent {0} with invalid authorization token {1} in {2}", 4504 "[SCENE]: Request to close agent {0} with invalid authorization token {1} in {2}",
4468 agentID, auth_token, Name); 4505 agentID, auth_token, Name);
4469 } 4506 }
4470 4507
4471 return false; 4508 return false;
@@ -4491,8 +4528,8 @@ namespace OpenSim.Region.Framework.Scenes
4491 if (sp.DoNotCloseAfterTeleport) 4528 if (sp.DoNotCloseAfterTeleport)
4492 { 4529 {
4493 m_log.DebugFormat( 4530 m_log.DebugFormat(
4494 "[SCENE]: Not pre-closing {0} agent {1} in {2} since another simulator has re-established the child connection", 4531 "[SCENE]: Not pre-closing {0} agent {1} in {2} since another simulator has re-established the child connection",
4495 sp.IsChildAgent ? "child" : "root", sp.Name, Name); 4532 sp.IsChildAgent ? "child" : "root", sp.Name, Name);
4496 4533
4497 // Need to reset the flag so that a subsequent close after another teleport can succeed. 4534 // Need to reset the flag so that a subsequent close after another teleport can succeed.
4498 sp.DoNotCloseAfterTeleport = false; 4535 sp.DoNotCloseAfterTeleport = false;
@@ -4503,8 +4540,8 @@ namespace OpenSim.Region.Framework.Scenes
4503 if (sp.LifecycleState != ScenePresenceState.Running) 4540 if (sp.LifecycleState != ScenePresenceState.Running)
4504 { 4541 {
4505 m_log.DebugFormat( 4542 m_log.DebugFormat(
4506 "[SCENE]: Called IncomingPreCloseAgent() for {0} in {1} but presence is already in state {2}", 4543 "[SCENE]: Called IncomingPreCloseAgent() for {0} in {1} but presence is already in state {2}",
4507 sp.Name, Name, sp.LifecycleState); 4544 sp.Name, Name, sp.LifecycleState);
4508 4545
4509 return false; 4546 return false;
4510 } 4547 }
@@ -4530,21 +4567,21 @@ namespace OpenSim.Region.Framework.Scenes
4530 lock (m_removeClientLock) 4567 lock (m_removeClientLock)
4531 { 4568 {
4532 sp = GetScenePresence(agentID); 4569 sp = GetScenePresence(agentID);
4533 4570
4534 if (sp == null) 4571 if (sp == null)
4535 { 4572 {
4536 m_log.DebugFormat( 4573 m_log.DebugFormat(
4537 "[SCENE]: Called CloseClient() with agent ID {0} but no such presence is in {1}", 4574 "[SCENE]: Called CloseClient() with agent ID {0} but no such presence is in {1}",
4538 agentID, Name); 4575 agentID, Name);
4539 4576
4540 return false; 4577 return false;
4541 } 4578 }
4542 4579
4543 if (sp.LifecycleState != ScenePresenceState.Running && sp.LifecycleState != ScenePresenceState.PreRemove) 4580 if (sp.LifecycleState != ScenePresenceState.Running && sp.LifecycleState != ScenePresenceState.PreRemove)
4544 { 4581 {
4545 m_log.DebugFormat( 4582 m_log.DebugFormat(
4546 "[SCENE]: Called CloseClient() for {0} in {1} but presence is already in state {2}", 4583 "[SCENE]: Called CloseClient() for {0} in {1} but presence is already in state {2}",
4547 sp.Name, Name, sp.LifecycleState); 4584 sp.Name, Name, sp.LifecycleState);
4548 4585
4549 return false; 4586 return false;
4550 } 4587 }
@@ -4555,8 +4592,8 @@ namespace OpenSim.Region.Framework.Scenes
4555 if (sp.DoNotCloseAfterTeleport) 4592 if (sp.DoNotCloseAfterTeleport)
4556 { 4593 {
4557 m_log.DebugFormat( 4594 m_log.DebugFormat(
4558 "[SCENE]: Not closing {0} agent {1} in {2} since another simulator has re-established the child connection", 4595 "[SCENE]: Not closing {0} agent {1} in {2} since another simulator has re-established the child connection",
4559 sp.IsChildAgent ? "child" : "root", sp.Name, Name); 4596 sp.IsChildAgent ? "child" : "root", sp.Name, Name);
4560 4597
4561 // Need to reset the flag so that a subsequent close after another teleport can succeed. 4598 // Need to reset the flag so that a subsequent close after another teleport can succeed.
4562 sp.DoNotCloseAfterTeleport = false; 4599 sp.DoNotCloseAfterTeleport = false;
@@ -4584,7 +4621,7 @@ namespace OpenSim.Region.Framework.Scenes
4584 /// <param name="lookAt"></param> 4621 /// <param name="lookAt"></param>
4585 /// <param name="teleportFlags"></param> 4622 /// <param name="teleportFlags"></param>
4586 public void RequestTeleportLocation(IClientAPI remoteClient, string regionName, Vector3 position, 4623 public void RequestTeleportLocation(IClientAPI remoteClient, string regionName, Vector3 position,
4587 Vector3 lookat, uint teleportFlags) 4624 Vector3 lookat, uint teleportFlags)
4588 { 4625 {
4589 GridRegion region = GridService.GetRegionByName(RegionInfo.ScopeID, regionName); 4626 GridRegion region = GridService.GetRegionByName(RegionInfo.ScopeID, regionName);
4590 4627
@@ -4607,7 +4644,7 @@ namespace OpenSim.Region.Framework.Scenes
4607 /// <param name="lookAt"></param> 4644 /// <param name="lookAt"></param>
4608 /// <param name="teleportFlags"></param> 4645 /// <param name="teleportFlags"></param>
4609 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position, 4646 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position,
4610 Vector3 lookAt, uint teleportFlags) 4647 Vector3 lookAt, uint teleportFlags)
4611 { 4648 {
4612 ScenePresence sp = GetScenePresence(remoteClient.AgentId); 4649 ScenePresence sp = GetScenePresence(remoteClient.AgentId);
4613 if (sp != null) 4650 if (sp != null)
@@ -4706,8 +4743,8 @@ namespace OpenSim.Region.Framework.Scenes
4706 if (part.Name == cmdparams[2]) 4743 if (part.Name == cmdparams[2])
4707 { 4744 {
4708 part.Resize( 4745 part.Resize(
4709 new Vector3(Convert.ToSingle(cmdparams[3]), Convert.ToSingle(cmdparams[4]), 4746 new Vector3(Convert.ToSingle(cmdparams[3]), Convert.ToSingle(cmdparams[4]),
4710 Convert.ToSingle(cmdparams[5]))); 4747 Convert.ToSingle(cmdparams[5])));
4711 4748
4712 m_log.DebugFormat("Edited scale of Primitive: {0}", part.Name); 4749 m_log.DebugFormat("Edited scale of Primitive: {0}", part.Name);
4713 } 4750 }
@@ -4752,7 +4789,7 @@ namespace OpenSim.Region.Framework.Scenes
4752 4789
4753 #region Script Engine 4790 #region Script Engine
4754 4791
4755 private bool ScriptDanger(SceneObjectPart part,Vector3 pos) 4792 private bool ScriptDanger(SceneObjectPart part, Vector3 pos)
4756 { 4793 {
4757 ILandObject parcel = LandChannel.GetLandObject(pos.X, pos.Y); 4794 ILandObject parcel = LandChannel.GetLandObject(pos.X, pos.Y);
4758 if (part != null) 4795 if (part != null)
@@ -4768,7 +4805,7 @@ namespace OpenSim.Region.Framework.Scenes
4768 return true; 4805 return true;
4769 } 4806 }
4770 else if (((parcel.LandData.Flags & (uint)ParcelFlags.AllowGroupScripts) != 0) 4807 else if (((parcel.LandData.Flags & (uint)ParcelFlags.AllowGroupScripts) != 0)
4771 && (parcel.LandData.GroupID != UUID.Zero) && (parcel.LandData.GroupID == part.GroupID)) 4808 && (parcel.LandData.GroupID != UUID.Zero) && (parcel.LandData.GroupID == part.GroupID))
4772 { 4809 {
4773 return true; 4810 return true;
4774 } 4811 }
@@ -5110,15 +5147,15 @@ namespace OpenSim.Region.Framework.Scenes
5110 #endregion 5147 #endregion
5111 5148
5112 5149
5113// Commented pending deletion since this method no longer appears to do anything at all 5150 // Commented pending deletion since this method no longer appears to do anything at all
5114// public bool NeedSceneCacheClear(UUID agentID) 5151 // public bool NeedSceneCacheClear(UUID agentID)
5115// { 5152 // {
5116// IInventoryTransferModule inv = RequestModuleInterface<IInventoryTransferModule>(); 5153 // IInventoryTransferModule inv = RequestModuleInterface<IInventoryTransferModule>();
5117// if (inv == null) 5154 // if (inv == null)
5118// return true; 5155 // return true;
5119// 5156 //
5120// return inv.NeedSceneCacheClear(agentID, this); 5157 // return inv.NeedSceneCacheClear(agentID, this);
5121// } 5158 // }
5122 5159
5123 public void CleanTempObjects() 5160 public void CleanTempObjects()
5124 { 5161 {
@@ -5134,7 +5171,7 @@ namespace OpenSim.Region.Framework.Scenes
5134 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) 5171 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
5135 { 5172 {
5136 if (grp.RootPart.Expires <= DateTime.Now) 5173 if (grp.RootPart.Expires <= DateTime.Now)
5137 DeleteSceneObject(grp, false); 5174 DeleteSceneObject(grp, false);
5138 } 5175 }
5139 } 5176 }
5140 } 5177 }
@@ -5160,21 +5197,21 @@ namespace OpenSim.Region.Framework.Scenes
5160 // 3 = We have seen a new user enter within the past 4 minutes 5197 // 3 = We have seen a new user enter within the past 4 minutes
5161 // which can be seen as positive confirmation of sim health 5198 // which can be seen as positive confirmation of sim health
5162 // 5199 //
5163 int health=1; // Start at 1, means we're up 5200 int health = 1; // Start at 1, means we're up
5164 5201
5165 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 5202 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
5166 health += 1; 5203 health += 1;
5167 else 5204 else
5168 return health; 5205 return health;
5169 5206
5170 // A login in the last 4 mins? We can't be doing too badly 5207 // A login in the last 4 mins? We can't be doing too badly
5171 // 5208 //
5172 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 5209 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000)
5173 health++; 5210 health++;
5174 else 5211 else
5175 return health; 5212 return health;
5176 5213
5177// CheckHeartbeat(); 5214 // CheckHeartbeat();
5178 5215
5179 return health; 5216 return health;
5180 } 5217 }
@@ -5204,41 +5241,41 @@ namespace OpenSim.Region.Framework.Scenes
5204 jointProxyObject.AngularVelocity = trackedBody.AngularVelocity; 5241 jointProxyObject.AngularVelocity = trackedBody.AngularVelocity;
5205 switch (joint.Type) 5242 switch (joint.Type)
5206 { 5243 {
5207 case PhysicsJointType.Ball: 5244 case PhysicsJointType.Ball:
5208 { 5245 {
5209 Vector3 jointAnchor = PhysicsScene.GetJointAnchor(joint); 5246 Vector3 jointAnchor = PhysicsScene.GetJointAnchor(joint);
5210 Vector3 proxyPos = jointAnchor; 5247 Vector3 proxyPos = jointAnchor;
5211 jointProxyObject.ParentGroup.UpdateGroupPosition(proxyPos); // schedules the entire group for a terse update 5248 jointProxyObject.ParentGroup.UpdateGroupPosition(proxyPos); // schedules the entire group for a terse update
5212 } 5249 }
5213 break; 5250 break;
5214 5251
5215 case PhysicsJointType.Hinge: 5252 case PhysicsJointType.Hinge:
5216 { 5253 {
5217 Vector3 jointAnchor = PhysicsScene.GetJointAnchor(joint); 5254 Vector3 jointAnchor = PhysicsScene.GetJointAnchor(joint);
5218 5255
5219 // Normally, we would just ask the physics scene to return the axis for the joint. 5256 // Normally, we would just ask the physics scene to return the axis for the joint.
5220 // Unfortunately, ODE sometimes returns <0,0,0> for the joint axis, which should 5257 // Unfortunately, ODE sometimes returns <0,0,0> for the joint axis, which should
5221 // never occur. Therefore we cannot rely on ODE to always return a correct joint axis. 5258 // never occur. Therefore we cannot rely on ODE to always return a correct joint axis.
5222 // Therefore the following call does not always work: 5259 // Therefore the following call does not always work:
5223 //PhysicsVector phyJointAxis = _PhyScene.GetJointAxis(joint); 5260 //PhysicsVector phyJointAxis = _PhyScene.GetJointAxis(joint);
5224 5261
5225 // instead we compute the joint orientation by saving the original joint orientation 5262 // instead we compute the joint orientation by saving the original joint orientation
5226 // relative to one of the jointed bodies, and applying this transformation 5263 // relative to one of the jointed bodies, and applying this transformation
5227 // to the current position of the jointed bodies (the tracked body) to compute the 5264 // to the current position of the jointed bodies (the tracked body) to compute the
5228 // current joint orientation. 5265 // current joint orientation.
5229 5266
5230 if (joint.TrackedBodyName == null) 5267 if (joint.TrackedBodyName == null)
5231 { 5268 {
5232 jointErrorMessage(joint, "joint.TrackedBodyName is null, joint " + joint.ObjectNameInScene); 5269 jointErrorMessage(joint, "joint.TrackedBodyName is null, joint " + joint.ObjectNameInScene);
5233 } 5270 }
5234 5271
5235 Vector3 proxyPos = jointAnchor; 5272 Vector3 proxyPos = jointAnchor;
5236 Quaternion q = trackedBody.RotationOffset * joint.LocalRotation; 5273 Quaternion q = trackedBody.RotationOffset * joint.LocalRotation;
5237 5274
5238 jointProxyObject.ParentGroup.UpdateGroupPosition(proxyPos); // schedules the entire group for a terse update 5275 jointProxyObject.ParentGroup.UpdateGroupPosition(proxyPos); // schedules the entire group for a terse update
5239 jointProxyObject.ParentGroup.UpdateGroupRotationR(q); // schedules the entire group for a terse update 5276 jointProxyObject.ParentGroup.UpdateGroupRotationR(q); // schedules the entire group for a terse update
5240 } 5277 }
5241 break; 5278 break;
5242 } 5279 }
5243 } 5280 }
5244 5281
@@ -5279,30 +5316,30 @@ namespace OpenSim.Region.Framework.Scenes
5279 if (joint != null) 5316 if (joint != null)
5280 { 5317 {
5281 if (joint.ErrorMessageCount > PhysicsJoint.maxErrorMessages) 5318 if (joint.ErrorMessageCount > PhysicsJoint.maxErrorMessages)
5282 return; 5319 return;
5283 5320
5284 SceneObjectPart jointProxyObject = GetSceneObjectPart(joint.ObjectNameInScene); 5321 SceneObjectPart jointProxyObject = GetSceneObjectPart(joint.ObjectNameInScene);
5285 if (jointProxyObject != null) 5322 if (jointProxyObject != null)
5286 { 5323 {
5287 SimChat(Utils.StringToBytes("[NINJA]: " + message), 5324 SimChat(Utils.StringToBytes("[NINJA]: " + message),
5288 ChatTypeEnum.DebugChannel, 5325 ChatTypeEnum.DebugChannel,
5289 2147483647, 5326 2147483647,
5290 jointProxyObject.AbsolutePosition, 5327 jointProxyObject.AbsolutePosition,
5291 jointProxyObject.Name, 5328 jointProxyObject.Name,
5292 jointProxyObject.UUID, 5329 jointProxyObject.UUID,
5293 false); 5330 false);
5294 5331
5295 joint.ErrorMessageCount++; 5332 joint.ErrorMessageCount++;
5296 5333
5297 if (joint.ErrorMessageCount > PhysicsJoint.maxErrorMessages) 5334 if (joint.ErrorMessageCount > PhysicsJoint.maxErrorMessages)
5298 { 5335 {
5299 SimChat(Utils.StringToBytes("[NINJA]: Too many messages for this joint, suppressing further messages."), 5336 SimChat(Utils.StringToBytes("[NINJA]: Too many messages for this joint, suppressing further messages."),
5300 ChatTypeEnum.DebugChannel, 5337 ChatTypeEnum.DebugChannel,
5301 2147483647, 5338 2147483647,
5302 jointProxyObject.AbsolutePosition, 5339 jointProxyObject.AbsolutePosition,
5303 jointProxyObject.Name, 5340 jointProxyObject.Name,
5304 jointProxyObject.UUID, 5341 jointProxyObject.UUID,
5305 false); 5342 false);
5306 } 5343 }
5307 } 5344 }
5308 else 5345 else
@@ -5315,9 +5352,9 @@ namespace OpenSim.Region.Framework.Scenes
5315 public Scene ConsoleScene() 5352 public Scene ConsoleScene()
5316 { 5353 {
5317 if (MainConsole.Instance == null) 5354 if (MainConsole.Instance == null)
5318 return null; 5355 return null;
5319 if (MainConsole.Instance.ConsoleScene is Scene) 5356 if (MainConsole.Instance.ConsoleScene is Scene)
5320 return (Scene)MainConsole.Instance.ConsoleScene; 5357 return (Scene)MainConsole.Instance.ConsoleScene;
5321 return null; 5358 return null;
5322 } 5359 }
5323 5360
@@ -5328,13 +5365,13 @@ namespace OpenSim.Region.Framework.Scenes
5328 public float GetGroundHeight(float x, float y) 5365 public float GetGroundHeight(float x, float y)
5329 { 5366 {
5330 if (x < 0) 5367 if (x < 0)
5331 x = 0; 5368 x = 0;
5332 if (x >= Heightmap.Width) 5369 if (x >= Heightmap.Width)
5333 x = Heightmap.Width - 1; 5370 x = Heightmap.Width - 1;
5334 if (y < 0) 5371 if (y < 0)
5335 y = 0; 5372 y = 0;
5336 if (y >= Heightmap.Height) 5373 if (y >= Heightmap.Height)
5337 y = Heightmap.Height - 1; 5374 y = Heightmap.Height - 1;
5338 5375
5339 Vector3 p0 = new Vector3(x, y, (float)Heightmap[(int)x, (int)y]); 5376 Vector3 p0 = new Vector3(x, y, (float)Heightmap[(int)x, (int)y]);
5340 Vector3 p1 = p0; 5377 Vector3 p1 = p0;
@@ -5342,11 +5379,11 @@ namespace OpenSim.Region.Framework.Scenes
5342 5379
5343 p1.X += 1.0f; 5380 p1.X += 1.0f;
5344 if (p1.X < Heightmap.Width) 5381 if (p1.X < Heightmap.Width)
5345 p1.Z = (float)Heightmap[(int)p1.X, (int)p1.Y]; 5382 p1.Z = (float)Heightmap[(int)p1.X, (int)p1.Y];
5346 5383
5347 p2.Y += 1.0f; 5384 p2.Y += 1.0f;
5348 if (p2.Y < Heightmap.Height) 5385 if (p2.Y < Heightmap.Height)
5349 p2.Z = (float)Heightmap[(int)p2.X, (int)p2.Y]; 5386 p2.Z = (float)Heightmap[(int)p2.X, (int)p2.Y];
5350 5387
5351 Vector3 v0 = new Vector3(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z); 5388 Vector3 v0 = new Vector3(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z);
5352 Vector3 v1 = new Vector3(p2.X - p0.X, p2.Y - p0.Y, p2.Z - p0.Z); 5389 Vector3 v1 = new Vector3(p2.X - p0.X, p2.Y - p0.Y, p2.Z - p0.Z);
@@ -5366,14 +5403,14 @@ namespace OpenSim.Region.Framework.Scenes
5366 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 5403 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
5367 } 5404 }
5368 5405
5369// private void CheckHeartbeat() 5406 // private void CheckHeartbeat()
5370// { 5407 // {
5371// if (m_firstHeartbeat) 5408 // if (m_firstHeartbeat)
5372// return; 5409 // return;
5373// 5410 //
5374// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 5411 // if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000)
5375// StartTimer(); 5412 // StartTimer();
5376// } 5413 // }
5377 5414
5378 public override ISceneObject DeserializeObject(string representation) 5415 public override ISceneObject DeserializeObject(string representation)
5379 { 5416 {
@@ -5416,7 +5453,7 @@ namespace OpenSim.Region.Framework.Scenes
5416 } 5453 }
5417 5454
5418 ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y); 5455 ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y);
5419 if (dest != excludeParcel) 5456 if (dest != excludeParcel)
5420 { 5457 {
5421 // Ultimate backup if we have no idea where they are and 5458 // Ultimate backup if we have no idea where they are and
5422 // the last allowed position was in another parcel 5459 // the last allowed position was in another parcel
@@ -5526,9 +5563,9 @@ namespace OpenSim.Region.Framework.Scenes
5526 private Vector3 GetNearestRegionEdgePosition(ScenePresence avatar) 5563 private Vector3 GetNearestRegionEdgePosition(ScenePresence avatar)
5527 { 5564 {
5528 float xdistance = avatar.AbsolutePosition.X < RegionInfo.RegionSizeX / 2 5565 float xdistance = avatar.AbsolutePosition.X < RegionInfo.RegionSizeX / 2
5529 ? avatar.AbsolutePosition.X : RegionInfo.RegionSizeX - avatar.AbsolutePosition.X; 5566 ? avatar.AbsolutePosition.X : RegionInfo.RegionSizeX - avatar.AbsolutePosition.X;
5530 float ydistance = avatar.AbsolutePosition.Y < RegionInfo.RegionSizeY / 2 5567 float ydistance = avatar.AbsolutePosition.Y < RegionInfo.RegionSizeY / 2
5531 ? avatar.AbsolutePosition.Y : RegionInfo.RegionSizeY - avatar.AbsolutePosition.Y; 5568 ? avatar.AbsolutePosition.Y : RegionInfo.RegionSizeY - avatar.AbsolutePosition.Y;
5532 5569
5533 //find out what vertical edge to go to 5570 //find out what vertical edge to go to
5534 if (xdistance < ydistance) 5571 if (xdistance < ydistance)
@@ -5575,7 +5612,7 @@ namespace OpenSim.Region.Framework.Scenes
5575 { 5612 {
5576 IEstateDataService estateDataService = EstateDataService; 5613 IEstateDataService estateDataService = EstateDataService;
5577 if (estateDataService == null) 5614 if (estateDataService == null)
5578 return new List<UUID>(0); 5615 return new List<UUID>(0);
5579 5616
5580 return estateDataService.GetRegions(estateID); 5617 return estateDataService.GetRegions(estateID);
5581 } 5618 }
@@ -5598,8 +5635,8 @@ namespace OpenSim.Region.Framework.Scenes
5598 private void HandleReloadEstate(string module, string[] cmd) 5635 private void HandleReloadEstate(string module, string[] cmd)
5599 { 5636 {
5600 if (MainConsole.Instance.ConsoleScene == null || 5637 if (MainConsole.Instance.ConsoleScene == null ||
5601 (MainConsole.Instance.ConsoleScene is Scene && 5638 (MainConsole.Instance.ConsoleScene is Scene &&
5602 (Scene)MainConsole.Instance.ConsoleScene == this)) 5639 (Scene)MainConsole.Instance.ConsoleScene == this))
5603 { 5640 {
5604 ReloadEstateData(); 5641 ReloadEstateData();
5605 } 5642 }
@@ -5617,8 +5654,8 @@ namespace OpenSim.Region.Framework.Scenes
5617 /// <param name="maxZ"></param> 5654 /// <param name="maxZ"></param>
5618 /// <returns></returns> 5655 /// <returns></returns>
5619 public static Vector3[] GetCombinedBoundingBox( 5656 public static Vector3[] GetCombinedBoundingBox(
5620 List<SceneObjectGroup> objects, 5657 List<SceneObjectGroup> objects,
5621 out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ) 5658 out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ)
5622 { 5659 {
5623 minX = float.MaxValue; 5660 minX = float.MaxValue;
5624 maxX = float.MinValue; 5661 maxX = float.MinValue;
@@ -5636,10 +5673,10 @@ namespace OpenSim.Region.Framework.Scenes
5636 Vector3 vec = g.AbsolutePosition; 5673 Vector3 vec = g.AbsolutePosition;
5637 5674
5638 g.GetAxisAlignedBoundingBoxRaw(out ominX, out omaxX, out ominY, out omaxY, out ominZ, out omaxZ); 5675 g.GetAxisAlignedBoundingBoxRaw(out ominX, out omaxX, out ominY, out omaxY, out ominZ, out omaxZ);
5639 5676
5640// m_log.DebugFormat( 5677 // m_log.DebugFormat(
5641// "[SCENE]: For {0} found AxisAlignedBoundingBoxRaw {1}, {2}", 5678 // "[SCENE]: For {0} found AxisAlignedBoundingBoxRaw {1}, {2}",
5642// g.Name, new Vector3(ominX, ominY, ominZ), new Vector3(omaxX, omaxY, omaxZ)); 5679 // g.Name, new Vector3(ominX, ominY, ominZ), new Vector3(omaxX, omaxY, omaxZ));
5643 5680
5644 ominX += vec.X; 5681 ominX += vec.X;
5645 omaxX += vec.X; 5682 omaxX += vec.X;
@@ -5649,17 +5686,17 @@ namespace OpenSim.Region.Framework.Scenes
5649 omaxZ += vec.Z; 5686 omaxZ += vec.Z;
5650 5687
5651 if (minX > ominX) 5688 if (minX > ominX)
5652 minX = ominX; 5689 minX = ominX;
5653 if (minY > ominY) 5690 if (minY > ominY)
5654 minY = ominY; 5691 minY = ominY;
5655 if (minZ > ominZ) 5692 if (minZ > ominZ)
5656 minZ = ominZ; 5693 minZ = ominZ;
5657 if (maxX < omaxX) 5694 if (maxX < omaxX)
5658 maxX = omaxX; 5695 maxX = omaxX;
5659 if (maxY < omaxY) 5696 if (maxY < omaxY)
5660 maxY = omaxY; 5697 maxY = omaxY;
5661 if (maxZ < omaxZ) 5698 if (maxZ < omaxZ)
5662 maxZ = omaxZ; 5699 maxZ = omaxZ;
5663 } 5700 }
5664 5701
5665 foreach (SceneObjectGroup g in objects) 5702 foreach (SceneObjectGroup g in objects)
@@ -5684,7 +5721,7 @@ namespace OpenSim.Region.Framework.Scenes
5684 { 5721 {
5685 IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>(); 5722 IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>();
5686 if (mapModule != null) 5723 if (mapModule != null)
5687 mapModule.GenerateMaptile(); 5724 mapModule.GenerateMaptile();
5688 } 5725 }
5689 5726
5690 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 5727 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
@@ -5695,7 +5732,7 @@ namespace OpenSim.Region.Framework.Scenes
5695 // so that all simulators can retrieve it 5732 // so that all simulators can retrieve it
5696 string error = GridService.RegisterRegion(RegionInfo.ScopeID, new GridRegion(RegionInfo)); 5733 string error = GridService.RegisterRegion(RegionInfo.ScopeID, new GridRegion(RegionInfo));
5697 if (error != string.Empty) 5734 if (error != string.Empty)
5698 throw new Exception(error); 5735 throw new Exception(error);
5699 } 5736 }
5700 5737
5701 /// <summary> 5738 /// <summary>
@@ -5725,7 +5762,7 @@ namespace OpenSim.Region.Framework.Scenes
5725 } 5762 }
5726 5763
5727 if (!AllowAvatarCrossing && !viaTeleport) 5764 if (!AllowAvatarCrossing && !viaTeleport)
5728 return false; 5765 return false;
5729 5766
5730 // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check. 5767 // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check.
5731 // However, the long term fix is to make sure root agent count is always accurate. 5768 // However, the long term fix is to make sure root agent count is always accurate.
@@ -5740,8 +5777,8 @@ namespace OpenSim.Region.Framework.Scenes
5740 reason = "The region is full"; 5777 reason = "The region is full";
5741 5778
5742 m_log.DebugFormat( 5779 m_log.DebugFormat(
5743 "[SCENE]: Denying presence with id {0} entry into {1} since region is at agent limit of {2}", 5780 "[SCENE]: Denying presence with id {0} entry into {1} since region is at agent limit of {2}",
5744 agentID, RegionInfo.RegionName, RegionInfo.RegionSettings.AgentLimit); 5781 agentID, RegionInfo.RegionName, RegionInfo.RegionSettings.AgentLimit);
5745 5782
5746 return false; 5783 return false;
5747 } 5784 }
@@ -5755,7 +5792,7 @@ namespace OpenSim.Region.Framework.Scenes
5755 { 5792 {
5756 client = presence.ControllingClient; 5793 client = presence.ControllingClient;
5757 if (client != null) 5794 if (client != null)
5758 aCircuit = client.RequestClientInfo(); 5795 aCircuit = client.RequestClientInfo();
5759 } 5796 }
5760 5797
5761 // We may be called before there is a presence or a client. 5798 // We may be called before there is a presence or a client.
@@ -5778,7 +5815,7 @@ namespace OpenSim.Region.Framework.Scenes
5778 } 5815 }
5779 catch (Exception e) 5816 catch (Exception e)
5780 { 5817 {
5781 m_log.DebugFormat("[SCENE]: Exception authorizing agent: {0} "+ e.StackTrace, e.Message); 5818 m_log.DebugFormat("[SCENE]: Exception authorizing agent: {0} " + e.StackTrace, e.Message);
5782 reason = "Error authorizing agent: " + e.Message; 5819 reason = "Error authorizing agent: " + e.Message;
5783 return false; 5820 return false;
5784 } 5821 }
@@ -5797,16 +5834,16 @@ namespace OpenSim.Region.Framework.Scenes
5797 Vector3 spawnPoint = sp.GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); 5834 Vector3 spawnPoint = sp.GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
5798 ILandObject land = LandChannel.GetLandObject(spawnPoint.X, spawnPoint.Y); 5835 ILandObject land = LandChannel.GetLandObject(spawnPoint.X, spawnPoint.Y);
5799 if (land == null) 5836 if (land == null)
5800 continue; 5837 continue;
5801 if (land.IsEitherBannedOrRestricted(agentID)) 5838 if (land.IsEitherBannedOrRestricted(agentID))
5802 continue; 5839 continue;
5803 banned = false; 5840 banned = false;
5804 break; 5841 break;
5805 } 5842 }
5806 5843
5807 if (banned) 5844 if (banned)
5808 { 5845 {
5809 if(Permissions.IsAdministrator(agentID) == false || Permissions.IsGridGod(agentID) == false) 5846 if (Permissions.IsAdministrator(agentID) == false || Permissions.IsGridGod(agentID) == false)
5810 { 5847 {
5811 reason = "No suitable landing point found"; 5848 reason = "No suitable landing point found";
5812 return false; 5849 return false;
@@ -5842,9 +5879,9 @@ namespace OpenSim.Region.Framework.Scenes
5842 if (banned || restricted) 5879 if (banned || restricted)
5843 { 5880 {
5844 if (banned) 5881 if (banned)
5845 reason = "You are banned from the parcel"; 5882 reason = "You are banned from the parcel";
5846 else 5883 else
5847 reason = "The parcel is restricted"; 5884 reason = "The parcel is restricted";
5848 return false; 5885 return false;
5849 } 5886 }
5850 } 5887 }
@@ -5866,15 +5903,15 @@ namespace OpenSim.Region.Framework.Scenes
5866 if (presence.MovingToTarget) 5903 if (presence.MovingToTarget)
5867 { 5904 {
5868 double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget); 5905 double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget);
5869// m_log.DebugFormat( 5906 // m_log.DebugFormat(
5870// "[SCENE]: Abs pos of {0} is {1}, target {2}, distance {3}", 5907 // "[SCENE]: Abs pos of {0} is {1}, target {2}, distance {3}",
5871// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget); 5908 // presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget);
5872 5909
5873 // Check the error term of the current position in relation to the target position 5910 // Check the error term of the current position in relation to the target position
5874 if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT) 5911 if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT)
5875 { 5912 {
5876 // We are close enough to the target 5913 // We are close enough to the target
5877// m_log.DebugFormat("[SCENEE]: Stopping autopilot of {0}", presence.Name); 5914 // m_log.DebugFormat("[SCENEE]: Stopping autopilot of {0}", presence.Name);
5878 5915
5879 presence.Velocity = Vector3.Zero; 5916 presence.Velocity = Vector3.Zero;
5880 presence.AbsolutePosition = presence.MoveToPositionTarget; 5917 presence.AbsolutePosition = presence.MoveToPositionTarget;
@@ -5888,28 +5925,28 @@ namespace OpenSim.Region.Framework.Scenes
5888 // least be able to set collision status once, rather than 5 times to give it enough 5925 // least be able to set collision status once, rather than 5 times to give it enough
5889 // weighting so that that PhysicsActor thinks it really is colliding. 5926 // weighting so that that PhysicsActor thinks it really is colliding.
5890 for (int i = 0; i < 5; i++) 5927 for (int i = 0; i < 5; i++)
5891 presence.IsColliding = true; 5928 presence.IsColliding = true;
5892 5929
5893 if (presence.LandAtTarget) 5930 if (presence.LandAtTarget)
5894 presence.Flying = false; 5931 presence.Flying = false;
5895 5932
5896// Vector3 targetPos = presence.MoveToPositionTarget; 5933 // Vector3 targetPos = presence.MoveToPositionTarget;
5897// float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y]; 5934 // float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y];
5898// if (targetPos.Z - terrainHeight < 0.2) 5935 // if (targetPos.Z - terrainHeight < 0.2)
5899// { 5936 // {
5900// presence.Flying = false; 5937 // presence.Flying = false;
5901// } 5938 // }
5902 } 5939 }
5903 5940
5904// m_log.DebugFormat( 5941 // m_log.DebugFormat(
5905// "[SCENE]: AgentControlFlags {0}, MovementFlag {1} for {2}", 5942 // "[SCENE]: AgentControlFlags {0}, MovementFlag {1} for {2}",
5906// presence.AgentControlFlags, presence.MovementFlag, presence.Name); 5943 // presence.AgentControlFlags, presence.MovementFlag, presence.Name);
5907 } 5944 }
5908 else 5945 else
5909 { 5946 {
5910// m_log.DebugFormat( 5947 // m_log.DebugFormat(
5911// "[SCENE]: Updating npc {0} at {1} for next movement to {2}", 5948 // "[SCENE]: Updating npc {0} at {1} for next movement to {2}",
5912// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget); 5949 // presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
5913 5950
5914 Vector3 agent_control_v3 = new Vector3(); 5951 Vector3 agent_control_v3 = new Vector3();
5915 presence.HandleMoveToTargetUpdate(1, ref agent_control_v3); 5952 presence.HandleMoveToTargetUpdate(1, ref agent_control_v3);
@@ -5924,11 +5961,11 @@ namespace OpenSim.Region.Framework.Scenes
5924 int spawnpoints = RegionInfo.RegionSettings.SpawnPoints().Count; 5961 int spawnpoints = RegionInfo.RegionSettings.SpawnPoints().Count;
5925 5962
5926 if (spawnpoints == 0) 5963 if (spawnpoints == 0)
5927 return 0; 5964 return 0;
5928 5965
5929 m_SpawnPoint++; 5966 m_SpawnPoint++;
5930 if (m_SpawnPoint > spawnpoints) 5967 if (m_SpawnPoint > spawnpoints)
5931 m_SpawnPoint = 1; 5968 m_SpawnPoint = 1;
5932 return m_SpawnPoint - 1; 5969 return m_SpawnPoint - 1;
5933 } 5970 }
5934 5971
@@ -5958,12 +5995,12 @@ namespace OpenSim.Region.Framework.Scenes
5958 public string GetExtraSetting(string name) 5995 public string GetExtraSetting(string name)
5959 { 5996 {
5960 if (m_extraSettings == null) 5997 if (m_extraSettings == null)
5961 return String.Empty; 5998 return String.Empty;
5962 5999
5963 string val; 6000 string val;
5964 6001
5965 if (!m_extraSettings.TryGetValue(name, out val)) 6002 if (!m_extraSettings.TryGetValue(name, out val))
5966 return String.Empty; 6003 return String.Empty;
5967 6004
5968 return val; 6005 return val;
5969 } 6006 }
@@ -5971,14 +6008,14 @@ namespace OpenSim.Region.Framework.Scenes
5971 public void StoreExtraSetting(string name, string val) 6008 public void StoreExtraSetting(string name, string val)
5972 { 6009 {
5973 if (m_extraSettings == null) 6010 if (m_extraSettings == null)
5974 return; 6011 return;
5975 6012
5976 string oldVal; 6013 string oldVal;
5977 6014
5978 if (m_extraSettings.TryGetValue(name, out oldVal)) 6015 if (m_extraSettings.TryGetValue(name, out oldVal))
5979 { 6016 {
5980 if (oldVal == val) 6017 if (oldVal == val)
5981 return; 6018 return;
5982 } 6019 }
5983 6020
5984 m_extraSettings[name] = val; 6021 m_extraSettings[name] = val;
@@ -5991,10 +6028,10 @@ namespace OpenSim.Region.Framework.Scenes
5991 public void RemoveExtraSetting(string name) 6028 public void RemoveExtraSetting(string name)
5992 { 6029 {
5993 if (m_extraSettings == null) 6030 if (m_extraSettings == null)
5994 return; 6031 return;
5995 6032
5996 if (!m_extraSettings.ContainsKey(name)) 6033 if (!m_extraSettings.ContainsKey(name))
5997 return; 6034 return;
5998 6035
5999 m_extraSettings.Remove(name); 6036 m_extraSettings.Remove(name);
6000 6037
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 51f50d9..c2e9b61 100644..100755
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -67,7 +67,9 @@ namespace OpenSim.Region.Framework.Scenes
67 protected Scene m_parentScene; 67 protected Scene m_parentScene;
68 protected Dictionary<UUID, SceneObjectGroup> m_updateList = new Dictionary<UUID, SceneObjectGroup>(); 68 protected Dictionary<UUID, SceneObjectGroup> m_updateList = new Dictionary<UUID, SceneObjectGroup>();
69 protected int m_numRootAgents = 0; 69 protected int m_numRootAgents = 0;
70 protected int m_numTotalPrim = 0;
70 protected int m_numPrim = 0; 71 protected int m_numPrim = 0;
72 protected int m_numMesh = 0;
71 protected int m_numChildAgents = 0; 73 protected int m_numChildAgents = 0;
72 protected int m_physicalPrim = 0; 74 protected int m_physicalPrim = 0;
73 75
@@ -368,7 +370,8 @@ namespace OpenSim.Region.Framework.Scenes
368 370
369 SceneObjectPart[] parts = sceneObject.Parts; 371 SceneObjectPart[] parts = sceneObject.Parts;
370 372
371 // Clamp child prim sizes and add child prims to the m_numPrim count 373 // Clamp the sizes (scales) of the child prims and add the child prims to the count of all primitives
374 // (meshes and geometric primitives) in the scene; add child prims to m_numTotalPrim count
372 if (m_parentScene.m_clampPrimSize) 375 if (m_parentScene.m_clampPrimSize)
373 { 376 {
374 foreach (SceneObjectPart part in parts) 377 foreach (SceneObjectPart part in parts)
@@ -382,7 +385,19 @@ namespace OpenSim.Region.Framework.Scenes
382 part.Shape.Scale = scale; 385 part.Shape.Scale = scale;
383 } 386 }
384 } 387 }
385 m_numPrim += parts.Length; 388 m_numTotalPrim += parts.Length;
389
390 // Go through all parts (geometric primitives and meshes) of this Scene Object
391 foreach (SceneObjectPart part in parts)
392 {
393 // Keep track of the total number of meshes or geometric primitives now in the scene;
394 // determine which object this is based on its primitive type: sculpted (sculpt) prim refers to
395 // a mesh and all other prims (i.e. box, sphere, etc) are geometric primitives
396 if (part.GetPrimType() == PrimType.SCULPT)
397 m_numMesh++;
398 else
399 m_numPrim++;
400 }
386 401
387 sceneObject.AttachToScene(m_parentScene); 402 sceneObject.AttachToScene(m_parentScene);
388 403
@@ -437,7 +452,21 @@ namespace OpenSim.Region.Framework.Scenes
437 452
438 if (!resultOfObjectLinked) 453 if (!resultOfObjectLinked)
439 { 454 {
440 m_numPrim -= grp.PrimCount; 455 // Decrement the total number of primitives (meshes and geometric primitives)
456 // that are part of the Scene Object being removed
457 m_numTotalPrim -= grp.PrimCount;
458
459 // Go through all parts (primitives and meshes) of this Scene Object
460 foreach (SceneObjectPart part in grp.Parts)
461 {
462 // Keep track of the total number of meshes or geometric primitives left in the scene;
463 // determine which object this is based on its primitive type: sculpted (sculpt) prim refers to
464 // a mesh and all other prims (i.e. box, sphere, etc) are geometric primitives
465 if (part.GetPrimType() == PrimType.SCULPT)
466 m_numMesh--;
467 else
468 m_numPrim--;
469 }
441 470
442 if ((grp.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics) 471 if ((grp.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics)
443 RemovePhysicalPrim(grp.PrimCount); 472 RemovePhysicalPrim(grp.PrimCount);
@@ -687,9 +716,19 @@ namespace OpenSim.Region.Framework.Scenes
687 716
688 public int GetTotalObjectsCount() 717 public int GetTotalObjectsCount()
689 { 718 {
719 return m_numTotalPrim;
720 }
721
722 public int GetTotalPrimObjectsCount()
723 {
690 return m_numPrim; 724 return m_numPrim;
691 } 725 }
692 726
727 public int GetTotalMeshObjectsCount()
728 {
729 return m_numMesh;
730 }
731
693 public int GetActiveObjectsCount() 732 public int GetActiveObjectsCount()
694 { 733 {
695 return m_physicalPrim; 734 return m_physicalPrim;
@@ -1970,7 +2009,19 @@ namespace OpenSim.Region.Framework.Scenes
1970 // think it's selected, so it will never send a deselect... 2009 // think it's selected, so it will never send a deselect...
1971 copy.IsSelected = false; 2010 copy.IsSelected = false;
1972 2011
1973 m_numPrim += copy.Parts.Length; 2012 m_numTotalPrim += copy.Parts.Length;
2013
2014 // Go through all parts (primitives and meshes) of this Scene Object
2015 foreach (SceneObjectPart part in copy.Parts)
2016 {
2017 // Keep track of the total number of meshes or geometric primitives now in the scene;
2018 // determine which object this is based on its primitive type: sculpted (sculpt) prim refers to
2019 // a mesh and all other prims (i.e. box, sphere, etc) are geometric primitives
2020 if (part.GetPrimType() == PrimType.SCULPT)
2021 m_numMesh++;
2022 else
2023 m_numPrim++;
2024 }
1974 2025
1975 if (rot != Quaternion.Identity) 2026 if (rot != Quaternion.Identity)
1976 { 2027 {
diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
index 0eab898..8918c3b 100755
--- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
+++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
@@ -61,6 +61,10 @@ namespace OpenSim.Region.Framework.Scenes
61 61
62 private YourStatsAreWrong handlerStatsIncorrect; 62 private YourStatsAreWrong handlerStatsIncorrect;
63 63
64 // Determines the size of the array that is used to collect StatBlocks
65 // for sending to the SimStats and SimExtraStatsCollector
66 private const int m_statisticArraySize = 27;
67
64 /// <summary> 68 /// <summary>
65 /// These are the IDs of stats sent in the StatsPacket to the viewer. 69 /// These are the IDs of stats sent in the StatsPacket to the viewer.
66 /// </summary> 70 /// </summary>
@@ -104,7 +108,12 @@ namespace OpenSim.Region.Framework.Scenes
104 ScriptEps = 31, 108 ScriptEps = 31,
105 SimSpareMs = 32, 109 SimSpareMs = 32,
106 SimSleepMs = 33, 110 SimSleepMs = 33,
107 SimIoPumpTime = 34 111 SimIoPumpTime = 34,
112 FrameDilation = 35,
113 UsersLoggingIn = 36,
114 TotalGeoPrim = 37,
115 TotalMesh = 38,
116 ThreadCount = 39
108 } 117 }
109 118
110 /// <summary> 119 /// <summary>
@@ -175,7 +184,7 @@ namespace OpenSim.Region.Framework.Scenes
175 184
176 // saved last reported value so there is something available for llGetRegionFPS 185 // saved last reported value so there is something available for llGetRegionFPS
177 private float lastReportedSimFPS; 186 private float lastReportedSimFPS;
178 private float[] lastReportedSimStats = new float[22]; 187 private float[] lastReportedSimStats = new float[m_statisticArraySize];
179 private float m_pfps; 188 private float m_pfps;
180 189
181 /// <summary> 190 /// <summary>
@@ -202,6 +211,8 @@ namespace OpenSim.Region.Framework.Scenes
202 private int m_rootAgents; 211 private int m_rootAgents;
203 private int m_childAgents; 212 private int m_childAgents;
204 private int m_numPrim; 213 private int m_numPrim;
214 private int m_numGeoPrim;
215 private int m_numMesh;
205 private int m_inPacketsPerSecond; 216 private int m_inPacketsPerSecond;
206 private int m_outPacketsPerSecond; 217 private int m_outPacketsPerSecond;
207 private int m_activePrim; 218 private int m_activePrim;
@@ -214,26 +225,33 @@ namespace OpenSim.Region.Framework.Scenes
214 private int m_objectCapacity = 45000; 225 private int m_objectCapacity = 45000;
215 226
216 // This is the number of frames that will be stored and then averaged for 227 // This is the number of frames that will be stored and then averaged for
217 // the Total, Simulation, Physics, and Network Frame Time; It is set to 228 // the Total, Simulation, Physics, and Network Frame Time; It is set to
218 // 10 by default but can be changed by the OpenSim.ini configuration file 229 // 10 by default but can be changed by the OpenSim.ini configuration file
219 // NumberOfFrames parameter 230 // NumberOfFrames parameter
220 private int m_numberFramesStored = Scene.m_defaultNumberFramesStored; 231 private int m_numberFramesStored = Scene.m_defaultNumberFramesStored;
221 232
222 // The arrays that will hold the time it took to run the past N frames, 233 // The arrays that will hold the time it took to run the past N frames,
223 // where N is the num_frames_to_average given by the configuration file 234 // where N is the num_frames_to_average given by the configuration file
224 private double[] m_totalFrameTimeMilliseconds; 235 private double[] m_totalFrameTimeMilliseconds;
225 private double[] m_simulationFrameTimeMilliseconds; 236 private double[] m_simulationFrameTimeMilliseconds;
226 private double[] m_physicsFrameTimeMilliseconds; 237 private double[] m_physicsFrameTimeMilliseconds;
227 private double[] m_networkFrameTimeMilliseconds; 238 private double[] m_networkFrameTimeMilliseconds;
228 239
229 // The location of the next time in milliseconds that will be 240 // The location of the next time in milliseconds that will be
230 // (over)written when the next frame completes 241 // (over)written when the next frame completes
231 private int m_nextLocation = 0; 242 private int m_nextLocation = 0;
232 243
233 // The correct number of frames that have completed since the last stats 244 // The correct number of frames that have completed since the last stats
234 // update for physics 245 // update for physics
235 private int m_numberPhysicsFrames; 246 private int m_numberPhysicsFrames;
236 247
248 // The current number of users attempting to login to the region
249 private int m_usersLoggingIn;
250
251 // The last reported value of threads from the SmartThreadPool inside of
252 // XEngine
253 private int m_inUseThreads;
254
237 private Scene m_scene; 255 private Scene m_scene;
238 256
239 private RegionInfo ReportingRegion; 257 private RegionInfo ReportingRegion;
@@ -246,11 +264,13 @@ namespace OpenSim.Region.Framework.Scenes
246 { 264 {
247 // Initialize the different frame time arrays to the correct sizes 265 // Initialize the different frame time arrays to the correct sizes
248 m_totalFrameTimeMilliseconds = new double[m_numberFramesStored]; 266 m_totalFrameTimeMilliseconds = new double[m_numberFramesStored];
249 m_simulationFrameTimeMilliseconds = new 267 m_simulationFrameTimeMilliseconds = new double[m_numberFramesStored];
250 double[m_numberFramesStored];
251 m_physicsFrameTimeMilliseconds = new double[m_numberFramesStored]; 268 m_physicsFrameTimeMilliseconds = new double[m_numberFramesStored];
252 m_networkFrameTimeMilliseconds = new double[m_numberFramesStored]; 269 m_networkFrameTimeMilliseconds = new double[m_numberFramesStored];
253 270
271 // Initialize the current number of users logging into the region
272 m_usersLoggingIn = 0;
273
254 m_scene = scene; 274 m_scene = scene;
255 m_reportedFpsCorrectionFactor = scene.MinFrameSeconds * m_nominalReportedFps; 275 m_reportedFpsCorrectionFactor = scene.MinFrameSeconds * m_nominalReportedFps;
256 m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); 276 m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000);
@@ -284,13 +304,14 @@ namespace OpenSim.Region.Framework.Scenes
284 StatsManager.RegisterStat(SlowFramesStat); 304 StatsManager.RegisterStat(SlowFramesStat);
285 } 305 }
286 306
307
287 public SimStatsReporter(Scene scene, int numberOfFrames) : this (scene) 308 public SimStatsReporter(Scene scene, int numberOfFrames) : this (scene)
288 { 309 {
289 // Store the number of frames from the OpenSim.ini configuration 310 // Store the number of frames from the OpenSim.ini configuration file
290 // file 311 m_numberFramesStored = numberOfFrames;
291 m_numberFramesStored = numberOfFrames;
292 } 312 }
293 313
314
294 public void Close() 315 public void Close()
295 { 316 {
296 m_report.Elapsed -= TriggerStatsHeartbeat; 317 m_report.Elapsed -= TriggerStatsHeartbeat;
@@ -328,11 +349,17 @@ namespace OpenSim.Region.Framework.Scenes
328 double simulationSumFrameTime; 349 double simulationSumFrameTime;
329 double physicsSumFrameTime; 350 double physicsSumFrameTime;
330 double networkSumFrameTime; 351 double networkSumFrameTime;
331 352 float frameDilation;
353 int currentFrame;
354
332 if (!m_scene.Active) 355 if (!m_scene.Active)
333 return; 356 return;
334 357
335 SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[22]; 358 // Create arrays to hold the statistics for this current scene,
359 // these will be passed to the SimExtraStatsCollector, they are also
360 // sent to the SimStats class
361 SimStatsPacket.StatBlock[] sb = new
362 SimStatsPacket.StatBlock[m_statisticArraySize];
336 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); 363 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
337 364
338 // Know what's not thread safe in Mono... modifying timers. 365 // Know what's not thread safe in Mono... modifying timers.
@@ -354,21 +381,21 @@ namespace OpenSim.Region.Framework.Scenes
354 381
355#region various statistic googly moogly 382#region various statistic googly moogly
356 383
357 // ORIGINAL code commented out until we have time to add our own 384 // ORIGINAL code commented out until we have time to add our own
358 // statistics to the statistics window, this will be done as a 385 // statistics to the statistics window, this will be done as a
359 // new section given the title of our current project 386 // new section given the title of our current project
360 // We're going to lie about the FPS because we've been lying since 2008. The actual FPS is currently 387 // We're going to lie about the FPS because we've been lying since 2008. The actual FPS is currently
361 // locked at a maximum of 11. Maybe at some point this can change so that we're not lying. 388 // locked at a maximum of 11. Maybe at some point this can change so that we're not lying.
362 //int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); 389 //int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor);
363 int reportedFPS = m_fps; 390 int reportedFPS = m_fps;
364 391
365 // save the reported value so there is something available for llGetRegionFPS 392 // save the reported value so there is something available for llGetRegionFPS
366 lastReportedSimFPS = reportedFPS / m_statsUpdateFactor; 393 lastReportedSimFPS = reportedFPS / m_statsUpdateFactor;
367 394
368 // ORIGINAL code commented out until we have time to add our own 395 // ORIGINAL code commented out until we have time to add our own
369 // statistics to the statistics window 396 // statistics to the statistics window
370 //float physfps = ((m_pfps / 1000)); 397 //float physfps = ((m_pfps / 1000));
371 float physfps = m_numberPhysicsFrames; 398 float physfps = m_numberPhysicsFrames;
372 399
373 //if (physfps > 600) 400 //if (physfps > 600)
374 //physfps = physfps - (physfps - 600); 401 //physfps = physfps - (physfps - 600);
@@ -381,6 +408,8 @@ namespace OpenSim.Region.Framework.Scenes
381 m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); 408 m_rootAgents = m_scene.SceneGraph.GetRootAgentCount();
382 m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); 409 m_childAgents = m_scene.SceneGraph.GetChildAgentCount();
383 m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount(); 410 m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount();
411 m_numGeoPrim = m_scene.SceneGraph.GetTotalPrimObjectsCount();
412 m_numMesh = m_scene.SceneGraph.GetTotalMeshObjectsCount();
384 m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount(); 413 m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount();
385 m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount(); 414 m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount();
386 415
@@ -406,11 +435,11 @@ namespace OpenSim.Region.Framework.Scenes
406 if (framesUpdated == 0) 435 if (framesUpdated == 0)
407 framesUpdated = 1; 436 framesUpdated = 1;
408 437
409 for (int i = 0; i < 22; i++) 438 for (int i = 0; i < m_statisticArraySize; i++)
410 { 439 {
411 sb[i] = new SimStatsPacket.StatBlock(); 440 sb[i] = new SimStatsPacket.StatBlock();
412 } 441 }
413 442
414 // Resetting the sums of the frame times to prevent any errors 443 // Resetting the sums of the frame times to prevent any errors
415 // in calculating the moving average for frame time 444 // in calculating the moving average for frame time
416 totalSumFrameTime = 0; 445 totalSumFrameTime = 0;
@@ -425,12 +454,25 @@ namespace OpenSim.Region.Framework.Scenes
425 // Sum up each frame time in order to calculate the moving 454 // Sum up each frame time in order to calculate the moving
426 // average of frame time 455 // average of frame time
427 totalSumFrameTime += m_totalFrameTimeMilliseconds[i]; 456 totalSumFrameTime += m_totalFrameTimeMilliseconds[i];
428 simulationSumFrameTime += 457 simulationSumFrameTime +=
429 m_simulationFrameTimeMilliseconds[i]; 458 m_simulationFrameTimeMilliseconds[i];
430 physicsSumFrameTime += m_physicsFrameTimeMilliseconds[i]; 459 physicsSumFrameTime += m_physicsFrameTimeMilliseconds[i];
431 networkSumFrameTime += m_networkFrameTimeMilliseconds[i]; 460 networkSumFrameTime += m_networkFrameTimeMilliseconds[i];
432 } 461 }
433 462
463 // Get the index that represents the current frame based on the next one known; go back
464 // to the last index if next one is stated to restart at 0
465 if (m_nextLocation == 0)
466 currentFrame = m_numberFramesStored - 1;
467 else
468 currentFrame = m_nextLocation - 1;
469
470 // Calculate the frame dilation; which is currently based on the ratio between the sum of the
471 // physics and simulation rate, and the set minimum time to run a scene's frame
472 frameDilation = (float)(m_simulationFrameTimeMilliseconds[currentFrame] +
473 m_physicsFrameTimeMilliseconds[currentFrame]) / m_scene.MinFrameTicks;
474
475 // ORIGINAL code commented out until we have time to add our own
434 sb[0].StatID = (uint) Stats.TimeDilation; 476 sb[0].StatID = (uint) Stats.TimeDilation;
435 sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); 477 sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor));
436 478
@@ -455,31 +497,28 @@ namespace OpenSim.Region.Framework.Scenes
455 sb[7].StatID = (uint) Stats.ActivePrim; 497 sb[7].StatID = (uint) Stats.ActivePrim;
456 sb[7].StatValue = m_activePrim; 498 sb[7].StatValue = m_activePrim;
457 499
458 // ORIGINAL code commented out until we have time to add our own 500 // ORIGINAL code commented out until we have time to add our own
459 // statistics to the statistics window 501 // statistics to the statistics window
460 sb[8].StatID = (uint)Stats.FrameMS; 502 sb[8].StatID = (uint)Stats.FrameMS;
461 //sb[8].StatValue = m_frameMS / framesUpdated; 503 //sb[8].StatValue = m_frameMS / framesUpdated;
462 sb[8].StatValue = (float) totalSumFrameTime / 504 sb[8].StatValue = (float) totalSumFrameTime / m_numberFramesStored;
463 m_numberFramesStored;
464 505
465 sb[9].StatID = (uint)Stats.NetMS; 506 sb[9].StatID = (uint)Stats.NetMS;
466 //sb[9].StatValue = m_netMS / framesUpdated; 507 //sb[9].StatValue = m_netMS / framesUpdated;
467 sb[9].StatValue = (float) networkSumFrameTime / 508 sb[9].StatValue = (float) networkSumFrameTime / m_numberFramesStored;
468 m_numberFramesStored;
469 509
470 sb[10].StatID = (uint)Stats.PhysicsMS; 510 sb[10].StatID = (uint)Stats.PhysicsMS;
471 //sb[10].StatValue = m_physicsMS / framesUpdated; 511 //sb[10].StatValue = m_physicsMS / framesUpdated;
472 sb[10].StatValue = (float) physicsSumFrameTime / 512 sb[10].StatValue = (float) physicsSumFrameTime / m_numberFramesStored;
473 m_numberFramesStored;
474 513
475 sb[11].StatID = (uint)Stats.ImageMS ; 514 sb[11].StatID = (uint)Stats.ImageMS ;
476 sb[11].StatValue = m_imageMS / framesUpdated; 515 sb[11].StatValue = m_imageMS / framesUpdated;
477 516
478 sb[12].StatID = (uint)Stats.OtherMS; 517 sb[12].StatID = (uint)Stats.OtherMS;
479 //sb[12].StatValue = m_otherMS / framesUpdated; 518 //sb[12].StatValue = m_otherMS / framesUpdated;
480 sb[12].StatValue = (float) simulationSumFrameTime / 519 sb[12].StatValue = (float) simulationSumFrameTime /
481 m_numberFramesStored; 520 m_numberFramesStored;
482 521
483 sb[13].StatID = (uint)Stats.InPacketsPerSecond; 522 sb[13].StatID = (uint)Stats.InPacketsPerSecond;
484 sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); 523 sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor);
485 524
@@ -507,7 +546,28 @@ namespace OpenSim.Region.Framework.Scenes
507 sb[21].StatID = (uint)Stats.SimSpareMs; 546 sb[21].StatID = (uint)Stats.SimSpareMs;
508 sb[21].StatValue = m_spareMS / framesUpdated; 547 sb[21].StatValue = m_spareMS / framesUpdated;
509 548
510 for (int i = 0; i < 22; i++) 549 // Current ratio between the sum of physics and sim rate, and the
550 // minimum time to run a scene's frame
551 sb[22].StatID = (uint)Stats.FrameDilation;
552 sb[22].StatValue = frameDilation;
553
554 // Current number of users currently attemptint to login to region
555 sb[23].StatID = (uint)Stats.UsersLoggingIn;
556 sb[23].StatValue = m_usersLoggingIn;
557
558 // Total number of geometric primitives in the scene
559 sb[24].StatID = (uint)Stats.TotalGeoPrim;
560 sb[24].StatValue = m_numGeoPrim;
561
562 // Total number of mesh objects in the scene
563 sb[25].StatID = (uint)Stats.TotalMesh;
564 sb[25].StatValue = m_numMesh;
565
566 // Current number of threads that XEngine is using
567 sb[26].StatID = (uint)Stats.ThreadCount;
568 sb[26].StatValue = m_inUseThreads;
569
570 for (int i = 0; i < m_statisticArraySize; i++)
511 { 571 {
512 lastReportedSimStats[i] = sb[i].StatValue; 572 lastReportedSimStats[i] = sb[i].StatValue;
513 } 573 }
@@ -554,8 +614,8 @@ namespace OpenSim.Region.Framework.Scenes
554 { 614 {
555 // Reset the number of frames that the physics library has 615 // Reset the number of frames that the physics library has
556 // processed since the last stats report 616 // processed since the last stats report
557 m_numberPhysicsFrames = 0; 617 m_numberPhysicsFrames = 0;
558 618
559 m_timeDilation = 0; 619 m_timeDilation = 0;
560 m_fps = 0; 620 m_fps = 0;
561 m_pfps = 0; 621 m_pfps = 0;
@@ -686,32 +746,32 @@ namespace OpenSim.Region.Framework.Scenes
686 m_otherMS += ms; 746 m_otherMS += ms;
687 } 747 }
688 748
689 public void addPhysicsFrame(int frames) 749 public void addPhysicsFrame(int frames)
690 { 750 {
691 // Add the number of physics frames to the correct total physics 751 // Add the number of physics frames to the correct total physics
692 // frames 752 // frames
693 m_numberPhysicsFrames += frames; 753 m_numberPhysicsFrames += frames;
694 } 754 }
695 755
696 public void addFrameTimeMilliseconds(double total, double simulation, 756 public void addFrameTimeMilliseconds(double total, double simulation,
697 double physics, double network) 757 double physics, double network)
698 { 758 {
699 // Save the frame times from the current frame into the appropriate 759 // Save the frame times from the current frame into the appropriate
700 // arrays 760 // arrays
701 m_totalFrameTimeMilliseconds[m_nextLocation] = total; 761 m_totalFrameTimeMilliseconds[m_nextLocation] = total;
702 m_simulationFrameTimeMilliseconds[m_nextLocation] = simulation; 762 m_simulationFrameTimeMilliseconds[m_nextLocation] = simulation;
703 m_physicsFrameTimeMilliseconds[m_nextLocation] = physics; 763 m_physicsFrameTimeMilliseconds[m_nextLocation] = physics;
704 m_networkFrameTimeMilliseconds[m_nextLocation] = network; 764 m_networkFrameTimeMilliseconds[m_nextLocation] = network;
705 765
706 // Update to the next location in the list 766 // Update to the next location in the list
707 m_nextLocation++; 767 m_nextLocation++;
768
769 // Since the list will begin to overwrite the oldest frame values
770 // first, the next location needs to loop back to the beginning of the
771 // list whenever it reaches the end
772 m_nextLocation = m_nextLocation % m_numberFramesStored;
773 }
708 774
709 // Since the list will begin to overwrite the oldest frame values
710 // first, the next location needs to loop back to the beginning of the
711 // list whenever it reaches the end
712 m_nextLocation = m_nextLocation % m_numberFramesStored;
713 }
714
715 public void AddPendingDownloads(int count) 775 public void AddPendingDownloads(int count)
716 { 776 {
717 m_pendingDownloads += count; 777 m_pendingDownloads += count;
@@ -734,6 +794,31 @@ namespace OpenSim.Region.Framework.Scenes
734 AddunAckedBytes(unAckedBytes); 794 AddunAckedBytes(unAckedBytes);
735 } 795 }
736 796
797 public void UpdateUsersLoggingIn(bool isLoggingIn)
798 {
799 // Determine whether the user has started logging in or has completed
800 // logging into the region
801 if (isLoggingIn)
802 {
803 // The user is starting to login to the region so increment the
804 // number of users attempting to login to the region
805 m_usersLoggingIn++;
806 }
807 else
808 {
809 // The user has finished logging into the region so decrement the
810 // number of users logging into the region
811 m_usersLoggingIn--;
812 }
813 }
814
815 public void SetThreadCount(int inUseThreads)
816 {
817 // Save the new number of threads to our member variable to send to
818 // the extra stats collector
819 m_inUseThreads = inUseThreads;
820 }
821
737 #endregion 822 #endregion
738 823
739 public Dictionary<string, float> GetExtraSimStats() 824 public Dictionary<string, float> GetExtraSimStats()
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 54620d1..4e383f8 100644..100755
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1872,6 +1872,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1872 IScriptInstance instance = GetInstance(itemID); 1872 IScriptInstance instance = GetInstance(itemID);
1873 if (instance != null) 1873 if (instance != null)
1874 instance.ApiResetScript(); 1874 instance.ApiResetScript();
1875
1876 // Send the new number of threads that are in use by the thread
1877 // pool, I believe that by adding them to the locations where the
1878 // script is changing states that I will catch all changes to the
1879 // thread pool
1880 m_Scene.setThreadCount(m_ThreadPool.InUseThreads);
1875 } 1881 }
1876 1882
1877 public void ResetScript(UUID itemID) 1883 public void ResetScript(UUID itemID)
@@ -1879,6 +1885,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1879 IScriptInstance instance = GetInstance(itemID); 1885 IScriptInstance instance = GetInstance(itemID);
1880 if (instance != null) 1886 if (instance != null)
1881 instance.ResetScript(m_WaitForEventCompletionOnScriptStop); 1887 instance.ResetScript(m_WaitForEventCompletionOnScriptStop);
1888
1889 // Send the new number of threads that are in use by the thread
1890 // pool, I believe that by adding them to the locations where the
1891 // script is changing states that I will catch all changes to the
1892 // thread pool
1893 m_Scene.setThreadCount(m_ThreadPool.InUseThreads);
1882 } 1894 }
1883 1895
1884 public void StartScript(UUID itemID) 1896 public void StartScript(UUID itemID)
@@ -1888,6 +1900,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1888 instance.Start(); 1900 instance.Start();
1889 else 1901 else
1890 m_runFlags.AddOrUpdate(itemID, true, 240); 1902 m_runFlags.AddOrUpdate(itemID, true, 240);
1903
1904 // Send the new number of threads that are in use by the thread
1905 // pool, I believe that by adding them to the locations where the
1906 // script is changing states that I will catch all changes to the
1907 // thread pool
1908 m_Scene.setThreadCount(m_ThreadPool.InUseThreads);
1891 } 1909 }
1892 1910
1893 public void StopScript(UUID itemID) 1911 public void StopScript(UUID itemID)
@@ -1903,6 +1921,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1903// m_log.DebugFormat("[XENGINE]: Could not find script with ID {0} to stop in {1}", itemID, World.Name); 1921// m_log.DebugFormat("[XENGINE]: Could not find script with ID {0} to stop in {1}", itemID, World.Name);
1904 m_runFlags.AddOrUpdate(itemID, false, 240); 1922 m_runFlags.AddOrUpdate(itemID, false, 240);
1905 } 1923 }
1924
1925 // Send the new number of threads that are in use by the thread
1926 // pool, I believe that by adding them to the locations where the
1927 // script is changing states that I will catch all changes to the
1928 // thread pool
1929 m_Scene.setThreadCount(m_ThreadPool.InUseThreads);
1906 } 1930 }
1907 1931
1908 public DetectParams GetDetectParams(UUID itemID, int idx) 1932 public DetectParams GetDetectParams(UUID itemID, int idx)
@@ -2393,6 +2417,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2393 instance.Suspend(); 2417 instance.Suspend();
2394// else 2418// else
2395// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); 2419// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID);
2420
2421 // Send the new number of threads that are in use by the thread
2422 // pool, I believe that by adding them to the locations where the
2423 // script is changing states that I will catch all changes to the
2424 // thread pool
2425 m_Scene.setThreadCount(m_ThreadPool.InUseThreads);
2396 } 2426 }
2397 2427
2398 public void ResumeScript(UUID itemID) 2428 public void ResumeScript(UUID itemID)
@@ -2404,6 +2434,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2404 instance.Resume(); 2434 instance.Resume();
2405// else 2435// else
2406// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); 2436// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID);
2437
2438 // Send the new number of threads that are in use by the thread
2439 // pool, I believe that by adding them to the locations where the
2440 // script is changing states that I will catch all changes to the
2441 // thread pool
2442 m_Scene.setThreadCount(m_ThreadPool.InUseThreads);
2407 } 2443 }
2408 2444
2409 public bool HasScript(UUID itemID, out bool running) 2445 public bool HasScript(UUID itemID, out bool running)
diff --git a/bin/LukeSkywalker.IPNetwork.dll b/bin/LukeSkywalker.IPNetwork.dll
index 25bcc2f..25bcc2f 100644..100755
--- a/bin/LukeSkywalker.IPNetwork.dll
+++ b/bin/LukeSkywalker.IPNetwork.dll
Binary files differ
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index af37ccc..3422996 100644..100755
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -296,7 +296,7 @@
296 ; Simulator Stats URI 296 ; Simulator Stats URI
297 ; Enable JSON simulator data by setting a URI name (case sensitive) 297 ; Enable JSON simulator data by setting a URI name (case sensitive)
298 ; Returns regular sim stats (SimFPS, ...) 298 ; Returns regular sim stats (SimFPS, ...)
299 ; Stats_URI = "jsonSimStats" 299 Stats_URI = "jsonSimStats"
300 300
301 ; Simulator StatsManager URI 301 ; Simulator StatsManager URI
302 ; Enable fetch of StatsManager registered stats. Fetch is query which can optionally 302 ; Enable fetch of StatsManager registered stats. Fetch is query which can optionally