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.cs684
1 files changed, 522 insertions, 162 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index e488fe1..a34079c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -118,6 +118,7 @@ namespace OpenSim.Region.Framework.Scenes
118 // TODO: need to figure out how allow client agents but deny 118 // TODO: need to figure out how allow client agents but deny
119 // root agents when ACL denies access to root agent 119 // root agents when ACL denies access to root agent
120 public bool m_strictAccessControl = true; 120 public bool m_strictAccessControl = true;
121 public bool m_seeIntoBannedRegion = false;
121 public int MaxUndoCount = 5; 122 public int MaxUndoCount = 5;
122 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; 123 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet;
123 public bool LoginLock = false; 124 public bool LoginLock = false;
@@ -133,12 +134,14 @@ namespace OpenSim.Region.Framework.Scenes
133 134
134 protected int m_splitRegionID; 135 protected int m_splitRegionID;
135 protected Timer m_restartWaitTimer = new Timer(); 136 protected Timer m_restartWaitTimer = new Timer();
137 protected Timer m_timerWatchdog = new Timer();
136 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); 138 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
137 protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); 139 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
138 protected string m_simulatorVersion = "OpenSimulator Server"; 140 protected string m_simulatorVersion = "OpenSimulator Server";
139 protected ModuleLoader m_moduleLoader; 141 protected ModuleLoader m_moduleLoader;
140 protected AgentCircuitManager m_authenticateHandler; 142 protected AgentCircuitManager m_authenticateHandler;
141 protected SceneCommunicationService m_sceneGridService; 143 protected SceneCommunicationService m_sceneGridService;
144 protected ISnmpModule m_snmpService = null;
142 145
143 protected ISimulationDataService m_SimulationDataService; 146 protected ISimulationDataService m_SimulationDataService;
144 protected IEstateDataService m_EstateDataService; 147 protected IEstateDataService m_EstateDataService;
@@ -201,7 +204,7 @@ namespace OpenSim.Region.Framework.Scenes
201 private int m_update_events = 1; 204 private int m_update_events = 1;
202 private int m_update_backup = 200; 205 private int m_update_backup = 200;
203 private int m_update_terrain = 50; 206 private int m_update_terrain = 50;
204// private int m_update_land = 1; 207 private int m_update_land = 10;
205 private int m_update_coarse_locations = 50; 208 private int m_update_coarse_locations = 50;
206 209
207 private int agentMS; 210 private int agentMS;
@@ -220,6 +223,7 @@ namespace OpenSim.Region.Framework.Scenes
220 /// </summary> 223 /// </summary>
221 private int m_lastFrameTick; 224 private int m_lastFrameTick;
222 225
226 public bool CombineRegions = false;
223 /// <summary> 227 /// <summary>
224 /// Tick at which the last maintenance run occurred. 228 /// Tick at which the last maintenance run occurred.
225 /// </summary> 229 /// </summary>
@@ -250,6 +254,11 @@ namespace OpenSim.Region.Framework.Scenes
250 /// </summary> 254 /// </summary>
251 private int m_LastLogin; 255 private int m_LastLogin;
252 256
257 private int m_lastIncoming;
258 private int m_lastOutgoing;
259 private int m_hbRestarts = 0;
260
261
253 /// <summary> 262 /// <summary>
254 /// Thread that runs the scene loop. 263 /// Thread that runs the scene loop.
255 /// </summary> 264 /// </summary>
@@ -265,7 +274,7 @@ namespace OpenSim.Region.Framework.Scenes
265 private volatile bool m_shuttingDown; 274 private volatile bool m_shuttingDown;
266 275
267// private int m_lastUpdate; 276// private int m_lastUpdate;
268// private bool m_firstHeartbeat = true; 277 private bool m_firstHeartbeat = true;
269 278
270 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 279 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
271 private bool m_reprioritizationEnabled = true; 280 private bool m_reprioritizationEnabled = true;
@@ -310,6 +319,19 @@ namespace OpenSim.Region.Framework.Scenes
310 get { return m_sceneGridService; } 319 get { return m_sceneGridService; }
311 } 320 }
312 321
322 public ISnmpModule SnmpService
323 {
324 get
325 {
326 if (m_snmpService == null)
327 {
328 m_snmpService = RequestModuleInterface<ISnmpModule>();
329 }
330
331 return m_snmpService;
332 }
333 }
334
313 public ISimulationDataService SimulationDataService 335 public ISimulationDataService SimulationDataService
314 { 336 {
315 get 337 get
@@ -592,6 +614,8 @@ namespace OpenSim.Region.Framework.Scenes
592 m_EstateDataService = estateDataService; 614 m_EstateDataService = estateDataService;
593 m_regionHandle = m_regInfo.RegionHandle; 615 m_regionHandle = m_regInfo.RegionHandle;
594 m_regionName = m_regInfo.RegionName; 616 m_regionName = m_regInfo.RegionName;
617 m_lastIncoming = 0;
618 m_lastOutgoing = 0;
595 619
596 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); 620 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
597 m_asyncSceneObjectDeleter.Enabled = true; 621 m_asyncSceneObjectDeleter.Enabled = true;
@@ -672,98 +696,107 @@ namespace OpenSim.Region.Framework.Scenes
672 696
673 // Region config overrides global config 697 // Region config overrides global config
674 // 698 //
675 if (m_config.Configs["Startup"] != null) 699 try
676 { 700 {
677 IConfig startupConfig = m_config.Configs["Startup"]; 701 if (m_config.Configs["Startup"] != null)
678
679 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
680 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
681 if (!m_useBackup)
682 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
683
684 //Animation states
685 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
686
687 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
688 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
689
690 m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
691 if (RegionInfo.NonphysPrimMax > 0)
692 { 702 {
693 m_maxNonphys = RegionInfo.NonphysPrimMax; 703 IConfig startupConfig = m_config.Configs["Startup"];
694 }
695 704
696 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); 705 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
706 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
707 if (!m_useBackup)
708 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
709
710 //Animation states
711 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
697 712
698 if (RegionInfo.PhysPrimMax > 0) 713 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
699 { 714 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
700 m_maxPhys = RegionInfo.PhysPrimMax;
701 }
702 715
703 // Here, if clamping is requested in either global or 716 m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
704 // local config, it will be used 717 if (RegionInfo.NonphysPrimMax > 0)
705 // 718 {
706 m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize); 719 m_maxNonphys = RegionInfo.NonphysPrimMax;
707 if (RegionInfo.ClampPrimSize) 720 }
708 {
709 m_clampPrimSize = true;
710 }
711 721
712 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 722 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
713 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
714 m_dontPersistBefore =
715 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
716 m_dontPersistBefore *= 10000000;
717 m_persistAfter =
718 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
719 m_persistAfter *= 10000000;
720 723
721 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 724 if (RegionInfo.PhysPrimMax > 0)
725 {
726 m_maxPhys = RegionInfo.PhysPrimMax;
727 }
722 728
723 IConfig packetConfig = m_config.Configs["PacketPool"]; 729 // Here, if clamping is requested in either global or
724 if (packetConfig != null) 730 // local config, it will be used
725 { 731 //
726 PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); 732 m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize);
727 PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); 733 if (RegionInfo.ClampPrimSize)
728 } 734 {
735 m_clampPrimSize = true;
736 }
729 737
730 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); 738 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
739 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
740 m_dontPersistBefore =
741 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
742 m_dontPersistBefore *= 10000000;
743 m_persistAfter =
744 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
745 m_persistAfter *= 10000000;
731 746
732 m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true); 747 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
733 if (m_generateMaptiles) 748 m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
734 { 749
735 int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0); 750 IConfig packetConfig = m_config.Configs["PacketPool"];
736 if (maptileRefresh != 0) 751 if (packetConfig != null)
737 { 752 {
738 m_mapGenerationTimer.Interval = maptileRefresh * 1000; 753 PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true);
739 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister; 754 PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true);
740 m_mapGenerationTimer.AutoReset = true;
741 m_mapGenerationTimer.Start();
742 } 755 }
743 }
744 else
745 {
746 string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString());
747 UUID tileID;
748 756
749 if (UUID.TryParse(tile, out tileID)) 757 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
758 m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
759 CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
760
761 m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true);
762 if (m_generateMaptiles)
750 { 763 {
751 RegionInfo.RegionSettings.TerrainImageID = tileID; 764 int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0);
765 if (maptileRefresh != 0)
766 {
767 m_mapGenerationTimer.Interval = maptileRefresh * 1000;
768 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister;
769 m_mapGenerationTimer.AutoReset = true;
770 m_mapGenerationTimer.Start();
771 }
752 } 772 }
753 } 773 else
774 {
775 string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString());
776 UUID tileID;
754 777
755 MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime); 778 if (UUID.TryParse(tile, out tileID))
756 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup); 779 {
757 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations); 780 RegionInfo.RegionSettings.TerrainImageID = tileID;
758 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement); 781 }
759 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events); 782 }
760 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects);
761 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics);
762 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
763 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
764 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
765 783
766 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates); 784 MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime);
785 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup);
786 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations);
787 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement);
788 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events);
789 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects);
790 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics);
791 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
792 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
793 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
794 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates);
795 }
796 }
797 catch (Exception e)
798 {
799 m_log.Error("[SCENE]: Failed to load StartupConfig: " + e.ToString());
767 } 800 }
768 801
769 #endregion Region Config 802 #endregion Region Config
@@ -1194,7 +1227,22 @@ namespace OpenSim.Region.Framework.Scenes
1194 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 1227 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
1195 if (m_heartbeatThread != null) 1228 if (m_heartbeatThread != null)
1196 { 1229 {
1230 m_hbRestarts++;
1231 if(m_hbRestarts > 10)
1232 Environment.Exit(1);
1233 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1234
1235//int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
1236//System.Diagnostics.Process proc = new System.Diagnostics.Process();
1237//proc.EnableRaisingEvents=false;
1238//proc.StartInfo.FileName = "/bin/kill";
1239//proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
1240//proc.Start();
1241//proc.WaitForExit();
1242//Thread.Sleep(1000);
1243//Environment.Exit(1);
1197 m_heartbeatThread.Abort(); 1244 m_heartbeatThread.Abort();
1245 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1198 m_heartbeatThread = null; 1246 m_heartbeatThread = null;
1199 } 1247 }
1200// m_lastUpdate = Util.EnvironmentTickCount(); 1248// m_lastUpdate = Util.EnvironmentTickCount();
@@ -1507,6 +1555,8 @@ namespace OpenSim.Region.Framework.Scenes
1507 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1555 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc);
1508 maintc = (int)(MinFrameTime * 1000) - maintc; 1556 maintc = (int)(MinFrameTime * 1000) - maintc;
1509 1557
1558 m_firstHeartbeat = false;
1559
1510 if (maintc > 0) 1560 if (maintc > 0)
1511 Thread.Sleep(maintc); 1561 Thread.Sleep(maintc);
1512 1562
@@ -1536,9 +1586,9 @@ namespace OpenSim.Region.Framework.Scenes
1536 1586
1537 private void CheckAtTargets() 1587 private void CheckAtTargets()
1538 { 1588 {
1539 Dictionary<UUID, SceneObjectGroup>.ValueCollection objs; 1589 List<SceneObjectGroup> objs = new List<SceneObjectGroup>();
1540 lock (m_groupsWithTargets) 1590 lock (m_groupsWithTargets)
1541 objs = m_groupsWithTargets.Values; 1591 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values);
1542 1592
1543 foreach (SceneObjectGroup entry in objs) 1593 foreach (SceneObjectGroup entry in objs)
1544 entry.checkAtTargets(); 1594 entry.checkAtTargets();
@@ -1619,7 +1669,7 @@ namespace OpenSim.Region.Framework.Scenes
1619 msg.fromAgentName = "Server"; 1669 msg.fromAgentName = "Server";
1620 msg.dialog = (byte)19; // Object msg 1670 msg.dialog = (byte)19; // Object msg
1621 msg.fromGroup = false; 1671 msg.fromGroup = false;
1622 msg.offline = (byte)0; 1672 msg.offline = (byte)1;
1623 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; 1673 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
1624 msg.Position = Vector3.Zero; 1674 msg.Position = Vector3.Zero;
1625 msg.RegionID = RegionInfo.RegionID.Guid; 1675 msg.RegionID = RegionInfo.RegionID.Guid;
@@ -1857,14 +1907,24 @@ namespace OpenSim.Region.Framework.Scenes
1857 /// <returns></returns> 1907 /// <returns></returns>
1858 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 1908 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
1859 { 1909 {
1910
1911 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
1912 Vector3 wpos = Vector3.Zero;
1913 // Check for water surface intersection from above
1914 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
1915 {
1916 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
1917 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
1918 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
1919 wpos.Z = wheight;
1920 }
1921
1860 Vector3 pos = Vector3.Zero; 1922 Vector3 pos = Vector3.Zero;
1861 if (RayEndIsIntersection == (byte)1) 1923 if (RayEndIsIntersection == (byte)1)
1862 { 1924 {
1863 pos = RayEnd; 1925 pos = RayEnd;
1864 return pos;
1865 } 1926 }
1866 1927 else if (RayTargetID != UUID.Zero)
1867 if (RayTargetID != UUID.Zero)
1868 { 1928 {
1869 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 1929 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
1870 1930
@@ -1886,7 +1946,7 @@ namespace OpenSim.Region.Framework.Scenes
1886 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter); 1946 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
1887 1947
1888 // Un-comment out the following line to Get Raytrace results printed to the console. 1948 // Un-comment out the following line to Get Raytrace results printed to the console.
1889 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 1949 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
1890 float ScaleOffset = 0.5f; 1950 float ScaleOffset = 0.5f;
1891 1951
1892 // If we hit something 1952 // If we hit something
@@ -1909,13 +1969,10 @@ namespace OpenSim.Region.Framework.Scenes
1909 //pos.Z -= 0.25F; 1969 //pos.Z -= 0.25F;
1910 1970
1911 } 1971 }
1912
1913 return pos;
1914 } 1972 }
1915 else 1973 else
1916 { 1974 {
1917 // We don't have a target here, so we're going to raytrace all the objects in the scene. 1975 // We don't have a target here, so we're going to raytrace all the objects in the scene.
1918
1919 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 1976 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
1920 1977
1921 // Un-comment the following line to print the raytrace results to the console. 1978 // Un-comment the following line to print the raytrace results to the console.
@@ -1924,13 +1981,12 @@ namespace OpenSim.Region.Framework.Scenes
1924 if (ei.HitTF) 1981 if (ei.HitTF)
1925 { 1982 {
1926 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); 1983 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
1927 } else 1984 }
1985 else
1928 { 1986 {
1929 // fall back to our stupid functionality 1987 // fall back to our stupid functionality
1930 pos = RayEnd; 1988 pos = RayEnd;
1931 } 1989 }
1932
1933 return pos;
1934 } 1990 }
1935 } 1991 }
1936 else 1992 else
@@ -1941,8 +1997,12 @@ namespace OpenSim.Region.Framework.Scenes
1941 //increase height so its above the ground. 1997 //increase height so its above the ground.
1942 //should be getting the normal of the ground at the rez point and using that? 1998 //should be getting the normal of the ground at the rez point and using that?
1943 pos.Z += scale.Z / 2f; 1999 pos.Z += scale.Z / 2f;
1944 return pos; 2000// return pos;
1945 } 2001 }
2002
2003 // check against posible water intercept
2004 if (wpos.Z > pos.Z) pos = wpos;
2005 return pos;
1946 } 2006 }
1947 2007
1948 2008
@@ -2032,7 +2092,10 @@ namespace OpenSim.Region.Framework.Scenes
2032 public bool AddRestoredSceneObject( 2092 public bool AddRestoredSceneObject(
2033 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates) 2093 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
2034 { 2094 {
2035 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates); 2095 bool result = m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates);
2096 if (result)
2097 sceneObject.IsDeleted = false;
2098 return result;
2036 } 2099 }
2037 2100
2038 /// <summary> 2101 /// <summary>
@@ -2124,6 +2187,15 @@ namespace OpenSim.Region.Framework.Scenes
2124 /// </summary> 2187 /// </summary>
2125 public void DeleteAllSceneObjects() 2188 public void DeleteAllSceneObjects()
2126 { 2189 {
2190 DeleteAllSceneObjects(false);
2191 }
2192
2193 /// <summary>
2194 /// Delete every object from the scene. This does not include attachments worn by avatars.
2195 /// </summary>
2196 public void DeleteAllSceneObjects(bool exceptNoCopy)
2197 {
2198 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2127 lock (Entities) 2199 lock (Entities)
2128 { 2200 {
2129 EntityBase[] entities = Entities.GetEntities(); 2201 EntityBase[] entities = Entities.GetEntities();
@@ -2132,11 +2204,24 @@ namespace OpenSim.Region.Framework.Scenes
2132 if (e is SceneObjectGroup) 2204 if (e is SceneObjectGroup)
2133 { 2205 {
2134 SceneObjectGroup sog = (SceneObjectGroup)e; 2206 SceneObjectGroup sog = (SceneObjectGroup)e;
2135 if (!sog.IsAttachment) 2207 if (sog != null && !sog.IsAttachment)
2136 DeleteSceneObject((SceneObjectGroup)e, false); 2208 {
2209 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2210 {
2211 DeleteSceneObject((SceneObjectGroup)e, false);
2212 }
2213 else
2214 {
2215 toReturn.Add((SceneObjectGroup)e);
2216 }
2217 }
2137 } 2218 }
2138 } 2219 }
2139 } 2220 }
2221 if (toReturn.Count > 0)
2222 {
2223 returnObjects(toReturn.ToArray(), UUID.Zero);
2224 }
2140 } 2225 }
2141 2226
2142 /// <summary> 2227 /// <summary>
@@ -2171,6 +2256,8 @@ namespace OpenSim.Region.Framework.Scenes
2171 } 2256 }
2172 2257
2173 group.DeleteGroupFromScene(silent); 2258 group.DeleteGroupFromScene(silent);
2259 if (!silent)
2260 SendKillObject(new List<uint>() { group.LocalId });
2174 2261
2175// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2262// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2176 } 2263 }
@@ -2460,6 +2547,8 @@ namespace OpenSim.Region.Framework.Scenes
2460 2547
2461 if (newPosition != Vector3.Zero) 2548 if (newPosition != Vector3.Zero)
2462 newObject.RootPart.GroupPosition = newPosition; 2549 newObject.RootPart.GroupPosition = newPosition;
2550 if (newObject.RootPart.KeyframeMotion != null)
2551 newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
2463 2552
2464 if (!AddSceneObject(newObject)) 2553 if (!AddSceneObject(newObject))
2465 { 2554 {
@@ -2528,10 +2617,17 @@ namespace OpenSim.Region.Framework.Scenes
2528 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> 2617 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
2529 public bool AddSceneObject(SceneObjectGroup sceneObject) 2618 public bool AddSceneObject(SceneObjectGroup sceneObject)
2530 { 2619 {
2620 if (sceneObject.OwnerID == UUID.Zero)
2621 {
2622 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
2623 return false;
2624 }
2625
2531 // If the user is banned, we won't let any of their objects 2626 // If the user is banned, we won't let any of their objects
2532 // enter. Period. 2627 // enter. Period.
2533 // 2628 //
2534 if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) 2629 int flags = GetUserFlags(sceneObject.OwnerID);
2630 if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags))
2535 { 2631 {
2536 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); 2632 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID);
2537 2633
@@ -2577,12 +2673,23 @@ namespace OpenSim.Region.Framework.Scenes
2577 } 2673 }
2578 else 2674 else
2579 { 2675 {
2676 m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
2580 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2677 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2581 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2678 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2582 } 2679 }
2680 if (sceneObject.OwnerID == UUID.Zero)
2681 {
2682 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
2683 return false;
2684 }
2583 } 2685 }
2584 else 2686 else
2585 { 2687 {
2688 if (sceneObject.OwnerID == UUID.Zero)
2689 {
2690 m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
2691 return false;
2692 }
2586 AddRestoredSceneObject(sceneObject, true, false); 2693 AddRestoredSceneObject(sceneObject, true, false);
2587 2694
2588 if (!Permissions.CanObjectEntry(sceneObject.UUID, 2695 if (!Permissions.CanObjectEntry(sceneObject.UUID,
@@ -2611,6 +2718,24 @@ namespace OpenSim.Region.Framework.Scenes
2611 return 2; // StateSource.PrimCrossing 2718 return 2; // StateSource.PrimCrossing
2612 } 2719 }
2613 2720
2721 public int GetUserFlags(UUID user)
2722 {
2723 //Unfortunately the SP approach means that the value is cached until region is restarted
2724 /*
2725 ScenePresence sp;
2726 if (TryGetScenePresence(user, out sp))
2727 {
2728 return sp.UserFlags;
2729 }
2730 else
2731 {
2732 */
2733 UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user);
2734 if (uac == null)
2735 return 0;
2736 return uac.UserFlags;
2737 //}
2738 }
2614 #endregion 2739 #endregion
2615 2740
2616 #region Add/Remove Avatar Methods 2741 #region Add/Remove Avatar Methods
@@ -2624,7 +2749,7 @@ namespace OpenSim.Region.Framework.Scenes
2624 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 2749 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2625 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2750 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2626 2751
2627// CheckHeartbeat(); 2752 CheckHeartbeat();
2628 2753
2629 ScenePresence sp = GetScenePresence(client.AgentId); 2754 ScenePresence sp = GetScenePresence(client.AgentId);
2630 2755
@@ -2677,7 +2802,13 @@ namespace OpenSim.Region.Framework.Scenes
2677 2802
2678 EventManager.TriggerOnNewClient(client); 2803 EventManager.TriggerOnNewClient(client);
2679 if (vialogin) 2804 if (vialogin)
2805 {
2680 EventManager.TriggerOnClientLogin(client); 2806 EventManager.TriggerOnClientLogin(client);
2807 // Send initial parcel data
2808 Vector3 pos = sp.AbsolutePosition;
2809 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
2810 land.SendLandUpdateToClient(client);
2811 }
2681 2812
2682 return sp; 2813 return sp;
2683 } 2814 }
@@ -2767,19 +2898,12 @@ namespace OpenSim.Region.Framework.Scenes
2767 // and the scene presence and the client, if they exist 2898 // and the scene presence and the client, if they exist
2768 try 2899 try
2769 { 2900 {
2770 // We need to wait for the client to make UDP contact first. 2901 ScenePresence sp = GetScenePresence(agentID);
2771 // It's the UDP contact that creates the scene presence 2902 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2772 ScenePresence sp = WaitGetScenePresence(agentID); 2903
2773 if (sp != null) 2904 if (sp != null)
2774 {
2775 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2776
2777 sp.ControllingClient.Close(); 2905 sp.ControllingClient.Close();
2778 } 2906
2779 else
2780 {
2781 m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID);
2782 }
2783 // BANG! SLASH! 2907 // BANG! SLASH!
2784 m_authenticateHandler.RemoveCircuit(agentID); 2908 m_authenticateHandler.RemoveCircuit(agentID);
2785 2909
@@ -2824,6 +2948,8 @@ namespace OpenSim.Region.Framework.Scenes
2824 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 2948 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
2825 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 2949 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
2826 2950
2951 client.onClientChangeObject += m_sceneGraph.ClientChangeObject;
2952
2827 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation; 2953 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation;
2828 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 2954 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
2829 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 2955 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
@@ -2880,6 +3006,7 @@ namespace OpenSim.Region.Framework.Scenes
2880 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory; 3006 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
2881 client.OnUpdateInventoryItem += UpdateInventoryItemAsset; 3007 client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
2882 client.OnCopyInventoryItem += CopyInventoryItem; 3008 client.OnCopyInventoryItem += CopyInventoryItem;
3009 client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
2883 client.OnMoveInventoryItem += MoveInventoryItem; 3010 client.OnMoveInventoryItem += MoveInventoryItem;
2884 client.OnRemoveInventoryItem += RemoveInventoryItem; 3011 client.OnRemoveInventoryItem += RemoveInventoryItem;
2885 client.OnRemoveInventoryFolder += RemoveInventoryFolder; 3012 client.OnRemoveInventoryFolder += RemoveInventoryFolder;
@@ -2951,6 +3078,8 @@ namespace OpenSim.Region.Framework.Scenes
2951 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition; 3078 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition;
2952 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; 3079 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
2953 3080
3081 client.onClientChangeObject -= m_sceneGraph.ClientChangeObject;
3082
2954 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3083 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation;
2955 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3084 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation;
2956 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; 3085 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
@@ -3053,15 +3182,16 @@ namespace OpenSim.Region.Framework.Scenes
3053 /// </summary> 3182 /// </summary>
3054 /// <param name="agentId">The avatar's Unique ID</param> 3183 /// <param name="agentId">The avatar's Unique ID</param>
3055 /// <param name="client">The IClientAPI for the client</param> 3184 /// <param name="client">The IClientAPI for the client</param>
3056 public virtual void TeleportClientHome(UUID agentId, IClientAPI client) 3185 public virtual bool TeleportClientHome(UUID agentId, IClientAPI client)
3057 { 3186 {
3058 if (m_teleportModule != null) 3187 if (m_teleportModule != null)
3059 m_teleportModule.TeleportHome(agentId, client); 3188 return m_teleportModule.TeleportHome(agentId, client);
3060 else 3189 else
3061 { 3190 {
3062 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); 3191 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active");
3063 client.SendTeleportFailed("Unable to perform teleports on this simulator."); 3192 client.SendTeleportFailed("Unable to perform teleports on this simulator.");
3064 } 3193 }
3194 return false;
3065 } 3195 }
3066 3196
3067 /// <summary> 3197 /// <summary>
@@ -3171,6 +3301,16 @@ namespace OpenSim.Region.Framework.Scenes
3171 /// <param name="flags"></param> 3301 /// <param name="flags"></param>
3172 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) 3302 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3173 { 3303 {
3304 //Add half the avatar's height so that the user doesn't fall through prims
3305 ScenePresence presence;
3306 if (TryGetScenePresence(remoteClient.AgentId, out presence))
3307 {
3308 if (presence.Appearance != null)
3309 {
3310 position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
3311 }
3312 }
3313
3174 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt)) 3314 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3175 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. 3315 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3176 m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); 3316 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
@@ -3239,8 +3379,9 @@ namespace OpenSim.Region.Framework.Scenes
3239 regions.Remove(RegionInfo.RegionHandle); 3379 regions.Remove(RegionInfo.RegionHandle);
3240 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3380 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions);
3241 } 3381 }
3242 3382 m_log.Debug("[Scene] Beginning ClientClosed");
3243 m_eventManager.TriggerClientClosed(agentID, this); 3383 m_eventManager.TriggerClientClosed(agentID, this);
3384 m_log.Debug("[Scene] Finished ClientClosed");
3244 } 3385 }
3245 catch (NullReferenceException) 3386 catch (NullReferenceException)
3246 { 3387 {
@@ -3302,9 +3443,10 @@ namespace OpenSim.Region.Framework.Scenes
3302 { 3443 {
3303 m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace); 3444 m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace);
3304 } 3445 }
3305 3446 m_log.Debug("[Scene] Done. Firing RemoveCircuit");
3306 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); 3447 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode);
3307// CleanDroppedAttachments(); 3448// CleanDroppedAttachments();
3449 m_log.Debug("[Scene] The avatar has left the building");
3308 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); 3450 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false));
3309 //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); 3451 //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true));
3310 } 3452 }
@@ -3426,13 +3568,16 @@ namespace OpenSim.Region.Framework.Scenes
3426 sp = null; 3568 sp = null;
3427 } 3569 }
3428 3570
3429 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3430 3571
3431 //On login test land permisions 3572 //On login test land permisions
3432 if (vialogin) 3573 if (vialogin)
3433 { 3574 {
3434 if (land != null && !TestLandRestrictions(agent, land, out reason)) 3575 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
3576 if (cache != null)
3577 cache.Remove(agent.firstname + " " + agent.lastname);
3578 if (!TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y))
3435 { 3579 {
3580 m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
3436 return false; 3581 return false;
3437 } 3582 }
3438 } 3583 }
@@ -3456,8 +3601,13 @@ namespace OpenSim.Region.Framework.Scenes
3456 3601
3457 try 3602 try
3458 { 3603 {
3459 if (!AuthorizeUser(agent, out reason)) 3604 // Always check estate if this is a login. Always
3460 return false; 3605 // check if banned regions are to be blacked out.
3606 if (vialogin || (!m_seeIntoBannedRegion))
3607 {
3608 if (!AuthorizeUser(agent, out reason))
3609 return false;
3610 }
3461 } 3611 }
3462 catch (Exception e) 3612 catch (Exception e)
3463 { 3613 {
@@ -3583,6 +3733,8 @@ namespace OpenSim.Region.Framework.Scenes
3583 } 3733 }
3584 3734
3585 // Honor parcel landing type and position. 3735 // Honor parcel landing type and position.
3736 /*
3737 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3586 if (land != null) 3738 if (land != null)
3587 { 3739 {
3588 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 3740 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -3590,26 +3742,34 @@ namespace OpenSim.Region.Framework.Scenes
3590 agent.startpos = land.LandData.UserLocation; 3742 agent.startpos = land.LandData.UserLocation;
3591 } 3743 }
3592 } 3744 }
3745 */// This is now handled properly in ScenePresence.MakeRootAgent
3593 } 3746 }
3594 3747
3595 return true; 3748 return true;
3596 } 3749 }
3597 3750
3598 private bool TestLandRestrictions(AgentCircuitData agent, ILandObject land, out string reason) 3751 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY)
3599 { 3752 {
3600 3753 reason = String.Empty;
3601 bool banned = land.IsBannedFromLand(agent.AgentID); 3754 if (Permissions.IsGod(agentID))
3602 bool restricted = land.IsRestrictedFromLand(agent.AgentID); 3755 return true;
3756
3757 ILandObject land = LandChannel.GetLandObject(posX, posY);
3758 if (land == null)
3759 return false;
3760
3761 bool banned = land.IsBannedFromLand(agentID);
3762 bool restricted = land.IsRestrictedFromLand(agentID);
3603 3763
3604 if (banned || restricted) 3764 if (banned || restricted)
3605 { 3765 {
3606 ILandObject nearestParcel = GetNearestAllowedParcel(agent.AgentID, agent.startpos.X, agent.startpos.Y); 3766 ILandObject nearestParcel = GetNearestAllowedParcel(agentID, posX, posY);
3607 if (nearestParcel != null) 3767 if (nearestParcel != null)
3608 { 3768 {
3609 //Move agent to nearest allowed 3769 //Move agent to nearest allowed
3610 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel); 3770 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel);
3611 agent.startpos.X = newPosition.X; 3771 posX = newPosition.X;
3612 agent.startpos.Y = newPosition.Y; 3772 posY = newPosition.Y;
3613 } 3773 }
3614 else 3774 else
3615 { 3775 {
@@ -3671,7 +3831,7 @@ namespace OpenSim.Region.Framework.Scenes
3671 3831
3672 if (!m_strictAccessControl) return true; 3832 if (!m_strictAccessControl) return true;
3673 if (Permissions.IsGod(agent.AgentID)) return true; 3833 if (Permissions.IsGod(agent.AgentID)) return true;
3674 3834
3675 if (AuthorizationService != null) 3835 if (AuthorizationService != null)
3676 { 3836 {
3677 if (!AuthorizationService.IsAuthorizedForRegion( 3837 if (!AuthorizationService.IsAuthorizedForRegion(
@@ -3686,7 +3846,7 @@ namespace OpenSim.Region.Framework.Scenes
3686 3846
3687 if (m_regInfo.EstateSettings != null) 3847 if (m_regInfo.EstateSettings != null)
3688 { 3848 {
3689 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) 3849 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID,0))
3690 { 3850 {
3691 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 3851 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
3692 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 3852 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
@@ -3878,6 +4038,13 @@ namespace OpenSim.Region.Framework.Scenes
3878 4038
3879 // We have to wait until the viewer contacts this region after receiving EAC. 4039 // We have to wait until the viewer contacts this region after receiving EAC.
3880 // That calls AddNewClient, which finally creates the ScenePresence 4040 // That calls AddNewClient, which finally creates the ScenePresence
4041 int flags = GetUserFlags(cAgentData.AgentID);
4042 if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags))
4043 {
4044 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID);
4045 return false;
4046 }
4047
3881 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); 4048 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2);
3882 if (nearestParcel == null) 4049 if (nearestParcel == null)
3883 { 4050 {
@@ -3959,12 +4126,22 @@ namespace OpenSim.Region.Framework.Scenes
3959 return false; 4126 return false;
3960 } 4127 }
3961 4128
4129 public bool IncomingCloseAgent(UUID agentID)
4130 {
4131 return IncomingCloseAgent(agentID, false);
4132 }
4133
4134 public bool IncomingCloseChildAgent(UUID agentID)
4135 {
4136 return IncomingCloseAgent(agentID, true);
4137 }
4138
3962 /// <summary> 4139 /// <summary>
3963 /// Tell a single agent to disconnect from the region. 4140 /// Tell a single agent to disconnect from the region.
3964 /// </summary> 4141 /// </summary>
3965 /// <param name="regionHandle"></param>
3966 /// <param name="agentID"></param> 4142 /// <param name="agentID"></param>
3967 public bool IncomingCloseAgent(UUID agentID) 4143 /// <param name="childOnly"></param>
4144 public bool IncomingCloseAgent(UUID agentID, bool childOnly)
3968 { 4145 {
3969 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); 4146 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID);
3970 4147
@@ -3976,7 +4153,7 @@ namespace OpenSim.Region.Framework.Scenes
3976 { 4153 {
3977 m_sceneGraph.removeUserCount(false); 4154 m_sceneGraph.removeUserCount(false);
3978 } 4155 }
3979 else 4156 else if (!childOnly)
3980 { 4157 {
3981 m_sceneGraph.removeUserCount(true); 4158 m_sceneGraph.removeUserCount(true);
3982 } 4159 }
@@ -3992,9 +4169,12 @@ namespace OpenSim.Region.Framework.Scenes
3992 } 4169 }
3993 else 4170 else
3994 presence.ControllingClient.SendShutdownConnectionNotice(); 4171 presence.ControllingClient.SendShutdownConnectionNotice();
4172 presence.ControllingClient.Close(false);
4173 }
4174 else if (!childOnly)
4175 {
4176 presence.ControllingClient.Close(true);
3995 } 4177 }
3996
3997 presence.ControllingClient.Close();
3998 return true; 4178 return true;
3999 } 4179 }
4000 4180
@@ -4576,35 +4756,81 @@ namespace OpenSim.Region.Framework.Scenes
4576 SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID); 4756 SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID);
4577 } 4757 }
4578 4758
4579 public int GetHealth() 4759 public int GetHealth(out int flags, out string message)
4580 { 4760 {
4581 // Returns: 4761 // Returns:
4582 // 1 = sim is up and accepting http requests. The heartbeat has 4762 // 1 = sim is up and accepting http requests. The heartbeat has
4583 // stopped and the sim is probably locked up, but a remote 4763 // stopped and the sim is probably locked up, but a remote
4584 // admin restart may succeed 4764 // admin restart may succeed
4585 // 4765 //
4586 // 2 = Sim is up and the heartbeat is running. The sim is likely 4766 // 2 = Sim is up and the heartbeat is running. The sim is likely
4587 // usable for people within and logins _may_ work 4767 // usable for people within
4768 //
4769 // 3 = Sim is up and one packet thread is running. Sim is
4770 // unstable and will not accept new logins
4588 // 4771 //
4589 // 3 = We have seen a new user enter within the past 4 minutes 4772 // 4 = Sim is up and both packet threads are running. Sim is
4773 // likely usable
4774 //
4775 // 5 = We have seen a new user enter within the past 4 minutes
4590 // which can be seen as positive confirmation of sim health 4776 // which can be seen as positive confirmation of sim health
4591 // 4777 //
4778
4779 flags = 0;
4780 message = String.Empty;
4781
4782 CheckHeartbeat();
4783
4784 if (m_firstHeartbeat || (m_lastIncoming == 0 && m_lastOutgoing == 0))
4785 {
4786 // We're still starting
4787 // 0 means "in startup", it can't happen another way, since
4788 // to get here, we must be able to accept http connections
4789 return 0;
4790 }
4791
4592 int health=1; // Start at 1, means we're up 4792 int health=1; // Start at 1, means we're up
4593 4793
4594 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 4794 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
4595 health += 1; 4795 {
4796 health+=1;
4797 flags |= 1;
4798 }
4799
4800 if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
4801 {
4802 health+=1;
4803 flags |= 2;
4804 }
4805
4806 if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
4807 {
4808 health+=1;
4809 flags |= 4;
4810 }
4596 else 4811 else
4812 {
4813int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
4814System.Diagnostics.Process proc = new System.Diagnostics.Process();
4815proc.EnableRaisingEvents=false;
4816proc.StartInfo.FileName = "/bin/kill";
4817proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
4818proc.Start();
4819proc.WaitForExit();
4820Thread.Sleep(1000);
4821Environment.Exit(1);
4822 }
4823
4824 if (flags != 7)
4597 return health; 4825 return health;
4598 4826
4599 // A login in the last 4 mins? We can't be doing too badly 4827 // A login in the last 4 mins? We can't be doing too badly
4600 // 4828 //
4601 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 4829 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
4602 health++; 4830 health++;
4603 else 4831 else
4604 return health; 4832 return health;
4605 4833
4606// CheckHeartbeat();
4607
4608 return health; 4834 return health;
4609 } 4835 }
4610 4836
@@ -4692,7 +4918,7 @@ namespace OpenSim.Region.Framework.Scenes
4692 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); 4918 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
4693 if (wasUsingPhysics) 4919 if (wasUsingPhysics)
4694 { 4920 {
4695 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 4921 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
4696 } 4922 }
4697 } 4923 }
4698 4924
@@ -4791,14 +5017,14 @@ namespace OpenSim.Region.Framework.Scenes
4791 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 5017 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
4792 } 5018 }
4793 5019
4794// private void CheckHeartbeat() 5020 private void CheckHeartbeat()
4795// { 5021 {
4796// if (m_firstHeartbeat) 5022 if (m_firstHeartbeat)
4797// return; 5023 return;
4798// 5024
4799// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 5025 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
4800// StartTimer(); 5026 Start();
4801// } 5027 }
4802 5028
4803 public override ISceneObject DeserializeObject(string representation) 5029 public override ISceneObject DeserializeObject(string representation)
4804 { 5030 {
@@ -4810,9 +5036,14 @@ namespace OpenSim.Region.Framework.Scenes
4810 get { return m_allowScriptCrossings; } 5036 get { return m_allowScriptCrossings; }
4811 } 5037 }
4812 5038
4813 public Vector3? GetNearestAllowedPosition(ScenePresence avatar) 5039 public Vector3 GetNearestAllowedPosition(ScenePresence avatar)
5040 {
5041 return GetNearestAllowedPosition(avatar, null);
5042 }
5043
5044 public Vector3 GetNearestAllowedPosition(ScenePresence avatar, ILandObject excludeParcel)
4814 { 5045 {
4815 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); 5046 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, excludeParcel);
4816 5047
4817 if (nearestParcel != null) 5048 if (nearestParcel != null)
4818 { 5049 {
@@ -4821,10 +5052,7 @@ namespace OpenSim.Region.Framework.Scenes
4821 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5052 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
4822 if (nearestPoint != null) 5053 if (nearestPoint != null)
4823 { 5054 {
4824// m_log.DebugFormat( 5055 Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString());
4825// "[SCENE]: Found a sane previous position based on velocity for {0}, sending them to {1} in {2}",
4826// avatar.Name, nearestPoint, nearestParcel.LandData.Name);
4827
4828 return nearestPoint.Value; 5056 return nearestPoint.Value;
4829 } 5057 }
4830 5058
@@ -4834,17 +5062,20 @@ namespace OpenSim.Region.Framework.Scenes
4834 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5062 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
4835 if (nearestPoint != null) 5063 if (nearestPoint != null)
4836 { 5064 {
4837// m_log.DebugFormat( 5065 Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString());
4838// "[SCENE]: {0} had a zero velocity, sending them to {1}", avatar.Name, nearestPoint);
4839
4840 return nearestPoint.Value; 5066 return nearestPoint.Value;
4841 } 5067 }
4842 5068
4843 //Ultimate backup if we have no idea where they are 5069 ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y);
4844// m_log.DebugFormat( 5070 if (dest != excludeParcel)
4845// "[SCENE]: No idea where {0} is, sending them to {1}", avatar.Name, avatar.lastKnownAllowedPosition); 5071 {
5072 // Ultimate backup if we have no idea where they are and
5073 // the last allowed position was in another parcel
5074 Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString());
5075 return avatar.lastKnownAllowedPosition;
5076 }
4846 5077
4847 return avatar.lastKnownAllowedPosition; 5078 // else fall through to region edge
4848 } 5079 }
4849 5080
4850 //Go to the edge, this happens in teleporting to a region with no available parcels 5081 //Go to the edge, this happens in teleporting to a region with no available parcels
@@ -4878,13 +5109,18 @@ namespace OpenSim.Region.Framework.Scenes
4878 5109
4879 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y) 5110 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y)
4880 { 5111 {
5112 return GetNearestAllowedParcel(avatarId, x, y, null);
5113 }
5114
5115 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y, ILandObject excludeParcel)
5116 {
4881 List<ILandObject> all = AllParcels(); 5117 List<ILandObject> all = AllParcels();
4882 float minParcelDistance = float.MaxValue; 5118 float minParcelDistance = float.MaxValue;
4883 ILandObject nearestParcel = null; 5119 ILandObject nearestParcel = null;
4884 5120
4885 foreach (var parcel in all) 5121 foreach (var parcel in all)
4886 { 5122 {
4887 if (!parcel.IsEitherBannedOrRestricted(avatarId)) 5123 if (!parcel.IsEitherBannedOrRestricted(avatarId) && parcel != excludeParcel)
4888 { 5124 {
4889 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y); 5125 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y);
4890 if (parcelDistance < minParcelDistance) 5126 if (parcelDistance < minParcelDistance)
@@ -5126,7 +5362,55 @@ namespace OpenSim.Region.Framework.Scenes
5126 mapModule.GenerateMaptile(); 5362 mapModule.GenerateMaptile();
5127 } 5363 }
5128 5364
5129 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 5365// public void CleanDroppedAttachments()
5366// {
5367// List<SceneObjectGroup> objectsToDelete =
5368// new List<SceneObjectGroup>();
5369//
5370// lock (m_cleaningAttachments)
5371// {
5372// ForEachSOG(delegate (SceneObjectGroup grp)
5373// {
5374// if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
5375// {
5376// UUID agentID = grp.OwnerID;
5377// if (agentID == UUID.Zero)
5378// {
5379// objectsToDelete.Add(grp);
5380// return;
5381// }
5382//
5383// ScenePresence sp = GetScenePresence(agentID);
5384// if (sp == null)
5385// {
5386// objectsToDelete.Add(grp);
5387// return;
5388// }
5389// }
5390// });
5391// }
5392//
5393// foreach (SceneObjectGroup grp in objectsToDelete)
5394// {
5395// m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
5396// DeleteSceneObject(grp, true);
5397// }
5398// }
5399
5400 public void ThreadAlive(int threadCode)
5401 {
5402 switch(threadCode)
5403 {
5404 case 1: // Incoming
5405 m_lastIncoming = Util.EnvironmentTickCount();
5406 break;
5407 case 2: // Incoming
5408 m_lastOutgoing = Util.EnvironmentTickCount();
5409 break;
5410 }
5411 }
5412
5413 public void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5130 { 5414 {
5131 RegenerateMaptile(); 5415 RegenerateMaptile();
5132 5416
@@ -5145,6 +5429,14 @@ namespace OpenSim.Region.Framework.Scenes
5145 // child agent creation, thereby emulating the SL behavior. 5429 // child agent creation, thereby emulating the SL behavior.
5146 public bool QueryAccess(UUID agentID, Vector3 position, out string reason) 5430 public bool QueryAccess(UUID agentID, Vector3 position, out string reason)
5147 { 5431 {
5432 reason = "You are banned from the region";
5433
5434 if (Permissions.IsGod(agentID))
5435 {
5436 reason = String.Empty;
5437 return true;
5438 }
5439
5148 int num = m_sceneGraph.GetNumberOfScenePresences(); 5440 int num = m_sceneGraph.GetNumberOfScenePresences();
5149 5441
5150 if (num >= RegionInfo.RegionSettings.AgentLimit) 5442 if (num >= RegionInfo.RegionSettings.AgentLimit)
@@ -5156,6 +5448,41 @@ namespace OpenSim.Region.Framework.Scenes
5156 } 5448 }
5157 } 5449 }
5158 5450
5451 ScenePresence presence = GetScenePresence(agentID);
5452 IClientAPI client = null;
5453 AgentCircuitData aCircuit = null;
5454
5455 if (presence != null)
5456 {
5457 client = presence.ControllingClient;
5458 if (client != null)
5459 aCircuit = client.RequestClientInfo();
5460 }
5461
5462 // We may be called before there is a presence or a client.
5463 // Fake AgentCircuitData to keep IAuthorizationModule smiling
5464 if (client == null)
5465 {
5466 aCircuit = new AgentCircuitData();
5467 aCircuit.AgentID = agentID;
5468 aCircuit.firstname = String.Empty;
5469 aCircuit.lastname = String.Empty;
5470 }
5471
5472 try
5473 {
5474 if (!AuthorizeUser(aCircuit, out reason))
5475 {
5476 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5477 return false;
5478 }
5479 }
5480 catch (Exception e)
5481 {
5482 m_log.DebugFormat("[SCENE]: Exception authorizing agent: {0} "+ e.StackTrace, e.Message);
5483 return false;
5484 }
5485
5159 if (position == Vector3.Zero) // Teleport 5486 if (position == Vector3.Zero) // Teleport
5160 { 5487 {
5161 if (!RegionInfo.EstateSettings.AllowDirectTeleport) 5488 if (!RegionInfo.EstateSettings.AllowDirectTeleport)
@@ -5184,13 +5511,46 @@ namespace OpenSim.Region.Framework.Scenes
5184 } 5511 }
5185 } 5512 }
5186 } 5513 }
5514
5515 float posX = 128.0f;
5516 float posY = 128.0f;
5517
5518 if (!TestLandRestrictions(agentID, out reason, ref posX, ref posY))
5519 {
5520 // m_log.DebugFormat("[SCENE]: Denying {0} because they are banned on all parcels", agentID);
5521 return false;
5522 }
5523 }
5524 else // Walking
5525 {
5526 ILandObject land = LandChannel.GetLandObject(position.X, position.Y);
5527 if (land == null)
5528 return false;
5529
5530 bool banned = land.IsBannedFromLand(agentID);
5531 bool restricted = land.IsRestrictedFromLand(agentID);
5532
5533 if (banned || restricted)
5534 return false;
5187 } 5535 }
5188 5536
5189 reason = String.Empty; 5537 reason = String.Empty;
5190 return true; 5538 return true;
5191 } 5539 }
5192 5540
5193 /// <summary> 5541 public void StartTimerWatchdog()
5542 {
5543 m_timerWatchdog.Interval = 1000;
5544 m_timerWatchdog.Elapsed += TimerWatchdog;
5545 m_timerWatchdog.AutoReset = true;
5546 m_timerWatchdog.Start();
5547 }
5548
5549 public void TimerWatchdog(object sender, ElapsedEventArgs e)
5550 {
5551 CheckHeartbeat();
5552 }
5553
5194 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the 5554 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
5195 /// autopilot that moves an avatar to a sit target!. 5555 /// autopilot that moves an avatar to a sit target!.
5196 /// </summary> 5556 /// </summary>