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 0b31e0c..973be39 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;
@@ -676,98 +700,107 @@ namespace OpenSim.Region.Framework.Scenes
676 700
677 // Region config overrides global config 701 // Region config overrides global config
678 // 702 //
679 if (m_config.Configs["Startup"] != null) 703 try
680 { 704 {
681 IConfig startupConfig = m_config.Configs["Startup"]; 705 if (m_config.Configs["Startup"] != null)
682
683 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
684 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
685 if (!m_useBackup)
686 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
687
688 //Animation states
689 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
690
691 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
692 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
693
694 m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
695 if (RegionInfo.NonphysPrimMax > 0)
696 { 706 {
697 m_maxNonphys = RegionInfo.NonphysPrimMax; 707 IConfig startupConfig = m_config.Configs["Startup"];
698 }
699 708
700 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); 709 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
710 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
711 if (!m_useBackup)
712 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
713
714 //Animation states
715 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
701 716
702 if (RegionInfo.PhysPrimMax > 0) 717 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
703 { 718 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
704 m_maxPhys = RegionInfo.PhysPrimMax;
705 }
706 719
707 // Here, if clamping is requested in either global or 720 m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
708 // local config, it will be used 721 if (RegionInfo.NonphysPrimMax > 0)
709 // 722 {
710 m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize); 723 m_maxNonphys = RegionInfo.NonphysPrimMax;
711 if (RegionInfo.ClampPrimSize) 724 }
712 {
713 m_clampPrimSize = true;
714 }
715 725
716 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 726 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
717 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
718 m_dontPersistBefore =
719 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
720 m_dontPersistBefore *= 10000000;
721 m_persistAfter =
722 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
723 m_persistAfter *= 10000000;
724 727
725 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 728 if (RegionInfo.PhysPrimMax > 0)
729 {
730 m_maxPhys = RegionInfo.PhysPrimMax;
731 }
726 732
727 IConfig packetConfig = m_config.Configs["PacketPool"]; 733 // Here, if clamping is requested in either global or
728 if (packetConfig != null) 734 // local config, it will be used
729 { 735 //
730 PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); 736 m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize);
731 PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); 737 if (RegionInfo.ClampPrimSize)
732 } 738 {
739 m_clampPrimSize = true;
740 }
733 741
734 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); 742 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
743 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
744 m_dontPersistBefore =
745 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
746 m_dontPersistBefore *= 10000000;
747 m_persistAfter =
748 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
749 m_persistAfter *= 10000000;
735 750
736 m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true); 751 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
737 if (m_generateMaptiles) 752 m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
738 { 753
739 int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0); 754 IConfig packetConfig = m_config.Configs["PacketPool"];
740 if (maptileRefresh != 0) 755 if (packetConfig != null)
741 { 756 {
742 m_mapGenerationTimer.Interval = maptileRefresh * 1000; 757 PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true);
743 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister; 758 PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true);
744 m_mapGenerationTimer.AutoReset = true;
745 m_mapGenerationTimer.Start();
746 } 759 }
747 }
748 else
749 {
750 string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString());
751 UUID tileID;
752 760
753 if (UUID.TryParse(tile, out tileID)) 761 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
762 m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
763 CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
764
765 m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true);
766 if (m_generateMaptiles)
754 { 767 {
755 RegionInfo.RegionSettings.TerrainImageID = tileID; 768 int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0);
769 if (maptileRefresh != 0)
770 {
771 m_mapGenerationTimer.Interval = maptileRefresh * 1000;
772 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister;
773 m_mapGenerationTimer.AutoReset = true;
774 m_mapGenerationTimer.Start();
775 }
756 } 776 }
757 } 777 else
778 {
779 string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString());
780 UUID tileID;
758 781
759 MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime); 782 if (UUID.TryParse(tile, out tileID))
760 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup); 783 {
761 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations); 784 RegionInfo.RegionSettings.TerrainImageID = tileID;
762 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement); 785 }
763 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events); 786 }
764 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects);
765 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics);
766 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
767 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
768 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
769 787
770 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates); 788 MinFrameTime = startupConfig.GetFloat( "MinFrameTime", MinFrameTime);
789 m_update_backup = startupConfig.GetInt( "UpdateStorageEveryNFrames", m_update_backup);
790 m_update_coarse_locations = startupConfig.GetInt( "UpdateCoarseLocationsEveryNFrames", m_update_coarse_locations);
791 m_update_entitymovement = startupConfig.GetInt( "UpdateEntityMovementEveryNFrames", m_update_entitymovement);
792 m_update_events = startupConfig.GetInt( "UpdateEventsEveryNFrames", m_update_events);
793 m_update_objects = startupConfig.GetInt( "UpdateObjectsEveryNFrames", m_update_objects);
794 m_update_physics = startupConfig.GetInt( "UpdatePhysicsEveryNFrames", m_update_physics);
795 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
796 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
797 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
798 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates);
799 }
800 }
801 catch (Exception e)
802 {
803 m_log.Error("[SCENE]: Failed to load StartupConfig: " + e.ToString());
771 } 804 }
772 805
773 #endregion Region Config 806 #endregion Region Config
@@ -1198,7 +1231,22 @@ namespace OpenSim.Region.Framework.Scenes
1198 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 1231 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
1199 if (m_heartbeatThread != null) 1232 if (m_heartbeatThread != null)
1200 { 1233 {
1234 m_hbRestarts++;
1235 if(m_hbRestarts > 10)
1236 Environment.Exit(1);
1237 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1238
1239//int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
1240//System.Diagnostics.Process proc = new System.Diagnostics.Process();
1241//proc.EnableRaisingEvents=false;
1242//proc.StartInfo.FileName = "/bin/kill";
1243//proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
1244//proc.Start();
1245//proc.WaitForExit();
1246//Thread.Sleep(1000);
1247//Environment.Exit(1);
1201 m_heartbeatThread.Abort(); 1248 m_heartbeatThread.Abort();
1249 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1202 m_heartbeatThread = null; 1250 m_heartbeatThread = null;
1203 } 1251 }
1204// m_lastUpdate = Util.EnvironmentTickCount(); 1252// m_lastUpdate = Util.EnvironmentTickCount();
@@ -1511,6 +1559,8 @@ namespace OpenSim.Region.Framework.Scenes
1511 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1559 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc);
1512 maintc = (int)(MinFrameTime * 1000) - maintc; 1560 maintc = (int)(MinFrameTime * 1000) - maintc;
1513 1561
1562 m_firstHeartbeat = false;
1563
1514 if (maintc > 0) 1564 if (maintc > 0)
1515 Thread.Sleep(maintc); 1565 Thread.Sleep(maintc);
1516 1566
@@ -1540,9 +1590,9 @@ namespace OpenSim.Region.Framework.Scenes
1540 1590
1541 private void CheckAtTargets() 1591 private void CheckAtTargets()
1542 { 1592 {
1543 Dictionary<UUID, SceneObjectGroup>.ValueCollection objs; 1593 List<SceneObjectGroup> objs = new List<SceneObjectGroup>();
1544 lock (m_groupsWithTargets) 1594 lock (m_groupsWithTargets)
1545 objs = m_groupsWithTargets.Values; 1595 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values);
1546 1596
1547 foreach (SceneObjectGroup entry in objs) 1597 foreach (SceneObjectGroup entry in objs)
1548 entry.checkAtTargets(); 1598 entry.checkAtTargets();
@@ -1623,7 +1673,7 @@ namespace OpenSim.Region.Framework.Scenes
1623 msg.fromAgentName = "Server"; 1673 msg.fromAgentName = "Server";
1624 msg.dialog = (byte)19; // Object msg 1674 msg.dialog = (byte)19; // Object msg
1625 msg.fromGroup = false; 1675 msg.fromGroup = false;
1626 msg.offline = (byte)0; 1676 msg.offline = (byte)1;
1627 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; 1677 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
1628 msg.Position = Vector3.Zero; 1678 msg.Position = Vector3.Zero;
1629 msg.RegionID = RegionInfo.RegionID.Guid; 1679 msg.RegionID = RegionInfo.RegionID.Guid;
@@ -1861,14 +1911,24 @@ namespace OpenSim.Region.Framework.Scenes
1861 /// <returns></returns> 1911 /// <returns></returns>
1862 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 1912 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
1863 { 1913 {
1914
1915 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
1916 Vector3 wpos = Vector3.Zero;
1917 // Check for water surface intersection from above
1918 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
1919 {
1920 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
1921 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
1922 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
1923 wpos.Z = wheight;
1924 }
1925
1864 Vector3 pos = Vector3.Zero; 1926 Vector3 pos = Vector3.Zero;
1865 if (RayEndIsIntersection == (byte)1) 1927 if (RayEndIsIntersection == (byte)1)
1866 { 1928 {
1867 pos = RayEnd; 1929 pos = RayEnd;
1868 return pos;
1869 } 1930 }
1870 1931 else if (RayTargetID != UUID.Zero)
1871 if (RayTargetID != UUID.Zero)
1872 { 1932 {
1873 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 1933 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
1874 1934
@@ -1890,7 +1950,7 @@ namespace OpenSim.Region.Framework.Scenes
1890 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter); 1950 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
1891 1951
1892 // Un-comment out the following line to Get Raytrace results printed to the console. 1952 // Un-comment out the following line to Get Raytrace results printed to the console.
1893 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 1953 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
1894 float ScaleOffset = 0.5f; 1954 float ScaleOffset = 0.5f;
1895 1955
1896 // If we hit something 1956 // If we hit something
@@ -1913,13 +1973,10 @@ namespace OpenSim.Region.Framework.Scenes
1913 //pos.Z -= 0.25F; 1973 //pos.Z -= 0.25F;
1914 1974
1915 } 1975 }
1916
1917 return pos;
1918 } 1976 }
1919 else 1977 else
1920 { 1978 {
1921 // We don't have a target here, so we're going to raytrace all the objects in the scene. 1979 // We don't have a target here, so we're going to raytrace all the objects in the scene.
1922
1923 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 1980 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
1924 1981
1925 // Un-comment the following line to print the raytrace results to the console. 1982 // Un-comment the following line to print the raytrace results to the console.
@@ -1928,13 +1985,12 @@ namespace OpenSim.Region.Framework.Scenes
1928 if (ei.HitTF) 1985 if (ei.HitTF)
1929 { 1986 {
1930 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); 1987 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
1931 } else 1988 }
1989 else
1932 { 1990 {
1933 // fall back to our stupid functionality 1991 // fall back to our stupid functionality
1934 pos = RayEnd; 1992 pos = RayEnd;
1935 } 1993 }
1936
1937 return pos;
1938 } 1994 }
1939 } 1995 }
1940 else 1996 else
@@ -1945,8 +2001,12 @@ namespace OpenSim.Region.Framework.Scenes
1945 //increase height so its above the ground. 2001 //increase height so its above the ground.
1946 //should be getting the normal of the ground at the rez point and using that? 2002 //should be getting the normal of the ground at the rez point and using that?
1947 pos.Z += scale.Z / 2f; 2003 pos.Z += scale.Z / 2f;
1948 return pos; 2004// return pos;
1949 } 2005 }
2006
2007 // check against posible water intercept
2008 if (wpos.Z > pos.Z) pos = wpos;
2009 return pos;
1950 } 2010 }
1951 2011
1952 2012
@@ -2030,7 +2090,10 @@ namespace OpenSim.Region.Framework.Scenes
2030 public bool AddRestoredSceneObject( 2090 public bool AddRestoredSceneObject(
2031 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates) 2091 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
2032 { 2092 {
2033 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates); 2093 bool result = m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates);
2094 if (result)
2095 sceneObject.IsDeleted = false;
2096 return result;
2034 } 2097 }
2035 2098
2036 /// <summary> 2099 /// <summary>
@@ -2122,6 +2185,15 @@ namespace OpenSim.Region.Framework.Scenes
2122 /// </summary> 2185 /// </summary>
2123 public void DeleteAllSceneObjects() 2186 public void DeleteAllSceneObjects()
2124 { 2187 {
2188 DeleteAllSceneObjects(false);
2189 }
2190
2191 /// <summary>
2192 /// Delete every object from the scene. This does not include attachments worn by avatars.
2193 /// </summary>
2194 public void DeleteAllSceneObjects(bool exceptNoCopy)
2195 {
2196 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2125 lock (Entities) 2197 lock (Entities)
2126 { 2198 {
2127 EntityBase[] entities = Entities.GetEntities(); 2199 EntityBase[] entities = Entities.GetEntities();
@@ -2130,11 +2202,24 @@ namespace OpenSim.Region.Framework.Scenes
2130 if (e is SceneObjectGroup) 2202 if (e is SceneObjectGroup)
2131 { 2203 {
2132 SceneObjectGroup sog = (SceneObjectGroup)e; 2204 SceneObjectGroup sog = (SceneObjectGroup)e;
2133 if (!sog.IsAttachment) 2205 if (sog != null && !sog.IsAttachment)
2134 DeleteSceneObject((SceneObjectGroup)e, false); 2206 {
2207 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2208 {
2209 DeleteSceneObject((SceneObjectGroup)e, false);
2210 }
2211 else
2212 {
2213 toReturn.Add((SceneObjectGroup)e);
2214 }
2215 }
2135 } 2216 }
2136 } 2217 }
2137 } 2218 }
2219 if (toReturn.Count > 0)
2220 {
2221 returnObjects(toReturn.ToArray(), UUID.Zero);
2222 }
2138 } 2223 }
2139 2224
2140 /// <summary> 2225 /// <summary>
@@ -2175,6 +2260,8 @@ namespace OpenSim.Region.Framework.Scenes
2175 } 2260 }
2176 2261
2177 group.DeleteGroupFromScene(silent); 2262 group.DeleteGroupFromScene(silent);
2263 if (!silent)
2264 SendKillObject(new List<uint>() { group.LocalId });
2178 2265
2179// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2266// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2180 } 2267 }
@@ -2464,6 +2551,8 @@ namespace OpenSim.Region.Framework.Scenes
2464 2551
2465 if (newPosition != Vector3.Zero) 2552 if (newPosition != Vector3.Zero)
2466 newObject.RootPart.GroupPosition = newPosition; 2553 newObject.RootPart.GroupPosition = newPosition;
2554 if (newObject.RootPart.KeyframeMotion != null)
2555 newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
2467 2556
2468 if (!AddSceneObject(newObject)) 2557 if (!AddSceneObject(newObject))
2469 { 2558 {
@@ -2532,10 +2621,17 @@ namespace OpenSim.Region.Framework.Scenes
2532 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> 2621 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
2533 public bool AddSceneObject(SceneObjectGroup sceneObject) 2622 public bool AddSceneObject(SceneObjectGroup sceneObject)
2534 { 2623 {
2624 if (sceneObject.OwnerID == UUID.Zero)
2625 {
2626 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
2627 return false;
2628 }
2629
2535 // If the user is banned, we won't let any of their objects 2630 // If the user is banned, we won't let any of their objects
2536 // enter. Period. 2631 // enter. Period.
2537 // 2632 //
2538 if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) 2633 int flags = GetUserFlags(sceneObject.OwnerID);
2634 if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags))
2539 { 2635 {
2540 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID); 2636 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID);
2541 2637
@@ -2581,12 +2677,23 @@ namespace OpenSim.Region.Framework.Scenes
2581 } 2677 }
2582 else 2678 else
2583 { 2679 {
2680 m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
2584 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2681 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2585 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 2682 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2586 } 2683 }
2684 if (sceneObject.OwnerID == UUID.Zero)
2685 {
2686 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
2687 return false;
2688 }
2587 } 2689 }
2588 else 2690 else
2589 { 2691 {
2692 if (sceneObject.OwnerID == UUID.Zero)
2693 {
2694 m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
2695 return false;
2696 }
2590 AddRestoredSceneObject(sceneObject, true, false); 2697 AddRestoredSceneObject(sceneObject, true, false);
2591 2698
2592 if (!Permissions.CanObjectEntry(sceneObject.UUID, 2699 if (!Permissions.CanObjectEntry(sceneObject.UUID,
@@ -2615,6 +2722,24 @@ namespace OpenSim.Region.Framework.Scenes
2615 return 2; // StateSource.PrimCrossing 2722 return 2; // StateSource.PrimCrossing
2616 } 2723 }
2617 2724
2725 public int GetUserFlags(UUID user)
2726 {
2727 //Unfortunately the SP approach means that the value is cached until region is restarted
2728 /*
2729 ScenePresence sp;
2730 if (TryGetScenePresence(user, out sp))
2731 {
2732 return sp.UserFlags;
2733 }
2734 else
2735 {
2736 */
2737 UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user);
2738 if (uac == null)
2739 return 0;
2740 return uac.UserFlags;
2741 //}
2742 }
2618 #endregion 2743 #endregion
2619 2744
2620 #region Add/Remove Avatar Methods 2745 #region Add/Remove Avatar Methods
@@ -2628,7 +2753,7 @@ namespace OpenSim.Region.Framework.Scenes
2628 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 2753 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2629 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2754 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2630 2755
2631// CheckHeartbeat(); 2756 CheckHeartbeat();
2632 2757
2633 ScenePresence sp = GetScenePresence(client.AgentId); 2758 ScenePresence sp = GetScenePresence(client.AgentId);
2634 2759
@@ -2685,7 +2810,13 @@ namespace OpenSim.Region.Framework.Scenes
2685 2810
2686 EventManager.TriggerOnNewClient(client); 2811 EventManager.TriggerOnNewClient(client);
2687 if (vialogin) 2812 if (vialogin)
2813 {
2688 EventManager.TriggerOnClientLogin(client); 2814 EventManager.TriggerOnClientLogin(client);
2815 // Send initial parcel data
2816 Vector3 pos = sp.AbsolutePosition;
2817 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
2818 land.SendLandUpdateToClient(client);
2819 }
2689 2820
2690 return sp; 2821 return sp;
2691 } 2822 }
@@ -2775,19 +2906,12 @@ namespace OpenSim.Region.Framework.Scenes
2775 // and the scene presence and the client, if they exist 2906 // and the scene presence and the client, if they exist
2776 try 2907 try
2777 { 2908 {
2778 // We need to wait for the client to make UDP contact first. 2909 ScenePresence sp = GetScenePresence(agentID);
2779 // It's the UDP contact that creates the scene presence 2910 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2780 ScenePresence sp = WaitGetScenePresence(agentID); 2911
2781 if (sp != null) 2912 if (sp != null)
2782 {
2783 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
2784
2785 sp.ControllingClient.Close(); 2913 sp.ControllingClient.Close();
2786 } 2914
2787 else
2788 {
2789 m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID);
2790 }
2791 // BANG! SLASH! 2915 // BANG! SLASH!
2792 m_authenticateHandler.RemoveCircuit(agentID); 2916 m_authenticateHandler.RemoveCircuit(agentID);
2793 2917
@@ -2832,6 +2956,8 @@ namespace OpenSim.Region.Framework.Scenes
2832 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 2956 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
2833 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 2957 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
2834 2958
2959 client.onClientChangeObject += m_sceneGraph.ClientChangeObject;
2960
2835 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation; 2961 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation;
2836 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 2962 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
2837 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 2963 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
@@ -2888,6 +3014,7 @@ namespace OpenSim.Region.Framework.Scenes
2888 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory; 3014 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
2889 client.OnUpdateInventoryItem += UpdateInventoryItemAsset; 3015 client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
2890 client.OnCopyInventoryItem += CopyInventoryItem; 3016 client.OnCopyInventoryItem += CopyInventoryItem;
3017 client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
2891 client.OnMoveInventoryItem += MoveInventoryItem; 3018 client.OnMoveInventoryItem += MoveInventoryItem;
2892 client.OnRemoveInventoryItem += RemoveInventoryItem; 3019 client.OnRemoveInventoryItem += RemoveInventoryItem;
2893 client.OnRemoveInventoryFolder += RemoveInventoryFolder; 3020 client.OnRemoveInventoryFolder += RemoveInventoryFolder;
@@ -2959,6 +3086,8 @@ namespace OpenSim.Region.Framework.Scenes
2959 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition; 3086 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition;
2960 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; 3087 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
2961 3088
3089 client.onClientChangeObject -= m_sceneGraph.ClientChangeObject;
3090
2962 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3091 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation;
2963 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3092 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation;
2964 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; 3093 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
@@ -3061,15 +3190,16 @@ namespace OpenSim.Region.Framework.Scenes
3061 /// </summary> 3190 /// </summary>
3062 /// <param name="agentId">The avatar's Unique ID</param> 3191 /// <param name="agentId">The avatar's Unique ID</param>
3063 /// <param name="client">The IClientAPI for the client</param> 3192 /// <param name="client">The IClientAPI for the client</param>
3064 public virtual void TeleportClientHome(UUID agentId, IClientAPI client) 3193 public virtual bool TeleportClientHome(UUID agentId, IClientAPI client)
3065 { 3194 {
3066 if (m_teleportModule != null) 3195 if (m_teleportModule != null)
3067 m_teleportModule.TeleportHome(agentId, client); 3196 return m_teleportModule.TeleportHome(agentId, client);
3068 else 3197 else
3069 { 3198 {
3070 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); 3199 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active");
3071 client.SendTeleportFailed("Unable to perform teleports on this simulator."); 3200 client.SendTeleportFailed("Unable to perform teleports on this simulator.");
3072 } 3201 }
3202 return false;
3073 } 3203 }
3074 3204
3075 /// <summary> 3205 /// <summary>
@@ -3179,6 +3309,16 @@ namespace OpenSim.Region.Framework.Scenes
3179 /// <param name="flags"></param> 3309 /// <param name="flags"></param>
3180 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) 3310 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3181 { 3311 {
3312 //Add half the avatar's height so that the user doesn't fall through prims
3313 ScenePresence presence;
3314 if (TryGetScenePresence(remoteClient.AgentId, out presence))
3315 {
3316 if (presence.Appearance != null)
3317 {
3318 position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
3319 }
3320 }
3321
3182 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt)) 3322 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3183 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. 3323 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3184 m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); 3324 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
@@ -3247,8 +3387,9 @@ namespace OpenSim.Region.Framework.Scenes
3247 regions.Remove(RegionInfo.RegionHandle); 3387 regions.Remove(RegionInfo.RegionHandle);
3248 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3388 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions);
3249 } 3389 }
3250 3390 m_log.Debug("[Scene] Beginning ClientClosed");
3251 m_eventManager.TriggerClientClosed(agentID, this); 3391 m_eventManager.TriggerClientClosed(agentID, this);
3392 m_log.Debug("[Scene] Finished ClientClosed");
3252 } 3393 }
3253 catch (NullReferenceException) 3394 catch (NullReferenceException)
3254 { 3395 {
@@ -3310,9 +3451,10 @@ namespace OpenSim.Region.Framework.Scenes
3310 { 3451 {
3311 m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace); 3452 m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace);
3312 } 3453 }
3313 3454 m_log.Debug("[Scene] Done. Firing RemoveCircuit");
3314 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); 3455 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode);
3315// CleanDroppedAttachments(); 3456// CleanDroppedAttachments();
3457 m_log.Debug("[Scene] The avatar has left the building");
3316 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); 3458 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false));
3317 //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); 3459 //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true));
3318 } 3460 }
@@ -3434,13 +3576,16 @@ namespace OpenSim.Region.Framework.Scenes
3434 sp = null; 3576 sp = null;
3435 } 3577 }
3436 3578
3437 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3438 3579
3439 //On login test land permisions 3580 //On login test land permisions
3440 if (vialogin) 3581 if (vialogin)
3441 { 3582 {
3442 if (land != null && !TestLandRestrictions(agent, land, out reason)) 3583 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
3584 if (cache != null)
3585 cache.Remove(agent.firstname + " " + agent.lastname);
3586 if (!TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y))
3443 { 3587 {
3588 m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
3444 return false; 3589 return false;
3445 } 3590 }
3446 } 3591 }
@@ -3464,8 +3609,13 @@ namespace OpenSim.Region.Framework.Scenes
3464 3609
3465 try 3610 try
3466 { 3611 {
3467 if (!AuthorizeUser(agent, out reason)) 3612 // Always check estate if this is a login. Always
3468 return false; 3613 // check if banned regions are to be blacked out.
3614 if (vialogin || (!m_seeIntoBannedRegion))
3615 {
3616 if (!AuthorizeUser(agent, out reason))
3617 return false;
3618 }
3469 } 3619 }
3470 catch (Exception e) 3620 catch (Exception e)
3471 { 3621 {
@@ -3591,6 +3741,8 @@ namespace OpenSim.Region.Framework.Scenes
3591 } 3741 }
3592 3742
3593 // Honor parcel landing type and position. 3743 // Honor parcel landing type and position.
3744 /*
3745 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3594 if (land != null) 3746 if (land != null)
3595 { 3747 {
3596 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 3748 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -3598,26 +3750,34 @@ namespace OpenSim.Region.Framework.Scenes
3598 agent.startpos = land.LandData.UserLocation; 3750 agent.startpos = land.LandData.UserLocation;
3599 } 3751 }
3600 } 3752 }
3753 */// This is now handled properly in ScenePresence.MakeRootAgent
3601 } 3754 }
3602 3755
3603 return true; 3756 return true;
3604 } 3757 }
3605 3758
3606 private bool TestLandRestrictions(AgentCircuitData agent, ILandObject land, out string reason) 3759 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY)
3607 { 3760 {
3608 3761 reason = String.Empty;
3609 bool banned = land.IsBannedFromLand(agent.AgentID); 3762 if (Permissions.IsGod(agentID))
3610 bool restricted = land.IsRestrictedFromLand(agent.AgentID); 3763 return true;
3764
3765 ILandObject land = LandChannel.GetLandObject(posX, posY);
3766 if (land == null)
3767 return false;
3768
3769 bool banned = land.IsBannedFromLand(agentID);
3770 bool restricted = land.IsRestrictedFromLand(agentID);
3611 3771
3612 if (banned || restricted) 3772 if (banned || restricted)
3613 { 3773 {
3614 ILandObject nearestParcel = GetNearestAllowedParcel(agent.AgentID, agent.startpos.X, agent.startpos.Y); 3774 ILandObject nearestParcel = GetNearestAllowedParcel(agentID, posX, posY);
3615 if (nearestParcel != null) 3775 if (nearestParcel != null)
3616 { 3776 {
3617 //Move agent to nearest allowed 3777 //Move agent to nearest allowed
3618 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel); 3778 Vector3 newPosition = GetParcelCenterAtGround(nearestParcel);
3619 agent.startpos.X = newPosition.X; 3779 posX = newPosition.X;
3620 agent.startpos.Y = newPosition.Y; 3780 posY = newPosition.Y;
3621 } 3781 }
3622 else 3782 else
3623 { 3783 {
@@ -3679,7 +3839,7 @@ namespace OpenSim.Region.Framework.Scenes
3679 3839
3680 if (!m_strictAccessControl) return true; 3840 if (!m_strictAccessControl) return true;
3681 if (Permissions.IsGod(agent.AgentID)) return true; 3841 if (Permissions.IsGod(agent.AgentID)) return true;
3682 3842
3683 if (AuthorizationService != null) 3843 if (AuthorizationService != null)
3684 { 3844 {
3685 if (!AuthorizationService.IsAuthorizedForRegion( 3845 if (!AuthorizationService.IsAuthorizedForRegion(
@@ -3694,7 +3854,7 @@ namespace OpenSim.Region.Framework.Scenes
3694 3854
3695 if (m_regInfo.EstateSettings != null) 3855 if (m_regInfo.EstateSettings != null)
3696 { 3856 {
3697 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) 3857 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID,0))
3698 { 3858 {
3699 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 3859 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
3700 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 3860 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
@@ -3886,6 +4046,13 @@ namespace OpenSim.Region.Framework.Scenes
3886 4046
3887 // We have to wait until the viewer contacts this region after receiving EAC. 4047 // We have to wait until the viewer contacts this region after receiving EAC.
3888 // That calls AddNewClient, which finally creates the ScenePresence 4048 // That calls AddNewClient, which finally creates the ScenePresence
4049 int flags = GetUserFlags(cAgentData.AgentID);
4050 if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags))
4051 {
4052 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID);
4053 return false;
4054 }
4055
3889 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); 4056 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2);
3890 if (nearestParcel == null) 4057 if (nearestParcel == null)
3891 { 4058 {
@@ -3967,12 +4134,22 @@ namespace OpenSim.Region.Framework.Scenes
3967 return false; 4134 return false;
3968 } 4135 }
3969 4136
4137 public bool IncomingCloseAgent(UUID agentID)
4138 {
4139 return IncomingCloseAgent(agentID, false);
4140 }
4141
4142 public bool IncomingCloseChildAgent(UUID agentID)
4143 {
4144 return IncomingCloseAgent(agentID, true);
4145 }
4146
3970 /// <summary> 4147 /// <summary>
3971 /// Tell a single agent to disconnect from the region. 4148 /// Tell a single agent to disconnect from the region.
3972 /// </summary> 4149 /// </summary>
3973 /// <param name="regionHandle"></param>
3974 /// <param name="agentID"></param> 4150 /// <param name="agentID"></param>
3975 public bool IncomingCloseAgent(UUID agentID) 4151 /// <param name="childOnly"></param>
4152 public bool IncomingCloseAgent(UUID agentID, bool childOnly)
3976 { 4153 {
3977 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); 4154 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID);
3978 4155
@@ -3984,7 +4161,7 @@ namespace OpenSim.Region.Framework.Scenes
3984 { 4161 {
3985 m_sceneGraph.removeUserCount(false); 4162 m_sceneGraph.removeUserCount(false);
3986 } 4163 }
3987 else 4164 else if (!childOnly)
3988 { 4165 {
3989 m_sceneGraph.removeUserCount(true); 4166 m_sceneGraph.removeUserCount(true);
3990 } 4167 }
@@ -4000,9 +4177,12 @@ namespace OpenSim.Region.Framework.Scenes
4000 } 4177 }
4001 else 4178 else
4002 presence.ControllingClient.SendShutdownConnectionNotice(); 4179 presence.ControllingClient.SendShutdownConnectionNotice();
4180 presence.ControllingClient.Close(false);
4181 }
4182 else if (!childOnly)
4183 {
4184 presence.ControllingClient.Close(true);
4003 } 4185 }
4004
4005 presence.ControllingClient.Close();
4006 return true; 4186 return true;
4007 } 4187 }
4008 4188
@@ -4584,35 +4764,81 @@ namespace OpenSim.Region.Framework.Scenes
4584 SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID); 4764 SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID);
4585 } 4765 }
4586 4766
4587 public int GetHealth() 4767 public int GetHealth(out int flags, out string message)
4588 { 4768 {
4589 // Returns: 4769 // Returns:
4590 // 1 = sim is up and accepting http requests. The heartbeat has 4770 // 1 = sim is up and accepting http requests. The heartbeat has
4591 // stopped and the sim is probably locked up, but a remote 4771 // stopped and the sim is probably locked up, but a remote
4592 // admin restart may succeed 4772 // admin restart may succeed
4593 // 4773 //
4594 // 2 = Sim is up and the heartbeat is running. The sim is likely 4774 // 2 = Sim is up and the heartbeat is running. The sim is likely
4595 // usable for people within and logins _may_ work 4775 // usable for people within
4776 //
4777 // 3 = Sim is up and one packet thread is running. Sim is
4778 // unstable and will not accept new logins
4596 // 4779 //
4597 // 3 = We have seen a new user enter within the past 4 minutes 4780 // 4 = Sim is up and both packet threads are running. Sim is
4781 // likely usable
4782 //
4783 // 5 = We have seen a new user enter within the past 4 minutes
4598 // which can be seen as positive confirmation of sim health 4784 // which can be seen as positive confirmation of sim health
4599 // 4785 //
4786
4787 flags = 0;
4788 message = String.Empty;
4789
4790 CheckHeartbeat();
4791
4792 if (m_firstHeartbeat || (m_lastIncoming == 0 && m_lastOutgoing == 0))
4793 {
4794 // We're still starting
4795 // 0 means "in startup", it can't happen another way, since
4796 // to get here, we must be able to accept http connections
4797 return 0;
4798 }
4799
4600 int health=1; // Start at 1, means we're up 4800 int health=1; // Start at 1, means we're up
4601 4801
4602 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 4802 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
4603 health += 1; 4803 {
4804 health+=1;
4805 flags |= 1;
4806 }
4807
4808 if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
4809 {
4810 health+=1;
4811 flags |= 2;
4812 }
4813
4814 if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
4815 {
4816 health+=1;
4817 flags |= 4;
4818 }
4604 else 4819 else
4820 {
4821int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
4822System.Diagnostics.Process proc = new System.Diagnostics.Process();
4823proc.EnableRaisingEvents=false;
4824proc.StartInfo.FileName = "/bin/kill";
4825proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
4826proc.Start();
4827proc.WaitForExit();
4828Thread.Sleep(1000);
4829Environment.Exit(1);
4830 }
4831
4832 if (flags != 7)
4605 return health; 4833 return health;
4606 4834
4607 // A login in the last 4 mins? We can't be doing too badly 4835 // A login in the last 4 mins? We can't be doing too badly
4608 // 4836 //
4609 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 4837 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
4610 health++; 4838 health++;
4611 else 4839 else
4612 return health; 4840 return health;
4613 4841
4614// CheckHeartbeat();
4615
4616 return health; 4842 return health;
4617 } 4843 }
4618 4844
@@ -4700,7 +4926,7 @@ namespace OpenSim.Region.Framework.Scenes
4700 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); 4926 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
4701 if (wasUsingPhysics) 4927 if (wasUsingPhysics)
4702 { 4928 {
4703 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 4929 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
4704 } 4930 }
4705 } 4931 }
4706 4932
@@ -4799,14 +5025,14 @@ namespace OpenSim.Region.Framework.Scenes
4799 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 5025 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
4800 } 5026 }
4801 5027
4802// private void CheckHeartbeat() 5028 private void CheckHeartbeat()
4803// { 5029 {
4804// if (m_firstHeartbeat) 5030 if (m_firstHeartbeat)
4805// return; 5031 return;
4806// 5032
4807// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 5033 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
4808// StartTimer(); 5034 Start();
4809// } 5035 }
4810 5036
4811 public override ISceneObject DeserializeObject(string representation) 5037 public override ISceneObject DeserializeObject(string representation)
4812 { 5038 {
@@ -4818,9 +5044,14 @@ namespace OpenSim.Region.Framework.Scenes
4818 get { return m_allowScriptCrossings; } 5044 get { return m_allowScriptCrossings; }
4819 } 5045 }
4820 5046
4821 public Vector3? GetNearestAllowedPosition(ScenePresence avatar) 5047 public Vector3 GetNearestAllowedPosition(ScenePresence avatar)
5048 {
5049 return GetNearestAllowedPosition(avatar, null);
5050 }
5051
5052 public Vector3 GetNearestAllowedPosition(ScenePresence avatar, ILandObject excludeParcel)
4822 { 5053 {
4823 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); 5054 ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, excludeParcel);
4824 5055
4825 if (nearestParcel != null) 5056 if (nearestParcel != null)
4826 { 5057 {
@@ -4829,10 +5060,7 @@ namespace OpenSim.Region.Framework.Scenes
4829 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5060 Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
4830 if (nearestPoint != null) 5061 if (nearestPoint != null)
4831 { 5062 {
4832// m_log.DebugFormat( 5063 Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString());
4833// "[SCENE]: Found a sane previous position based on velocity for {0}, sending them to {1} in {2}",
4834// avatar.Name, nearestPoint, nearestParcel.LandData.Name);
4835
4836 return nearestPoint.Value; 5064 return nearestPoint.Value;
4837 } 5065 }
4838 5066
@@ -4842,17 +5070,20 @@ namespace OpenSim.Region.Framework.Scenes
4842 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); 5070 nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
4843 if (nearestPoint != null) 5071 if (nearestPoint != null)
4844 { 5072 {
4845// m_log.DebugFormat( 5073 Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString());
4846// "[SCENE]: {0} had a zero velocity, sending them to {1}", avatar.Name, nearestPoint);
4847
4848 return nearestPoint.Value; 5074 return nearestPoint.Value;
4849 } 5075 }
4850 5076
4851 //Ultimate backup if we have no idea where they are 5077 ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y);
4852// m_log.DebugFormat( 5078 if (dest != excludeParcel)
4853// "[SCENE]: No idea where {0} is, sending them to {1}", avatar.Name, avatar.lastKnownAllowedPosition); 5079 {
5080 // Ultimate backup if we have no idea where they are and
5081 // the last allowed position was in another parcel
5082 Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString());
5083 return avatar.lastKnownAllowedPosition;
5084 }
4854 5085
4855 return avatar.lastKnownAllowedPosition; 5086 // else fall through to region edge
4856 } 5087 }
4857 5088
4858 //Go to the edge, this happens in teleporting to a region with no available parcels 5089 //Go to the edge, this happens in teleporting to a region with no available parcels
@@ -4886,13 +5117,18 @@ namespace OpenSim.Region.Framework.Scenes
4886 5117
4887 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y) 5118 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y)
4888 { 5119 {
5120 return GetNearestAllowedParcel(avatarId, x, y, null);
5121 }
5122
5123 public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y, ILandObject excludeParcel)
5124 {
4889 List<ILandObject> all = AllParcels(); 5125 List<ILandObject> all = AllParcels();
4890 float minParcelDistance = float.MaxValue; 5126 float minParcelDistance = float.MaxValue;
4891 ILandObject nearestParcel = null; 5127 ILandObject nearestParcel = null;
4892 5128
4893 foreach (var parcel in all) 5129 foreach (var parcel in all)
4894 { 5130 {
4895 if (!parcel.IsEitherBannedOrRestricted(avatarId)) 5131 if (!parcel.IsEitherBannedOrRestricted(avatarId) && parcel != excludeParcel)
4896 { 5132 {
4897 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y); 5133 float parcelDistance = GetParcelDistancefromPoint(parcel, x, y);
4898 if (parcelDistance < minParcelDistance) 5134 if (parcelDistance < minParcelDistance)
@@ -5134,7 +5370,55 @@ namespace OpenSim.Region.Framework.Scenes
5134 mapModule.GenerateMaptile(); 5370 mapModule.GenerateMaptile();
5135 } 5371 }
5136 5372
5137 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 5373// public void CleanDroppedAttachments()
5374// {
5375// List<SceneObjectGroup> objectsToDelete =
5376// new List<SceneObjectGroup>();
5377//
5378// lock (m_cleaningAttachments)
5379// {
5380// ForEachSOG(delegate (SceneObjectGroup grp)
5381// {
5382// if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
5383// {
5384// UUID agentID = grp.OwnerID;
5385// if (agentID == UUID.Zero)
5386// {
5387// objectsToDelete.Add(grp);
5388// return;
5389// }
5390//
5391// ScenePresence sp = GetScenePresence(agentID);
5392// if (sp == null)
5393// {
5394// objectsToDelete.Add(grp);
5395// return;
5396// }
5397// }
5398// });
5399// }
5400//
5401// foreach (SceneObjectGroup grp in objectsToDelete)
5402// {
5403// m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
5404// DeleteSceneObject(grp, true);
5405// }
5406// }
5407
5408 public void ThreadAlive(int threadCode)
5409 {
5410 switch(threadCode)
5411 {
5412 case 1: // Incoming
5413 m_lastIncoming = Util.EnvironmentTickCount();
5414 break;
5415 case 2: // Incoming
5416 m_lastOutgoing = Util.EnvironmentTickCount();
5417 break;
5418 }
5419 }
5420
5421 public void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5138 { 5422 {
5139 RegenerateMaptile(); 5423 RegenerateMaptile();
5140 5424
@@ -5153,6 +5437,14 @@ namespace OpenSim.Region.Framework.Scenes
5153 // child agent creation, thereby emulating the SL behavior. 5437 // child agent creation, thereby emulating the SL behavior.
5154 public bool QueryAccess(UUID agentID, Vector3 position, out string reason) 5438 public bool QueryAccess(UUID agentID, Vector3 position, out string reason)
5155 { 5439 {
5440 reason = "You are banned from the region";
5441
5442 if (Permissions.IsGod(agentID))
5443 {
5444 reason = String.Empty;
5445 return true;
5446 }
5447
5156 int num = m_sceneGraph.GetNumberOfScenePresences(); 5448 int num = m_sceneGraph.GetNumberOfScenePresences();
5157 5449
5158 if (num >= RegionInfo.RegionSettings.AgentLimit) 5450 if (num >= RegionInfo.RegionSettings.AgentLimit)
@@ -5164,6 +5456,41 @@ namespace OpenSim.Region.Framework.Scenes
5164 } 5456 }
5165 } 5457 }
5166 5458
5459 ScenePresence presence = GetScenePresence(agentID);
5460 IClientAPI client = null;
5461 AgentCircuitData aCircuit = null;
5462
5463 if (presence != null)
5464 {
5465 client = presence.ControllingClient;
5466 if (client != null)
5467 aCircuit = client.RequestClientInfo();
5468 }
5469
5470 // We may be called before there is a presence or a client.
5471 // Fake AgentCircuitData to keep IAuthorizationModule smiling
5472 if (client == null)
5473 {
5474 aCircuit = new AgentCircuitData();
5475 aCircuit.AgentID = agentID;
5476 aCircuit.firstname = String.Empty;
5477 aCircuit.lastname = String.Empty;
5478 }
5479
5480 try
5481 {
5482 if (!AuthorizeUser(aCircuit, out reason))
5483 {
5484 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5485 return false;
5486 }
5487 }
5488 catch (Exception e)
5489 {
5490 m_log.DebugFormat("[SCENE]: Exception authorizing agent: {0} "+ e.StackTrace, e.Message);
5491 return false;
5492 }
5493
5167 if (position == Vector3.Zero) // Teleport 5494 if (position == Vector3.Zero) // Teleport
5168 { 5495 {
5169 if (!RegionInfo.EstateSettings.AllowDirectTeleport) 5496 if (!RegionInfo.EstateSettings.AllowDirectTeleport)
@@ -5192,13 +5519,46 @@ namespace OpenSim.Region.Framework.Scenes
5192 } 5519 }
5193 } 5520 }
5194 } 5521 }
5522
5523 float posX = 128.0f;
5524 float posY = 128.0f;
5525
5526 if (!TestLandRestrictions(agentID, out reason, ref posX, ref posY))
5527 {
5528 // m_log.DebugFormat("[SCENE]: Denying {0} because they are banned on all parcels", agentID);
5529 return false;
5530 }
5531 }
5532 else // Walking
5533 {
5534 ILandObject land = LandChannel.GetLandObject(position.X, position.Y);
5535 if (land == null)
5536 return false;
5537
5538 bool banned = land.IsBannedFromLand(agentID);
5539 bool restricted = land.IsRestrictedFromLand(agentID);
5540
5541 if (banned || restricted)
5542 return false;
5195 } 5543 }
5196 5544
5197 reason = String.Empty; 5545 reason = String.Empty;
5198 return true; 5546 return true;
5199 } 5547 }
5200 5548
5201 /// <summary> 5549 public void StartTimerWatchdog()
5550 {
5551 m_timerWatchdog.Interval = 1000;
5552 m_timerWatchdog.Elapsed += TimerWatchdog;
5553 m_timerWatchdog.AutoReset = true;
5554 m_timerWatchdog.Start();
5555 }
5556
5557 public void TimerWatchdog(object sender, ElapsedEventArgs e)
5558 {
5559 CheckHeartbeat();
5560 }
5561
5202 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the 5562 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
5203 /// autopilot that moves an avatar to a sit target!. 5563 /// autopilot that moves an avatar to a sit target!.
5204 /// </summary> 5564 /// </summary>