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.cs719
1 files changed, 551 insertions, 168 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4d0aa6f..ff2c46f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -119,6 +119,7 @@ namespace OpenSim.Region.Framework.Scenes
119 // TODO: need to figure out how allow client agents but deny 119 // TODO: need to figure out how allow client agents but deny
120 // root agents when ACL denies access to root agent 120 // root agents when ACL denies access to root agent
121 public bool m_strictAccessControl = true; 121 public bool m_strictAccessControl = true;
122 public bool m_seeIntoBannedRegion = false;
122 public int MaxUndoCount = 5; 123 public int MaxUndoCount = 5;
123 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; 124 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet;
124 public bool LoginLock = false; 125 public bool LoginLock = false;
@@ -134,12 +135,14 @@ namespace OpenSim.Region.Framework.Scenes
134 135
135 protected int m_splitRegionID; 136 protected int m_splitRegionID;
136 protected Timer m_restartWaitTimer = new Timer(); 137 protected Timer m_restartWaitTimer = new Timer();
138 protected Timer m_timerWatchdog = new Timer();
137 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); 139 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
138 protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); 140 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
139 protected string m_simulatorVersion = "OpenSimulator Server"; 141 protected string m_simulatorVersion = "OpenSimulator Server";
140 protected ModuleLoader m_moduleLoader; 142 protected ModuleLoader m_moduleLoader;
141 protected AgentCircuitManager m_authenticateHandler; 143 protected AgentCircuitManager m_authenticateHandler;
142 protected SceneCommunicationService m_sceneGridService; 144 protected SceneCommunicationService m_sceneGridService;
145 protected ISnmpModule m_snmpService = null;
143 146
144 protected ISimulationDataService m_SimulationDataService; 147 protected ISimulationDataService m_SimulationDataService;
145 protected IEstateDataService m_EstateDataService; 148 protected IEstateDataService m_EstateDataService;
@@ -202,7 +205,7 @@ namespace OpenSim.Region.Framework.Scenes
202 private int m_update_events = 1; 205 private int m_update_events = 1;
203 private int m_update_backup = 200; 206 private int m_update_backup = 200;
204 private int m_update_terrain = 50; 207 private int m_update_terrain = 50;
205// private int m_update_land = 1; 208 private int m_update_land = 10;
206 private int m_update_coarse_locations = 50; 209 private int m_update_coarse_locations = 50;
207 210
208 private int agentMS; 211 private int agentMS;
@@ -221,6 +224,7 @@ namespace OpenSim.Region.Framework.Scenes
221 /// </summary> 224 /// </summary>
222 private int m_lastFrameTick; 225 private int m_lastFrameTick;
223 226
227 public bool CombineRegions = false;
224 /// <summary> 228 /// <summary>
225 /// Tick at which the last maintenance run occurred. 229 /// Tick at which the last maintenance run occurred.
226 /// </summary> 230 /// </summary>
@@ -251,6 +255,11 @@ namespace OpenSim.Region.Framework.Scenes
251 /// </summary> 255 /// </summary>
252 private int m_LastLogin; 256 private int m_LastLogin;
253 257
258 private int m_lastIncoming;
259 private int m_lastOutgoing;
260 private int m_hbRestarts = 0;
261
262
254 /// <summary> 263 /// <summary>
255 /// Thread that runs the scene loop. 264 /// Thread that runs the scene loop.
256 /// </summary> 265 /// </summary>
@@ -266,7 +275,7 @@ namespace OpenSim.Region.Framework.Scenes
266 private volatile bool m_shuttingDown; 275 private volatile bool m_shuttingDown;
267 276
268// private int m_lastUpdate; 277// private int m_lastUpdate;
269// private bool m_firstHeartbeat = true; 278 private bool m_firstHeartbeat = true;
270 279
271 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 280 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
272 private bool m_reprioritizationEnabled = true; 281 private bool m_reprioritizationEnabled = true;
@@ -311,6 +320,19 @@ namespace OpenSim.Region.Framework.Scenes
311 get { return m_sceneGridService; } 320 get { return m_sceneGridService; }
312 } 321 }
313 322
323 public ISnmpModule SnmpService
324 {
325 get
326 {
327 if (m_snmpService == null)
328 {
329 m_snmpService = RequestModuleInterface<ISnmpModule>();
330 }
331
332 return m_snmpService;
333 }
334 }
335
314 public ISimulationDataService SimulationDataService 336 public ISimulationDataService SimulationDataService
315 { 337 {
316 get 338 get
@@ -594,6 +616,8 @@ namespace OpenSim.Region.Framework.Scenes
594 m_EstateDataService = estateDataService; 616 m_EstateDataService = estateDataService;
595 m_regionHandle = m_regInfo.RegionHandle; 617 m_regionHandle = m_regInfo.RegionHandle;
596 m_regionName = m_regInfo.RegionName; 618 m_regionName = m_regInfo.RegionName;
619 m_lastIncoming = 0;
620 m_lastOutgoing = 0;
597 621
598 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); 622 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
599 m_asyncSceneObjectDeleter.Enabled = true; 623 m_asyncSceneObjectDeleter.Enabled = true;
@@ -674,99 +698,108 @@ namespace OpenSim.Region.Framework.Scenes
674 698
675 // Region config overrides global config 699 // Region config overrides global config
676 // 700 //
677 if (m_config.Configs["Startup"] != null) 701 try
678 { 702 {
679 IConfig startupConfig = m_config.Configs["Startup"]; 703 if (m_config.Configs["Startup"] != null)
680
681 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
682 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
683 if (!m_useBackup)
684 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
685
686 //Animation states
687 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
688
689 PhysicalPrims = startupConfig.GetBoolean("physical_prim", PhysicalPrims);
690 CollidablePrims = startupConfig.GetBoolean("collidable_prim", CollidablePrims);
691
692 m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
693 if (RegionInfo.NonphysPrimMax > 0)
694 { 704 {
695 m_maxNonphys = RegionInfo.NonphysPrimMax; 705 IConfig startupConfig = m_config.Configs["Startup"];
696 }
697
698 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
699 706
700 if (RegionInfo.PhysPrimMax > 0) 707 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
701 { 708 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
702 m_maxPhys = RegionInfo.PhysPrimMax; 709 if (!m_useBackup)
703 } 710 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
711
712 //Animation states
713 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
704 714
705 // Here, if clamping is requested in either global or 715 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
706 // local config, it will be used 716 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
707 //
708 m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize);
709 if (RegionInfo.ClampPrimSize)
710 {
711 m_clampPrimSize = true;
712 }
713 717
714 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete); 718 m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
715 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 719 if (RegionInfo.NonphysPrimMax > 0)
716 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 720 {
717 m_dontPersistBefore = 721 m_maxNonphys = RegionInfo.NonphysPrimMax;
718 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); 722 }
719 m_dontPersistBefore *= 10000000;
720 m_persistAfter =
721 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
722 m_persistAfter *= 10000000;
723 723
724 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 724 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
725 725
726 IConfig packetConfig = m_config.Configs["PacketPool"]; 726 if (RegionInfo.PhysPrimMax > 0)
727 if (packetConfig != null) 727 {
728 { 728 m_maxPhys = RegionInfo.PhysPrimMax;
729 PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); 729 }
730 PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true);
731 }
732 730
733 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); 731 // Here, if clamping is requested in either global or
732 // local config, it will be used
733 //
734 m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize);
735 if (RegionInfo.ClampPrimSize)
736 {
737 m_clampPrimSize = true;
738 }
734 739
735 m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true); 740 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete);
736 if (m_generateMaptiles) 741 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
737 { 742 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
738 int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0); 743 m_dontPersistBefore =
739 if (maptileRefresh != 0) 744 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
745 m_dontPersistBefore *= 10000000;
746 m_persistAfter =
747 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
748 m_persistAfter *= 10000000;
749
750 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
751 m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
752
753 IConfig packetConfig = m_config.Configs["PacketPool"];
754 if (packetConfig != null)
740 { 755 {
741 m_mapGenerationTimer.Interval = maptileRefresh * 1000; 756 PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true);
742 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister; 757 PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true);
743 m_mapGenerationTimer.AutoReset = true;
744 m_mapGenerationTimer.Start();
745 } 758 }
746 }
747 else
748 {
749 string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString());
750 UUID tileID;
751 759
752 if (UUID.TryParse(tile, out tileID)) 760 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
761 m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
762 CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
763
764 m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true);
765 if (m_generateMaptiles)
753 { 766 {
754 RegionInfo.RegionSettings.TerrainImageID = tileID; 767 int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0);
768 if (maptileRefresh != 0)
769 {
770 m_mapGenerationTimer.Interval = maptileRefresh * 1000;
771 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister;
772 m_mapGenerationTimer.AutoReset = true;
773 m_mapGenerationTimer.Start();
774 }
755 } 775 }
756 } 776 else
777 {
778 string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString());
779 UUID tileID;
757 780
758 MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime); 781 if (UUID.TryParse(tile, out tileID))
759 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup); 782 {
760 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations); 783 RegionInfo.RegionSettings.TerrainImageID = tileID;
761 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement); 784 }
762 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events); 785 }
763 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects);
764 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics);
765 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
766 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
767 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
768 786
769 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates); 787 MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime);
788 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup);
789 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations);
790 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement);
791 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events);
792 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects);
793 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics);
794 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
795 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
796 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
797 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates);
798 }
799 }
800 catch (Exception e)
801 {
802 m_log.Error("[SCENE]: Failed to load StartupConfig: " + e.ToString());
770 } 803 }
771 804
772 #endregion Region Config 805 #endregion Region Config
@@ -1193,7 +1226,22 @@ namespace OpenSim.Region.Framework.Scenes
1193 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 1226 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
1194 if (m_heartbeatThread != null) 1227 if (m_heartbeatThread != null)
1195 { 1228 {
1229 m_hbRestarts++;
1230 if(m_hbRestarts > 10)
1231 Environment.Exit(1);
1232 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1233
1234//int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
1235//System.Diagnostics.Process proc = new System.Diagnostics.Process();
1236//proc.EnableRaisingEvents=false;
1237//proc.StartInfo.FileName = "/bin/kill";
1238//proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
1239//proc.Start();
1240//proc.WaitForExit();
1241//Thread.Sleep(1000);
1242//Environment.Exit(1);
1196 m_heartbeatThread.Abort(); 1243 m_heartbeatThread.Abort();
1244 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1197 m_heartbeatThread = null; 1245 m_heartbeatThread = null;
1198 } 1246 }
1199// m_lastUpdate = Util.EnvironmentTickCount(); 1247// m_lastUpdate = Util.EnvironmentTickCount();
@@ -1341,10 +1389,12 @@ namespace OpenSim.Region.Framework.Scenes
1341 int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS; 1389 int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS;
1342 int previousFrameTick; 1390 int previousFrameTick;
1343 int maintc; 1391 int maintc;
1392 int sleepMS;
1393 int framestart;
1344 1394
1345 while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) 1395 while (!m_shuttingDown && (endFrame == null || Frame < endFrame))
1346 { 1396 {
1347 maintc = Util.EnvironmentTickCount(); 1397 framestart = Util.EnvironmentTickCount();
1348 ++Frame; 1398 ++Frame;
1349 1399
1350// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); 1400// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
@@ -1431,7 +1481,7 @@ namespace OpenSim.Region.Framework.Scenes
1431 // landMS = Util.EnvironmentTickCountSubtract(ldMS); 1481 // landMS = Util.EnvironmentTickCountSubtract(ldMS);
1432 //} 1482 //}
1433 1483
1434 frameMS = Util.EnvironmentTickCountSubtract(maintc); 1484 // frameMS = Util.EnvironmentTickCountSubtract(maintc);
1435 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; 1485 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
1436 1486
1437 // if (Frame%m_update_avatars == 0) 1487 // if (Frame%m_update_avatars == 0)
@@ -1446,7 +1496,7 @@ namespace OpenSim.Region.Framework.Scenes
1446 1496
1447 // frameMS currently records work frame times, not total frame times (work + any required sleep to 1497 // frameMS currently records work frame times, not total frame times (work + any required sleep to
1448 // reach min frame time. 1498 // reach min frame time.
1449 StatsReporter.addFrameMS(frameMS); 1499 // StatsReporter.addFrameMS(frameMS);
1450 1500
1451 StatsReporter.addAgentMS(agentMS); 1501 StatsReporter.addAgentMS(agentMS);
1452 StatsReporter.addPhysicsMS(physicsMS + physicsMS2); 1502 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
@@ -1503,12 +1553,22 @@ namespace OpenSim.Region.Framework.Scenes
1503 1553
1504 previousFrameTick = m_lastFrameTick; 1554 previousFrameTick = m_lastFrameTick;
1505 m_lastFrameTick = Util.EnvironmentTickCount(); 1555 m_lastFrameTick = Util.EnvironmentTickCount();
1506 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1556 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart);
1507 maintc = (int)(MinFrameTime * 1000) - maintc; 1557 maintc = (int)(MinFrameTime * 1000) - maintc;
1508 1558
1559 m_firstHeartbeat = false;
1560
1561
1562 sleepMS = Util.EnvironmentTickCount();
1563
1509 if (maintc > 0) 1564 if (maintc > 0)
1510 Thread.Sleep(maintc); 1565 Thread.Sleep(maintc);
1511 1566
1567 sleepMS = Util.EnvironmentTickCountSubtract(sleepMS);
1568 frameMS = Util.EnvironmentTickCountSubtract(framestart);
1569 StatsReporter.addSleepMS(sleepMS);
1570 StatsReporter.addFrameMS(frameMS);
1571
1512 // Optionally warn if a frame takes double the amount of time that it should. 1572 // Optionally warn if a frame takes double the amount of time that it should.
1513 if (DebugUpdates 1573 if (DebugUpdates
1514 && Util.EnvironmentTickCountSubtract( 1574 && Util.EnvironmentTickCountSubtract(
@@ -1535,9 +1595,9 @@ namespace OpenSim.Region.Framework.Scenes
1535 1595
1536 private void CheckAtTargets() 1596 private void CheckAtTargets()
1537 { 1597 {
1538 Dictionary<UUID, SceneObjectGroup>.ValueCollection objs; 1598 List<SceneObjectGroup> objs = new List<SceneObjectGroup>();
1539 lock (m_groupsWithTargets) 1599 lock (m_groupsWithTargets)
1540 objs = m_groupsWithTargets.Values; 1600 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values);
1541 1601
1542 foreach (SceneObjectGroup entry in objs) 1602 foreach (SceneObjectGroup entry in objs)
1543 entry.checkAtTargets(); 1603 entry.checkAtTargets();
@@ -1618,7 +1678,7 @@ namespace OpenSim.Region.Framework.Scenes
1618 msg.fromAgentName = "Server"; 1678 msg.fromAgentName = "Server";
1619 msg.dialog = (byte)19; // Object msg 1679 msg.dialog = (byte)19; // Object msg
1620 msg.fromGroup = false; 1680 msg.fromGroup = false;
1621 msg.offline = (byte)0; 1681 msg.offline = (byte)1;
1622 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; 1682 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
1623 msg.Position = Vector3.Zero; 1683 msg.Position = Vector3.Zero;
1624 msg.RegionID = RegionInfo.RegionID.Guid; 1684 msg.RegionID = RegionInfo.RegionID.Guid;
@@ -1840,6 +1900,19 @@ namespace OpenSim.Region.Framework.Scenes
1840 EventManager.TriggerPrimsLoaded(this); 1900 EventManager.TriggerPrimsLoaded(this);
1841 } 1901 }
1842 1902
1903 public bool SuportsRayCastFiltered()
1904 {
1905 if (PhysicsScene == null)
1906 return false;
1907 return PhysicsScene.SuportsRaycastWorldFiltered();
1908 }
1909
1910 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
1911 {
1912 if (PhysicsScene == null)
1913 return null;
1914 return PhysicsScene.RaycastWorld(position, direction, length, Count,filter);
1915 }
1843 1916
1844 /// <summary> 1917 /// <summary>
1845 /// Gets a new rez location based on the raycast and the size of the object that is being rezzed. 1918 /// Gets a new rez location based on the raycast and the size of the object that is being rezzed.
@@ -1856,14 +1929,24 @@ namespace OpenSim.Region.Framework.Scenes
1856 /// <returns></returns> 1929 /// <returns></returns>
1857 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 1930 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
1858 { 1931 {
1932
1933 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
1934 Vector3 wpos = Vector3.Zero;
1935 // Check for water surface intersection from above
1936 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
1937 {
1938 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
1939 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
1940 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
1941 wpos.Z = wheight;
1942 }
1943
1859 Vector3 pos = Vector3.Zero; 1944 Vector3 pos = Vector3.Zero;
1860 if (RayEndIsIntersection == (byte)1) 1945 if (RayEndIsIntersection == (byte)1)
1861 { 1946 {
1862 pos = RayEnd; 1947 pos = RayEnd;
1863 return pos;
1864 } 1948 }
1865 1949 else if (RayTargetID != UUID.Zero)
1866 if (RayTargetID != UUID.Zero)
1867 { 1950 {
1868 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 1951 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
1869 1952
@@ -1885,7 +1968,7 @@ namespace OpenSim.Region.Framework.Scenes
1885 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter); 1968 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
1886 1969
1887 // Un-comment out the following line to Get Raytrace results printed to the console. 1970 // Un-comment out the following line to Get Raytrace results printed to the console.
1888 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 1971 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
1889 float ScaleOffset = 0.5f; 1972 float ScaleOffset = 0.5f;
1890 1973
1891 // If we hit something 1974 // If we hit something
@@ -1908,13 +1991,10 @@ namespace OpenSim.Region.Framework.Scenes
1908 //pos.Z -= 0.25F; 1991 //pos.Z -= 0.25F;
1909 1992
1910 } 1993 }
1911
1912 return pos;
1913 } 1994 }
1914 else 1995 else
1915 { 1996 {
1916 // We don't have a target here, so we're going to raytrace all the objects in the scene. 1997 // We don't have a target here, so we're going to raytrace all the objects in the scene.
1917
1918 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 1998 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
1919 1999
1920 // Un-comment the following line to print the raytrace results to the console. 2000 // Un-comment the following line to print the raytrace results to the console.
@@ -1923,13 +2003,12 @@ namespace OpenSim.Region.Framework.Scenes
1923 if (ei.HitTF) 2003 if (ei.HitTF)
1924 { 2004 {
1925 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); 2005 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
1926 } else 2006 }
2007 else
1927 { 2008 {
1928 // fall back to our stupid functionality 2009 // fall back to our stupid functionality
1929 pos = RayEnd; 2010 pos = RayEnd;
1930 } 2011 }
1931
1932 return pos;
1933 } 2012 }
1934 } 2013 }
1935 else 2014 else
@@ -1940,8 +2019,12 @@ namespace OpenSim.Region.Framework.Scenes
1940 //increase height so its above the ground. 2019 //increase height so its above the ground.
1941 //should be getting the normal of the ground at the rez point and using that? 2020 //should be getting the normal of the ground at the rez point and using that?
1942 pos.Z += scale.Z / 2f; 2021 pos.Z += scale.Z / 2f;
1943 return pos; 2022// return pos;
1944 } 2023 }
2024
2025 // check against posible water intercept
2026 if (wpos.Z > pos.Z) pos = wpos;
2027 return pos;
1945 } 2028 }
1946 2029
1947 2030
@@ -2031,7 +2114,10 @@ namespace OpenSim.Region.Framework.Scenes
2031 public bool AddRestoredSceneObject( 2114 public bool AddRestoredSceneObject(
2032 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates) 2115 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
2033 { 2116 {
2034 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates); 2117 bool result = m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates);
2118 if (result)
2119 sceneObject.IsDeleted = false;
2120 return result;
2035 } 2121 }
2036 2122
2037 /// <summary> 2123 /// <summary>
@@ -2123,6 +2209,15 @@ namespace OpenSim.Region.Framework.Scenes
2123 /// </summary> 2209 /// </summary>
2124 public void DeleteAllSceneObjects() 2210 public void DeleteAllSceneObjects()
2125 { 2211 {
2212 DeleteAllSceneObjects(false);
2213 }
2214
2215 /// <summary>
2216 /// Delete every object from the scene. This does not include attachments worn by avatars.
2217 /// </summary>
2218 public void DeleteAllSceneObjects(bool exceptNoCopy)
2219 {
2220 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2126 lock (Entities) 2221 lock (Entities)
2127 { 2222 {
2128 EntityBase[] entities = Entities.GetEntities(); 2223 EntityBase[] entities = Entities.GetEntities();
@@ -2131,11 +2226,24 @@ namespace OpenSim.Region.Framework.Scenes
2131 if (e is SceneObjectGroup) 2226 if (e is SceneObjectGroup)
2132 { 2227 {
2133 SceneObjectGroup sog = (SceneObjectGroup)e; 2228 SceneObjectGroup sog = (SceneObjectGroup)e;
2134 if (!sog.IsAttachment) 2229 if (sog != null && !sog.IsAttachment)
2135 DeleteSceneObject((SceneObjectGroup)e, false); 2230 {
2231 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2232 {
2233 DeleteSceneObject((SceneObjectGroup)e, false);
2234 }
2235 else
2236 {
2237 toReturn.Add((SceneObjectGroup)e);
2238 }
2239 }
2136 } 2240 }
2137 } 2241 }
2138 } 2242 }
2243 if (toReturn.Count > 0)
2244 {
2245 returnObjects(toReturn.ToArray(), UUID.Zero);
2246 }
2139 } 2247 }
2140 2248
2141 /// <summary> 2249 /// <summary>
@@ -2170,6 +2278,8 @@ namespace OpenSim.Region.Framework.Scenes
2170 } 2278 }
2171 2279
2172 group.DeleteGroupFromScene(silent); 2280 group.DeleteGroupFromScene(silent);
2281 if (!silent)
2282 SendKillObject(new List<uint>() { group.LocalId });
2173 2283
2174// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2284// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2175 } 2285 }
@@ -2459,6 +2569,8 @@ namespace OpenSim.Region.Framework.Scenes
2459 2569
2460 if (newPosition != Vector3.Zero) 2570 if (newPosition != Vector3.Zero)
2461 newObject.RootPart.GroupPosition = newPosition; 2571 newObject.RootPart.GroupPosition = newPosition;
2572 if (newObject.RootPart.KeyframeMotion != null)
2573 newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
2462 2574
2463 if (!AddSceneObject(newObject)) 2575 if (!AddSceneObject(newObject))
2464 { 2576 {
@@ -2527,10 +2639,17 @@ namespace OpenSim.Region.Framework.Scenes
2527 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> 2639 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
2528 public bool AddSceneObject(SceneObjectGroup sceneObject) 2640 public bool AddSceneObject(SceneObjectGroup sceneObject)
2529 { 2641 {
2642 if (sceneObject.OwnerID == UUID.Zero)
2643 {
2644 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
2645 return false;
2646 }
2647
2530 // If the user is banned, we won't let any of their objects 2648 // If the user is banned, we won't let any of their objects
2531 // enter. Period. 2649 // enter. Period.
2532 // 2650 //
2533 if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) 2651 int flags = GetUserFlags(sceneObject.OwnerID);
2652 if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags))
2534 { 2653 {
2535 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); 2654 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID);
2536 2655
@@ -2576,12 +2695,23 @@ namespace OpenSim.Region.Framework.Scenes
2576 } 2695 }
2577 else 2696 else
2578 { 2697 {
2698 m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
2579 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2699 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2580 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2700 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2581 } 2701 }
2702 if (sceneObject.OwnerID == UUID.Zero)
2703 {
2704 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
2705 return false;
2706 }
2582 } 2707 }
2583 else 2708 else
2584 { 2709 {
2710 if (sceneObject.OwnerID == UUID.Zero)
2711 {
2712 m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
2713 return false;
2714 }
2585 AddRestoredSceneObject(sceneObject, true, false); 2715 AddRestoredSceneObject(sceneObject, true, false);
2586 2716
2587 if (!Permissions.CanObjectEntry(sceneObject.UUID, 2717 if (!Permissions.CanObjectEntry(sceneObject.UUID,
@@ -2610,6 +2740,24 @@ namespace OpenSim.Region.Framework.Scenes
2610 return 2; // StateSource.PrimCrossing 2740 return 2; // StateSource.PrimCrossing
2611 } 2741 }
2612 2742
2743 public int GetUserFlags(UUID user)
2744 {
2745 //Unfortunately the SP approach means that the value is cached until region is restarted
2746 /*
2747 ScenePresence sp;
2748 if (TryGetScenePresence(user, out sp))
2749 {
2750 return sp.UserFlags;
2751 }
2752 else
2753 {
2754 */
2755 UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user);
2756 if (uac == null)
2757 return 0;
2758 return uac.UserFlags;
2759 //}
2760 }
2613 #endregion 2761 #endregion
2614 2762
2615 #region Add/Remove Avatar Methods 2763 #region Add/Remove Avatar Methods
@@ -2623,7 +2771,7 @@ namespace OpenSim.Region.Framework.Scenes
2623 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 2771 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2624 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2772 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2625 2773
2626// CheckHeartbeat(); 2774 CheckHeartbeat();
2627 2775
2628 ScenePresence sp = GetScenePresence(client.AgentId); 2776 ScenePresence sp = GetScenePresence(client.AgentId);
2629 2777
@@ -2676,7 +2824,13 @@ namespace OpenSim.Region.Framework.Scenes
2676 2824
2677 EventManager.TriggerOnNewClient(client); 2825 EventManager.TriggerOnNewClient(client);
2678 if (vialogin) 2826 if (vialogin)
2827 {
2679 EventManager.TriggerOnClientLogin(client); 2828 EventManager.TriggerOnClientLogin(client);
2829 // Send initial parcel data
2830 Vector3 pos = sp.AbsolutePosition;
2831 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
2832 land.SendLandUpdateToClient(client);
2833 }
2680 2834
2681 return sp; 2835 return sp;
2682 } 2836 }
@@ -2766,19 +2920,12 @@ namespace OpenSim.Region.Framework.Scenes
2766 // and the scene presence and the client, if they exist 2920 // and the scene presence and the client, if they exist
2767 try 2921 try
2768 { 2922 {
2769 // We need to wait for the client to make UDP contact first. 2923 ScenePresence sp = GetScenePresence(agentID);
2770 // It's the UDP contact that creates the scene presence 2924 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2771 ScenePresence sp = WaitGetScenePresence(agentID); 2925
2772 if (sp != null) 2926 if (sp != null)
2773 {
2774 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2775
2776 sp.ControllingClient.Close(); 2927 sp.ControllingClient.Close();
2777 } 2928
2778 else
2779 {
2780 m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID);
2781 }
2782 // BANG! SLASH! 2929 // BANG! SLASH!
2783 m_authenticateHandler.RemoveCircuit(agentID); 2930 m_authenticateHandler.RemoveCircuit(agentID);
2784 2931
@@ -2823,6 +2970,8 @@ namespace OpenSim.Region.Framework.Scenes
2823 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 2970 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
2824 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 2971 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
2825 2972
2973 client.onClientChangeObject += m_sceneGraph.ClientChangeObject;
2974
2826 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation; 2975 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation;
2827 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 2976 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
2828 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 2977 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
@@ -2879,6 +3028,7 @@ namespace OpenSim.Region.Framework.Scenes
2879 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory; 3028 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
2880 client.OnUpdateInventoryItem += UpdateInventoryItemAsset; 3029 client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
2881 client.OnCopyInventoryItem += CopyInventoryItem; 3030 client.OnCopyInventoryItem += CopyInventoryItem;
3031 client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
2882 client.OnMoveInventoryItem += MoveInventoryItem; 3032 client.OnMoveInventoryItem += MoveInventoryItem;
2883 client.OnRemoveInventoryItem += RemoveInventoryItem; 3033 client.OnRemoveInventoryItem += RemoveInventoryItem;
2884 client.OnRemoveInventoryFolder += RemoveInventoryFolder; 3034 client.OnRemoveInventoryFolder += RemoveInventoryFolder;
@@ -2950,6 +3100,8 @@ namespace OpenSim.Region.Framework.Scenes
2950 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition; 3100 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition;
2951 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; 3101 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
2952 3102
3103 client.onClientChangeObject -= m_sceneGraph.ClientChangeObject;
3104
2953 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3105 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation;
2954 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3106 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation;
2955 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; 3107 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
@@ -3052,15 +3204,16 @@ namespace OpenSim.Region.Framework.Scenes
3052 /// </summary> 3204 /// </summary>
3053 /// <param name="agentId">The avatar's Unique ID</param> 3205 /// <param name="agentId">The avatar's Unique ID</param>
3054 /// <param name="client">The IClientAPI for the client</param> 3206 /// <param name="client">The IClientAPI for the client</param>
3055 public virtual void TeleportClientHome(UUID agentId, IClientAPI client) 3207 public virtual bool TeleportClientHome(UUID agentId, IClientAPI client)
3056 { 3208 {
3057 if (m_teleportModule != null) 3209 if (m_teleportModule != null)
3058 m_teleportModule.TeleportHome(agentId, client); 3210 return m_teleportModule.TeleportHome(agentId, client);
3059 else 3211 else
3060 { 3212 {
3061 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); 3213 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active");
3062 client.SendTeleportFailed("Unable to perform teleports on this simulator."); 3214 client.SendTeleportFailed("Unable to perform teleports on this simulator.");
3063 } 3215 }
3216 return false;
3064 } 3217 }
3065 3218
3066 /// <summary> 3219 /// <summary>
@@ -3170,6 +3323,16 @@ namespace OpenSim.Region.Framework.Scenes
3170 /// <param name="flags"></param> 3323 /// <param name="flags"></param>
3171 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) 3324 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3172 { 3325 {
3326 //Add half the avatar's height so that the user doesn't fall through prims
3327 ScenePresence presence;
3328 if (TryGetScenePresence(remoteClient.AgentId, out presence))
3329 {
3330 if (presence.Appearance != null)
3331 {
3332 position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
3333 }
3334 }
3335
3173 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt)) 3336 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3174 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. 3337 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3175 m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); 3338 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
@@ -3238,8 +3401,9 @@ namespace OpenSim.Region.Framework.Scenes
3238 regions.Remove(RegionInfo.RegionHandle); 3401 regions.Remove(RegionInfo.RegionHandle);
3239 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3402 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions);
3240 } 3403 }
3241 3404 m_log.Debug("[Scene] Beginning ClientClosed");
3242 m_eventManager.TriggerClientClosed(agentID, this); 3405 m_eventManager.TriggerClientClosed(agentID, this);
3406 m_log.Debug("[Scene] Finished ClientClosed");
3243 } 3407 }
3244 catch (NullReferenceException) 3408 catch (NullReferenceException)
3245 { 3409 {
@@ -3301,9 +3465,10 @@ namespace OpenSim.Region.Framework.Scenes
3301 { 3465 {
3302 m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace); 3466 m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace);
3303 } 3467 }
3304 3468 m_log.Debug("[Scene] Done. Firing RemoveCircuit");
3305 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); 3469 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode);
3306// CleanDroppedAttachments(); 3470// CleanDroppedAttachments();
3471 m_log.Debug("[Scene] The avatar has left the building");
3307 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); 3472 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false));
3308 //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); 3473 //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true));
3309 } 3474 }
@@ -3425,13 +3590,16 @@ namespace OpenSim.Region.Framework.Scenes
3425 sp = null; 3590 sp = null;
3426 } 3591 }
3427 3592
3428 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3429 3593
3430 //On login test land permisions 3594 //On login test land permisions
3431 if (vialogin) 3595 if (vialogin)
3432 { 3596 {
3433 if (land != null && !TestLandRestrictions(agent, land, out reason)) 3597 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
3598 if (cache != null)
3599 cache.Remove(agent.firstname + " " + agent.lastname);
3600 if (!TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y))
3434 { 3601 {
3602 m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
3435 return false; 3603 return false;
3436 } 3604 }
3437 } 3605 }
@@ -3455,8 +3623,13 @@ namespace OpenSim.Region.Framework.Scenes
3455 3623
3456 try 3624 try
3457 { 3625 {
3458 if (!AuthorizeUser(agent, out reason)) 3626 // Always check estate if this is a login. Always
3459 return false; 3627 // check if banned regions are to be blacked out.
3628 if (vialogin || (!m_seeIntoBannedRegion))
3629 {
3630 if (!AuthorizeUser(agent, out reason))
3631 return false;
3632 }
3460 } 3633 }
3461 catch (Exception e) 3634 catch (Exception e)
3462 { 3635 {
@@ -3582,6 +3755,8 @@ namespace OpenSim.Region.Framework.Scenes
3582 } 3755 }
3583 3756
3584 // Honor parcel landing type and position. 3757 // Honor parcel landing type and position.
3758 /*
3759 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3585 if (land != null) 3760 if (land != null)
3586 { 3761 {
3587 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 3762 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -3589,26 +3764,34 @@ namespace OpenSim.Region.Framework.Scenes
3589 agent.startpos = land.LandData.UserLocation; 3764 agent.startpos = land.LandData.UserLocation;
3590 } 3765 }
3591 } 3766 }
3767 */// This is now handled properly in ScenePresence.MakeRootAgent
3592 } 3768 }
3593 3769
3594 return true; 3770 return true;
3595 } 3771 }
3596 3772
3597 private bool TestLandRestrictions(AgentCircuitData agent, ILandObject land, out string reason) 3773 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY)
3598 { 3774 {
3599 3775 reason = String.Empty;
3600 bool banned = land.IsBannedFromLand(agent.AgentID); 3776 if (Permissions.IsGod(agentID))
3601 bool restricted = land.IsRestrictedFromLand(agent.AgentID); 3777 return true;
3778
3779 ILandObject land = LandChannel.GetLandObject(posX, posY);
3780 if (land == null)
3781 return false;
3782
3783 bool banned = land.IsBannedFromLand(agentID);
3784 bool restricted = land.IsRestrictedFromLand(agentID);
3602 3785
3603 if (banned || restricted) 3786 if (banned || restricted)
3604 { 3787 {
3605 ILandObject nearestParcel = GetNearestAllowedParcel(agent.AgentID, agent.startpos.X, agent.startpos.Y); 3788 ILandObject nearestParcel = GetNearestAllowedParcel(agentID, posX, posY);
3606 if (nearestParcel != null) 3789 if (nearestParcel != null)
3607 { 3790 {
3608 //Move agent to nearest allowed 3791 //Move agent to nearest allowed
3609 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel); 3792 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel);
3610 agent.startpos.X = newPosition.X; 3793 posX = newPosition.X;
3611 agent.startpos.Y = newPosition.Y; 3794 posY = newPosition.Y;
3612 } 3795 }
3613 else 3796 else
3614 { 3797 {
@@ -3670,7 +3853,7 @@ namespace OpenSim.Region.Framework.Scenes
3670 3853
3671 if (!m_strictAccessControl) return true; 3854 if (!m_strictAccessControl) return true;
3672 if (Permissions.IsGod(agent.AgentID)) return true; 3855 if (Permissions.IsGod(agent.AgentID)) return true;
3673 3856
3674 if (AuthorizationService != null) 3857 if (AuthorizationService != null)
3675 { 3858 {
3676 if (!AuthorizationService.IsAuthorizedForRegion( 3859 if (!AuthorizationService.IsAuthorizedForRegion(
@@ -3685,7 +3868,7 @@ namespace OpenSim.Region.Framework.Scenes
3685 3868
3686 if (m_regInfo.EstateSettings != null) 3869 if (m_regInfo.EstateSettings != null)
3687 { 3870 {
3688 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) 3871 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID,0))
3689 { 3872 {
3690 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 3873 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
3691 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 3874 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
@@ -3877,6 +4060,13 @@ namespace OpenSim.Region.Framework.Scenes
3877 4060
3878 // We have to wait until the viewer contacts this region after receiving EAC. 4061 // We have to wait until the viewer contacts this region after receiving EAC.
3879 // That calls AddNewClient, which finally creates the ScenePresence 4062 // That calls AddNewClient, which finally creates the ScenePresence
4063 int flags = GetUserFlags(cAgentData.AgentID);
4064 if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags))
4065 {
4066 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID);
4067 return false;
4068 }
4069
3880 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); 4070 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2);
3881 if (nearestParcel == null) 4071 if (nearestParcel == null)
3882 { 4072 {
@@ -3961,12 +4151,22 @@ namespace OpenSim.Region.Framework.Scenes
3961 return false; 4151 return false;
3962 } 4152 }
3963 4153
4154 public bool IncomingCloseAgent(UUID agentID)
4155 {
4156 return IncomingCloseAgent(agentID, false);
4157 }
4158
4159 public bool IncomingCloseChildAgent(UUID agentID)
4160 {
4161 return IncomingCloseAgent(agentID, true);
4162 }
4163
3964 /// <summary> 4164 /// <summary>
3965 /// Tell a single agent to disconnect from the region. 4165 /// Tell a single agent to disconnect from the region.
3966 /// </summary> 4166 /// </summary>
3967 /// <param name="regionHandle"></param>
3968 /// <param name="agentID"></param> 4167 /// <param name="agentID"></param>
3969 public bool IncomingCloseAgent(UUID agentID) 4168 /// <param name="childOnly"></param>
4169 public bool IncomingCloseAgent(UUID agentID, bool childOnly)
3970 { 4170 {
3971 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); 4171 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID);
3972 4172
@@ -3978,7 +4178,7 @@ namespace OpenSim.Region.Framework.Scenes
3978 { 4178 {
3979 m_sceneGraph.removeUserCount(false); 4179 m_sceneGraph.removeUserCount(false);
3980 } 4180 }
3981 else 4181 else if (!childOnly)
3982 { 4182 {
3983 m_sceneGraph.removeUserCount(true); 4183 m_sceneGraph.removeUserCount(true);
3984 } 4184 }
@@ -3994,9 +4194,12 @@ namespace OpenSim.Region.Framework.Scenes
3994 } 4194 }
3995 else 4195 else
3996 presence.ControllingClient.SendShutdownConnectionNotice(); 4196 presence.ControllingClient.SendShutdownConnectionNotice();
4197 presence.ControllingClient.Close(false);
4198 }
4199 else if (!childOnly)
4200 {
4201 presence.ControllingClient.Close(true);
3997 } 4202 }
3998
3999 presence.ControllingClient.Close();
4000 return true; 4203 return true;
4001 } 4204 }
4002 4205
@@ -4578,35 +4781,81 @@ namespace OpenSim.Region.Framework.Scenes
4578 SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID); 4781 SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID);
4579 } 4782 }
4580 4783
4581 public int GetHealth() 4784 public int GetHealth(out int flags, out string message)
4582 { 4785 {
4583 // Returns: 4786 // Returns:
4584 // 1 = sim is up and accepting http requests. The heartbeat has 4787 // 1 = sim is up and accepting http requests. The heartbeat has
4585 // stopped and the sim is probably locked up, but a remote 4788 // stopped and the sim is probably locked up, but a remote
4586 // admin restart may succeed 4789 // admin restart may succeed
4587 // 4790 //
4588 // 2 = Sim is up and the heartbeat is running. The sim is likely 4791 // 2 = Sim is up and the heartbeat is running. The sim is likely
4589 // usable for people within and logins _may_ work 4792 // usable for people within
4793 //
4794 // 3 = Sim is up and one packet thread is running. Sim is
4795 // unstable and will not accept new logins
4590 // 4796 //
4591 // 3 = We have seen a new user enter within the past 4 minutes 4797 // 4 = Sim is up and both packet threads are running. Sim is
4798 // likely usable
4799 //
4800 // 5 = We have seen a new user enter within the past 4 minutes
4592 // which can be seen as positive confirmation of sim health 4801 // which can be seen as positive confirmation of sim health
4593 // 4802 //
4803
4804 flags = 0;
4805 message = String.Empty;
4806
4807 CheckHeartbeat();
4808
4809 if (m_firstHeartbeat || (m_lastIncoming == 0 && m_lastOutgoing == 0))
4810 {
4811 // We're still starting
4812 // 0 means "in startup", it can't happen another way, since
4813 // to get here, we must be able to accept http connections
4814 return 0;
4815 }
4816
4594 int health=1; // Start at 1, means we're up 4817 int health=1; // Start at 1, means we're up
4595 4818
4596 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 4819 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
4597 health += 1; 4820 {
4821 health+=1;
4822 flags |= 1;
4823 }
4824
4825 if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
4826 {
4827 health+=1;
4828 flags |= 2;
4829 }
4830
4831 if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
4832 {
4833 health+=1;
4834 flags |= 4;
4835 }
4598 else 4836 else
4837 {
4838int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
4839System.Diagnostics.Process proc = new System.Diagnostics.Process();
4840proc.EnableRaisingEvents=false;
4841proc.StartInfo.FileName = "/bin/kill";
4842proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
4843proc.Start();
4844proc.WaitForExit();
4845Thread.Sleep(1000);
4846Environment.Exit(1);
4847 }
4848
4849 if (flags != 7)
4599 return health; 4850 return health;
4600 4851
4601 // A login in the last 4 mins? We can't be doing too badly 4852 // A login in the last 4 mins? We can't be doing too badly
4602 // 4853 //
4603 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 4854 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
4604 health++; 4855 health++;
4605 else 4856 else
4606 return health; 4857 return health;
4607 4858
4608// CheckHeartbeat();
4609
4610 return health; 4859 return health;
4611 } 4860 }
4612 4861
@@ -4694,7 +4943,7 @@ namespace OpenSim.Region.Framework.Scenes
4694 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); 4943 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
4695 if (wasUsingPhysics) 4944 if (wasUsingPhysics)
4696 { 4945 {
4697 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 4946 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
4698 } 4947 }
4699 } 4948 }
4700 4949
@@ -4793,14 +5042,14 @@ namespace OpenSim.Region.Framework.Scenes
4793 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 5042 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
4794 } 5043 }
4795 5044
4796// private void CheckHeartbeat() 5045 private void CheckHeartbeat()
4797// { 5046 {
4798// if (m_firstHeartbeat) 5047 if (m_firstHeartbeat)
4799// return; 5048 return;
4800// 5049
4801// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 5050 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
4802// StartTimer(); 5051 Start();
4803// } 5052 }
4804 5053
4805 public override ISceneObject DeserializeObject(string representation) 5054 public override ISceneObject DeserializeObject(string representation)
4806 { 5055 {
@@ -4812,9 +5061,14 @@ namespace OpenSim.Region.Framework.Scenes
4812 get { return m_allowScriptCrossings; } 5061 get { return m_allowScriptCrossings; }
4813 } 5062 }
4814 5063
4815 public Vector3? GetNearestAllowedPosition(ScenePresence avatar) 5064 public Vector3 GetNearestAllowedPosition(ScenePresence avatar)
5065 {
5066 return GetNearestAllowedPosition(avatar, null);
5067 }
5068
5069 public Vector3 GetNearestAllowedPosition(ScenePresence avatar, ILandObject excludeParcel)
4816 { 5070 {
4817 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); 5071 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, excludeParcel);
4818 5072
4819 if (nearestParcel != null) 5073 if (nearestParcel != null)
4820 { 5074 {
@@ -4823,10 +5077,7 @@ namespace OpenSim.Region.Framework.Scenes
4823 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5077 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
4824 if (nearestPoint != null) 5078 if (nearestPoint != null)
4825 { 5079 {
4826// m_log.DebugFormat( 5080 Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString());
4827// "[SCENE]: Found a sane previous position based on velocity for {0}, sending them to {1} in {2}",
4828// avatar.Name, nearestPoint, nearestParcel.LandData.Name);
4829
4830 return nearestPoint.Value; 5081 return nearestPoint.Value;
4831 } 5082 }
4832 5083
@@ -4836,17 +5087,20 @@ namespace OpenSim.Region.Framework.Scenes
4836 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5087 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
4837 if (nearestPoint != null) 5088 if (nearestPoint != null)
4838 { 5089 {
4839// m_log.DebugFormat( 5090 Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString());
4840// "[SCENE]: {0} had a zero velocity, sending them to {1}", avatar.Name, nearestPoint);
4841
4842 return nearestPoint.Value; 5091 return nearestPoint.Value;
4843 } 5092 }
4844 5093
4845 //Ultimate backup if we have no idea where they are 5094 ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y);
4846// m_log.DebugFormat( 5095 if (dest != excludeParcel)
4847// "[SCENE]: No idea where {0} is, sending them to {1}", avatar.Name, avatar.lastKnownAllowedPosition); 5096 {
5097 // Ultimate backup if we have no idea where they are and
5098 // the last allowed position was in another parcel
5099 Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString());
5100 return avatar.lastKnownAllowedPosition;
5101 }
4848 5102
4849 return avatar.lastKnownAllowedPosition; 5103 // else fall through to region edge
4850 } 5104 }
4851 5105
4852 //Go to the edge, this happens in teleporting to a region with no available parcels 5106 //Go to the edge, this happens in teleporting to a region with no available parcels
@@ -4880,13 +5134,18 @@ namespace OpenSim.Region.Framework.Scenes
4880 5134
4881 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y) 5135 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y)
4882 { 5136 {
5137 return GetNearestAllowedParcel(avatarId, x, y, null);
5138 }
5139
5140 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y, ILandObject excludeParcel)
5141 {
4883 List<ILandObject> all = AllParcels(); 5142 List<ILandObject> all = AllParcels();
4884 float minParcelDistance = float.MaxValue; 5143 float minParcelDistance = float.MaxValue;
4885 ILandObject nearestParcel = null; 5144 ILandObject nearestParcel = null;
4886 5145
4887 foreach (var parcel in all) 5146 foreach (var parcel in all)
4888 { 5147 {
4889 if (!parcel.IsEitherBannedOrRestricted(avatarId)) 5148 if (!parcel.IsEitherBannedOrRestricted(avatarId) && parcel != excludeParcel)
4890 { 5149 {
4891 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y); 5150 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y);
4892 if (parcelDistance < minParcelDistance) 5151 if (parcelDistance < minParcelDistance)
@@ -5128,7 +5387,55 @@ namespace OpenSim.Region.Framework.Scenes
5128 mapModule.GenerateMaptile(); 5387 mapModule.GenerateMaptile();
5129 } 5388 }
5130 5389
5131 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 5390// public void CleanDroppedAttachments()
5391// {
5392// List<SceneObjectGroup> objectsToDelete =
5393// new List<SceneObjectGroup>();
5394//
5395// lock (m_cleaningAttachments)
5396// {
5397// ForEachSOG(delegate (SceneObjectGroup grp)
5398// {
5399// if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
5400// {
5401// UUID agentID = grp.OwnerID;
5402// if (agentID == UUID.Zero)
5403// {
5404// objectsToDelete.Add(grp);
5405// return;
5406// }
5407//
5408// ScenePresence sp = GetScenePresence(agentID);
5409// if (sp == null)
5410// {
5411// objectsToDelete.Add(grp);
5412// return;
5413// }
5414// }
5415// });
5416// }
5417//
5418// foreach (SceneObjectGroup grp in objectsToDelete)
5419// {
5420// m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
5421// DeleteSceneObject(grp, true);
5422// }
5423// }
5424
5425 public void ThreadAlive(int threadCode)
5426 {
5427 switch(threadCode)
5428 {
5429 case 1: // Incoming
5430 m_lastIncoming = Util.EnvironmentTickCount();
5431 break;
5432 case 2: // Incoming
5433 m_lastOutgoing = Util.EnvironmentTickCount();
5434 break;
5435 }
5436 }
5437
5438 public void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5132 { 5439 {
5133 RegenerateMaptile(); 5440 RegenerateMaptile();
5134 5441
@@ -5147,6 +5454,14 @@ namespace OpenSim.Region.Framework.Scenes
5147 // child agent creation, thereby emulating the SL behavior. 5454 // child agent creation, thereby emulating the SL behavior.
5148 public bool QueryAccess(UUID agentID, Vector3 position, out string reason) 5455 public bool QueryAccess(UUID agentID, Vector3 position, out string reason)
5149 { 5456 {
5457 reason = "You are banned from the region";
5458
5459 if (Permissions.IsGod(agentID))
5460 {
5461 reason = String.Empty;
5462 return true;
5463 }
5464
5150 int num = m_sceneGraph.GetNumberOfScenePresences(); 5465 int num = m_sceneGraph.GetNumberOfScenePresences();
5151 5466
5152 if (num >= RegionInfo.RegionSettings.AgentLimit) 5467 if (num >= RegionInfo.RegionSettings.AgentLimit)
@@ -5158,6 +5473,41 @@ namespace OpenSim.Region.Framework.Scenes
5158 } 5473 }
5159 } 5474 }
5160 5475
5476 ScenePresence presence = GetScenePresence(agentID);
5477 IClientAPI client = null;
5478 AgentCircuitData aCircuit = null;
5479
5480 if (presence != null)
5481 {
5482 client = presence.ControllingClient;
5483 if (client != null)
5484 aCircuit = client.RequestClientInfo();
5485 }
5486
5487 // We may be called before there is a presence or a client.
5488 // Fake AgentCircuitData to keep IAuthorizationModule smiling
5489 if (client == null)
5490 {
5491 aCircuit = new AgentCircuitData();
5492 aCircuit.AgentID = agentID;
5493 aCircuit.firstname = String.Empty;
5494 aCircuit.lastname = String.Empty;
5495 }
5496
5497 try
5498 {
5499 if (!AuthorizeUser(aCircuit, out reason))
5500 {
5501 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5502 return false;
5503 }
5504 }
5505 catch (Exception e)
5506 {
5507 m_log.DebugFormat("[SCENE]: Exception authorizing agent: {0} "+ e.StackTrace, e.Message);
5508 return false;
5509 }
5510
5161 if (position == Vector3.Zero) // Teleport 5511 if (position == Vector3.Zero) // Teleport
5162 { 5512 {
5163 if (!RegionInfo.EstateSettings.AllowDirectTeleport) 5513 if (!RegionInfo.EstateSettings.AllowDirectTeleport)
@@ -5186,13 +5536,46 @@ namespace OpenSim.Region.Framework.Scenes
5186 } 5536 }
5187 } 5537 }
5188 } 5538 }
5539
5540 float posX = 128.0f;
5541 float posY = 128.0f;
5542
5543 if (!TestLandRestrictions(agentID, out reason, ref posX, ref posY))
5544 {
5545 // m_log.DebugFormat("[SCENE]: Denying {0} because they are banned on all parcels", agentID);
5546 return false;
5547 }
5548 }
5549 else // Walking
5550 {
5551 ILandObject land = LandChannel.GetLandObject(position.X, position.Y);
5552 if (land == null)
5553 return false;
5554
5555 bool banned = land.IsBannedFromLand(agentID);
5556 bool restricted = land.IsRestrictedFromLand(agentID);
5557
5558 if (banned || restricted)
5559 return false;
5189 } 5560 }
5190 5561
5191 reason = String.Empty; 5562 reason = String.Empty;
5192 return true; 5563 return true;
5193 } 5564 }
5194 5565
5195 /// <summary> 5566 public void StartTimerWatchdog()
5567 {
5568 m_timerWatchdog.Interval = 1000;
5569 m_timerWatchdog.Elapsed += TimerWatchdog;
5570 m_timerWatchdog.AutoReset = true;
5571 m_timerWatchdog.Start();
5572 }
5573
5574 public void TimerWatchdog(object sender, ElapsedEventArgs e)
5575 {
5576 CheckHeartbeat();
5577 }
5578
5196 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the 5579 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
5197 /// autopilot that moves an avatar to a sit target!. 5580 /// autopilot that moves an avatar to a sit target!.
5198 /// </summary> 5581 /// </summary>