diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPart.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 153 |
1 files changed, 82 insertions, 71 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 548a64f..4b2641c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -573,8 +573,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
573 | private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>(); | 573 | private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>(); |
574 | public List<SceneObjectPart> PlaySoundSlavePrims | 574 | public List<SceneObjectPart> PlaySoundSlavePrims |
575 | { | 575 | { |
576 | get { return m_LoopSoundSlavePrims; } | 576 | get { return m_PlaySoundSlavePrims; } |
577 | set { m_LoopSoundSlavePrims = value; } | 577 | set { m_PlaySoundSlavePrims = value; } |
578 | } | 578 | } |
579 | 579 | ||
580 | private SceneObjectPart m_LoopSoundMasterPrim = null; | 580 | private SceneObjectPart m_LoopSoundMasterPrim = null; |
@@ -682,7 +682,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
682 | if (m_parentGroup != null) // TODO can there be a SOP without a SOG? | 682 | if (m_parentGroup != null) // TODO can there be a SOP without a SOG? |
683 | { | 683 | { |
684 | ScenePresence avatar; | 684 | ScenePresence avatar; |
685 | if (m_parentGroup.Scene.TryGetAvatar(m_sitTargetAvatar, out avatar)) | 685 | if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar)) |
686 | { | 686 | { |
687 | avatar.ParentPosition = GetWorldPosition(); | 687 | avatar.ParentPosition = GetWorldPosition(); |
688 | } | 688 | } |
@@ -1208,15 +1208,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1208 | 1208 | ||
1209 | private void SendObjectPropertiesToClient(UUID AgentID) | 1209 | private void SendObjectPropertiesToClient(UUID AgentID) |
1210 | { | 1210 | { |
1211 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 1211 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
1212 | for (int i = 0; i < avatars.Length; i++) | ||
1213 | { | 1212 | { |
1214 | // Ugly reference :( | 1213 | // Ugly reference :( |
1215 | if (avatars[i].UUID == AgentID) | 1214 | if (avatar.UUID == AgentID) |
1216 | { | 1215 | { |
1217 | m_parentGroup.GetProperties(avatars[i].ControllingClient); | 1216 | m_parentGroup.GetProperties(avatar.ControllingClient); |
1218 | } | 1217 | } |
1219 | } | 1218 | }); |
1220 | } | 1219 | } |
1221 | 1220 | ||
1222 | // TODO: unused: | 1221 | // TODO: unused: |
@@ -1271,11 +1270,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1271 | /// </summary> | 1270 | /// </summary> |
1272 | public void AddFullUpdateToAllAvatars() | 1271 | public void AddFullUpdateToAllAvatars() |
1273 | { | 1272 | { |
1274 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 1273 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
1275 | for (int i = 0; i < avatars.Length; i++) | ||
1276 | { | 1274 | { |
1277 | avatars[i].SceneViewer.QueuePartForUpdate(this); | 1275 | avatar.SceneViewer.QueuePartForUpdate(this); |
1278 | } | 1276 | }); |
1279 | } | 1277 | } |
1280 | 1278 | ||
1281 | public void AddFullUpdateToAvatar(ScenePresence presence) | 1279 | public void AddFullUpdateToAvatar(ScenePresence presence) |
@@ -1296,11 +1294,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1296 | /// Terse updates | 1294 | /// Terse updates |
1297 | public void AddTerseUpdateToAllAvatars() | 1295 | public void AddTerseUpdateToAllAvatars() |
1298 | { | 1296 | { |
1299 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 1297 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
1300 | for (int i = 0; i < avatars.Length; i++) | ||
1301 | { | 1298 | { |
1302 | avatars[i].SceneViewer.QueuePartForUpdate(this); | 1299 | avatar.SceneViewer.QueuePartForUpdate(this); |
1303 | } | 1300 | }); |
1304 | } | 1301 | } |
1305 | 1302 | ||
1306 | public void AddTerseUpdateToAvatar(ScenePresence presence) | 1303 | public void AddTerseUpdateToAvatar(ScenePresence presence) |
@@ -1335,11 +1332,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1335 | if (volume < 0) | 1332 | if (volume < 0) |
1336 | volume = 0; | 1333 | volume = 0; |
1337 | 1334 | ||
1338 | List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); | 1335 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) |
1339 | foreach (ScenePresence p in avatarts) | ||
1340 | { | 1336 | { |
1341 | p.ControllingClient.SendAttachedSoundGainChange(UUID, (float)volume); | 1337 | if(!sp.IsChildAgent) |
1342 | } | 1338 | sp.ControllingClient.SendAttachedSoundGainChange(UUID, (float)volume); |
1339 | }); | ||
1343 | } | 1340 | } |
1344 | 1341 | ||
1345 | /// <summary> | 1342 | /// <summary> |
@@ -2060,6 +2057,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2060 | { | 2057 | { |
2061 | m_lastColliders.Remove(localID); | 2058 | m_lastColliders.Remove(localID); |
2062 | } | 2059 | } |
2060 | |||
2063 | if (m_parentGroup == null) | 2061 | if (m_parentGroup == null) |
2064 | return; | 2062 | return; |
2065 | if (m_parentGroup.IsDeleted) | 2063 | if (m_parentGroup.IsDeleted) |
@@ -2136,17 +2134,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2136 | } | 2134 | } |
2137 | else | 2135 | else |
2138 | { | 2136 | { |
2139 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); | 2137 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence av) |
2140 | |||
2141 | for (int i = 0; i < avlist.Length; i++) | ||
2142 | { | 2138 | { |
2143 | ScenePresence av = avlist[i]; | ||
2144 | |||
2145 | if (av.LocalId == localId) | 2139 | if (av.LocalId == localId) |
2146 | { | 2140 | { |
2147 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) | 2141 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) |
2148 | { | 2142 | { |
2149 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2143 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); |
2150 | //If it is 1, it is to accept ONLY collisions from this avatar | 2144 | //If it is 1, it is to accept ONLY collisions from this avatar |
2151 | if (found) | 2145 | if (found) |
2152 | { | 2146 | { |
@@ -2168,7 +2162,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2168 | } | 2162 | } |
2169 | else | 2163 | else |
2170 | { | 2164 | { |
2171 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2165 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); |
2172 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | 2166 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work |
2173 | if (!found) | 2167 | if (!found) |
2174 | { | 2168 | { |
@@ -2186,7 +2180,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2186 | } | 2180 | } |
2187 | 2181 | ||
2188 | } | 2182 | } |
2189 | } | 2183 | }); |
2190 | } | 2184 | } |
2191 | } | 2185 | } |
2192 | if (colliding.Count > 0) | 2186 | if (colliding.Count > 0) |
@@ -2272,17 +2266,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2272 | } | 2266 | } |
2273 | else | 2267 | else |
2274 | { | 2268 | { |
2275 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); | 2269 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence av) |
2276 | |||
2277 | for (int i = 0; i < avlist.Length; i++) | ||
2278 | { | 2270 | { |
2279 | ScenePresence av = avlist[i]; | ||
2280 | |||
2281 | if (av.LocalId == localId) | 2271 | if (av.LocalId == localId) |
2282 | { | 2272 | { |
2283 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) | 2273 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) |
2284 | { | 2274 | { |
2285 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2275 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); |
2286 | //If it is 1, it is to accept ONLY collisions from this avatar | 2276 | //If it is 1, it is to accept ONLY collisions from this avatar |
2287 | if (found) | 2277 | if (found) |
2288 | { | 2278 | { |
@@ -2304,7 +2294,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2304 | } | 2294 | } |
2305 | else | 2295 | else |
2306 | { | 2296 | { |
2307 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2297 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); |
2308 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | 2298 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work |
2309 | if (!found) | 2299 | if (!found) |
2310 | { | 2300 | { |
@@ -2322,7 +2312,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2322 | } | 2312 | } |
2323 | 2313 | ||
2324 | } | 2314 | } |
2325 | } | 2315 | }); |
2326 | } | 2316 | } |
2327 | } | 2317 | } |
2328 | if (colliding.Count > 0) | 2318 | if (colliding.Count > 0) |
@@ -2403,17 +2393,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2403 | } | 2393 | } |
2404 | else | 2394 | else |
2405 | { | 2395 | { |
2406 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); | 2396 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence av) |
2407 | |||
2408 | for (int i = 0; i < avlist.Length; i++) | ||
2409 | { | 2397 | { |
2410 | ScenePresence av = avlist[i]; | ||
2411 | |||
2412 | if (av.LocalId == localId) | 2398 | if (av.LocalId == localId) |
2413 | { | 2399 | { |
2414 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) | 2400 | if (m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) || m_parentGroup.RootPart.CollisionFilter.ContainsValue(av.Name)) |
2415 | { | 2401 | { |
2416 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2402 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); |
2417 | //If it is 1, it is to accept ONLY collisions from this avatar | 2403 | //If it is 1, it is to accept ONLY collisions from this avatar |
2418 | if (found) | 2404 | if (found) |
2419 | { | 2405 | { |
@@ -2435,7 +2421,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2435 | } | 2421 | } |
2436 | else | 2422 | else |
2437 | { | 2423 | { |
2438 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1,out data); | 2424 | bool found = m_parentGroup.RootPart.CollisionFilter.TryGetValue(1, out data); |
2439 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work | 2425 | //If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work |
2440 | if (!found) | 2426 | if (!found) |
2441 | { | 2427 | { |
@@ -2453,7 +2439,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2453 | } | 2439 | } |
2454 | 2440 | ||
2455 | } | 2441 | } |
2456 | } | 2442 | }); |
2457 | } | 2443 | } |
2458 | } | 2444 | } |
2459 | 2445 | ||
@@ -2640,12 +2626,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2640 | TaskInventory.LockItemsForRead(false); | 2626 | TaskInventory.LockItemsForRead(false); |
2641 | } | 2627 | } |
2642 | 2628 | ||
2643 | List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); | 2629 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) |
2644 | foreach (ScenePresence p in avatarts) | ||
2645 | { | 2630 | { |
2646 | if (!(Util.GetDistanceTo(p.AbsolutePosition, AbsolutePosition) >= 100)) | 2631 | if (sp.IsChildAgent) |
2647 | p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); | 2632 | return; |
2648 | } | 2633 | if (!(Util.GetDistanceTo(sp.AbsolutePosition, AbsolutePosition) >= 100)) |
2634 | sp.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); | ||
2635 | }); | ||
2649 | } | 2636 | } |
2650 | 2637 | ||
2651 | public void RemFlag(PrimFlags flag) | 2638 | public void RemFlag(PrimFlags flag) |
@@ -2820,41 +2807,66 @@ namespace OpenSim.Region.Framework.Scenes | |||
2820 | } | 2807 | } |
2821 | } | 2808 | } |
2822 | 2809 | ||
2810 | // /// <summary> | ||
2811 | // /// | ||
2812 | // /// </summary> | ||
2813 | // /// <param name="remoteClient"></param> | ||
2814 | // public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) | ||
2815 | // { | ||
2816 | // m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags); | ||
2817 | // } | ||
2818 | |||
2819 | |||
2823 | /// <summary> | 2820 | /// <summary> |
2824 | /// | 2821 | /// Send a full update to the client for the given part |
2825 | /// </summary> | 2822 | /// </summary> |
2826 | /// <param name="remoteClient"></param> | 2823 | /// <param name="remoteClient"></param> |
2827 | public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) | 2824 | /// <param name="clientFlags"></param> |
2825 | protected internal void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) | ||
2828 | { | 2826 | { |
2829 | m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags); | 2827 | // m_log.DebugFormat( |
2828 | // "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId); | ||
2829 | |||
2830 | if (IsRoot) | ||
2831 | { | ||
2832 | if (IsAttachment) | ||
2833 | { | ||
2834 | SendFullUpdateToClient(remoteClient, AttachedPos, clientFlags); | ||
2835 | } | ||
2836 | else | ||
2837 | { | ||
2838 | SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags); | ||
2839 | } | ||
2840 | } | ||
2841 | else | ||
2842 | { | ||
2843 | SendFullUpdateToClient(remoteClient, clientFlags); | ||
2844 | } | ||
2830 | } | 2845 | } |
2831 | 2846 | ||
2832 | /// <summary> | 2847 | /// <summary> |
2833 | /// | 2848 | /// Send a full update for this part to all clients. |
2834 | /// </summary> | 2849 | /// </summary> |
2835 | public void SendFullUpdateToAllClients() | 2850 | public void SendFullUpdateToAllClients() |
2836 | { | 2851 | { |
2837 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 2852 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
2838 | for (int i = 0; i < avatars.Length; i++) | ||
2839 | { | 2853 | { |
2840 | // Ugly reference :( | 2854 | SendFullUpdate(avatar.ControllingClient, avatar.GenerateClientFlags(UUID)); |
2841 | m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this, | 2855 | }); |
2842 | avatars[i].GenerateClientFlags(UUID)); | ||
2843 | } | ||
2844 | } | 2856 | } |
2845 | 2857 | ||
2858 | /// <summary> | ||
2859 | /// Send a full update to all clients except the one nominated. | ||
2860 | /// </summary> | ||
2861 | /// <param name="agentID"></param> | ||
2846 | public void SendFullUpdateToAllClientsExcept(UUID agentID) | 2862 | public void SendFullUpdateToAllClientsExcept(UUID agentID) |
2847 | { | 2863 | { |
2848 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 2864 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
2849 | for (int i = 0; i < avatars.Length; i++) | ||
2850 | { | 2865 | { |
2851 | // Ugly reference :( | 2866 | // Ugly reference :( |
2852 | if (avatars[i].UUID != agentID) | 2867 | if (avatar.UUID != agentID) |
2853 | { | 2868 | SendFullUpdate(avatar.ControllingClient, avatar.GenerateClientFlags(UUID)); |
2854 | m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this, | 2869 | }); |
2855 | avatars[i].GenerateClientFlags(UUID)); | ||
2856 | } | ||
2857 | } | ||
2858 | } | 2870 | } |
2859 | 2871 | ||
2860 | /// <summary> | 2872 | /// <summary> |
@@ -3055,11 +3067,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3055 | /// </summary> | 3067 | /// </summary> |
3056 | public void SendTerseUpdateToAllClients() | 3068 | public void SendTerseUpdateToAllClients() |
3057 | { | 3069 | { |
3058 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 3070 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
3059 | for (int i = 0; i < avatars.Length; i++) | ||
3060 | { | 3071 | { |
3061 | SendTerseUpdateToClient(avatars[i].ControllingClient); | 3072 | SendTerseUpdateToClient(avatar.ControllingClient); |
3062 | } | 3073 | }); |
3063 | } | 3074 | } |
3064 | 3075 | ||
3065 | public void SetAttachmentPoint(uint AttachmentPoint) | 3076 | public void SetAttachmentPoint(uint AttachmentPoint) |