diff options
author | Melanie | 2013-06-04 21:09:25 +0100 |
---|---|---|
committer | Melanie | 2013-06-04 21:09:25 +0100 |
commit | 648e258b8e79e52df18f41f2ec79016a095f7766 (patch) | |
tree | de96993d11a0183ac026cec61e0e5a937f801c3c /OpenSim/Region/Framework | |
parent | Merge branch 'master' into careminster (diff) | |
parent | New HttpServer_OpenSim.dll with increased limits on number of connections, re... (diff) | |
download | opensim-SC-648e258b8e79e52df18f41f2ec79016a095f7766.zip opensim-SC-648e258b8e79e52df18f41f2ec79016a095f7766.tar.gz opensim-SC-648e258b8e79e52df18f41f2ec79016a095f7766.tar.bz2 opensim-SC-648e258b8e79e52df18f41f2ec79016a095f7766.tar.xz |
Merge branch 'master' into careminster
Conflicts:
OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
Diffstat (limited to 'OpenSim/Region/Framework')
6 files changed, 184 insertions, 6 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs index 66edfed..5dee64d 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs | |||
@@ -28,8 +28,11 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Text; | ||
31 | using log4net; | 32 | using log4net; |
32 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenMetaverse.StructuredData; | ||
35 | |||
33 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
34 | 37 | ||
35 | using Animation = OpenSim.Framework.Animation; | 38 | using Animation = OpenSim.Framework.Animation; |
@@ -60,6 +63,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
60 | ResetDefaultAnimation(); | 63 | ResetDefaultAnimation(); |
61 | } | 64 | } |
62 | 65 | ||
66 | public AnimationSet(OSDArray pArray) | ||
67 | { | ||
68 | ResetDefaultAnimation(); | ||
69 | FromOSDArray(pArray); | ||
70 | } | ||
71 | |||
63 | public bool HasAnimation(UUID animID) | 72 | public bool HasAnimation(UUID animID) |
64 | { | 73 | { |
65 | if (m_defaultAnimation.AnimID == animID) | 74 | if (m_defaultAnimation.AnimID == animID) |
@@ -218,5 +227,106 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
218 | foreach (OpenSim.Framework.Animation anim in theArray) | 227 | foreach (OpenSim.Framework.Animation anim in theArray) |
219 | m_animations.Add(anim); | 228 | m_animations.Add(anim); |
220 | } | 229 | } |
230 | |||
231 | // Create representation of this AnimationSet as an OSDArray. | ||
232 | // First two entries in the array are the default and implicitDefault animations | ||
233 | // followed by the other animations. | ||
234 | public OSDArray ToOSDArray() | ||
235 | { | ||
236 | OSDArray ret = new OSDArray(); | ||
237 | ret.Add(DefaultAnimation.PackUpdateMessage()); | ||
238 | ret.Add(ImplicitDefaultAnimation.PackUpdateMessage()); | ||
239 | |||
240 | foreach (OpenSim.Framework.Animation anim in m_animations) | ||
241 | ret.Add(anim.PackUpdateMessage()); | ||
242 | |||
243 | return ret; | ||
244 | } | ||
245 | |||
246 | public void FromOSDArray(OSDArray pArray) | ||
247 | { | ||
248 | this.Clear(); | ||
249 | |||
250 | if (pArray.Count >= 1) | ||
251 | { | ||
252 | m_defaultAnimation = new OpenSim.Framework.Animation((OSDMap)pArray[0]); | ||
253 | } | ||
254 | if (pArray.Count >= 2) | ||
255 | { | ||
256 | m_implicitDefaultAnimation = new OpenSim.Framework.Animation((OSDMap)pArray[1]); | ||
257 | } | ||
258 | for (int ii = 2; ii < pArray.Count; ii++) | ||
259 | { | ||
260 | m_animations.Add(new OpenSim.Framework.Animation((OSDMap)pArray[ii])); | ||
261 | } | ||
262 | } | ||
263 | |||
264 | // Compare two AnimationSets and return 'true' if the default animations are the same | ||
265 | // and all of the animations in the list are equal. | ||
266 | public override bool Equals(object obj) | ||
267 | { | ||
268 | AnimationSet other = obj as AnimationSet; | ||
269 | if (other != null) | ||
270 | { | ||
271 | if (this.DefaultAnimation.Equals(other.DefaultAnimation) | ||
272 | && this.ImplicitDefaultAnimation.Equals(other.ImplicitDefaultAnimation)) | ||
273 | { | ||
274 | // The defaults are the same. Is the list of animations the same? | ||
275 | OpenSim.Framework.Animation[] thisAnims = this.ToArray(); | ||
276 | OpenSim.Framework.Animation[] otherAnims = other.ToArray(); | ||
277 | if (thisAnims.Length == 0 && otherAnims.Length == 0) | ||
278 | return true; // the common case | ||
279 | if (thisAnims.Length == otherAnims.Length) | ||
280 | { | ||
281 | // Do this the hard way but since the list is usually short this won't take long. | ||
282 | foreach (OpenSim.Framework.Animation thisAnim in thisAnims) | ||
283 | { | ||
284 | bool found = false; | ||
285 | foreach (OpenSim.Framework.Animation otherAnim in otherAnims) | ||
286 | { | ||
287 | if (thisAnim.Equals(otherAnim)) | ||
288 | { | ||
289 | found = true; | ||
290 | break; | ||
291 | } | ||
292 | } | ||
293 | if (!found) | ||
294 | { | ||
295 | // If anything is not in the other list, these are not equal | ||
296 | return false; | ||
297 | } | ||
298 | } | ||
299 | // Found everything in the other list. Since lists are equal length, they must be equal. | ||
300 | return true; | ||
301 | } | ||
302 | } | ||
303 | return false; | ||
304 | } | ||
305 | // Don't know what was passed, but the base system will figure it out for me. | ||
306 | return base.Equals(obj); | ||
307 | } | ||
308 | |||
309 | public override string ToString() | ||
310 | { | ||
311 | StringBuilder buff = new StringBuilder(); | ||
312 | buff.Append("dflt="); | ||
313 | buff.Append(DefaultAnimation.ToString()); | ||
314 | buff.Append(",iDflt="); | ||
315 | if (DefaultAnimation == ImplicitDefaultAnimation) | ||
316 | buff.Append("same"); | ||
317 | else | ||
318 | buff.Append(ImplicitDefaultAnimation.ToString()); | ||
319 | if (m_animations.Count > 0) | ||
320 | { | ||
321 | buff.Append(",anims="); | ||
322 | foreach (OpenSim.Framework.Animation anim in m_animations) | ||
323 | { | ||
324 | buff.Append("<"); | ||
325 | buff.Append(anim.ToString()); | ||
326 | buff.Append(">,"); | ||
327 | } | ||
328 | } | ||
329 | return buff.ToString(); | ||
330 | } | ||
221 | } | 331 | } |
222 | } | 332 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs b/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs index c2b0468..b79dd8f 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs | |||
@@ -104,5 +104,31 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
104 | 104 | ||
105 | return UUID.Zero; | 105 | return UUID.Zero; |
106 | } | 106 | } |
107 | |||
108 | /// <summary> | ||
109 | /// Get the name of the animation given a UUID. If there is no matching animation | ||
110 | /// return the UUID as a string. | ||
111 | /// </summary> | ||
112 | public static string GetDefaultAnimationName(UUID uuid) | ||
113 | { | ||
114 | string ret = "unknown"; | ||
115 | if (AnimsUUID.ContainsValue(uuid)) | ||
116 | { | ||
117 | foreach (KeyValuePair<string, UUID> kvp in AnimsUUID) | ||
118 | { | ||
119 | if (kvp.Value == uuid) | ||
120 | { | ||
121 | ret = kvp.Key; | ||
122 | break; | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | ret = uuid.ToString(); | ||
129 | } | ||
130 | |||
131 | return ret; | ||
132 | } | ||
107 | } | 133 | } |
108 | } \ No newline at end of file | 134 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 65c279e..eb70eee 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -93,7 +93,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
93 | GetAnimName(animID), animID, m_scenePresence.Name); | 93 | GetAnimName(animID), animID, m_scenePresence.Name); |
94 | 94 | ||
95 | if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID)) | 95 | if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID)) |
96 | { | ||
96 | SendAnimPack(); | 97 | SendAnimPack(); |
98 | } | ||
97 | } | 99 | } |
98 | 100 | ||
99 | // Called from scripts | 101 | // Called from scripts |
@@ -132,7 +134,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
132 | GetAnimName(animID), animID, m_scenePresence.Name); | 134 | GetAnimName(animID), animID, m_scenePresence.Name); |
133 | 135 | ||
134 | if (m_animations.Remove(animID, allowNoDefault)) | 136 | if (m_animations.Remove(animID, allowNoDefault)) |
137 | { | ||
135 | SendAnimPack(); | 138 | SendAnimPack(); |
139 | } | ||
136 | } | 140 | } |
137 | 141 | ||
138 | public void avnChangeAnim(UUID animID, bool addRemove, bool sendPack) | 142 | public void avnChangeAnim(UUID animID, bool addRemove, bool sendPack) |
@@ -180,8 +184,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
180 | /// The movement animation is reserved for "main" animations | 184 | /// The movement animation is reserved for "main" animations |
181 | /// that are mutually exclusive, e.g. flying and sitting. | 185 | /// that are mutually exclusive, e.g. flying and sitting. |
182 | /// </summary> | 186 | /// </summary> |
183 | public void TrySetMovementAnimation(string anim) | 187 | /// <returns>'true' if the animation was updated</returns> |
188 | public bool TrySetMovementAnimation(string anim) | ||
184 | { | 189 | { |
190 | bool ret = false; | ||
185 | if (!m_scenePresence.IsChildAgent) | 191 | if (!m_scenePresence.IsChildAgent) |
186 | { | 192 | { |
187 | // m_log.DebugFormat( | 193 | // m_log.DebugFormat( |
@@ -198,6 +204,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
198 | // 16384 is CHANGED_ANIMATION | 204 | // 16384 is CHANGED_ANIMATION |
199 | m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION}); | 205 | m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION}); |
200 | SendAnimPack(); | 206 | SendAnimPack(); |
207 | ret = true; | ||
201 | } | 208 | } |
202 | } | 209 | } |
203 | else | 210 | else |
@@ -206,6 +213,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
206 | "[SCENE PRESENCE ANIMATOR]: Tried to set movement animation {0} on child presence {1}", | 213 | "[SCENE PRESENCE ANIMATOR]: Tried to set movement animation {0} on child presence {1}", |
207 | anim, m_scenePresence.Name); | 214 | anim, m_scenePresence.Name); |
208 | } | 215 | } |
216 | return ret; | ||
209 | } | 217 | } |
210 | 218 | ||
211 | /// <summary> | 219 | /// <summary> |
@@ -439,8 +447,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
439 | /// <summary> | 447 | /// <summary> |
440 | /// Update the movement animation of this avatar according to its current state | 448 | /// Update the movement animation of this avatar according to its current state |
441 | /// </summary> | 449 | /// </summary> |
442 | public void UpdateMovementAnimations() | 450 | /// <returns>'true' if the animation was changed</returns> |
451 | public bool UpdateMovementAnimations() | ||
443 | { | 452 | { |
453 | bool ret = false; | ||
444 | lock (m_animations) | 454 | lock (m_animations) |
445 | { | 455 | { |
446 | string newMovementAnimation = DetermineMovementAnimation(); | 456 | string newMovementAnimation = DetermineMovementAnimation(); |
@@ -454,9 +464,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
454 | 464 | ||
455 | // Only set it if it's actually changed, give a script | 465 | // Only set it if it's actually changed, give a script |
456 | // a chance to stop a default animation | 466 | // a chance to stop a default animation |
457 | TrySetMovementAnimation(CurrentMovementAnimation); | 467 | ret = TrySetMovementAnimation(CurrentMovementAnimation); |
458 | } | 468 | } |
459 | } | 469 | } |
470 | return ret; | ||
460 | } | 471 | } |
461 | 472 | ||
462 | public UUID[] GetAnimationArray() | 473 | public UUID[] GetAnimationArray() |
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 4733547..4fec44f 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -974,6 +974,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
974 | public delegate void RegionStarted(Scene scene); | 974 | public delegate void RegionStarted(Scene scene); |
975 | public event RegionStarted OnRegionStarted; | 975 | public event RegionStarted OnRegionStarted; |
976 | 976 | ||
977 | public delegate void RegionHeartbeatStart(Scene scene); | ||
978 | public event RegionHeartbeatStart OnRegionHeartbeatStart; | ||
977 | public delegate void RegionHeartbeatEnd(Scene scene); | 979 | public delegate void RegionHeartbeatEnd(Scene scene); |
978 | public event RegionHeartbeatEnd OnRegionHeartbeatEnd; | 980 | public event RegionHeartbeatEnd OnRegionHeartbeatEnd; |
979 | 981 | ||
@@ -3096,6 +3098,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
3096 | } | 3098 | } |
3097 | } | 3099 | } |
3098 | 3100 | ||
3101 | public void TriggerRegionHeartbeatStart(Scene scene) | ||
3102 | { | ||
3103 | RegionHeartbeatStart handler = OnRegionHeartbeatStart; | ||
3104 | |||
3105 | if (handler != null) | ||
3106 | { | ||
3107 | foreach (RegionHeartbeatStart d in handler.GetInvocationList()) | ||
3108 | { | ||
3109 | try | ||
3110 | { | ||
3111 | d(scene); | ||
3112 | } | ||
3113 | catch (Exception e) | ||
3114 | { | ||
3115 | m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionHeartbeatStart failed - continuing {0} - {1}", | ||
3116 | e.Message, e.StackTrace); | ||
3117 | } | ||
3118 | } | ||
3119 | } | ||
3120 | } | ||
3121 | |||
3099 | public void TriggerRegionHeartbeatEnd(Scene scene) | 3122 | public void TriggerRegionHeartbeatEnd(Scene scene) |
3100 | { | 3123 | { |
3101 | RegionHeartbeatEnd handler = OnRegionHeartbeatEnd; | 3124 | RegionHeartbeatEnd handler = OnRegionHeartbeatEnd; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6bac468..6ef83fb 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -1569,6 +1569,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1569 | 1569 | ||
1570 | try | 1570 | try |
1571 | { | 1571 | { |
1572 | EventManager.TriggerRegionHeartbeatStart(this); | ||
1573 | |||
1572 | // Apply taints in terrain module to terrain in physics scene | 1574 | // Apply taints in terrain module to terrain in physics scene |
1573 | if (Frame % m_update_terrain == 0) | 1575 | if (Frame % m_update_terrain == 0) |
1574 | { | 1576 | { |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 83bd3fb..1859cb1 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2310,6 +2310,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2310 | AddToPhysicalScene(false); | 2310 | AddToPhysicalScene(false); |
2311 | 2311 | ||
2312 | Animator.TrySetMovementAnimation("STAND"); | 2312 | Animator.TrySetMovementAnimation("STAND"); |
2313 | TriggerScenePresenceUpdated(); | ||
2313 | } | 2314 | } |
2314 | 2315 | ||
2315 | private SceneObjectPart FindNextAvailableSitTarget(UUID targetID) | 2316 | private SceneObjectPart FindNextAvailableSitTarget(UUID targetID) |
@@ -2408,7 +2409,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2408 | ControllingClient.SendSitResponse( | 2409 | ControllingClient.SendSitResponse( |
2409 | part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); | 2410 | part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); |
2410 | 2411 | ||
2411 | m_requestedSitTargetUUID = targetID; | 2412 | m_requestedSitTargetUUID = part.UUID; |
2412 | 2413 | ||
2413 | HandleAgentSit(ControllingClient, UUID); | 2414 | HandleAgentSit(ControllingClient, UUID); |
2414 | 2415 | ||
@@ -2436,7 +2437,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2436 | if (part != null) | 2437 | if (part != null) |
2437 | { | 2438 | { |
2438 | m_requestedSitTargetID = part.LocalId; | 2439 | m_requestedSitTargetID = part.LocalId; |
2439 | m_requestedSitTargetUUID = targetID; | 2440 | m_requestedSitTargetUUID = part.UUID; |
2440 | 2441 | ||
2441 | } | 2442 | } |
2442 | else | 2443 | else |
@@ -2635,6 +2636,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2635 | } | 2636 | } |
2636 | Animator.TrySetMovementAnimation(sitAnimation); | 2637 | Animator.TrySetMovementAnimation(sitAnimation); |
2637 | SendAvatarDataToAllAgents(); | 2638 | SendAvatarDataToAllAgents(); |
2639 | TriggerScenePresenceUpdated(); | ||
2638 | } | 2640 | } |
2639 | } | 2641 | } |
2640 | 2642 | ||
@@ -2643,6 +2645,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2643 | // m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.. | 2645 | // m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.. |
2644 | m_AngularVelocity = Vector3.Zero; | 2646 | m_AngularVelocity = Vector3.Zero; |
2645 | Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); | 2647 | Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); |
2648 | TriggerScenePresenceUpdated(); | ||
2646 | SitGround = true; | 2649 | SitGround = true; |
2647 | RemoveFromPhysicalScene(); | 2650 | RemoveFromPhysicalScene(); |
2648 | } | 2651 | } |
@@ -2659,11 +2662,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2659 | public void HandleStartAnim(IClientAPI remoteClient, UUID animID) | 2662 | public void HandleStartAnim(IClientAPI remoteClient, UUID animID) |
2660 | { | 2663 | { |
2661 | Animator.AddAnimation(animID, UUID.Zero); | 2664 | Animator.AddAnimation(animID, UUID.Zero); |
2665 | TriggerScenePresenceUpdated(); | ||
2662 | } | 2666 | } |
2663 | 2667 | ||
2664 | public void HandleStopAnim(IClientAPI remoteClient, UUID animID) | 2668 | public void HandleStopAnim(IClientAPI remoteClient, UUID animID) |
2665 | { | 2669 | { |
2666 | Animator.RemoveAnimation(animID, false); | 2670 | Animator.RemoveAnimation(animID, false); |
2671 | TriggerScenePresenceUpdated(); | ||
2667 | } | 2672 | } |
2668 | 2673 | ||
2669 | public void avnHandleChangeAnim(UUID animID, bool addRemove,bool sendPack) | 2674 | public void avnHandleChangeAnim(UUID animID, bool addRemove,bool sendPack) |
@@ -3693,7 +3698,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3693 | 3698 | ||
3694 | // if (m_updateCount > 0) | 3699 | // if (m_updateCount > 0) |
3695 | // { | 3700 | // { |
3696 | Animator.UpdateMovementAnimations(); | 3701 | if (Animator.UpdateMovementAnimations()) |
3702 | TriggerScenePresenceUpdated(); | ||
3697 | // m_updateCount--; | 3703 | // m_updateCount--; |
3698 | // } | 3704 | // } |
3699 | 3705 | ||