aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs572
1 files changed, 443 insertions, 129 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 0743ce7..6ef83fb 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -227,8 +227,8 @@ namespace OpenSim.Region.Framework.Scenes
227 // TODO: need to figure out how allow client agents but deny 227 // TODO: need to figure out how allow client agents but deny
228 // root agents when ACL denies access to root agent 228 // root agents when ACL denies access to root agent
229 public bool m_strictAccessControl = true; 229 public bool m_strictAccessControl = true;
230 230 public bool m_seeIntoBannedRegion = false;
231 public int MaxUndoCount { get; set; } 231 public int MaxUndoCount = 5;
232 232
233 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; 233 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet;
234 public bool LoginLock = false; 234 public bool LoginLock = false;
@@ -244,11 +244,13 @@ namespace OpenSim.Region.Framework.Scenes
244 244
245 protected int m_splitRegionID; 245 protected int m_splitRegionID;
246 protected Timer m_restartWaitTimer = new Timer(); 246 protected Timer m_restartWaitTimer = new Timer();
247 protected Timer m_timerWatchdog = new Timer();
247 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); 248 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
248 protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); 249 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
249 protected string m_simulatorVersion = "OpenSimulator Server"; 250 protected string m_simulatorVersion = "OpenSimulator Server";
250 protected AgentCircuitManager m_authenticateHandler; 251 protected AgentCircuitManager m_authenticateHandler;
251 protected SceneCommunicationService m_sceneGridService; 252 protected SceneCommunicationService m_sceneGridService;
253 protected ISnmpModule m_snmpService = null;
252 254
253 protected ISimulationDataService m_SimulationDataService; 255 protected ISimulationDataService m_SimulationDataService;
254 protected IEstateDataService m_EstateDataService; 256 protected IEstateDataService m_EstateDataService;
@@ -311,8 +313,8 @@ namespace OpenSim.Region.Framework.Scenes
311 private int m_update_presences = 1; // Update scene presence movements 313 private int m_update_presences = 1; // Update scene presence movements
312 private int m_update_events = 1; 314 private int m_update_events = 1;
313 private int m_update_backup = 200; 315 private int m_update_backup = 200;
314 private int m_update_terrain = 50; 316 private int m_update_terrain = 1000;
315// private int m_update_land = 1; 317 private int m_update_land = 10;
316 private int m_update_coarse_locations = 50; 318 private int m_update_coarse_locations = 50;
317 319
318 private int agentMS; 320 private int agentMS;
@@ -325,13 +327,13 @@ namespace OpenSim.Region.Framework.Scenes
325 private int backupMS; 327 private int backupMS;
326 private int terrainMS; 328 private int terrainMS;
327 private int landMS; 329 private int landMS;
328 private int spareMS;
329 330
330 /// <summary> 331 /// <summary>
331 /// Tick at which the last frame was processed. 332 /// Tick at which the last frame was processed.
332 /// </summary> 333 /// </summary>
333 private int m_lastFrameTick; 334 private int m_lastFrameTick;
334 335
336 public bool CombineRegions = false;
335 /// <summary> 337 /// <summary>
336 /// Tick at which the last maintenance run occurred. 338 /// Tick at which the last maintenance run occurred.
337 /// </summary> 339 /// </summary>
@@ -351,7 +353,7 @@ namespace OpenSim.Region.Framework.Scenes
351 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing 353 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
352 private volatile bool m_backingup; 354 private volatile bool m_backingup;
353 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); 355 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>();
354 private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); 356 private Dictionary<UUID, int> m_groupsWithTargets = new Dictionary<UUID, int>();
355 357
356 private string m_defaultScriptEngine; 358 private string m_defaultScriptEngine;
357 359
@@ -360,6 +362,11 @@ namespace OpenSim.Region.Framework.Scenes
360 /// </summary> 362 /// </summary>
361 private int m_LastLogin; 363 private int m_LastLogin;
362 364
365 private int m_lastIncoming;
366 private int m_lastOutgoing;
367 private int m_hbRestarts = 0;
368
369
363 /// <summary> 370 /// <summary>
364 /// Thread that runs the scene loop. 371 /// Thread that runs the scene loop.
365 /// </summary> 372 /// </summary>
@@ -402,7 +409,7 @@ namespace OpenSim.Region.Framework.Scenes
402 private volatile bool m_active; 409 private volatile bool m_active;
403 410
404// private int m_lastUpdate; 411// private int m_lastUpdate;
405// private bool m_firstHeartbeat = true; 412 private bool m_firstHeartbeat = true;
406 413
407 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 414 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
408 private bool m_reprioritizationEnabled = true; 415 private bool m_reprioritizationEnabled = true;
@@ -446,6 +453,19 @@ namespace OpenSim.Region.Framework.Scenes
446 get { return m_sceneGridService; } 453 get { return m_sceneGridService; }
447 } 454 }
448 455
456 public ISnmpModule SnmpService
457 {
458 get
459 {
460 if (m_snmpService == null)
461 {
462 m_snmpService = RequestModuleInterface<ISnmpModule>();
463 }
464
465 return m_snmpService;
466 }
467 }
468
449 public ISimulationDataService SimulationDataService 469 public ISimulationDataService SimulationDataService
450 { 470 {
451 get 471 get
@@ -738,6 +758,8 @@ namespace OpenSim.Region.Framework.Scenes
738 m_SimulationDataService = simDataService; 758 m_SimulationDataService = simDataService;
739 m_EstateDataService = estateDataService; 759 m_EstateDataService = estateDataService;
740 m_regionHandle = RegionInfo.RegionHandle; 760 m_regionHandle = RegionInfo.RegionHandle;
761 m_lastIncoming = 0;
762 m_lastOutgoing = 0;
741 763
742 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); 764 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
743 m_asyncSceneObjectDeleter.Enabled = true; 765 m_asyncSceneObjectDeleter.Enabled = true;
@@ -831,7 +853,7 @@ namespace OpenSim.Region.Framework.Scenes
831 853
832 StartDisabled = startupConfig.GetBoolean("StartDisabled", false); 854 StartDisabled = startupConfig.GetBoolean("StartDisabled", false);
833 855
834 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); 856 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
835 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup); 857 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
836 if (!UseBackup) 858 if (!UseBackup)
837 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); 859 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
@@ -839,10 +861,8 @@ namespace OpenSim.Region.Framework.Scenes
839 //Animation states 861 //Animation states
840 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); 862 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
841 863
842 MaxUndoCount = startupConfig.GetInt("MaxPrimUndos", 20); 864 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
843 865 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
844 PhysicalPrims = startupConfig.GetBoolean("physical_prim", PhysicalPrims);
845 CollidablePrims = startupConfig.GetBoolean("collidable_prim", CollidablePrims);
846 866
847 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys); 867 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys);
848 if (RegionInfo.NonphysPrimMin > 0) 868 if (RegionInfo.NonphysPrimMin > 0)
@@ -863,11 +883,21 @@ namespace OpenSim.Region.Framework.Scenes
863 } 883 }
864 884
865 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); 885 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
886
866 if (RegionInfo.PhysPrimMax > 0) 887 if (RegionInfo.PhysPrimMax > 0)
867 { 888 {
868 m_maxPhys = RegionInfo.PhysPrimMax; 889 m_maxPhys = RegionInfo.PhysPrimMax;
869 } 890 }
870 891
892 m_linksetCapacity = startupConfig.GetInt("LinksetPrims", m_linksetCapacity);
893 if (RegionInfo.LinksetCapacity > 0)
894 {
895 m_linksetCapacity = RegionInfo.LinksetCapacity;
896 }
897
898 SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
899 TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false);
900
871 // Here, if clamping is requested in either global or 901 // Here, if clamping is requested in either global or
872 // local config, it will be used 902 // local config, it will be used
873 // 903 //
@@ -877,13 +907,7 @@ namespace OpenSim.Region.Framework.Scenes
877 m_clampPrimSize = true; 907 m_clampPrimSize = true;
878 } 908 }
879 909
880 m_linksetCapacity = startupConfig.GetInt("LinksetPrims", m_linksetCapacity); 910 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete);
881 if (RegionInfo.LinksetCapacity > 0)
882 {
883 m_linksetCapacity = RegionInfo.LinksetCapacity;
884 }
885
886 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete", m_useTrashOnDelete);
887 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 911 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
888 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 912 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
889 m_dontPersistBefore = 913 m_dontPersistBefore =
@@ -894,11 +918,11 @@ namespace OpenSim.Region.Framework.Scenes
894 m_persistAfter *= 10000000; 918 m_persistAfter *= 10000000;
895 919
896 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 920 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
897 921 m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
898 SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
899 TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false);
900 922
901 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); 923 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
924 m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
925 CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
902 926
903 string[] possibleMapConfigSections = new string[] { "Map", "Startup" }; 927 string[] possibleMapConfigSections = new string[] { "Map", "Startup" };
904 928
@@ -943,7 +967,7 @@ namespace OpenSim.Region.Framework.Scenes
943 967
944 if (grant.Length > 0) 968 if (grant.Length > 0)
945 { 969 {
946 foreach (string viewer in grant.Split('|')) 970 foreach (string viewer in grant.Split(','))
947 { 971 {
948 m_AllowedViewers.Add(viewer.Trim().ToLower()); 972 m_AllowedViewers.Add(viewer.Trim().ToLower());
949 } 973 }
@@ -955,7 +979,7 @@ namespace OpenSim.Region.Framework.Scenes
955 979
956 if (grant.Length > 0) 980 if (grant.Length > 0)
957 { 981 {
958 foreach (string viewer in grant.Split('|')) 982 foreach (string viewer in grant.Split(','))
959 { 983 {
960 m_BannedViewers.Add(viewer.Trim().ToLower()); 984 m_BannedViewers.Add(viewer.Trim().ToLower());
961 } 985 }
@@ -1015,6 +1039,8 @@ namespace OpenSim.Region.Framework.Scenes
1015 StatsReporter = new SimStatsReporter(this); 1039 StatsReporter = new SimStatsReporter(this);
1016 StatsReporter.OnSendStatsResult += SendSimStatsPackets; 1040 StatsReporter.OnSendStatsResult += SendSimStatsPackets;
1017 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; 1041 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
1042
1043 MainConsole.Instance.Commands.AddCommand("scene", false, "gc collect", "gc collect", "gc collect", "Cause the garbage collector to make a single pass", HandleGcCollect);
1018 } 1044 }
1019 1045
1020 public Scene(RegionInfo regInfo) : base(regInfo) 1046 public Scene(RegionInfo regInfo) : base(regInfo)
@@ -1310,8 +1336,11 @@ namespace OpenSim.Region.Framework.Scenes
1310 // Stop all client threads. 1336 // Stop all client threads.
1311 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); 1337 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); });
1312 1338
1313 m_log.Debug("[SCENE]: Persisting changed objects"); 1339 m_log.Debug("[SCENE]: TriggerSceneShuttingDown");
1314 EventManager.TriggerSceneShuttingDown(this); 1340 EventManager.TriggerSceneShuttingDown(this);
1341
1342 m_log.Debug("[SCENE]: Persisting changed objects");
1343
1315 Backup(false); 1344 Backup(false);
1316 m_sceneGraph.Close(); 1345 m_sceneGraph.Close();
1317 1346
@@ -1325,6 +1354,7 @@ namespace OpenSim.Region.Framework.Scenes
1325 // attempt to reference a null or disposed physics scene. 1354 // attempt to reference a null or disposed physics scene.
1326 if (PhysicsScene != null) 1355 if (PhysicsScene != null)
1327 { 1356 {
1357 m_log.Debug("[SCENE]: Dispose Physics");
1328 PhysicsScene phys = PhysicsScene; 1358 PhysicsScene phys = PhysicsScene;
1329 // remove the physics engine from both Scene and SceneGraph 1359 // remove the physics engine from both Scene and SceneGraph
1330 PhysicsScene = null; 1360 PhysicsScene = null;
@@ -1355,11 +1385,29 @@ namespace OpenSim.Region.Framework.Scenes
1355 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 1385 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
1356 if (m_heartbeatThread != null) 1386 if (m_heartbeatThread != null)
1357 { 1387 {
1388 m_hbRestarts++;
1389 if(m_hbRestarts > 10)
1390 Environment.Exit(1);
1391 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1392
1393//int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
1394//System.Diagnostics.Process proc = new System.Diagnostics.Process();
1395//proc.EnableRaisingEvents=false;
1396//proc.StartInfo.FileName = "/bin/kill";
1397//proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
1398//proc.Start();
1399//proc.WaitForExit();
1400//Thread.Sleep(1000);
1401//Environment.Exit(1);
1358 m_heartbeatThread.Abort(); 1402 m_heartbeatThread.Abort();
1403 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1359 m_heartbeatThread = null; 1404 m_heartbeatThread = null;
1360 } 1405 }
1361// m_lastUpdate = Util.EnvironmentTickCount(); 1406// m_lastUpdate = Util.EnvironmentTickCount();
1362 1407
1408// m_sceneGraph.PreparePhysicsSimulation();
1409
1410
1363 m_heartbeatThread 1411 m_heartbeatThread
1364 = Watchdog.StartThread( 1412 = Watchdog.StartThread(
1365 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); 1413 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false);
@@ -1504,16 +1552,20 @@ namespace OpenSim.Region.Framework.Scenes
1504 endFrame = Frame + frames; 1552 endFrame = Frame + frames;
1505 1553
1506 float physicsFPS = 0f; 1554 float physicsFPS = 0f;
1507 int previousFrameTick, tmpMS; 1555 int tmpMS;
1508 int maintc = Util.EnvironmentTickCount(); 1556 int previousFrameTick;
1557 int maintc;
1558 int sleepMS;
1559 int framestart;
1509 1560
1510 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame)) 1561 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame))
1511 { 1562 {
1563 framestart = Util.EnvironmentTickCount();
1512 ++Frame; 1564 ++Frame;
1513 1565
1514// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); 1566// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
1515 1567
1516 agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; 1568 agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0;
1517 1569
1518 try 1570 try
1519 { 1571 {
@@ -1567,6 +1619,7 @@ namespace OpenSim.Region.Framework.Scenes
1567 m_sceneGraph.UpdatePresences(); 1619 m_sceneGraph.UpdatePresences();
1568 1620
1569 agentMS += Util.EnvironmentTickCountSubtract(tmpMS); 1621 agentMS += Util.EnvironmentTickCountSubtract(tmpMS);
1622
1570 1623
1571 // Delete temp-on-rez stuff 1624 // Delete temp-on-rez stuff
1572 if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) 1625 if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps)
@@ -1648,34 +1701,37 @@ namespace OpenSim.Region.Framework.Scenes
1648 1701
1649 Watchdog.UpdateThread(); 1702 Watchdog.UpdateThread();
1650 1703
1704 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
1705
1706 StatsReporter.AddPhysicsFPS(physicsFPS);
1707 StatsReporter.AddTimeDilation(TimeDilation);
1708 StatsReporter.AddFPS(1);
1709
1710 StatsReporter.addAgentMS(agentMS);
1711 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
1712 StatsReporter.addOtherMS(otherMS);
1713 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1714
1651 previousFrameTick = m_lastFrameTick; 1715 previousFrameTick = m_lastFrameTick;
1652 m_lastFrameTick = Util.EnvironmentTickCount(); 1716 m_lastFrameTick = Util.EnvironmentTickCount();
1653 tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1717 tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart);
1654 tmpMS = (int)(MinFrameTime * 1000) - tmpMS; 1718 tmpMS = (int)(MinFrameTime * 1000) - tmpMS;
1655 1719
1720 m_firstHeartbeat = false;
1721
1722 sleepMS = Util.EnvironmentTickCount();
1723
1656 if (tmpMS > 0) 1724 if (tmpMS > 0)
1657 {
1658 Thread.Sleep(tmpMS); 1725 Thread.Sleep(tmpMS);
1659 spareMS += tmpMS;
1660 }
1661 1726
1662 frameMS = Util.EnvironmentTickCountSubtract(maintc); 1727 sleepMS = Util.EnvironmentTickCountSubtract(sleepMS);
1663 maintc = Util.EnvironmentTickCount(); 1728 frameMS = Util.EnvironmentTickCountSubtract(framestart);
1664 1729 StatsReporter.addSleepMS(sleepMS);
1665 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; 1730 StatsReporter.addFrameMS(frameMS);
1666 1731
1667 // if (Frame%m_update_avatars == 0) 1732 // if (Frame%m_update_avatars == 0)
1668 // UpdateInWorldTime(); 1733 // UpdateInWorldTime();
1669 StatsReporter.AddPhysicsFPS(physicsFPS);
1670 StatsReporter.AddTimeDilation(TimeDilation);
1671 StatsReporter.AddFPS(1);
1672 1734
1673 StatsReporter.addFrameMS(frameMS);
1674 StatsReporter.addAgentMS(agentMS);
1675 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
1676 StatsReporter.addOtherMS(otherMS);
1677 StatsReporter.AddSpareMS(spareMS);
1678 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1679 1735
1680 // Optionally warn if a frame takes double the amount of time that it should. 1736 // Optionally warn if a frame takes double the amount of time that it should.
1681 if (DebugUpdates 1737 if (DebugUpdates
@@ -1692,7 +1748,7 @@ namespace OpenSim.Region.Framework.Scenes
1692 public void AddGroupTarget(SceneObjectGroup grp) 1748 public void AddGroupTarget(SceneObjectGroup grp)
1693 { 1749 {
1694 lock (m_groupsWithTargets) 1750 lock (m_groupsWithTargets)
1695 m_groupsWithTargets[grp.UUID] = grp; 1751 m_groupsWithTargets[grp.UUID] = 0;
1696 } 1752 }
1697 1753
1698 public void RemoveGroupTarget(SceneObjectGroup grp) 1754 public void RemoveGroupTarget(SceneObjectGroup grp)
@@ -1703,18 +1759,24 @@ namespace OpenSim.Region.Framework.Scenes
1703 1759
1704 private void CheckAtTargets() 1760 private void CheckAtTargets()
1705 { 1761 {
1706 List<SceneObjectGroup> objs = null; 1762 List<UUID> objs = null;
1707 1763
1708 lock (m_groupsWithTargets) 1764 lock (m_groupsWithTargets)
1709 { 1765 {
1710 if (m_groupsWithTargets.Count != 0) 1766 if (m_groupsWithTargets.Count != 0)
1711 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values); 1767 objs = new List<UUID>(m_groupsWithTargets.Keys);
1712 } 1768 }
1713 1769
1714 if (objs != null) 1770 if (objs != null)
1715 { 1771 {
1716 foreach (SceneObjectGroup entry in objs) 1772 foreach (UUID entry in objs)
1717 entry.checkAtTargets(); 1773 {
1774 SceneObjectGroup grp = GetSceneObjectGroup(entry);
1775 if (grp == null)
1776 m_groupsWithTargets.Remove(entry);
1777 else
1778 grp.checkAtTargets();
1779 }
1718 } 1780 }
1719 } 1781 }
1720 1782
@@ -1793,7 +1855,7 @@ namespace OpenSim.Region.Framework.Scenes
1793 msg.fromAgentName = "Server"; 1855 msg.fromAgentName = "Server";
1794 msg.dialog = (byte)19; // Object msg 1856 msg.dialog = (byte)19; // Object msg
1795 msg.fromGroup = false; 1857 msg.fromGroup = false;
1796 msg.offline = (byte)0; 1858 msg.offline = (byte)1;
1797 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; 1859 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
1798 msg.Position = Vector3.Zero; 1860 msg.Position = Vector3.Zero;
1799 msg.RegionID = RegionInfo.RegionID.Guid; 1861 msg.RegionID = RegionInfo.RegionID.Guid;
@@ -2022,7 +2084,7 @@ namespace OpenSim.Region.Framework.Scenes
2022 return PhysicsScene.SupportsRaycastWorldFiltered(); 2084 return PhysicsScene.SupportsRaycastWorldFiltered();
2023 } 2085 }
2024 2086
2025 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter) 2087 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
2026 { 2088 {
2027 if (PhysicsScene == null) 2089 if (PhysicsScene == null)
2028 return null; 2090 return null;
@@ -2044,14 +2106,24 @@ namespace OpenSim.Region.Framework.Scenes
2044 /// <returns></returns> 2106 /// <returns></returns>
2045 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 2107 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
2046 { 2108 {
2109
2110 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
2111 Vector3 wpos = Vector3.Zero;
2112 // Check for water surface intersection from above
2113 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
2114 {
2115 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
2116 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
2117 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
2118 wpos.Z = wheight;
2119 }
2120
2047 Vector3 pos = Vector3.Zero; 2121 Vector3 pos = Vector3.Zero;
2048 if (RayEndIsIntersection == (byte)1) 2122 if (RayEndIsIntersection == (byte)1)
2049 { 2123 {
2050 pos = RayEnd; 2124 pos = RayEnd;
2051 return pos;
2052 } 2125 }
2053 2126 else if (RayTargetID != UUID.Zero)
2054 if (RayTargetID != UUID.Zero)
2055 { 2127 {
2056 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 2128 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
2057 2129
@@ -2073,7 +2145,7 @@ namespace OpenSim.Region.Framework.Scenes
2073 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter); 2145 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
2074 2146
2075 // Un-comment out the following line to Get Raytrace results printed to the console. 2147 // Un-comment out the following line to Get Raytrace results printed to the console.
2076 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 2148 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
2077 float ScaleOffset = 0.5f; 2149 float ScaleOffset = 0.5f;
2078 2150
2079 // If we hit something 2151 // If we hit something
@@ -2096,13 +2168,10 @@ namespace OpenSim.Region.Framework.Scenes
2096 //pos.Z -= 0.25F; 2168 //pos.Z -= 0.25F;
2097 2169
2098 } 2170 }
2099
2100 return pos;
2101 } 2171 }
2102 else 2172 else
2103 { 2173 {
2104 // We don't have a target here, so we're going to raytrace all the objects in the scene. 2174 // We don't have a target here, so we're going to raytrace all the objects in the scene.
2105
2106 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 2175 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
2107 2176
2108 // Un-comment the following line to print the raytrace results to the console. 2177 // Un-comment the following line to print the raytrace results to the console.
@@ -2111,13 +2180,12 @@ namespace OpenSim.Region.Framework.Scenes
2111 if (ei.HitTF) 2180 if (ei.HitTF)
2112 { 2181 {
2113 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); 2182 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
2114 } else 2183 }
2184 else
2115 { 2185 {
2116 // fall back to our stupid functionality 2186 // fall back to our stupid functionality
2117 pos = RayEnd; 2187 pos = RayEnd;
2118 } 2188 }
2119
2120 return pos;
2121 } 2189 }
2122 } 2190 }
2123 else 2191 else
@@ -2128,8 +2196,12 @@ namespace OpenSim.Region.Framework.Scenes
2128 //increase height so its above the ground. 2196 //increase height so its above the ground.
2129 //should be getting the normal of the ground at the rez point and using that? 2197 //should be getting the normal of the ground at the rez point and using that?
2130 pos.Z += scale.Z / 2f; 2198 pos.Z += scale.Z / 2f;
2131 return pos; 2199// return pos;
2132 } 2200 }
2201
2202 // check against posible water intercept
2203 if (wpos.Z > pos.Z) pos = wpos;
2204 return pos;
2133 } 2205 }
2134 2206
2135 2207
@@ -2220,12 +2292,12 @@ namespace OpenSim.Region.Framework.Scenes
2220 { 2292 {
2221 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates)) 2293 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates))
2222 { 2294 {
2295 sceneObject.IsDeleted = false;
2223 EventManager.TriggerObjectAddedToScene(sceneObject); 2296 EventManager.TriggerObjectAddedToScene(sceneObject);
2224 return true; 2297 return true;
2225 } 2298 }
2226 2299
2227 return false; 2300 return false;
2228
2229 } 2301 }
2230 2302
2231 /// <summary> 2303 /// <summary>
@@ -2317,6 +2389,15 @@ namespace OpenSim.Region.Framework.Scenes
2317 /// </summary> 2389 /// </summary>
2318 public void DeleteAllSceneObjects() 2390 public void DeleteAllSceneObjects()
2319 { 2391 {
2392 DeleteAllSceneObjects(false);
2393 }
2394
2395 /// <summary>
2396 /// Delete every object from the scene. This does not include attachments worn by avatars.
2397 /// </summary>
2398 public void DeleteAllSceneObjects(bool exceptNoCopy)
2399 {
2400 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2320 lock (Entities) 2401 lock (Entities)
2321 { 2402 {
2322 EntityBase[] entities = Entities.GetEntities(); 2403 EntityBase[] entities = Entities.GetEntities();
@@ -2325,11 +2406,24 @@ namespace OpenSim.Region.Framework.Scenes
2325 if (e is SceneObjectGroup) 2406 if (e is SceneObjectGroup)
2326 { 2407 {
2327 SceneObjectGroup sog = (SceneObjectGroup)e; 2408 SceneObjectGroup sog = (SceneObjectGroup)e;
2328 if (!sog.IsAttachment) 2409 if (sog != null && !sog.IsAttachment)
2329 DeleteSceneObject((SceneObjectGroup)e, false); 2410 {
2411 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2412 {
2413 DeleteSceneObject((SceneObjectGroup)e, false);
2414 }
2415 else
2416 {
2417 toReturn.Add((SceneObjectGroup)e);
2418 }
2419 }
2330 } 2420 }
2331 } 2421 }
2332 } 2422 }
2423 if (toReturn.Count > 0)
2424 {
2425 returnObjects(toReturn.ToArray(), UUID.Zero);
2426 }
2333 } 2427 }
2334 2428
2335 /// <summary> 2429 /// <summary>
@@ -2364,6 +2458,12 @@ namespace OpenSim.Region.Framework.Scenes
2364 2458
2365 foreach (SceneObjectPart part in partList) 2459 foreach (SceneObjectPart part in partList)
2366 { 2460 {
2461 if (part.KeyframeMotion != null)
2462 {
2463 part.KeyframeMotion.Delete();
2464 part.KeyframeMotion = null;
2465 }
2466
2367 if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) 2467 if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
2368 { 2468 {
2369 PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? 2469 PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
@@ -2381,6 +2481,8 @@ namespace OpenSim.Region.Framework.Scenes
2381 } 2481 }
2382 2482
2383 group.DeleteGroupFromScene(silent); 2483 group.DeleteGroupFromScene(silent);
2484 if (!silent)
2485 SendKillObject(new List<uint>() { group.LocalId });
2384 2486
2385// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2487// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2386 } 2488 }
@@ -2670,7 +2772,7 @@ namespace OpenSim.Region.Framework.Scenes
2670 // If the user is banned, we won't let any of their objects 2772 // If the user is banned, we won't let any of their objects
2671 // enter. Period. 2773 // enter. Period.
2672 // 2774 //
2673 if (RegionInfo.EstateSettings.IsBanned(newObject.OwnerID)) 2775 if (RegionInfo.EstateSettings.IsBanned(newObject.OwnerID, 36))
2674 { 2776 {
2675 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", newObject.OwnerID); 2777 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", newObject.OwnerID);
2676 return false; 2778 return false;
@@ -2705,6 +2807,9 @@ namespace OpenSim.Region.Framework.Scenes
2705 // before we restart the scripts, or else some functions won't work. 2807 // before we restart the scripts, or else some functions won't work.
2706 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); 2808 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
2707 newObject.ResumeScripts(); 2809 newObject.ResumeScripts();
2810
2811 if (newObject.RootPart.KeyframeMotion != null)
2812 newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
2708 } 2813 }
2709 2814
2710 // Do this as late as possible so that listeners have full access to the incoming object 2815 // Do this as late as possible so that listeners have full access to the incoming object
@@ -2722,6 +2827,23 @@ namespace OpenSim.Region.Framework.Scenes
2722 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> 2827 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
2723 public bool AddSceneObject(SceneObjectGroup sceneObject) 2828 public bool AddSceneObject(SceneObjectGroup sceneObject)
2724 { 2829 {
2830 if (sceneObject.OwnerID == UUID.Zero)
2831 {
2832 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
2833 return false;
2834 }
2835
2836 // If the user is banned, we won't let any of their objects
2837 // enter. Period.
2838 //
2839 int flags = GetUserFlags(sceneObject.OwnerID);
2840 if (RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags))
2841 {
2842 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID);
2843
2844 return false;
2845 }
2846
2725 // Force allocation of new LocalId 2847 // Force allocation of new LocalId
2726 // 2848 //
2727 SceneObjectPart[] parts = sceneObject.Parts; 2849 SceneObjectPart[] parts = sceneObject.Parts;
@@ -2758,16 +2880,27 @@ namespace OpenSim.Region.Framework.Scenes
2758 // information that this is due to a teleport/border cross rather than an ordinary attachment. 2880 // information that this is due to a teleport/border cross rather than an ordinary attachment.
2759 // We currently do this in Scene.MakeRootAgent() instead. 2881 // We currently do this in Scene.MakeRootAgent() instead.
2760 if (AttachmentsModule != null) 2882 if (AttachmentsModule != null)
2761 AttachmentsModule.AttachObject(sp, grp, 0, false, false, true); 2883 AttachmentsModule.AttachObject(sp, grp, 0, false, false, false, true);
2762 } 2884 }
2763 else 2885 else
2764 { 2886 {
2887 m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
2765 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2888 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2766 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2889 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2767 } 2890 }
2891 if (sceneObject.OwnerID == UUID.Zero)
2892 {
2893 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
2894 return false;
2895 }
2768 } 2896 }
2769 else 2897 else
2770 { 2898 {
2899 if (sceneObject.OwnerID == UUID.Zero)
2900 {
2901 m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
2902 return false;
2903 }
2771 AddRestoredSceneObject(sceneObject, true, false); 2904 AddRestoredSceneObject(sceneObject, true, false);
2772 } 2905 }
2773 2906
@@ -2784,6 +2917,24 @@ namespace OpenSim.Region.Framework.Scenes
2784 return 2; // StateSource.PrimCrossing 2917 return 2; // StateSource.PrimCrossing
2785 } 2918 }
2786 2919
2920 public int GetUserFlags(UUID user)
2921 {
2922 //Unfortunately the SP approach means that the value is cached until region is restarted
2923 /*
2924 ScenePresence sp;
2925 if (TryGetScenePresence(user, out sp))
2926 {
2927 return sp.UserFlags;
2928 }
2929 else
2930 {
2931 */
2932 UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user);
2933 if (uac == null)
2934 return 0;
2935 return uac.UserFlags;
2936 //}
2937 }
2787 #endregion 2938 #endregion
2788 2939
2789 #region Add/Remove Avatar Methods 2940 #region Add/Remove Avatar Methods
@@ -2816,7 +2967,7 @@ namespace OpenSim.Region.Framework.Scenes
2816 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 2967 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2817 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2968 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2818 2969
2819 // CheckHeartbeat(); 2970 CheckHeartbeat();
2820 2971
2821 sp = GetScenePresence(client.AgentId); 2972 sp = GetScenePresence(client.AgentId);
2822 2973
@@ -2834,6 +2985,13 @@ namespace OpenSim.Region.Framework.Scenes
2834 SubscribeToClientEvents(client); 2985 SubscribeToClientEvents(client);
2835 2986
2836 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); 2987 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
2988 InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46);
2989 if (cof == null)
2990 sp.COF = UUID.Zero;
2991 else
2992 sp.COF = cof.ID;
2993
2994 m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF);
2837 m_eventManager.TriggerOnNewPresence(sp); 2995 m_eventManager.TriggerOnNewPresence(sp);
2838 2996
2839 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags; 2997 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
@@ -2948,19 +3106,14 @@ namespace OpenSim.Region.Framework.Scenes
2948 // and the scene presence and the client, if they exist 3106 // and the scene presence and the client, if they exist
2949 try 3107 try
2950 { 3108 {
2951 // We need to wait for the client to make UDP contact first. 3109 ScenePresence sp = GetScenePresence(agentID);
2952 // It's the UDP contact that creates the scene presence 3110
2953 ScenePresence sp = WaitGetScenePresence(agentID);
2954 if (sp != null) 3111 if (sp != null)
2955 { 3112 {
2956 PresenceService.LogoutAgent(sp.ControllingClient.SessionId); 3113 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2957
2958 sp.ControllingClient.Close(); 3114 sp.ControllingClient.Close();
2959 } 3115 }
2960 else 3116
2961 {
2962 m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID);
2963 }
2964 // BANG! SLASH! 3117 // BANG! SLASH!
2965 m_authenticateHandler.RemoveCircuit(agentID); 3118 m_authenticateHandler.RemoveCircuit(agentID);
2966 3119
@@ -3005,6 +3158,8 @@ namespace OpenSim.Region.Framework.Scenes
3005 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 3158 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
3006 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 3159 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
3007 3160
3161 client.onClientChangeObject += m_sceneGraph.ClientChangeObject;
3162
3008 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation; 3163 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation;
3009 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 3164 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
3010 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 3165 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
@@ -3061,6 +3216,7 @@ namespace OpenSim.Region.Framework.Scenes
3061 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory; 3216 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
3062 client.OnUpdateInventoryItem += UpdateInventoryItemAsset; 3217 client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
3063 client.OnCopyInventoryItem += CopyInventoryItem; 3218 client.OnCopyInventoryItem += CopyInventoryItem;
3219 client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
3064 client.OnMoveInventoryItem += MoveInventoryItem; 3220 client.OnMoveInventoryItem += MoveInventoryItem;
3065 client.OnRemoveInventoryItem += RemoveInventoryItem; 3221 client.OnRemoveInventoryItem += RemoveInventoryItem;
3066 client.OnRemoveInventoryFolder += RemoveInventoryFolder; 3222 client.OnRemoveInventoryFolder += RemoveInventoryFolder;
@@ -3131,6 +3287,8 @@ namespace OpenSim.Region.Framework.Scenes
3131 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition; 3287 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition;
3132 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; 3288 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
3133 3289
3290 client.onClientChangeObject -= m_sceneGraph.ClientChangeObject;
3291
3134 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3292 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation;
3135 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3293 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation;
3136 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; 3294 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
@@ -3437,7 +3595,7 @@ namespace OpenSim.Region.Framework.Scenes
3437 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop 3595 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop
3438 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI 3596 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI
3439 if (closeChildAgents && CapsModule != null) 3597 if (closeChildAgents && CapsModule != null)
3440 CapsModule.RemoveCaps(agentID); 3598 CapsModule.RemoveCaps(agentID, avatar.ControllingClient.CircuitCode);
3441 3599
3442 if (closeChildAgents && !isChildAgent) 3600 if (closeChildAgents && !isChildAgent)
3443 { 3601 {
@@ -3470,6 +3628,7 @@ namespace OpenSim.Region.Framework.Scenes
3470 // It's possible for child agents to have transactions if changes are being made cross-border. 3628 // It's possible for child agents to have transactions if changes are being made cross-border.
3471 if (AgentTransactionsModule != null) 3629 if (AgentTransactionsModule != null)
3472 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); 3630 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID);
3631 m_log.Debug("[Scene] The avatar has left the building");
3473 } 3632 }
3474 catch (Exception e) 3633 catch (Exception e)
3475 { 3634 {
@@ -3663,15 +3822,27 @@ namespace OpenSim.Region.Framework.Scenes
3663 agent.firstname, agent.lastname, agent.Viewer); 3822 agent.firstname, agent.lastname, agent.Viewer);
3664 reason = "Access denied, your viewer is banned by the region owner"; 3823 reason = "Access denied, your viewer is banned by the region owner";
3665 return false; 3824 return false;
3666 } 3825 }
3667 3826
3668 ILandObject land; 3827 ScenePresence sp = GetScenePresence(agent.AgentID);
3669 3828
3670 lock (agent) 3829 // If we have noo presence here or if that presence is a zombie root
3830 // presence that will be kicled, we need a new CAPS object.
3831 if (sp == null || (sp != null && !sp.IsChildAgent))
3671 { 3832 {
3672 ScenePresence sp = GetScenePresence(agent.AgentID); 3833 if (CapsModule != null)
3673 3834 {
3674 if (sp != null && !sp.IsChildAgent) 3835 lock (agent)
3836 {
3837 CapsModule.SetAgentCapsSeeds(agent);
3838 CapsModule.CreateCaps(agent.AgentID, agent.circuitcode);
3839 }
3840 }
3841 }
3842
3843 if (sp != null)
3844 {
3845 if (!sp.IsChildAgent)
3675 { 3846 {
3676 // We have a zombie from a crashed session. 3847 // We have a zombie from a crashed session.
3677 // Or the same user is trying to be root twice here, won't work. 3848 // Or the same user is trying to be root twice here, won't work.
@@ -3679,29 +3850,34 @@ namespace OpenSim.Region.Framework.Scenes
3679 m_log.WarnFormat( 3850 m_log.WarnFormat(
3680 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.", 3851 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.",
3681 sp.Name, sp.UUID, RegionInfo.RegionName); 3852 sp.Name, sp.UUID, RegionInfo.RegionName);
3682 3853
3683 sp.ControllingClient.Close(true); 3854 sp.ControllingClient.Close(true, true);
3684 sp = null; 3855 sp = null;
3685 } 3856 }
3857 }
3686 3858
3859 lock (agent)
3860 {
3687 // Optimistic: add or update the circuit data with the new agent circuit data and teleport flags. 3861 // Optimistic: add or update the circuit data with the new agent circuit data and teleport flags.
3688 // We need the circuit data here for some of the subsequent checks. (groups, for example) 3862 // We need the circuit data here for some of the subsequent checks. (groups, for example)
3689 // If the checks fail, we remove the circuit. 3863 // If the checks fail, we remove the circuit.
3690 agent.teleportFlags = teleportFlags; 3864 agent.teleportFlags = teleportFlags;
3691 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); 3865 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
3692 3866
3693 land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3694
3695 // On login test land permisions 3867 // On login test land permisions
3696 if (vialogin) 3868 if (vialogin)
3697 { 3869 {
3698 if (land != null && !TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y)) 3870 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
3871 if (cache != null)
3872 cache.Remove(agent.firstname + " " + agent.lastname);
3873 if (!TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y))
3699 { 3874 {
3875 m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
3700 m_authenticateHandler.RemoveCircuit(agent.circuitcode); 3876 m_authenticateHandler.RemoveCircuit(agent.circuitcode);
3701 return false; 3877 return false;
3702 } 3878 }
3703 } 3879 }
3704 3880
3705 if (sp == null) // We don't have an [child] agent here already 3881 if (sp == null) // We don't have an [child] agent here already
3706 { 3882 {
3707 if (requirePresenceLookup) 3883 if (requirePresenceLookup)
@@ -3723,13 +3899,18 @@ namespace OpenSim.Region.Framework.Scenes
3723 return false; 3899 return false;
3724 } 3900 }
3725 } 3901 }
3726 3902
3727 try 3903 try
3728 { 3904 {
3729 if (!AuthorizeUser(agent, out reason)) 3905 // Always check estate if this is a login. Always
3906 // check if banned regions are to be blacked out.
3907 if (vialogin || (!m_seeIntoBannedRegion))
3730 { 3908 {
3731 m_authenticateHandler.RemoveCircuit(agent.circuitcode); 3909 if (!AuthorizeUser(agent, out reason))
3732 return false; 3910 {
3911 m_authenticateHandler.RemoveCircuit(agent.circuitcode);
3912 return false;
3913 }
3733 } 3914 }
3734 } 3915 }
3735 catch (Exception e) 3916 catch (Exception e)
@@ -3740,32 +3921,27 @@ namespace OpenSim.Region.Framework.Scenes
3740 m_authenticateHandler.RemoveCircuit(agent.circuitcode); 3921 m_authenticateHandler.RemoveCircuit(agent.circuitcode);
3741 return false; 3922 return false;
3742 } 3923 }
3743 3924
3744 m_log.InfoFormat( 3925 m_log.InfoFormat(
3745 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", 3926 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
3746 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, 3927 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
3747 agent.AgentID, agent.circuitcode); 3928 agent.AgentID, agent.circuitcode);
3748 3929
3749 if (CapsModule != null)
3750 {
3751 CapsModule.SetAgentCapsSeeds(agent);
3752 CapsModule.CreateCaps(agent.AgentID);
3753 }
3754 } 3930 }
3755 else 3931 else
3756 { 3932 {
3757 // Let the SP know how we got here. This has a lot of interesting 3933 // Let the SP know how we got here. This has a lot of interesting
3758 // uses down the line. 3934 // uses down the line.
3759 sp.TeleportFlags = (TPFlags)teleportFlags; 3935 sp.TeleportFlags = (TPFlags)teleportFlags;
3760 3936
3761 if (sp.IsChildAgent) 3937 if (sp.IsChildAgent)
3762 { 3938 {
3763 m_log.DebugFormat( 3939 m_log.DebugFormat(
3764 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}", 3940 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}",
3765 agent.AgentID, RegionInfo.RegionName); 3941 agent.AgentID, RegionInfo.RegionName);
3766 3942
3767 sp.AdjustKnownSeeds(); 3943 sp.AdjustKnownSeeds();
3768 3944
3769 if (CapsModule != null) 3945 if (CapsModule != null)
3770 CapsModule.SetAgentCapsSeeds(agent); 3946 CapsModule.SetAgentCapsSeeds(agent);
3771 } 3947 }
@@ -3777,6 +3953,11 @@ namespace OpenSim.Region.Framework.Scenes
3777 CacheUserName(null, agent); 3953 CacheUserName(null, agent);
3778 } 3954 }
3779 3955
3956 if (CapsModule != null)
3957 {
3958 CapsModule.ActivateCaps(agent.circuitcode);
3959 }
3960
3780 if (vialogin) 3961 if (vialogin)
3781 { 3962 {
3782// CleanDroppedAttachments(); 3963// CleanDroppedAttachments();
@@ -3868,6 +4049,8 @@ namespace OpenSim.Region.Framework.Scenes
3868 } 4049 }
3869 4050
3870 // Honor parcel landing type and position. 4051 // Honor parcel landing type and position.
4052 /*
4053 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3871 if (land != null) 4054 if (land != null)
3872 { 4055 {
3873 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 4056 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -3875,6 +4058,7 @@ namespace OpenSim.Region.Framework.Scenes
3875 agent.startpos = land.LandData.UserLocation; 4058 agent.startpos = land.LandData.UserLocation;
3876 } 4059 }
3877 } 4060 }
4061 */// This is now handled properly in ScenePresence.MakeRootAgent
3878 } 4062 }
3879 4063
3880 return true; 4064 return true;
@@ -3972,7 +4156,7 @@ namespace OpenSim.Region.Framework.Scenes
3972 4156
3973 if (!m_strictAccessControl) return true; 4157 if (!m_strictAccessControl) return true;
3974 if (Permissions.IsGod(agent.AgentID)) return true; 4158 if (Permissions.IsGod(agent.AgentID)) return true;
3975 4159
3976 if (AuthorizationService != null) 4160 if (AuthorizationService != null)
3977 { 4161 {
3978 if (!AuthorizationService.IsAuthorizedForRegion( 4162 if (!AuthorizationService.IsAuthorizedForRegion(
@@ -3987,7 +4171,7 @@ namespace OpenSim.Region.Framework.Scenes
3987 4171
3988 if (RegionInfo.EstateSettings != null) 4172 if (RegionInfo.EstateSettings != null)
3989 { 4173 {
3990 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID)) 4174 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID, 0))
3991 { 4175 {
3992 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 4176 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
3993 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4177 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
@@ -4175,6 +4359,15 @@ namespace OpenSim.Region.Framework.Scenes
4175 m_log.DebugFormat( 4359 m_log.DebugFormat(
4176 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); 4360 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName);
4177 4361
4362 // We have to wait until the viewer contacts this region after receiving EAC.
4363 // That calls AddNewClient, which finally creates the ScenePresence
4364 int flags = GetUserFlags(cAgentData.AgentID);
4365 if (RegionInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags))
4366 {
4367 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID);
4368 return false;
4369 }
4370
4178 // TODO: This check should probably be in QueryAccess(). 4371 // TODO: This check should probably be in QueryAccess().
4179 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); 4372 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2);
4180 if (nearestParcel == null) 4373 if (nearestParcel == null)
@@ -4239,7 +4432,7 @@ namespace OpenSim.Region.Framework.Scenes
4239 /// <param name='agentID'></param> 4432 /// <param name='agentID'></param>
4240 protected virtual ScenePresence WaitGetScenePresence(UUID agentID) 4433 protected virtual ScenePresence WaitGetScenePresence(UUID agentID)
4241 { 4434 {
4242 int ntimes = 10; 4435 int ntimes = 30;
4243 ScenePresence sp = null; 4436 ScenePresence sp = null;
4244 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0)) 4437 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0))
4245 Thread.Sleep(1000); 4438 Thread.Sleep(1000);
@@ -4269,6 +4462,16 @@ namespace OpenSim.Region.Framework.Scenes
4269 return false; 4462 return false;
4270 } 4463 }
4271 4464
4465 public bool IncomingCloseAgent(UUID agentID)
4466 {
4467 return IncomingCloseAgent(agentID, false);
4468 }
4469
4470 public bool IncomingCloseChildAgent(UUID agentID)
4471 {
4472 return IncomingCloseAgent(agentID, true);
4473 }
4474
4272 /// <summary> 4475 /// <summary>
4273 /// Tell a single agent to disconnect from the region. 4476 /// Tell a single agent to disconnect from the region.
4274 /// </summary> 4477 /// </summary>
@@ -4284,7 +4487,7 @@ namespace OpenSim.Region.Framework.Scenes
4284 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); 4487 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID);
4285 if (presence != null) 4488 if (presence != null)
4286 { 4489 {
4287 presence.ControllingClient.Close(force); 4490 presence.ControllingClient.Close(force, force);
4288 return true; 4491 return true;
4289 } 4492 }
4290 4493
@@ -4917,7 +5120,7 @@ namespace OpenSim.Region.Framework.Scenes
4917 { 5120 {
4918 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) 5121 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
4919 { 5122 {
4920 if (grp.RootPart.Expires <= DateTime.Now) 5123 if (grp.GetSittingAvatarsCount() == 0 && grp.RootPart.Expires <= DateTime.Now)
4921 DeleteSceneObject(grp, false); 5124 DeleteSceneObject(grp, false);
4922 } 5125 }
4923 } 5126 }
@@ -4931,35 +5134,81 @@ namespace OpenSim.Region.Framework.Scenes
4931 SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID); 5134 SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID);
4932 } 5135 }
4933 5136
4934 public int GetHealth() 5137 public int GetHealth(out int flags, out string message)
4935 { 5138 {
4936 // Returns: 5139 // Returns:
4937 // 1 = sim is up and accepting http requests. The heartbeat has 5140 // 1 = sim is up and accepting http requests. The heartbeat has
4938 // stopped and the sim is probably locked up, but a remote 5141 // stopped and the sim is probably locked up, but a remote
4939 // admin restart may succeed 5142 // admin restart may succeed
4940 // 5143 //
4941 // 2 = Sim is up and the heartbeat is running. The sim is likely 5144 // 2 = Sim is up and the heartbeat is running. The sim is likely
4942 // usable for people within and logins _may_ work 5145 // usable for people within
5146 //
5147 // 3 = Sim is up and one packet thread is running. Sim is
5148 // unstable and will not accept new logins
4943 // 5149 //
4944 // 3 = We have seen a new user enter within the past 4 minutes 5150 // 4 = Sim is up and both packet threads are running. Sim is
5151 // likely usable
5152 //
5153 // 5 = We have seen a new user enter within the past 4 minutes
4945 // which can be seen as positive confirmation of sim health 5154 // which can be seen as positive confirmation of sim health
4946 // 5155 //
5156
5157 flags = 0;
5158 message = String.Empty;
5159
5160 CheckHeartbeat();
5161
5162 if (m_firstHeartbeat || (m_lastIncoming == 0 && m_lastOutgoing == 0))
5163 {
5164 // We're still starting
5165 // 0 means "in startup", it can't happen another way, since
5166 // to get here, we must be able to accept http connections
5167 return 0;
5168 }
5169
4947 int health=1; // Start at 1, means we're up 5170 int health=1; // Start at 1, means we're up
4948 5171
4949 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 5172 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
4950 health += 1; 5173 {
5174 health+=1;
5175 flags |= 1;
5176 }
5177
5178 if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
5179 {
5180 health+=1;
5181 flags |= 2;
5182 }
5183
5184 if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
5185 {
5186 health+=1;
5187 flags |= 4;
5188 }
4951 else 5189 else
5190 {
5191int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
5192System.Diagnostics.Process proc = new System.Diagnostics.Process();
5193proc.EnableRaisingEvents=false;
5194proc.StartInfo.FileName = "/bin/kill";
5195proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
5196proc.Start();
5197proc.WaitForExit();
5198Thread.Sleep(1000);
5199Environment.Exit(1);
5200 }
5201
5202 if (flags != 7)
4952 return health; 5203 return health;
4953 5204
4954 // A login in the last 4 mins? We can't be doing too badly 5205 // A login in the last 4 mins? We can't be doing too badly
4955 // 5206 //
4956 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 5207 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
4957 health++; 5208 health++;
4958 else 5209 else
4959 return health; 5210 return health;
4960 5211
4961// CheckHeartbeat();
4962
4963 return health; 5212 return health;
4964 } 5213 }
4965 5214
@@ -5047,7 +5296,7 @@ namespace OpenSim.Region.Framework.Scenes
5047 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); 5296 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
5048 if (wasUsingPhysics) 5297 if (wasUsingPhysics)
5049 { 5298 {
5050 jointProxyObject.UpdatePrimFlags(false, false, true, false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock 5299 jointProxyObject.UpdatePrimFlags(false, false, true, false,false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock
5051 } 5300 }
5052 } 5301 }
5053 5302
@@ -5146,14 +5395,14 @@ namespace OpenSim.Region.Framework.Scenes
5146 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 5395 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
5147 } 5396 }
5148 5397
5149// private void CheckHeartbeat() 5398 private void CheckHeartbeat()
5150// { 5399 {
5151// if (m_firstHeartbeat) 5400 if (m_firstHeartbeat)
5152// return; 5401 return;
5153// 5402
5154// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 5403 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
5155// StartTimer(); 5404 Start();
5156// } 5405 }
5157 5406
5158 public override ISceneObject DeserializeObject(string representation) 5407 public override ISceneObject DeserializeObject(string representation)
5159 { 5408 {
@@ -5211,7 +5460,7 @@ namespace OpenSim.Region.Framework.Scenes
5211 Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar); 5460 Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar);
5212 5461
5213 //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString()); 5462 //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString());
5214 5463
5215 return nearestRegionEdgePoint; 5464 return nearestRegionEdgePoint;
5216 } 5465 }
5217 5466
@@ -5465,7 +5714,55 @@ namespace OpenSim.Region.Framework.Scenes
5465 mapModule.GenerateMaptile(); 5714 mapModule.GenerateMaptile();
5466 } 5715 }
5467 5716
5468 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 5717// public void CleanDroppedAttachments()
5718// {
5719// List<SceneObjectGroup> objectsToDelete =
5720// new List<SceneObjectGroup>();
5721//
5722// lock (m_cleaningAttachments)
5723// {
5724// ForEachSOG(delegate (SceneObjectGroup grp)
5725// {
5726// if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
5727// {
5728// UUID agentID = grp.OwnerID;
5729// if (agentID == UUID.Zero)
5730// {
5731// objectsToDelete.Add(grp);
5732// return;
5733// }
5734//
5735// ScenePresence sp = GetScenePresence(agentID);
5736// if (sp == null)
5737// {
5738// objectsToDelete.Add(grp);
5739// return;
5740// }
5741// }
5742// });
5743// }
5744//
5745// foreach (SceneObjectGroup grp in objectsToDelete)
5746// {
5747// m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
5748// DeleteSceneObject(grp, true);
5749// }
5750// }
5751
5752 public void ThreadAlive(int threadCode)
5753 {
5754 switch(threadCode)
5755 {
5756 case 1: // Incoming
5757 m_lastIncoming = Util.EnvironmentTickCount();
5758 break;
5759 case 2: // Incoming
5760 m_lastOutgoing = Util.EnvironmentTickCount();
5761 break;
5762 }
5763 }
5764
5765 public void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5469 { 5766 {
5470 RegenerateMaptile(); 5767 RegenerateMaptile();
5471 5768
@@ -5627,7 +5924,19 @@ namespace OpenSim.Region.Framework.Scenes
5627 return true; 5924 return true;
5628 } 5925 }
5629 5926
5630 /// <summary> 5927 public void StartTimerWatchdog()
5928 {
5929 m_timerWatchdog.Interval = 1000;
5930 m_timerWatchdog.Elapsed += TimerWatchdog;
5931 m_timerWatchdog.AutoReset = true;
5932 m_timerWatchdog.Start();
5933 }
5934
5935 public void TimerWatchdog(object sender, ElapsedEventArgs e)
5936 {
5937 CheckHeartbeat();
5938 }
5939
5631 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the 5940 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
5632 /// autopilot that moves an avatar to a sit target!. 5941 /// autopilot that moves an avatar to a sit target!.
5633 /// </summary> 5942 /// </summary>
@@ -5706,6 +6015,11 @@ namespace OpenSim.Region.Framework.Scenes
5706 return m_SpawnPoint - 1; 6015 return m_SpawnPoint - 1;
5707 } 6016 }
5708 6017
6018 private void HandleGcCollect(string module, string[] args)
6019 {
6020 GC.Collect();
6021 }
6022
5709 /// <summary> 6023 /// <summary>
5710 /// Wrappers to get physics modules retrieve assets. 6024 /// Wrappers to get physics modules retrieve assets.
5711 /// </summary> 6025 /// </summary>