Added new ForEachRootScenePresence to Scene since almost every delegate passed to ForEachScenePresence checks for !IsChildAgent first. It consolidates child and root handling for coming refactors.
							parent
							
								
									40bee97015
								
							
						
					
					
						commit
						b98613091c
					
				|  | @ -279,12 +279,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
| 
 | ||||
|             HashSet<UUID> receiverIDs = new HashSet<UUID>(); | ||||
|              | ||||
|             ((Scene)c.Scene).ForEachScenePresence( | ||||
|             ((Scene)c.Scene).ForEachRootScenePresence( | ||||
|                 delegate(ScenePresence presence) | ||||
|                 {    | ||||
|                     // ignore chat from child agents | ||||
|                     if (presence.IsChildAgent) return; | ||||
|                      | ||||
|                     IClientAPI client = presence.ControllingClient; | ||||
|                      | ||||
|                     // don't forward SayOwner chat from objects to | ||||
|  |  | |||
|  | @ -140,10 +140,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
|                             // This is a bit crude. It seems the client will be null before it actually stops the thread | ||||
|                             // The thread will kill itself eventually :/ | ||||
|                             // Is there another way to make sure *all* clients get this 'inter region' message? | ||||
|                             m_scene.ForEachScenePresence( | ||||
|                             m_scene.ForEachRootScenePresence( | ||||
|                                 delegate(ScenePresence p) | ||||
|                                 { | ||||
|                                     if (p.UUID != godID && !p.IsChildAgent) | ||||
|                                     if (p.UUID != godID) | ||||
|                                     { | ||||
|                                         // Possibly this should really be p.Close() though that method doesn't send a close | ||||
|                                         // to the client | ||||
|  |  | |||
|  | @ -658,17 +658,15 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
|             if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) | ||||
|                 return; | ||||
| 
 | ||||
|             Scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             Scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (sp.UUID != senderID) | ||||
|                 { | ||||
|                     ScenePresence p = Scene.GetScenePresence(sp.UUID); | ||||
|                     // make sure they are still there, we could be working down a long list | ||||
|                     // Also make sure they are actually in the region | ||||
|                     if (p != null && !p.IsChildAgent) | ||||
|                     { | ||||
|                     ScenePresence p; | ||||
|                     if(Scene.TryGetScenePresence(sp.UUID, out p)) | ||||
|                         Scene.TeleportClientHome(p.UUID, p.ControllingClient); | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | @ -929,10 +927,9 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
| 
 | ||||
|         public void sendRegionInfoPacketToAll() | ||||
|         { | ||||
|             Scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             Scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (!sp.IsChildAgent) | ||||
|                     HandleRegionInfoRequest(sp.ControllingClient); | ||||
|                 HandleRegionInfoRequest(sp.ControllingClient); | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -476,11 +476,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
| 
 | ||||
|         public void SendLandUpdateToAvatarsOverMe(bool snap_selection) | ||||
|         { | ||||
|             m_scene.ForEachScenePresence(delegate(ScenePresence avatar) | ||||
|             m_scene.ForEachRootScenePresence(delegate(ScenePresence avatar) | ||||
|             { | ||||
|                 if (avatar.IsChildAgent) | ||||
|                     return; | ||||
| 
 | ||||
|                 ILandObject over = null; | ||||
|                 try | ||||
|                 { | ||||
|  |  | |||
|  | @ -70,11 +70,8 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
| 
 | ||||
|             SceneObjectGroup grp = part.ParentGroup; | ||||
| 
 | ||||
|             m_scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (sp.IsChildAgent) | ||||
|                     return; | ||||
| 
 | ||||
|                 double dis = Util.GetDistanceTo(sp.AbsolutePosition, position); | ||||
|                 if (dis > 100.0) // Max audio distance | ||||
|                     return; | ||||
|  | @ -122,11 +119,8 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             m_scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (sp.IsChildAgent) | ||||
|                     return; | ||||
| 
 | ||||
|                 double dis = Util.GetDistanceTo(sp.AbsolutePosition, position); | ||||
|                 if (dis > 100.0) // Max audio distance | ||||
|                     return; | ||||
|  |  | |||
|  | @ -488,12 +488,9 @@ namespace OpenSim.Region.CoreModules | |||
| 
 | ||||
|         private void SunUpdateToAllClients() | ||||
|         { | ||||
|             m_scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (!sp.IsChildAgent) | ||||
|                 { | ||||
|                     SunToClient(sp.ControllingClient); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -435,10 +435,9 @@ namespace OpenSim.Region.CoreModules | |||
|                         m_frameLastUpdateClientArray = m_frame; | ||||
|                     } | ||||
| 
 | ||||
|                     m_scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|                     m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|                     { | ||||
|                         if (!sp.IsChildAgent) | ||||
|                             sp.ControllingClient.SendWindData(windSpeeds); | ||||
|                         sp.ControllingClient.SendWindData(windSpeeds); | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -401,10 +401,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         m_scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|                         m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|                         { | ||||
|                             // Don't send a green dot for yourself | ||||
|                             if (!sp.IsChildAgent && sp.UUID != remoteClient.AgentId) | ||||
|                             if (sp.UUID != remoteClient.AgentId) | ||||
|                             { | ||||
|                                 mapitem = new mapItemReply(); | ||||
|                                 mapitem.x = (uint)(xstart + sp.AbsolutePosition.X); | ||||
|  |  | |||
|  | @ -893,22 +893,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|                     try | ||||
|                     { | ||||
|                         ForEachScenePresence(delegate(ScenePresence agent) | ||||
|                                              { | ||||
|                                                  // If agent is a root agent. | ||||
|                                                  if (!agent.IsChildAgent) | ||||
|                                                  { | ||||
|                                                      //agent.ControllingClient.new | ||||
|                                                      //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); | ||||
|                         ForEachRootScenePresence(delegate(ScenePresence agent) | ||||
|                             { | ||||
|                                 //agent.ControllingClient.new | ||||
|                                 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); | ||||
| 
 | ||||
|                                                      List<ulong> old = new List<ulong>(); | ||||
|                                                      old.Add(otherRegion.RegionHandle); | ||||
|                                                      agent.DropOldNeighbours(old); | ||||
|                                                      if (m_teleportModule != null) | ||||
|                                                          m_teleportModule.EnableChildAgent(agent, otherRegion); | ||||
|                                                  } | ||||
|                                              } | ||||
|                             ); | ||||
|                                 List<ulong> old = new List<ulong>(); | ||||
|                                 old.Add(otherRegion.RegionHandle); | ||||
|                                 agent.DropOldNeighbours(old); | ||||
|                                 if (m_teleportModule != null) | ||||
|                                     m_teleportModule.EnableChildAgent(agent, otherRegion); | ||||
|                             }); | ||||
|                     } | ||||
|                     catch (NullReferenceException) | ||||
|                     { | ||||
|  | @ -1043,16 +1038,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                     GridRegion r = new GridRegion(region); | ||||
|                     try | ||||
|                     { | ||||
|                         ForEachScenePresence(delegate(ScenePresence agent) | ||||
|                                              { | ||||
|                                                  // If agent is a root agent. | ||||
|                                                  if (!agent.IsChildAgent) | ||||
|                                                  { | ||||
|                                                      if (m_teleportModule != null) | ||||
|                                                          m_teleportModule.EnableChildAgent(agent, r); | ||||
|                                                  } | ||||
|                                              } | ||||
|                             ); | ||||
|                         ForEachRootScenePresence(delegate(ScenePresence agent) | ||||
|                             { | ||||
|                                 if (m_teleportModule != null) | ||||
|                                         m_teleportModule.EnableChildAgent(agent, r); | ||||
|                             }); | ||||
|                     } | ||||
|                     catch (NullReferenceException) | ||||
|                     { | ||||
|  | @ -1456,11 +1446,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// <param name="stats">Stats on the Simulator's performance</param> | ||||
|         private void SendSimStatsPackets(SimStats stats) | ||||
|         { | ||||
|             ForEachScenePresence( | ||||
|             ForEachRootScenePresence( | ||||
|                 delegate(ScenePresence agent) | ||||
|                 { | ||||
|                     if (!agent.IsChildAgent) | ||||
|                         agent.ControllingClient.SendSimStats(stats); | ||||
|                     agent.ControllingClient.SendSimStats(stats); | ||||
|                 } | ||||
|             ); | ||||
|         } | ||||
|  | @ -4289,6 +4278,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             return cp.IsChildAgent; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Performs action on all ROOT (not child) scene presences. | ||||
|         /// This is just a shortcut function since frequently actions only appy to root SPs | ||||
|         /// </summary> | ||||
|         /// <param name="action"></param> | ||||
|         public void ForEachRootScenePresence(Action<ScenePresence> action) | ||||
|         { | ||||
|             if(m_sceneGraph != null) | ||||
|             { | ||||
|                 m_sceneGraph.ForEachRootScenePresence(action); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Performs action on all scene presences. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -1191,6 +1191,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Performs action on all ROOT (not child) scene presences. | ||||
|         /// This is just a shortcut function since frequently actions only appy to root SPs | ||||
|         /// </summary> | ||||
|         /// <param name="action"></param> | ||||
|         public void ForEachRootScenePresence(Action<ScenePresence> action) | ||||
|         { | ||||
|             ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (!sp.IsChildAgent) | ||||
|                     action(sp); | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Performs action on all scene presences. This can ultimately run the actions in parallel but | ||||
|         /// any delegates passed in will need to implement their own locking on data they reference and | ||||
|  |  | |||
|  | @ -458,9 +458,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             ForEachCurrentScene( | ||||
|                 delegate(Scene scene) | ||||
|                 { | ||||
|                     scene.ForEachScenePresence(delegate(ScenePresence scenePresence) | ||||
|                     scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | ||||
|                     { | ||||
|                         if (!scenePresence.IsChildAgent && (name == null || scenePresence.Name == name)) | ||||
|                         if (name == null || scenePresence.Name == name) | ||||
|                         { | ||||
|                             m_log.DebugFormat("Packet debug for {0} {1} set to {2}", | ||||
|                                               scenePresence.Firstname, | ||||
|  | @ -481,10 +481,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             ForEachCurrentScene( | ||||
|                 delegate(Scene scene) | ||||
|                 { | ||||
|                     scene.ForEachScenePresence(delegate(ScenePresence scenePresence) | ||||
|                     scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | ||||
|                     { | ||||
|                         if (!scenePresence.IsChildAgent) | ||||
|                             avatars.Add(scenePresence); | ||||
|                         avatars.Add(scenePresence); | ||||
|                     }); | ||||
|                 } | ||||
|             ); | ||||
|  |  | |||
|  | @ -373,13 +373,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
|                                           scene.GetRootAgentCount(), scene.RegionInfo.RegionName, | ||||
|                                           scene.RegionInfo.RegionID, | ||||
|                                           DateTime.UtcNow.ToString("s"))); | ||||
|             scene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (!sp.IsChildAgent) | ||||
|                 { | ||||
|                     list.Append(String.Format("    <avatar name=\"{0}\" uuid=\"{1}\" />\n", sp.Name, sp.UUID)); | ||||
|                     list.Append("</avatars>"); | ||||
|                 } | ||||
|             }); | ||||
|             string payload = list.ToString(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -711,10 +711,8 @@ namespace OpenSim.Region.RegionCombinerModule | |||
| 
 | ||||
|             List<Vector3> CoarseLocations = new List<Vector3>(); | ||||
|             List<UUID> AvatarUUIDs = new List<UUID>(); | ||||
|             connectiondata.RegionScene.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|             connectiondata.RegionScene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|             { | ||||
|                 if (sp.IsChildAgent) | ||||
|                     return; | ||||
|                 if (sp.UUID != presence.UUID) | ||||
|                 { | ||||
|                     if (sp.ParentID != 0) | ||||
|  |  | |||
|  | @ -3723,9 +3723,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|             m_host.AddScriptLPS(1); | ||||
|             List<UUID> keytable = new List<UUID>(); | ||||
|             // parse for sitting avatare-uuids | ||||
|             World.ForEachScenePresence(delegate(ScenePresence presence) | ||||
|             World.ForEachRootScenePresence(delegate(ScenePresence presence) | ||||
|             { | ||||
|                 if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) | ||||
|                 if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) | ||||
|                     keytable.Add(presence.UUID); | ||||
|             }); | ||||
| 
 | ||||
|  | @ -3785,9 +3785,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|             m_host.AddScriptLPS(1); | ||||
|             // parse for sitting avatare-names | ||||
|             List<String> nametable = new List<String>(); | ||||
|             World.ForEachScenePresence(delegate(ScenePresence presence) | ||||
|             World.ForEachRootScenePresence(delegate(ScenePresence presence) | ||||
|             { | ||||
|                 if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) | ||||
|                 if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) | ||||
|                     nametable.Add(presence.ControllingClient.Name); | ||||
|             }); | ||||
| 
 | ||||
|  | @ -7568,9 +7568,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|         { | ||||
|             m_host.AddScriptLPS(1); | ||||
|             int avatarCount = 0; | ||||
|             World.ForEachScenePresence(delegate(ScenePresence presence) | ||||
|             World.ForEachRootScenePresence(delegate(ScenePresence presence) | ||||
|             { | ||||
|                 if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) | ||||
|                 if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) | ||||
|                         avatarCount++; | ||||
|             }); | ||||
| 
 | ||||
|  | @ -9336,9 +9336,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                     landObject.SetMediaUrl(url); | ||||
| 
 | ||||
|                     // now send to all (non-child) agents in the parcel | ||||
|                     World.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|                     World.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|                     { | ||||
|                         if (!sp.IsChildAgent && (sp.currentParcelUUID == landData.GlobalID)) | ||||
|                         if (sp.currentParcelUUID == landData.GlobalID) | ||||
|                         { | ||||
|                             sp.ControllingClient.SendParcelMediaUpdate(landData.MediaURL, | ||||
|                                                                           landData.MediaID, | ||||
|  | @ -9369,9 +9369,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                 if (presence == null) | ||||
|                 { | ||||
|                     // send to all (non-child) agents in the parcel | ||||
|                     World.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|                     World.ForEachRootScenePresence(delegate(ScenePresence sp) | ||||
|                     { | ||||
|                         if (!sp.IsChildAgent && (sp.currentParcelUUID == landData.GlobalID)) | ||||
|                         if (sp.currentParcelUUID == landData.GlobalID) | ||||
|                         { | ||||
|                             sp.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this? | ||||
|                                                                            (ParcelMediaCommandEnum)commandToSend, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Dan Lake
						Dan Lake