diff options
author | Oren Hurvitz | 2012-04-23 19:07:36 +0300 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-04-27 20:47:02 +0100 |
commit | 6473674bbf6ce006512083902e8ff1796d8c8b22 (patch) | |
tree | 8f2e71c3c0442050789dc7e15334ad6e11ece27a /OpenSim/Region/Framework | |
parent | If a Grid God teleports then include the Godlike teleport flag. This can affe... (diff) | |
download | opensim-SC-6473674bbf6ce006512083902e8ff1796d8c8b22.zip opensim-SC-6473674bbf6ce006512083902e8ff1796d8c8b22.tar.gz opensim-SC-6473674bbf6ce006512083902e8ff1796d8c8b22.tar.bz2 opensim-SC-6473674bbf6ce006512083902e8ff1796d8c8b22.tar.xz |
Fixed: custom walking animations didn't stop when the avatar stopped walking.
This happened because the scripts were notified about control changes (e.g., the user stopped pressing the Forward key) when the animation was still WALK, so the script didn't stop the walking animation. Fixing this required: a) Update the movement animation *before* notifying the script; b) Add locking to prevent clashes with the Heartbeat thread (which also updates the animations); c) Handle the case of a user who stops walking just as the avatar is in the air: the avatar should STAND in that case, not WALK.
This reverts commit feef1dd73243cfdd5322632fb67e64cabc1ad4bc.
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | 19 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 33 |
2 files changed, 32 insertions, 20 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index f5623bd..14ae287 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -278,6 +278,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
278 | return "FALLDOWN"; | 278 | return "FALLDOWN"; |
279 | } | 279 | } |
280 | 280 | ||
281 | // Check if the user has stopped walking just now | ||
282 | if (CurrentMovementAnimation == "WALK" && (move == Vector3.Zero)) | ||
283 | return "STAND"; | ||
284 | |||
281 | return CurrentMovementAnimation; | 285 | return CurrentMovementAnimation; |
282 | } | 286 | } |
283 | 287 | ||
@@ -402,13 +406,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
402 | /// </summary> | 406 | /// </summary> |
403 | public void UpdateMovementAnimations() | 407 | public void UpdateMovementAnimations() |
404 | { | 408 | { |
405 | CurrentMovementAnimation = DetermineMovementAnimation(); | 409 | lock (m_animations) |
410 | { | ||
411 | CurrentMovementAnimation = DetermineMovementAnimation(); | ||
406 | 412 | ||
407 | // m_log.DebugFormat( | 413 | // m_log.DebugFormat( |
408 | // "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", | 414 | // "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", |
409 | // CurrentMovementAnimation, m_scenePresence.Name); | 415 | // CurrentMovementAnimation, m_scenePresence.Name); |
410 | 416 | ||
411 | TrySetMovementAnimation(CurrentMovementAnimation); | 417 | TrySetMovementAnimation(CurrentMovementAnimation); |
418 | } | ||
412 | } | 419 | } |
413 | 420 | ||
414 | public UUID[] GetAnimationArray() | 421 | public UUID[] GetAnimationArray() |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 6b38027..64fe7a8 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -45,6 +45,7 @@ using TeleportFlags = OpenSim.Framework.Constants.TeleportFlags; | |||
45 | 45 | ||
46 | namespace OpenSim.Region.Framework.Scenes | 46 | namespace OpenSim.Region.Framework.Scenes |
47 | { | 47 | { |
48 | [Flags] | ||
48 | enum ScriptControlled : uint | 49 | enum ScriptControlled : uint |
49 | { | 50 | { |
50 | CONTROL_ZERO = 0, | 51 | CONTROL_ZERO = 0, |
@@ -1220,7 +1221,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1220 | { | 1221 | { |
1221 | // m_log.DebugFormat( | 1222 | // m_log.DebugFormat( |
1222 | // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", | 1223 | // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", |
1223 | // Scene.RegionInfo.RegionName, remoteClient.Name, agentData.ControlFlags); | 1224 | // Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags); |
1224 | 1225 | ||
1225 | if (IsChildAgent) | 1226 | if (IsChildAgent) |
1226 | { | 1227 | { |
@@ -1320,14 +1321,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1320 | } | 1321 | } |
1321 | } | 1322 | } |
1322 | 1323 | ||
1323 | lock (scriptedcontrols) | 1324 | uint flagsForScripts = (uint)flags; |
1324 | { | 1325 | flags = RemoveIgnoredControls(flags, IgnoredControls); |
1325 | if (scriptedcontrols.Count > 0) | ||
1326 | { | ||
1327 | SendControlToScripts((uint)flags); | ||
1328 | flags = RemoveIgnoredControls(flags, IgnoredControls); | ||
1329 | } | ||
1330 | } | ||
1331 | 1326 | ||
1332 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) | 1327 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) |
1333 | HandleAgentSitOnGround(); | 1328 | HandleAgentSitOnGround(); |
@@ -1420,7 +1415,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1420 | MovementFlag |= (byte)nudgehack; | 1415 | MovementFlag |= (byte)nudgehack; |
1421 | } | 1416 | } |
1422 | 1417 | ||
1423 | // m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); | 1418 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); |
1424 | MovementFlag += (byte)(uint)DCF; | 1419 | MovementFlag += (byte)(uint)DCF; |
1425 | update_movementflag = true; | 1420 | update_movementflag = true; |
1426 | } | 1421 | } |
@@ -1433,7 +1428,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1433 | && ((MovementFlag & (byte)nudgehack) == nudgehack)) | 1428 | && ((MovementFlag & (byte)nudgehack) == nudgehack)) |
1434 | ) // This or is for Nudge forward | 1429 | ) // This or is for Nudge forward |
1435 | { | 1430 | { |
1436 | // m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); | 1431 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); |
1437 | MovementFlag -= ((byte)(uint)DCF); | 1432 | MovementFlag -= ((byte)(uint)DCF); |
1438 | update_movementflag = true; | 1433 | update_movementflag = true; |
1439 | 1434 | ||
@@ -1514,8 +1509,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1514 | // } | 1509 | // } |
1515 | // } | 1510 | // } |
1516 | 1511 | ||
1517 | // if (update_movementflag && ParentID == 0) | 1512 | if (update_movementflag && ParentID == 0) |
1518 | // Animator.UpdateMovementAnimations(); | 1513 | Animator.UpdateMovementAnimations(); |
1514 | |||
1515 | lock (scriptedcontrols) | ||
1516 | { | ||
1517 | if (scriptedcontrols.Count > 0) | ||
1518 | { | ||
1519 | // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script | ||
1520 | // (e.g., a walking script) checks which animation is active it will be the correct animation. | ||
1521 | SendControlToScripts(flagsForScripts); | ||
1522 | } | ||
1523 | } | ||
1519 | } | 1524 | } |
1520 | 1525 | ||
1521 | m_scene.EventManager.TriggerOnClientMovement(this); | 1526 | m_scene.EventManager.TriggerOnClientMovement(this); |