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.cs721
1 files changed, 568 insertions, 153 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 0ac4027..3835047 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>
@@ -400,7 +407,7 @@ namespace OpenSim.Region.Framework.Scenes
400 private volatile bool m_active; 407 private volatile bool m_active;
401 408
402// private int m_lastUpdate; 409// private int m_lastUpdate;
403// private bool m_firstHeartbeat = true; 410 private bool m_firstHeartbeat = true;
404 411
405 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 412 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
406 private bool m_reprioritizationEnabled = true; 413 private bool m_reprioritizationEnabled = true;
@@ -444,6 +451,19 @@ namespace OpenSim.Region.Framework.Scenes
444 get { return m_sceneGridService; } 451 get { return m_sceneGridService; }
445 } 452 }
446 453
454 public ISnmpModule SnmpService
455 {
456 get
457 {
458 if (m_snmpService == null)
459 {
460 m_snmpService = RequestModuleInterface<ISnmpModule>();
461 }
462
463 return m_snmpService;
464 }
465 }
466
447 public ISimulationDataService SimulationDataService 467 public ISimulationDataService SimulationDataService
448 { 468 {
449 get 469 get
@@ -736,6 +756,8 @@ namespace OpenSim.Region.Framework.Scenes
736 m_SimulationDataService = simDataService; 756 m_SimulationDataService = simDataService;
737 m_EstateDataService = estateDataService; 757 m_EstateDataService = estateDataService;
738 m_regionHandle = RegionInfo.RegionHandle; 758 m_regionHandle = RegionInfo.RegionHandle;
759 m_lastIncoming = 0;
760 m_lastOutgoing = 0;
739 761
740 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); 762 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
741 m_asyncSceneObjectDeleter.Enabled = true; 763 m_asyncSceneObjectDeleter.Enabled = true;
@@ -829,7 +851,7 @@ namespace OpenSim.Region.Framework.Scenes
829 851
830 StartDisabled = startupConfig.GetBoolean("StartDisabled", false); 852 StartDisabled = startupConfig.GetBoolean("StartDisabled", false);
831 853
832 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); 854 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
833 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup); 855 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
834 if (!UseBackup) 856 if (!UseBackup)
835 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); 857 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
@@ -837,10 +859,8 @@ namespace OpenSim.Region.Framework.Scenes
837 //Animation states 859 //Animation states
838 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); 860 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
839 861
840 MaxUndoCount = startupConfig.GetInt("MaxPrimUndos", 20); 862 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
841 863 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
842 PhysicalPrims = startupConfig.GetBoolean("physical_prim", PhysicalPrims);
843 CollidablePrims = startupConfig.GetBoolean("collidable_prim", CollidablePrims);
844 864
845 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys); 865 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys);
846 if (RegionInfo.NonphysPrimMin > 0) 866 if (RegionInfo.NonphysPrimMin > 0)
@@ -861,11 +881,21 @@ namespace OpenSim.Region.Framework.Scenes
861 } 881 }
862 882
863 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); 883 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
884
864 if (RegionInfo.PhysPrimMax > 0) 885 if (RegionInfo.PhysPrimMax > 0)
865 { 886 {
866 m_maxPhys = RegionInfo.PhysPrimMax; 887 m_maxPhys = RegionInfo.PhysPrimMax;
867 } 888 }
868 889
890 m_linksetCapacity = startupConfig.GetInt("LinksetPrims", m_linksetCapacity);
891 if (RegionInfo.LinksetCapacity > 0)
892 {
893 m_linksetCapacity = RegionInfo.LinksetCapacity;
894 }
895
896 SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
897 TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false);
898
869 // Here, if clamping is requested in either global or 899 // Here, if clamping is requested in either global or
870 // local config, it will be used 900 // local config, it will be used
871 // 901 //
@@ -875,13 +905,7 @@ namespace OpenSim.Region.Framework.Scenes
875 m_clampPrimSize = true; 905 m_clampPrimSize = true;
876 } 906 }
877 907
878 m_linksetCapacity = startupConfig.GetInt("LinksetPrims", m_linksetCapacity); 908 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete);
879 if (RegionInfo.LinksetCapacity > 0)
880 {
881 m_linksetCapacity = RegionInfo.LinksetCapacity;
882 }
883
884 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete", m_useTrashOnDelete);
885 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 909 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
886 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 910 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
887 m_dontPersistBefore = 911 m_dontPersistBefore =
@@ -892,11 +916,11 @@ namespace OpenSim.Region.Framework.Scenes
892 m_persistAfter *= 10000000; 916 m_persistAfter *= 10000000;
893 917
894 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 918 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
895 919 m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
896 SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
897 TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false);
898 920
899 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); 921 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
922 m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
923 CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
900 924
901 string[] possibleMapConfigSections = new string[] { "Map", "Startup" }; 925 string[] possibleMapConfigSections = new string[] { "Map", "Startup" };
902 926
@@ -941,7 +965,7 @@ namespace OpenSim.Region.Framework.Scenes
941 965
942 if (grant.Length > 0) 966 if (grant.Length > 0)
943 { 967 {
944 foreach (string viewer in grant.Split('|')) 968 foreach (string viewer in grant.Split(','))
945 { 969 {
946 m_AllowedViewers.Add(viewer.Trim().ToLower()); 970 m_AllowedViewers.Add(viewer.Trim().ToLower());
947 } 971 }
@@ -953,7 +977,7 @@ namespace OpenSim.Region.Framework.Scenes
953 977
954 if (grant.Length > 0) 978 if (grant.Length > 0)
955 { 979 {
956 foreach (string viewer in grant.Split('|')) 980 foreach (string viewer in grant.Split(','))
957 { 981 {
958 m_BannedViewers.Add(viewer.Trim().ToLower()); 982 m_BannedViewers.Add(viewer.Trim().ToLower());
959 } 983 }
@@ -1013,6 +1037,8 @@ namespace OpenSim.Region.Framework.Scenes
1013 StatsReporter = new SimStatsReporter(this); 1037 StatsReporter = new SimStatsReporter(this);
1014 StatsReporter.OnSendStatsResult += SendSimStatsPackets; 1038 StatsReporter.OnSendStatsResult += SendSimStatsPackets;
1015 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; 1039 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
1040
1041 MainConsole.Instance.Commands.AddCommand("scene", false, "gc collect", "gc collect", "gc collect", "Cause the garbage collector to make a single pass", HandleGcCollect);
1016 } 1042 }
1017 1043
1018 public Scene(RegionInfo regInfo) : base(regInfo) 1044 public Scene(RegionInfo regInfo) : base(regInfo)
@@ -1308,8 +1334,11 @@ namespace OpenSim.Region.Framework.Scenes
1308 // Stop all client threads. 1334 // Stop all client threads.
1309 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); 1335 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); });
1310 1336
1311 m_log.Debug("[SCENE]: Persisting changed objects"); 1337 m_log.Debug("[SCENE]: TriggerSceneShuttingDown");
1312 EventManager.TriggerSceneShuttingDown(this); 1338 EventManager.TriggerSceneShuttingDown(this);
1339
1340 m_log.Debug("[SCENE]: Persisting changed objects");
1341
1313 Backup(false); 1342 Backup(false);
1314 m_sceneGraph.Close(); 1343 m_sceneGraph.Close();
1315 1344
@@ -1323,6 +1352,7 @@ namespace OpenSim.Region.Framework.Scenes
1323 // attempt to reference a null or disposed physics scene. 1352 // attempt to reference a null or disposed physics scene.
1324 if (PhysicsScene != null) 1353 if (PhysicsScene != null)
1325 { 1354 {
1355 m_log.Debug("[SCENE]: Dispose Physics");
1326 PhysicsScene phys = PhysicsScene; 1356 PhysicsScene phys = PhysicsScene;
1327 // remove the physics engine from both Scene and SceneGraph 1357 // remove the physics engine from both Scene and SceneGraph
1328 PhysicsScene = null; 1358 PhysicsScene = null;
@@ -1345,11 +1375,29 @@ namespace OpenSim.Region.Framework.Scenes
1345 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 1375 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
1346 if (m_heartbeatThread != null) 1376 if (m_heartbeatThread != null)
1347 { 1377 {
1378 m_hbRestarts++;
1379 if(m_hbRestarts > 10)
1380 Environment.Exit(1);
1381 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1382
1383//int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
1384//System.Diagnostics.Process proc = new System.Diagnostics.Process();
1385//proc.EnableRaisingEvents=false;
1386//proc.StartInfo.FileName = "/bin/kill";
1387//proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
1388//proc.Start();
1389//proc.WaitForExit();
1390//Thread.Sleep(1000);
1391//Environment.Exit(1);
1348 m_heartbeatThread.Abort(); 1392 m_heartbeatThread.Abort();
1393 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1349 m_heartbeatThread = null; 1394 m_heartbeatThread = null;
1350 } 1395 }
1351// m_lastUpdate = Util.EnvironmentTickCount(); 1396// m_lastUpdate = Util.EnvironmentTickCount();
1352 1397
1398// m_sceneGraph.PreparePhysicsSimulation();
1399
1400
1353 m_heartbeatThread 1401 m_heartbeatThread
1354 = Watchdog.StartThread( 1402 = Watchdog.StartThread(
1355 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); 1403 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false);
@@ -1492,16 +1540,20 @@ namespace OpenSim.Region.Framework.Scenes
1492 endFrame = Frame + frames; 1540 endFrame = Frame + frames;
1493 1541
1494 float physicsFPS = 0f; 1542 float physicsFPS = 0f;
1495 int previousFrameTick, tmpMS; 1543 int tmpMS;
1496 int maintc = Util.EnvironmentTickCount(); 1544 int previousFrameTick;
1545 int maintc;
1546 int sleepMS;
1547 int framestart;
1497 1548
1498 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame)) 1549 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame))
1499 { 1550 {
1551 framestart = Util.EnvironmentTickCount();
1500 ++Frame; 1552 ++Frame;
1501 1553
1502// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); 1554// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
1503 1555
1504 agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; 1556 agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0;
1505 1557
1506 try 1558 try
1507 { 1559 {
@@ -1553,6 +1605,7 @@ namespace OpenSim.Region.Framework.Scenes
1553 m_sceneGraph.UpdatePresences(); 1605 m_sceneGraph.UpdatePresences();
1554 1606
1555 agentMS += Util.EnvironmentTickCountSubtract(tmpMS); 1607 agentMS += Util.EnvironmentTickCountSubtract(tmpMS);
1608
1556 1609
1557 // Delete temp-on-rez stuff 1610 // Delete temp-on-rez stuff
1558 if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) 1611 if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps)
@@ -1634,34 +1687,37 @@ namespace OpenSim.Region.Framework.Scenes
1634 1687
1635 Watchdog.UpdateThread(); 1688 Watchdog.UpdateThread();
1636 1689
1690 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
1691
1692 StatsReporter.AddPhysicsFPS(physicsFPS);
1693 StatsReporter.AddTimeDilation(TimeDilation);
1694 StatsReporter.AddFPS(1);
1695
1696 StatsReporter.addAgentMS(agentMS);
1697 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
1698 StatsReporter.addOtherMS(otherMS);
1699 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1700
1637 previousFrameTick = m_lastFrameTick; 1701 previousFrameTick = m_lastFrameTick;
1638 m_lastFrameTick = Util.EnvironmentTickCount(); 1702 m_lastFrameTick = Util.EnvironmentTickCount();
1639 tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1703 tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart);
1640 tmpMS = (int)(MinFrameTime * 1000) - tmpMS; 1704 tmpMS = (int)(MinFrameTime * 1000) - tmpMS;
1641 1705
1706 m_firstHeartbeat = false;
1707
1708 sleepMS = Util.EnvironmentTickCount();
1709
1642 if (tmpMS > 0) 1710 if (tmpMS > 0)
1643 {
1644 Thread.Sleep(tmpMS); 1711 Thread.Sleep(tmpMS);
1645 spareMS += tmpMS;
1646 }
1647
1648 frameMS = Util.EnvironmentTickCountSubtract(maintc);
1649 maintc = Util.EnvironmentTickCount();
1650 1712
1651 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; 1713 sleepMS = Util.EnvironmentTickCountSubtract(sleepMS);
1714 frameMS = Util.EnvironmentTickCountSubtract(framestart);
1715 StatsReporter.addSleepMS(sleepMS);
1716 StatsReporter.addFrameMS(frameMS);
1652 1717
1653 // if (Frame%m_update_avatars == 0) 1718 // if (Frame%m_update_avatars == 0)
1654 // UpdateInWorldTime(); 1719 // UpdateInWorldTime();
1655 StatsReporter.AddPhysicsFPS(physicsFPS);
1656 StatsReporter.AddTimeDilation(TimeDilation);
1657 StatsReporter.AddFPS(1);
1658 1720
1659 StatsReporter.addFrameMS(frameMS);
1660 StatsReporter.addAgentMS(agentMS);
1661 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
1662 StatsReporter.addOtherMS(otherMS);
1663 StatsReporter.AddSpareMS(spareMS);
1664 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1665 1721
1666 // Optionally warn if a frame takes double the amount of time that it should. 1722 // Optionally warn if a frame takes double the amount of time that it should.
1667 if (DebugUpdates 1723 if (DebugUpdates
@@ -1678,7 +1734,7 @@ namespace OpenSim.Region.Framework.Scenes
1678 public void AddGroupTarget(SceneObjectGroup grp) 1734 public void AddGroupTarget(SceneObjectGroup grp)
1679 { 1735 {
1680 lock (m_groupsWithTargets) 1736 lock (m_groupsWithTargets)
1681 m_groupsWithTargets[grp.UUID] = grp; 1737 m_groupsWithTargets[grp.UUID] = 0;
1682 } 1738 }
1683 1739
1684 public void RemoveGroupTarget(SceneObjectGroup grp) 1740 public void RemoveGroupTarget(SceneObjectGroup grp)
@@ -1689,18 +1745,24 @@ namespace OpenSim.Region.Framework.Scenes
1689 1745
1690 private void CheckAtTargets() 1746 private void CheckAtTargets()
1691 { 1747 {
1692 List<SceneObjectGroup> objs = null; 1748 List<UUID> objs = null;
1693 1749
1694 lock (m_groupsWithTargets) 1750 lock (m_groupsWithTargets)
1695 { 1751 {
1696 if (m_groupsWithTargets.Count != 0) 1752 if (m_groupsWithTargets.Count != 0)
1697 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values); 1753 objs = new List<UUID>(m_groupsWithTargets.Keys);
1698 } 1754 }
1699 1755
1700 if (objs != null) 1756 if (objs != null)
1701 { 1757 {
1702 foreach (SceneObjectGroup entry in objs) 1758 foreach (UUID entry in objs)
1703 entry.checkAtTargets(); 1759 {
1760 SceneObjectGroup grp = GetSceneObjectGroup(entry);
1761 if (grp == null)
1762 m_groupsWithTargets.Remove(entry);
1763 else
1764 grp.checkAtTargets();
1765 }
1704 } 1766 }
1705 } 1767 }
1706 1768
@@ -1779,7 +1841,7 @@ namespace OpenSim.Region.Framework.Scenes
1779 msg.fromAgentName = "Server"; 1841 msg.fromAgentName = "Server";
1780 msg.dialog = (byte)19; // Object msg 1842 msg.dialog = (byte)19; // Object msg
1781 msg.fromGroup = false; 1843 msg.fromGroup = false;
1782 msg.offline = (byte)0; 1844 msg.offline = (byte)1;
1783 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; 1845 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
1784 msg.Position = Vector3.Zero; 1846 msg.Position = Vector3.Zero;
1785 msg.RegionID = RegionInfo.RegionID.Guid; 1847 msg.RegionID = RegionInfo.RegionID.Guid;
@@ -2008,7 +2070,7 @@ namespace OpenSim.Region.Framework.Scenes
2008 return PhysicsScene.SupportsRaycastWorldFiltered(); 2070 return PhysicsScene.SupportsRaycastWorldFiltered();
2009 } 2071 }
2010 2072
2011 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter) 2073 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
2012 { 2074 {
2013 if (PhysicsScene == null) 2075 if (PhysicsScene == null)
2014 return null; 2076 return null;
@@ -2030,14 +2092,24 @@ namespace OpenSim.Region.Framework.Scenes
2030 /// <returns></returns> 2092 /// <returns></returns>
2031 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 2093 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
2032 { 2094 {
2095
2096 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
2097 Vector3 wpos = Vector3.Zero;
2098 // Check for water surface intersection from above
2099 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
2100 {
2101 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
2102 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
2103 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
2104 wpos.Z = wheight;
2105 }
2106
2033 Vector3 pos = Vector3.Zero; 2107 Vector3 pos = Vector3.Zero;
2034 if (RayEndIsIntersection == (byte)1) 2108 if (RayEndIsIntersection == (byte)1)
2035 { 2109 {
2036 pos = RayEnd; 2110 pos = RayEnd;
2037 return pos;
2038 } 2111 }
2039 2112 else if (RayTargetID != UUID.Zero)
2040 if (RayTargetID != UUID.Zero)
2041 { 2113 {
2042 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 2114 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
2043 2115
@@ -2059,7 +2131,7 @@ namespace OpenSim.Region.Framework.Scenes
2059 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter); 2131 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
2060 2132
2061 // Un-comment out the following line to Get Raytrace results printed to the console. 2133 // Un-comment out the following line to Get Raytrace results printed to the console.
2062 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 2134 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
2063 float ScaleOffset = 0.5f; 2135 float ScaleOffset = 0.5f;
2064 2136
2065 // If we hit something 2137 // If we hit something
@@ -2082,13 +2154,10 @@ namespace OpenSim.Region.Framework.Scenes
2082 //pos.Z -= 0.25F; 2154 //pos.Z -= 0.25F;
2083 2155
2084 } 2156 }
2085
2086 return pos;
2087 } 2157 }
2088 else 2158 else
2089 { 2159 {
2090 // We don't have a target here, so we're going to raytrace all the objects in the scene. 2160 // We don't have a target here, so we're going to raytrace all the objects in the scene.
2091
2092 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 2161 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
2093 2162
2094 // Un-comment the following line to print the raytrace results to the console. 2163 // Un-comment the following line to print the raytrace results to the console.
@@ -2097,13 +2166,12 @@ namespace OpenSim.Region.Framework.Scenes
2097 if (ei.HitTF) 2166 if (ei.HitTF)
2098 { 2167 {
2099 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); 2168 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
2100 } else 2169 }
2170 else
2101 { 2171 {
2102 // fall back to our stupid functionality 2172 // fall back to our stupid functionality
2103 pos = RayEnd; 2173 pos = RayEnd;
2104 } 2174 }
2105
2106 return pos;
2107 } 2175 }
2108 } 2176 }
2109 else 2177 else
@@ -2114,8 +2182,12 @@ namespace OpenSim.Region.Framework.Scenes
2114 //increase height so its above the ground. 2182 //increase height so its above the ground.
2115 //should be getting the normal of the ground at the rez point and using that? 2183 //should be getting the normal of the ground at the rez point and using that?
2116 pos.Z += scale.Z / 2f; 2184 pos.Z += scale.Z / 2f;
2117 return pos; 2185// return pos;
2118 } 2186 }
2187
2188 // check against posible water intercept
2189 if (wpos.Z > pos.Z) pos = wpos;
2190 return pos;
2119 } 2191 }
2120 2192
2121 2193
@@ -2206,12 +2278,12 @@ namespace OpenSim.Region.Framework.Scenes
2206 { 2278 {
2207 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates)) 2279 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates))
2208 { 2280 {
2281 sceneObject.IsDeleted = false;
2209 EventManager.TriggerObjectAddedToScene(sceneObject); 2282 EventManager.TriggerObjectAddedToScene(sceneObject);
2210 return true; 2283 return true;
2211 } 2284 }
2212 2285
2213 return false; 2286 return false;
2214
2215 } 2287 }
2216 2288
2217 /// <summary> 2289 /// <summary>
@@ -2303,6 +2375,15 @@ namespace OpenSim.Region.Framework.Scenes
2303 /// </summary> 2375 /// </summary>
2304 public void DeleteAllSceneObjects() 2376 public void DeleteAllSceneObjects()
2305 { 2377 {
2378 DeleteAllSceneObjects(false);
2379 }
2380
2381 /// <summary>
2382 /// Delete every object from the scene. This does not include attachments worn by avatars.
2383 /// </summary>
2384 public void DeleteAllSceneObjects(bool exceptNoCopy)
2385 {
2386 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2306 lock (Entities) 2387 lock (Entities)
2307 { 2388 {
2308 EntityBase[] entities = Entities.GetEntities(); 2389 EntityBase[] entities = Entities.GetEntities();
@@ -2311,11 +2392,24 @@ namespace OpenSim.Region.Framework.Scenes
2311 if (e is SceneObjectGroup) 2392 if (e is SceneObjectGroup)
2312 { 2393 {
2313 SceneObjectGroup sog = (SceneObjectGroup)e; 2394 SceneObjectGroup sog = (SceneObjectGroup)e;
2314 if (!sog.IsAttachment) 2395 if (sog != null && !sog.IsAttachment)
2315 DeleteSceneObject((SceneObjectGroup)e, false); 2396 {
2397 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2398 {
2399 DeleteSceneObject((SceneObjectGroup)e, false);
2400 }
2401 else
2402 {
2403 toReturn.Add((SceneObjectGroup)e);
2404 }
2405 }
2316 } 2406 }
2317 } 2407 }
2318 } 2408 }
2409 if (toReturn.Count > 0)
2410 {
2411 returnObjects(toReturn.ToArray(), UUID.Zero);
2412 }
2319 } 2413 }
2320 2414
2321 /// <summary> 2415 /// <summary>
@@ -2350,6 +2444,12 @@ namespace OpenSim.Region.Framework.Scenes
2350 2444
2351 foreach (SceneObjectPart part in partList) 2445 foreach (SceneObjectPart part in partList)
2352 { 2446 {
2447 if (part.KeyframeMotion != null)
2448 {
2449 part.KeyframeMotion.Delete();
2450 part.KeyframeMotion = null;
2451 }
2452
2353 if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) 2453 if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
2354 { 2454 {
2355 PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? 2455 PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
@@ -2367,6 +2467,8 @@ namespace OpenSim.Region.Framework.Scenes
2367 } 2467 }
2368 2468
2369 group.DeleteGroupFromScene(silent); 2469 group.DeleteGroupFromScene(silent);
2470 if (!silent)
2471 SendKillObject(new List<uint>() { group.LocalId });
2370 2472
2371// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2473// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2372 } 2474 }
@@ -2656,7 +2758,7 @@ namespace OpenSim.Region.Framework.Scenes
2656 // If the user is banned, we won't let any of their objects 2758 // If the user is banned, we won't let any of their objects
2657 // enter. Period. 2759 // enter. Period.
2658 // 2760 //
2659 if (RegionInfo.EstateSettings.IsBanned(newObject.OwnerID)) 2761 if (RegionInfo.EstateSettings.IsBanned(newObject.OwnerID, 36))
2660 { 2762 {
2661 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", newObject.OwnerID); 2763 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", newObject.OwnerID);
2662 return false; 2764 return false;
@@ -2691,6 +2793,9 @@ namespace OpenSim.Region.Framework.Scenes
2691 // before we restart the scripts, or else some functions won't work. 2793 // before we restart the scripts, or else some functions won't work.
2692 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); 2794 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
2693 newObject.ResumeScripts(); 2795 newObject.ResumeScripts();
2796
2797 if (newObject.RootPart.KeyframeMotion != null)
2798 newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
2694 } 2799 }
2695 2800
2696 // Do this as late as possible so that listeners have full access to the incoming object 2801 // Do this as late as possible so that listeners have full access to the incoming object
@@ -2708,6 +2813,23 @@ namespace OpenSim.Region.Framework.Scenes
2708 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> 2813 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
2709 public bool AddSceneObject(SceneObjectGroup sceneObject) 2814 public bool AddSceneObject(SceneObjectGroup sceneObject)
2710 { 2815 {
2816 if (sceneObject.OwnerID == UUID.Zero)
2817 {
2818 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
2819 return false;
2820 }
2821
2822 // If the user is banned, we won't let any of their objects
2823 // enter. Period.
2824 //
2825 int flags = GetUserFlags(sceneObject.OwnerID);
2826 if (RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags))
2827 {
2828 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID);
2829
2830 return false;
2831 }
2832
2711 // Force allocation of new LocalId 2833 // Force allocation of new LocalId
2712 // 2834 //
2713 SceneObjectPart[] parts = sceneObject.Parts; 2835 SceneObjectPart[] parts = sceneObject.Parts;
@@ -2741,16 +2863,27 @@ namespace OpenSim.Region.Framework.Scenes
2741 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2863 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2742 2864
2743 if (AttachmentsModule != null) 2865 if (AttachmentsModule != null)
2744 AttachmentsModule.AttachObject(sp, grp, 0, false, false, true); 2866 AttachmentsModule.AttachObject(sp, grp, 0, false, false, false, true);
2745 } 2867 }
2746 else 2868 else
2747 { 2869 {
2870 m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
2748 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2871 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2749 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2872 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2750 } 2873 }
2874 if (sceneObject.OwnerID == UUID.Zero)
2875 {
2876 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
2877 return false;
2878 }
2751 } 2879 }
2752 else 2880 else
2753 { 2881 {
2882 if (sceneObject.OwnerID == UUID.Zero)
2883 {
2884 m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
2885 return false;
2886 }
2754 AddRestoredSceneObject(sceneObject, true, false); 2887 AddRestoredSceneObject(sceneObject, true, false);
2755 } 2888 }
2756 2889
@@ -2767,6 +2900,24 @@ namespace OpenSim.Region.Framework.Scenes
2767 return 2; // StateSource.PrimCrossing 2900 return 2; // StateSource.PrimCrossing
2768 } 2901 }
2769 2902
2903 public int GetUserFlags(UUID user)
2904 {
2905 //Unfortunately the SP approach means that the value is cached until region is restarted
2906 /*
2907 ScenePresence sp;
2908 if (TryGetScenePresence(user, out sp))
2909 {
2910 return sp.UserFlags;
2911 }
2912 else
2913 {
2914 */
2915 UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user);
2916 if (uac == null)
2917 return 0;
2918 return uac.UserFlags;
2919 //}
2920 }
2770 #endregion 2921 #endregion
2771 2922
2772 #region Add/Remove Avatar Methods 2923 #region Add/Remove Avatar Methods
@@ -2799,7 +2950,7 @@ namespace OpenSim.Region.Framework.Scenes
2799 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 2950 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2800 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2951 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2801 2952
2802 // CheckHeartbeat(); 2953 CheckHeartbeat();
2803 2954
2804 sp = GetScenePresence(client.AgentId); 2955 sp = GetScenePresence(client.AgentId);
2805 2956
@@ -2817,6 +2968,13 @@ namespace OpenSim.Region.Framework.Scenes
2817 SubscribeToClientEvents(client); 2968 SubscribeToClientEvents(client);
2818 2969
2819 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); 2970 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
2971 InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46);
2972 if (cof == null)
2973 sp.COF = UUID.Zero;
2974 else
2975 sp.COF = cof.ID;
2976
2977 m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF);
2820 m_eventManager.TriggerOnNewPresence(sp); 2978 m_eventManager.TriggerOnNewPresence(sp);
2821 2979
2822 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags; 2980 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
@@ -2929,19 +3087,14 @@ namespace OpenSim.Region.Framework.Scenes
2929 // and the scene presence and the client, if they exist 3087 // and the scene presence and the client, if they exist
2930 try 3088 try
2931 { 3089 {
2932 // We need to wait for the client to make UDP contact first. 3090 ScenePresence sp = GetScenePresence(agentID);
2933 // It's the UDP contact that creates the scene presence 3091
2934 ScenePresence sp = WaitGetScenePresence(agentID);
2935 if (sp != null) 3092 if (sp != null)
2936 { 3093 {
2937 PresenceService.LogoutAgent(sp.ControllingClient.SessionId); 3094 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2938
2939 sp.ControllingClient.Close(); 3095 sp.ControllingClient.Close();
2940 } 3096 }
2941 else 3097
2942 {
2943 m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID);
2944 }
2945 // BANG! SLASH! 3098 // BANG! SLASH!
2946 m_authenticateHandler.RemoveCircuit(agentID); 3099 m_authenticateHandler.RemoveCircuit(agentID);
2947 3100
@@ -2986,6 +3139,8 @@ namespace OpenSim.Region.Framework.Scenes
2986 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 3139 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
2987 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 3140 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
2988 3141
3142 client.onClientChangeObject += m_sceneGraph.ClientChangeObject;
3143
2989 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation; 3144 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation;
2990 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 3145 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
2991 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 3146 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
@@ -3042,6 +3197,7 @@ namespace OpenSim.Region.Framework.Scenes
3042 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory; 3197 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
3043 client.OnUpdateInventoryItem += UpdateInventoryItemAsset; 3198 client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
3044 client.OnCopyInventoryItem += CopyInventoryItem; 3199 client.OnCopyInventoryItem += CopyInventoryItem;
3200 client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
3045 client.OnMoveInventoryItem += MoveInventoryItem; 3201 client.OnMoveInventoryItem += MoveInventoryItem;
3046 client.OnRemoveInventoryItem += RemoveInventoryItem; 3202 client.OnRemoveInventoryItem += RemoveInventoryItem;
3047 client.OnRemoveInventoryFolder += RemoveInventoryFolder; 3203 client.OnRemoveInventoryFolder += RemoveInventoryFolder;
@@ -3113,6 +3269,8 @@ namespace OpenSim.Region.Framework.Scenes
3113 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition; 3269 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition;
3114 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; 3270 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
3115 3271
3272 client.onClientChangeObject -= m_sceneGraph.ClientChangeObject;
3273
3116 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3274 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation;
3117 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3275 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation;
3118 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; 3276 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
@@ -3215,7 +3373,7 @@ namespace OpenSim.Region.Framework.Scenes
3215 /// </summary> 3373 /// </summary>
3216 /// <param name="agentId">The avatar's Unique ID</param> 3374 /// <param name="agentId">The avatar's Unique ID</param>
3217 /// <param name="client">The IClientAPI for the client</param> 3375 /// <param name="client">The IClientAPI for the client</param>
3218 public virtual void TeleportClientHome(UUID agentId, IClientAPI client) 3376 public virtual bool TeleportClientHome(UUID agentId, IClientAPI client)
3219 { 3377 {
3220 if (EntityTransferModule != null) 3378 if (EntityTransferModule != null)
3221 { 3379 {
@@ -3226,6 +3384,7 @@ namespace OpenSim.Region.Framework.Scenes
3226 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); 3384 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active");
3227 client.SendTeleportFailed("Unable to perform teleports on this simulator."); 3385 client.SendTeleportFailed("Unable to perform teleports on this simulator.");
3228 } 3386 }
3387 return false;
3229 } 3388 }
3230 3389
3231 /// <summary> 3390 /// <summary>
@@ -3335,6 +3494,16 @@ namespace OpenSim.Region.Framework.Scenes
3335 /// <param name="flags"></param> 3494 /// <param name="flags"></param>
3336 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) 3495 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3337 { 3496 {
3497 //Add half the avatar's height so that the user doesn't fall through prims
3498 ScenePresence presence;
3499 if (TryGetScenePresence(remoteClient.AgentId, out presence))
3500 {
3501 if (presence.Appearance != null)
3502 {
3503 position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
3504 }
3505 }
3506
3338 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt)) 3507 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3339 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. 3508 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3340 m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); 3509 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
@@ -3436,7 +3605,7 @@ namespace OpenSim.Region.Framework.Scenes
3436 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop 3605 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop
3437 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI 3606 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI
3438 if (closeChildAgents && CapsModule != null) 3607 if (closeChildAgents && CapsModule != null)
3439 CapsModule.RemoveCaps(agentID); 3608 CapsModule.RemoveCaps(agentID, avatar.ControllingClient.CircuitCode);
3440 3609
3441// // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever 3610// // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever
3442// // this method is doing is HORRIBLE!!! 3611// // this method is doing is HORRIBLE!!!
@@ -3472,6 +3641,7 @@ namespace OpenSim.Region.Framework.Scenes
3472 // It's possible for child agents to have transactions if changes are being made cross-border. 3641 // It's possible for child agents to have transactions if changes are being made cross-border.
3473 if (AgentTransactionsModule != null) 3642 if (AgentTransactionsModule != null)
3474 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); 3643 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID);
3644 m_log.Debug("[Scene] The avatar has left the building");
3475 } 3645 }
3476 catch (Exception e) 3646 catch (Exception e)
3477 { 3647 {
@@ -3664,15 +3834,27 @@ namespace OpenSim.Region.Framework.Scenes
3664 agent.firstname, agent.lastname, agent.Viewer); 3834 agent.firstname, agent.lastname, agent.Viewer);
3665 reason = "Access denied, your viewer is banned by the region owner"; 3835 reason = "Access denied, your viewer is banned by the region owner";
3666 return false; 3836 return false;
3667 } 3837 }
3668 3838
3669 ILandObject land; 3839 ScenePresence sp = GetScenePresence(agent.AgentID);
3670 3840
3671 lock (agent) 3841 // If we have noo presence here or if that presence is a zombie root
3842 // presence that will be kicled, we need a new CAPS object.
3843 if (sp == null || (sp != null && !sp.IsChildAgent))
3672 { 3844 {
3673 ScenePresence sp = GetScenePresence(agent.AgentID); 3845 if (CapsModule != null)
3674 3846 {
3675 if (sp != null && !sp.IsChildAgent) 3847 lock (agent)
3848 {
3849 CapsModule.SetAgentCapsSeeds(agent);
3850 CapsModule.CreateCaps(agent.AgentID, agent.circuitcode);
3851 }
3852 }
3853 }
3854
3855 if (sp != null)
3856 {
3857 if (!sp.IsChildAgent)
3676 { 3858 {
3677 // We have a zombie from a crashed session. 3859 // We have a zombie from a crashed session.
3678 // Or the same user is trying to be root twice here, won't work. 3860 // Or the same user is trying to be root twice here, won't work.
@@ -3680,22 +3862,27 @@ namespace OpenSim.Region.Framework.Scenes
3680 m_log.WarnFormat( 3862 m_log.WarnFormat(
3681 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.", 3863 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.",
3682 sp.Name, sp.UUID, RegionInfo.RegionName); 3864 sp.Name, sp.UUID, RegionInfo.RegionName);
3683 3865
3684 sp.ControllingClient.Close(true); 3866 sp.ControllingClient.Close(true, true);
3685 sp = null; 3867 sp = null;
3686 } 3868 }
3687 3869 }
3688 land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); 3870
3689 3871 lock (agent)
3872 {
3690 //On login test land permisions 3873 //On login test land permisions
3691 if (vialogin) 3874 if (vialogin)
3692 { 3875 {
3693 if (land != null && !TestLandRestrictions(agent, land, out reason)) 3876 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
3877 if (cache != null)
3878 cache.Remove(agent.firstname + " " + agent.lastname);
3879 if (!TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y))
3694 { 3880 {
3881 m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
3695 return false; 3882 return false;
3696 } 3883 }
3697 } 3884 }
3698 3885
3699 if (sp == null) // We don't have an [child] agent here already 3886 if (sp == null) // We don't have an [child] agent here already
3700 { 3887 {
3701 if (requirePresenceLookup) 3888 if (requirePresenceLookup)
@@ -3704,54 +3891,53 @@ namespace OpenSim.Region.Framework.Scenes
3704 { 3891 {
3705 if (!VerifyUserPresence(agent, out reason)) 3892 if (!VerifyUserPresence(agent, out reason))
3706 return false; 3893 return false;
3707 } 3894 } catch (Exception e)
3708 catch (Exception e)
3709 { 3895 {
3710 m_log.ErrorFormat( 3896 m_log.ErrorFormat(
3711 "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); 3897 "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace);
3712
3713 return false; 3898 return false;
3714 } 3899 }
3715 } 3900 }
3716 3901
3717 try 3902 try
3718 { 3903 {
3719 if (!AuthorizeUser(agent, out reason)) 3904 // Always check estate if this is a login. Always
3720 return false; 3905 // check if banned regions are to be blacked out.
3906 if (vialogin || (!m_seeIntoBannedRegion))
3907 {
3908 if (!AuthorizeUser(agent, out reason))
3909 {
3910 return false;
3911 }
3912 }
3721 } 3913 }
3722 catch (Exception e) 3914 catch (Exception e)
3723 { 3915 {
3724 m_log.ErrorFormat( 3916 m_log.ErrorFormat(
3725 "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace); 3917 "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace);
3726
3727 return false; 3918 return false;
3728 } 3919 }
3729 3920
3730 m_log.InfoFormat( 3921 m_log.InfoFormat(
3731 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", 3922 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
3732 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, 3923 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
3733 agent.AgentID, agent.circuitcode); 3924 agent.AgentID, agent.circuitcode);
3734 3925
3735 if (CapsModule != null)
3736 {
3737 CapsModule.SetAgentCapsSeeds(agent);
3738 CapsModule.CreateCaps(agent.AgentID);
3739 }
3740 } 3926 }
3741 else 3927 else
3742 { 3928 {
3743 // Let the SP know how we got here. This has a lot of interesting 3929 // Let the SP know how we got here. This has a lot of interesting
3744 // uses down the line. 3930 // uses down the line.
3745 sp.TeleportFlags = (TPFlags)teleportFlags; 3931 sp.TeleportFlags = (TPFlags)teleportFlags;
3746 3932
3747 if (sp.IsChildAgent) 3933 if (sp.IsChildAgent)
3748 { 3934 {
3749 m_log.DebugFormat( 3935 m_log.DebugFormat(
3750 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}", 3936 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}",
3751 agent.AgentID, RegionInfo.RegionName); 3937 agent.AgentID, RegionInfo.RegionName);
3752 3938
3753 sp.AdjustKnownSeeds(); 3939 sp.AdjustKnownSeeds();
3754 3940
3755 if (CapsModule != null) 3941 if (CapsModule != null)
3756 CapsModule.SetAgentCapsSeeds(agent); 3942 CapsModule.SetAgentCapsSeeds(agent);
3757 } 3943 }
@@ -3762,6 +3948,11 @@ namespace OpenSim.Region.Framework.Scenes
3762 agent.teleportFlags = teleportFlags; 3948 agent.teleportFlags = teleportFlags;
3763 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); 3949 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
3764 3950
3951 if (CapsModule != null)
3952 {
3953 CapsModule.ActivateCaps(agent.circuitcode);
3954 }
3955
3765 if (vialogin) 3956 if (vialogin)
3766 { 3957 {
3767// CleanDroppedAttachments(); 3958// CleanDroppedAttachments();
@@ -3853,6 +4044,8 @@ namespace OpenSim.Region.Framework.Scenes
3853 } 4044 }
3854 4045
3855 // Honor parcel landing type and position. 4046 // Honor parcel landing type and position.
4047 /*
4048 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3856 if (land != null) 4049 if (land != null)
3857 { 4050 {
3858 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 4051 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -3860,25 +4053,43 @@ namespace OpenSim.Region.Framework.Scenes
3860 agent.startpos = land.LandData.UserLocation; 4053 agent.startpos = land.LandData.UserLocation;
3861 } 4054 }
3862 } 4055 }
4056 */// This is now handled properly in ScenePresence.MakeRootAgent
3863 } 4057 }
3864 4058
3865 return true; 4059 return true;
3866 } 4060 }
3867 4061
3868 private bool TestLandRestrictions(AgentCircuitData agent, ILandObject land, out string reason) 4062 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY)
3869 { 4063 {
3870 bool banned = land.IsBannedFromLand(agent.AgentID); 4064 if (posX < 0)
3871 bool restricted = land.IsRestrictedFromLand(agent.AgentID); 4065 posX = 0;
4066 else if (posX >= 256)
4067 posX = 255.999f;
4068 if (posY < 0)
4069 posY = 0;
4070 else if (posY >= 256)
4071 posY = 255.999f;
4072
4073 reason = String.Empty;
4074 if (Permissions.IsGod(agentID))
4075 return true;
4076
4077 ILandObject land = LandChannel.GetLandObject(posX, posY);
4078 if (land == null)
4079 return false;
4080
4081 bool banned = land.IsBannedFromLand(agentID);
4082 bool restricted = land.IsRestrictedFromLand(agentID);
3872 4083
3873 if (banned || restricted) 4084 if (banned || restricted)
3874 { 4085 {
3875 ILandObject nearestParcel = GetNearestAllowedParcel(agent.AgentID, agent.startpos.X, agent.startpos.Y); 4086 ILandObject nearestParcel = GetNearestAllowedParcel(agentID, posX, posY);
3876 if (nearestParcel != null) 4087 if (nearestParcel != null)
3877 { 4088 {
3878 //Move agent to nearest allowed 4089 //Move agent to nearest allowed
3879 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel); 4090 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel);
3880 agent.startpos.X = newPosition.X; 4091 posX = newPosition.X;
3881 agent.startpos.Y = newPosition.Y; 4092 posY = newPosition.Y;
3882 } 4093 }
3883 else 4094 else
3884 { 4095 {
@@ -3940,7 +4151,7 @@ namespace OpenSim.Region.Framework.Scenes
3940 4151
3941 if (!m_strictAccessControl) return true; 4152 if (!m_strictAccessControl) return true;
3942 if (Permissions.IsGod(agent.AgentID)) return true; 4153 if (Permissions.IsGod(agent.AgentID)) return true;
3943 4154
3944 if (AuthorizationService != null) 4155 if (AuthorizationService != null)
3945 { 4156 {
3946 if (!AuthorizationService.IsAuthorizedForRegion( 4157 if (!AuthorizationService.IsAuthorizedForRegion(
@@ -3955,7 +4166,7 @@ namespace OpenSim.Region.Framework.Scenes
3955 4166
3956 if (RegionInfo.EstateSettings != null) 4167 if (RegionInfo.EstateSettings != null)
3957 { 4168 {
3958 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID)) 4169 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID, 0))
3959 { 4170 {
3960 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",
3961 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4172 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
@@ -4145,6 +4356,15 @@ namespace OpenSim.Region.Framework.Scenes
4145 4356
4146 // XPTO: if this agent is not allowed here as root, always return false 4357 // XPTO: if this agent is not allowed here as root, always return false
4147 4358
4359 // We have to wait until the viewer contacts this region after receiving EAC.
4360 // That calls AddNewClient, which finally creates the ScenePresence
4361 int flags = GetUserFlags(cAgentData.AgentID);
4362 if (RegionInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags))
4363 {
4364 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID);
4365 return false;
4366 }
4367
4148 // TODO: This check should probably be in QueryAccess(). 4368 // TODO: This check should probably be in QueryAccess().
4149 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); 4369 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2);
4150 if (nearestParcel == null) 4370 if (nearestParcel == null)
@@ -4209,7 +4429,7 @@ namespace OpenSim.Region.Framework.Scenes
4209 /// <param name='agentID'></param> 4429 /// <param name='agentID'></param>
4210 protected virtual ScenePresence WaitGetScenePresence(UUID agentID) 4430 protected virtual ScenePresence WaitGetScenePresence(UUID agentID)
4211 { 4431 {
4212 int ntimes = 10; 4432 int ntimes = 30;
4213 ScenePresence sp = null; 4433 ScenePresence sp = null;
4214 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0)) 4434 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0))
4215 Thread.Sleep(1000); 4435 Thread.Sleep(1000);
@@ -4239,6 +4459,16 @@ namespace OpenSim.Region.Framework.Scenes
4239 return false; 4459 return false;
4240 } 4460 }
4241 4461
4462 public bool IncomingCloseAgent(UUID agentID)
4463 {
4464 return IncomingCloseAgent(agentID, false);
4465 }
4466
4467 public bool IncomingCloseChildAgent(UUID agentID)
4468 {
4469 return IncomingCloseAgent(agentID, true);
4470 }
4471
4242 /// <summary> 4472 /// <summary>
4243 /// Tell a single agent to disconnect from the region. 4473 /// Tell a single agent to disconnect from the region.
4244 /// </summary> 4474 /// </summary>
@@ -4254,7 +4484,7 @@ namespace OpenSim.Region.Framework.Scenes
4254 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); 4484 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID);
4255 if (presence != null) 4485 if (presence != null)
4256 { 4486 {
4257 presence.ControllingClient.Close(force); 4487 presence.ControllingClient.Close(force, force);
4258 return true; 4488 return true;
4259 } 4489 }
4260 4490
@@ -4887,7 +5117,7 @@ namespace OpenSim.Region.Framework.Scenes
4887 { 5117 {
4888 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) 5118 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
4889 { 5119 {
4890 if (grp.RootPart.Expires <= DateTime.Now) 5120 if (grp.GetSittingAvatarsCount() == 0 && grp.RootPart.Expires <= DateTime.Now)
4891 DeleteSceneObject(grp, false); 5121 DeleteSceneObject(grp, false);
4892 } 5122 }
4893 } 5123 }
@@ -4901,35 +5131,81 @@ namespace OpenSim.Region.Framework.Scenes
4901 SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID); 5131 SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID);
4902 } 5132 }
4903 5133
4904 public int GetHealth() 5134 public int GetHealth(out int flags, out string message)
4905 { 5135 {
4906 // Returns: 5136 // Returns:
4907 // 1 = sim is up and accepting http requests. The heartbeat has 5137 // 1 = sim is up and accepting http requests. The heartbeat has
4908 // stopped and the sim is probably locked up, but a remote 5138 // stopped and the sim is probably locked up, but a remote
4909 // admin restart may succeed 5139 // admin restart may succeed
4910 // 5140 //
4911 // 2 = Sim is up and the heartbeat is running. The sim is likely 5141 // 2 = Sim is up and the heartbeat is running. The sim is likely
4912 // usable for people within and logins _may_ work 5142 // usable for people within
5143 //
5144 // 3 = Sim is up and one packet thread is running. Sim is
5145 // unstable and will not accept new logins
4913 // 5146 //
4914 // 3 = We have seen a new user enter within the past 4 minutes 5147 // 4 = Sim is up and both packet threads are running. Sim is
5148 // likely usable
5149 //
5150 // 5 = We have seen a new user enter within the past 4 minutes
4915 // which can be seen as positive confirmation of sim health 5151 // which can be seen as positive confirmation of sim health
4916 // 5152 //
5153
5154 flags = 0;
5155 message = String.Empty;
5156
5157 CheckHeartbeat();
5158
5159 if (m_firstHeartbeat || (m_lastIncoming == 0 && m_lastOutgoing == 0))
5160 {
5161 // We're still starting
5162 // 0 means "in startup", it can't happen another way, since
5163 // to get here, we must be able to accept http connections
5164 return 0;
5165 }
5166
4917 int health=1; // Start at 1, means we're up 5167 int health=1; // Start at 1, means we're up
4918 5168
4919 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 5169 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
4920 health += 1; 5170 {
5171 health+=1;
5172 flags |= 1;
5173 }
5174
5175 if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
5176 {
5177 health+=1;
5178 flags |= 2;
5179 }
5180
5181 if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
5182 {
5183 health+=1;
5184 flags |= 4;
5185 }
4921 else 5186 else
5187 {
5188int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
5189System.Diagnostics.Process proc = new System.Diagnostics.Process();
5190proc.EnableRaisingEvents=false;
5191proc.StartInfo.FileName = "/bin/kill";
5192proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
5193proc.Start();
5194proc.WaitForExit();
5195Thread.Sleep(1000);
5196Environment.Exit(1);
5197 }
5198
5199 if (flags != 7)
4922 return health; 5200 return health;
4923 5201
4924 // A login in the last 4 mins? We can't be doing too badly 5202 // A login in the last 4 mins? We can't be doing too badly
4925 // 5203 //
4926 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 5204 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
4927 health++; 5205 health++;
4928 else 5206 else
4929 return health; 5207 return health;
4930 5208
4931// CheckHeartbeat();
4932
4933 return health; 5209 return health;
4934 } 5210 }
4935 5211
@@ -5017,7 +5293,7 @@ namespace OpenSim.Region.Framework.Scenes
5017 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); 5293 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
5018 if (wasUsingPhysics) 5294 if (wasUsingPhysics)
5019 { 5295 {
5020 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 5296 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
5021 } 5297 }
5022 } 5298 }
5023 5299
@@ -5116,14 +5392,14 @@ namespace OpenSim.Region.Framework.Scenes
5116 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 5392 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
5117 } 5393 }
5118 5394
5119// private void CheckHeartbeat() 5395 private void CheckHeartbeat()
5120// { 5396 {
5121// if (m_firstHeartbeat) 5397 if (m_firstHeartbeat)
5122// return; 5398 return;
5123// 5399
5124// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 5400 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
5125// StartTimer(); 5401 Start();
5126// } 5402 }
5127 5403
5128 public override ISceneObject DeserializeObject(string representation) 5404 public override ISceneObject DeserializeObject(string representation)
5129 { 5405 {
@@ -5135,9 +5411,14 @@ namespace OpenSim.Region.Framework.Scenes
5135 get { return m_allowScriptCrossings; } 5411 get { return m_allowScriptCrossings; }
5136 } 5412 }
5137 5413
5138 public Vector3? GetNearestAllowedPosition(ScenePresence avatar) 5414 public Vector3 GetNearestAllowedPosition(ScenePresence avatar)
5139 { 5415 {
5140 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); 5416 return GetNearestAllowedPosition(avatar, null);
5417 }
5418
5419 public Vector3 GetNearestAllowedPosition(ScenePresence avatar, ILandObject excludeParcel)
5420 {
5421 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, excludeParcel);
5141 5422
5142 if (nearestParcel != null) 5423 if (nearestParcel != null)
5143 { 5424 {
@@ -5146,10 +5427,7 @@ namespace OpenSim.Region.Framework.Scenes
5146 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5427 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
5147 if (nearestPoint != null) 5428 if (nearestPoint != null)
5148 { 5429 {
5149// m_log.DebugFormat( 5430 Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString());
5150// "[SCENE]: Found a sane previous position based on velocity for {0}, sending them to {1} in {2}",
5151// avatar.Name, nearestPoint, nearestParcel.LandData.Name);
5152
5153 return nearestPoint.Value; 5431 return nearestPoint.Value;
5154 } 5432 }
5155 5433
@@ -5159,17 +5437,20 @@ namespace OpenSim.Region.Framework.Scenes
5159 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5437 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
5160 if (nearestPoint != null) 5438 if (nearestPoint != null)
5161 { 5439 {
5162// m_log.DebugFormat( 5440 Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString());
5163// "[SCENE]: {0} had a zero velocity, sending them to {1}", avatar.Name, nearestPoint);
5164
5165 return nearestPoint.Value; 5441 return nearestPoint.Value;
5166 } 5442 }
5167 5443
5168 //Ultimate backup if we have no idea where they are 5444 ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y);
5169// m_log.DebugFormat( 5445 if (dest != excludeParcel)
5170// "[SCENE]: No idea where {0} is, sending them to {1}", avatar.Name, avatar.lastKnownAllowedPosition); 5446 {
5447 // Ultimate backup if we have no idea where they are and
5448 // the last allowed position was in another parcel
5449 Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString());
5450 return avatar.lastKnownAllowedPosition;
5451 }
5171 5452
5172 return avatar.lastKnownAllowedPosition; 5453 // else fall through to region edge
5173 } 5454 }
5174 5455
5175 //Go to the edge, this happens in teleporting to a region with no available parcels 5456 //Go to the edge, this happens in teleporting to a region with no available parcels
@@ -5203,13 +5484,18 @@ namespace OpenSim.Region.Framework.Scenes
5203 5484
5204 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y) 5485 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y)
5205 { 5486 {
5487 return GetNearestAllowedParcel(avatarId, x, y, null);
5488 }
5489
5490 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y, ILandObject excludeParcel)
5491 {
5206 List<ILandObject> all = AllParcels(); 5492 List<ILandObject> all = AllParcels();
5207 float minParcelDistance = float.MaxValue; 5493 float minParcelDistance = float.MaxValue;
5208 ILandObject nearestParcel = null; 5494 ILandObject nearestParcel = null;
5209 5495
5210 foreach (var parcel in all) 5496 foreach (var parcel in all)
5211 { 5497 {
5212 if (!parcel.IsEitherBannedOrRestricted(avatarId)) 5498 if (!parcel.IsEitherBannedOrRestricted(avatarId) && parcel != excludeParcel)
5213 { 5499 {
5214 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y); 5500 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y);
5215 if (parcelDistance < minParcelDistance) 5501 if (parcelDistance < minParcelDistance)
@@ -5425,7 +5711,55 @@ namespace OpenSim.Region.Framework.Scenes
5425 mapModule.GenerateMaptile(); 5711 mapModule.GenerateMaptile();
5426 } 5712 }
5427 5713
5428 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 5714// public void CleanDroppedAttachments()
5715// {
5716// List<SceneObjectGroup> objectsToDelete =
5717// new List<SceneObjectGroup>();
5718//
5719// lock (m_cleaningAttachments)
5720// {
5721// ForEachSOG(delegate (SceneObjectGroup grp)
5722// {
5723// if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
5724// {
5725// UUID agentID = grp.OwnerID;
5726// if (agentID == UUID.Zero)
5727// {
5728// objectsToDelete.Add(grp);
5729// return;
5730// }
5731//
5732// ScenePresence sp = GetScenePresence(agentID);
5733// if (sp == null)
5734// {
5735// objectsToDelete.Add(grp);
5736// return;
5737// }
5738// }
5739// });
5740// }
5741//
5742// foreach (SceneObjectGroup grp in objectsToDelete)
5743// {
5744// m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
5745// DeleteSceneObject(grp, true);
5746// }
5747// }
5748
5749 public void ThreadAlive(int threadCode)
5750 {
5751 switch(threadCode)
5752 {
5753 case 1: // Incoming
5754 m_lastIncoming = Util.EnvironmentTickCount();
5755 break;
5756 case 2: // Incoming
5757 m_lastOutgoing = Util.EnvironmentTickCount();
5758 break;
5759 }
5760 }
5761
5762 public void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5429 { 5763 {
5430 RegenerateMaptile(); 5764 RegenerateMaptile();
5431 5765
@@ -5453,6 +5787,8 @@ namespace OpenSim.Region.Framework.Scenes
5453 /// <returns></returns> 5787 /// <returns></returns>
5454 public bool QueryAccess(UUID agentID, Vector3 position, out string reason) 5788 public bool QueryAccess(UUID agentID, Vector3 position, out string reason)
5455 { 5789 {
5790 reason = "You are banned from the region";
5791
5456 if (EntityTransferModule.IsInTransit(agentID)) 5792 if (EntityTransferModule.IsInTransit(agentID))
5457 { 5793 {
5458 reason = "Agent is still in transit from this region"; 5794 reason = "Agent is still in transit from this region";
@@ -5464,6 +5800,12 @@ namespace OpenSim.Region.Framework.Scenes
5464 return false; 5800 return false;
5465 } 5801 }
5466 5802
5803 if (Permissions.IsGod(agentID))
5804 {
5805 reason = String.Empty;
5806 return true;
5807 }
5808
5467 // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check. 5809 // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check.
5468 // However, the long term fix is to make sure root agent count is always accurate. 5810 // However, the long term fix is to make sure root agent count is always accurate.
5469 m_sceneGraph.RecalculateStats(); 5811 m_sceneGraph.RecalculateStats();
@@ -5484,6 +5826,41 @@ namespace OpenSim.Region.Framework.Scenes
5484 } 5826 }
5485 } 5827 }
5486 5828
5829 ScenePresence presence = GetScenePresence(agentID);
5830 IClientAPI client = null;
5831 AgentCircuitData aCircuit = null;
5832
5833 if (presence != null)
5834 {
5835 client = presence.ControllingClient;
5836 if (client != null)
5837 aCircuit = client.RequestClientInfo();
5838 }
5839
5840 // We may be called before there is a presence or a client.
5841 // Fake AgentCircuitData to keep IAuthorizationModule smiling
5842 if (client == null)
5843 {
5844 aCircuit = new AgentCircuitData();
5845 aCircuit.AgentID = agentID;
5846 aCircuit.firstname = String.Empty;
5847 aCircuit.lastname = String.Empty;
5848 }
5849
5850 try
5851 {
5852 if (!AuthorizeUser(aCircuit, out reason))
5853 {
5854 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5855 return false;
5856 }
5857 }
5858 catch (Exception e)
5859 {
5860 m_log.DebugFormat("[SCENE]: Exception authorizing agent: {0} "+ e.StackTrace, e.Message);
5861 return false;
5862 }
5863
5487 if (position == Vector3.Zero) // Teleport 5864 if (position == Vector3.Zero) // Teleport
5488 { 5865 {
5489 if (!RegionInfo.EstateSettings.AllowDirectTeleport) 5866 if (!RegionInfo.EstateSettings.AllowDirectTeleport)
@@ -5517,13 +5894,46 @@ namespace OpenSim.Region.Framework.Scenes
5517 } 5894 }
5518 } 5895 }
5519 } 5896 }
5897
5898 float posX = 128.0f;
5899 float posY = 128.0f;
5900
5901 if (!TestLandRestrictions(agentID, out reason, ref posX, ref posY))
5902 {
5903 // m_log.DebugFormat("[SCENE]: Denying {0} because they are banned on all parcels", agentID);
5904 return false;
5905 }
5906 }
5907 else // Walking
5908 {
5909 ILandObject land = LandChannel.GetLandObject(position.X, position.Y);
5910 if (land == null)
5911 return false;
5912
5913 bool banned = land.IsBannedFromLand(agentID);
5914 bool restricted = land.IsRestrictedFromLand(agentID);
5915
5916 if (banned || restricted)
5917 return false;
5520 } 5918 }
5521 5919
5522 reason = String.Empty; 5920 reason = String.Empty;
5523 return true; 5921 return true;
5524 } 5922 }
5525 5923
5526 /// <summary> 5924 public void StartTimerWatchdog()
5925 {
5926 m_timerWatchdog.Interval = 1000;
5927 m_timerWatchdog.Elapsed += TimerWatchdog;
5928 m_timerWatchdog.AutoReset = true;
5929 m_timerWatchdog.Start();
5930 }
5931
5932 public void TimerWatchdog(object sender, ElapsedEventArgs e)
5933 {
5934 CheckHeartbeat();
5935 }
5936
5527 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the 5937 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
5528 /// autopilot that moves an avatar to a sit target!. 5938 /// autopilot that moves an avatar to a sit target!.
5529 /// </summary> 5939 /// </summary>
@@ -5602,6 +6012,11 @@ namespace OpenSim.Region.Framework.Scenes
5602 return m_SpawnPoint - 1; 6012 return m_SpawnPoint - 1;
5603 } 6013 }
5604 6014
6015 private void HandleGcCollect(string module, string[] args)
6016 {
6017 GC.Collect();
6018 }
6019
5605 /// <summary> 6020 /// <summary>
5606 /// Wrappers to get physics modules retrieve assets. 6021 /// Wrappers to get physics modules retrieve assets.
5607 /// </summary> 6022 /// </summary>