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.cs139
1 files changed, 113 insertions, 26 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index b0f4ac0..daad3d2 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -149,6 +149,20 @@ namespace OpenSim.Region.Framework.Scenes
149 149
150 public IXfer XferManager; 150 public IXfer XferManager;
151 151
152 protected ISnmpModule m_snmpService = null;
153 public ISnmpModule SnmpService
154 {
155 get
156 {
157 if (m_snmpService == null)
158 {
159 m_snmpService = RequestModuleInterface<ISnmpModule>();
160 }
161
162 return m_snmpService;
163 }
164 }
165
152 protected IAssetService m_AssetService; 166 protected IAssetService m_AssetService;
153 protected IAuthorizationService m_AuthorizationService; 167 protected IAuthorizationService m_AuthorizationService;
154 168
@@ -607,6 +621,8 @@ namespace OpenSim.Region.Framework.Scenes
607 621
608 // Load region settings 622 // Load region settings
609 m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID); 623 m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID);
624 m_regInfo.WindlightSettings = m_storageManager.DataStore.LoadRegionWindlightSettings(m_regInfo.RegionID);
625
610 if (m_storageManager.EstateDataStore != null) 626 if (m_storageManager.EstateDataStore != null)
611 { 627 {
612 m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false); 628 m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false);
@@ -709,7 +725,7 @@ namespace OpenSim.Region.Framework.Scenes
709 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); 725 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
710 // TODO: Change default to true once the feature is supported 726 // TODO: Change default to true once the feature is supported
711 m_usePreJump = startupConfig.GetBoolean("enableprejump", false); 727 m_usePreJump = startupConfig.GetBoolean("enableprejump", false);
712 728 m_usePreJump = true; // Above line fails!?
713 m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); 729 m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys);
714 if (RegionInfo.NonphysPrimMax > 0) 730 if (RegionInfo.NonphysPrimMax > 0)
715 { 731 {
@@ -1023,6 +1039,15 @@ namespace OpenSim.Region.Framework.Scenes
1023 /// <param name="seconds">float indicating duration before restart.</param> 1039 /// <param name="seconds">float indicating duration before restart.</param>
1024 public virtual void Restart(float seconds) 1040 public virtual void Restart(float seconds)
1025 { 1041 {
1042 Restart(seconds, true);
1043 }
1044
1045 /// <summary>
1046 /// Given float seconds, this will restart the region. showDialog will optionally alert the users.
1047 /// </summary>
1048 /// <param name="seconds">float indicating duration before restart.</param>
1049 public virtual void Restart(float seconds, bool showDialog)
1050 {
1026 // notifications are done in 15 second increments 1051 // notifications are done in 15 second increments
1027 // so .. if the number of seconds is less then 15 seconds, it's not really a restart request 1052 // so .. if the number of seconds is less then 15 seconds, it's not really a restart request
1028 // It's a 'Cancel restart' request. 1053 // It's a 'Cancel restart' request.
@@ -1043,8 +1068,11 @@ namespace OpenSim.Region.Framework.Scenes
1043 m_restartTimer.Elapsed += new ElapsedEventHandler(RestartTimer_Elapsed); 1068 m_restartTimer.Elapsed += new ElapsedEventHandler(RestartTimer_Elapsed);
1044 m_log.Info("[REGION]: Restarting Region in " + (seconds / 60) + " minutes"); 1069 m_log.Info("[REGION]: Restarting Region in " + (seconds / 60) + " minutes");
1045 m_restartTimer.Start(); 1070 m_restartTimer.Start();
1046 m_dialogModule.SendNotificationToUsersInRegion( 1071 if (showDialog)
1072 {
1073 m_dialogModule.SendNotificationToUsersInRegion(
1047 UUID.Random(), String.Empty, RegionInfo.RegionName + String.Format(": Restarting in {0} Minutes", (int)(seconds / 60.0))); 1074 UUID.Random(), String.Empty, RegionInfo.RegionName + String.Format(": Restarting in {0} Minutes", (int)(seconds / 60.0)));
1075 }
1048 } 1076 }
1049 } 1077 }
1050 1078
@@ -1402,16 +1430,16 @@ namespace OpenSim.Region.Framework.Scenes
1402 // Check if any objects have reached their targets 1430 // Check if any objects have reached their targets
1403 CheckAtTargets(); 1431 CheckAtTargets();
1404 1432
1405 // Update SceneObjectGroups that have scheduled themselves for updates
1406 // Objects queue their updates onto all scene presences
1407 if (m_frame % m_update_objects == 0)
1408 m_sceneGraph.UpdateObjectGroups();
1409
1410 // Run through all ScenePresences looking for updates 1433 // Run through all ScenePresences looking for updates
1411 // Presence updates and queued object updates for each presence are sent to clients 1434 // Presence updates and queued object updates for each presence are sent to clients
1412 if (m_frame % m_update_presences == 0) 1435 if (m_frame % m_update_presences == 0)
1413 m_sceneGraph.UpdatePresences(); 1436 m_sceneGraph.UpdatePresences();
1414 1437
1438 // Update SceneObjectGroups that have scheduled themselves for updates
1439 // Objects queue their updates onto all scene presences
1440 if (m_frame % m_update_objects == 0)
1441 m_sceneGraph.UpdateObjectGroups();
1442
1415 if (m_frame % m_update_coarse_locations == 0) 1443 if (m_frame % m_update_coarse_locations == 0)
1416 { 1444 {
1417 List<Vector3> coarseLocations; 1445 List<Vector3> coarseLocations;
@@ -1740,6 +1768,7 @@ namespace OpenSim.Region.Framework.Scenes
1740 public void StoreWindlightProfile(RegionLightShareData wl) 1768 public void StoreWindlightProfile(RegionLightShareData wl)
1741 { 1769 {
1742 m_regInfo.WindlightSettings = wl; 1770 m_regInfo.WindlightSettings = wl;
1771 wl.Save();
1743 m_storageManager.DataStore.StoreRegionWindlightSettings(wl); 1772 m_storageManager.DataStore.StoreRegionWindlightSettings(wl);
1744 m_eventManager.TriggerOnSaveNewWindlightProfile(); 1773 m_eventManager.TriggerOnSaveNewWindlightProfile();
1745 } 1774 }
@@ -1918,14 +1947,24 @@ namespace OpenSim.Region.Framework.Scenes
1918 /// <returns></returns> 1947 /// <returns></returns>
1919 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 1948 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
1920 { 1949 {
1950
1951 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
1952 Vector3 wpos = Vector3.Zero;
1953 // Check for water surface intersection from above
1954 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
1955 {
1956 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
1957 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
1958 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
1959 wpos.Z = wheight;
1960 }
1961
1921 Vector3 pos = Vector3.Zero; 1962 Vector3 pos = Vector3.Zero;
1922 if (RayEndIsIntersection == (byte)1) 1963 if (RayEndIsIntersection == (byte)1)
1923 { 1964 {
1924 pos = RayEnd; 1965 pos = RayEnd;
1925 return pos;
1926 } 1966 }
1927 1967 else if (RayTargetID != UUID.Zero)
1928 if (RayTargetID != UUID.Zero)
1929 { 1968 {
1930 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 1969 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
1931 1970
@@ -1947,7 +1986,7 @@ namespace OpenSim.Region.Framework.Scenes
1947 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter); 1986 EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
1948 1987
1949 // Un-comment out the following line to Get Raytrace results printed to the console. 1988 // Un-comment out the following line to Get Raytrace results printed to the console.
1950 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 1989 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
1951 float ScaleOffset = 0.5f; 1990 float ScaleOffset = 0.5f;
1952 1991
1953 // If we hit something 1992 // If we hit something
@@ -1970,13 +2009,10 @@ namespace OpenSim.Region.Framework.Scenes
1970 //pos.Z -= 0.25F; 2009 //pos.Z -= 0.25F;
1971 2010
1972 } 2011 }
1973
1974 return pos;
1975 } 2012 }
1976 else 2013 else
1977 { 2014 {
1978 // We don't have a target here, so we're going to raytrace all the objects in the scene. 2015 // We don't have a target here, so we're going to raytrace all the objects in the scene.
1979
1980 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 2016 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
1981 2017
1982 // Un-comment the following line to print the raytrace results to the console. 2018 // Un-comment the following line to print the raytrace results to the console.
@@ -1985,13 +2021,12 @@ namespace OpenSim.Region.Framework.Scenes
1985 if (ei.HitTF) 2021 if (ei.HitTF)
1986 { 2022 {
1987 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z); 2023 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
1988 } else 2024 }
2025 else
1989 { 2026 {
1990 // fall back to our stupid functionality 2027 // fall back to our stupid functionality
1991 pos = RayEnd; 2028 pos = RayEnd;
1992 } 2029 }
1993
1994 return pos;
1995 } 2030 }
1996 } 2031 }
1997 else 2032 else
@@ -2002,8 +2037,12 @@ namespace OpenSim.Region.Framework.Scenes
2002 //increase height so its above the ground. 2037 //increase height so its above the ground.
2003 //should be getting the normal of the ground at the rez point and using that? 2038 //should be getting the normal of the ground at the rez point and using that?
2004 pos.Z += scale.Z / 2f; 2039 pos.Z += scale.Z / 2f;
2005 return pos; 2040// return pos;
2006 } 2041 }
2042
2043 // check against posible water intercept
2044 if (wpos.Z > pos.Z) pos = wpos;
2045 return pos;
2007 } 2046 }
2008 2047
2009 2048
@@ -2136,13 +2175,22 @@ namespace OpenSim.Region.Framework.Scenes
2136 public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) 2175 public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
2137 { 2176 {
2138 return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates); 2177 return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates);
2139 } 2178 }
2140 2179
2141 /// <summary> 2180 /// <summary>
2142 /// Delete every object from the scene. This does not include attachments worn by avatars. 2181 /// Delete every object from the scene. This does not include attachments worn by avatars.
2143 /// </summary> 2182 /// </summary>
2144 public void DeleteAllSceneObjects() 2183 public void DeleteAllSceneObjects()
2145 { 2184 {
2185 DeleteAllSceneObjects(false);
2186 }
2187
2188 /// <summary>
2189 /// Delete every object from the scene. This does not include attachments worn by avatars.
2190 /// </summary>
2191 public void DeleteAllSceneObjects(bool exceptNoCopy)
2192 {
2193 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2146 lock (Entities) 2194 lock (Entities)
2147 { 2195 {
2148 ICollection<EntityBase> entities = new List<EntityBase>(Entities); 2196 ICollection<EntityBase> entities = new List<EntityBase>(Entities);
@@ -2152,11 +2200,24 @@ namespace OpenSim.Region.Framework.Scenes
2152 if (e is SceneObjectGroup) 2200 if (e is SceneObjectGroup)
2153 { 2201 {
2154 SceneObjectGroup sog = (SceneObjectGroup)e; 2202 SceneObjectGroup sog = (SceneObjectGroup)e;
2155 if (!sog.IsAttachment) 2203 if (sog != null && !sog.IsAttachment)
2156 DeleteSceneObject((SceneObjectGroup)e, false); 2204 {
2205 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2206 {
2207 DeleteSceneObject((SceneObjectGroup)e, false);
2208 }
2209 else
2210 {
2211 toReturn.Add((SceneObjectGroup)e);
2212 }
2213 }
2157 } 2214 }
2158 } 2215 }
2159 } 2216 }
2217 if (toReturn.Count > 0)
2218 {
2219 returnObjects(toReturn.ToArray(), UUID.Zero);
2220 }
2160 } 2221 }
2161 2222
2162 /// <summary> 2223 /// <summary>
@@ -3194,6 +3255,16 @@ namespace OpenSim.Region.Framework.Scenes
3194 /// <param name="flags"></param> 3255 /// <param name="flags"></param>
3195 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) 3256 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3196 { 3257 {
3258 //Add half the avatar's height so that the user doesn't fall through prims
3259 ScenePresence presence;
3260 if (TryGetScenePresence(remoteClient.AgentId, out presence))
3261 {
3262 if (presence.Appearance != null)
3263 {
3264 position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
3265 }
3266 }
3267
3197 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt)) 3268 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3198 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. 3269 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3199 m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); 3270 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
@@ -3581,6 +3652,8 @@ namespace OpenSim.Region.Framework.Scenes
3581 } 3652 }
3582 } 3653 }
3583 // Honor parcel landing type and position. 3654 // Honor parcel landing type and position.
3655 /*
3656 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3584 if (land != null) 3657 if (land != null)
3585 { 3658 {
3586 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 3659 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -3588,6 +3661,7 @@ namespace OpenSim.Region.Framework.Scenes
3588 agent.startpos = land.LandData.UserLocation; 3661 agent.startpos = land.LandData.UserLocation;
3589 } 3662 }
3590 } 3663 }
3664 */// This is now handled properly in ScenePresence.MakeRootAgent
3591 } 3665 }
3592 3666
3593 return true; 3667 return true;
@@ -3950,12 +4024,22 @@ namespace OpenSim.Region.Framework.Scenes
3950 return false; 4024 return false;
3951 } 4025 }
3952 4026
4027 public bool IncomingCloseAgent(UUID agentID)
4028 {
4029 return IncomingCloseAgent(agentID, false);
4030 }
4031
4032 public bool IncomingCloseChildAgent(UUID agentID)
4033 {
4034 return IncomingCloseAgent(agentID, true);
4035 }
4036
3953 /// <summary> 4037 /// <summary>
3954 /// Tell a single agent to disconnect from the region. 4038 /// Tell a single agent to disconnect from the region.
3955 /// </summary> 4039 /// </summary>
3956 /// <param name="regionHandle"></param>
3957 /// <param name="agentID"></param> 4040 /// <param name="agentID"></param>
3958 public bool IncomingCloseAgent(UUID agentID) 4041 /// <param name="childOnly"></param>
4042 public bool IncomingCloseAgent(UUID agentID, bool childOnly)
3959 { 4043 {
3960 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); 4044 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID);
3961 4045
@@ -3967,7 +4051,7 @@ namespace OpenSim.Region.Framework.Scenes
3967 { 4051 {
3968 m_sceneGraph.removeUserCount(false); 4052 m_sceneGraph.removeUserCount(false);
3969 } 4053 }
3970 else 4054 else if (!childOnly)
3971 { 4055 {
3972 m_sceneGraph.removeUserCount(true); 4056 m_sceneGraph.removeUserCount(true);
3973 } 4057 }
@@ -3983,9 +4067,12 @@ namespace OpenSim.Region.Framework.Scenes
3983 } 4067 }
3984 else 4068 else
3985 presence.ControllingClient.SendShutdownConnectionNotice(); 4069 presence.ControllingClient.SendShutdownConnectionNotice();
4070 presence.ControllingClient.Close(false);
4071 }
4072 else if (!childOnly)
4073 {
4074 presence.ControllingClient.Close(true);
3986 } 4075 }
3987
3988 presence.ControllingClient.Close();
3989 return true; 4076 return true;
3990 } 4077 }
3991 4078