From 2dc452b4a71be8359a7ff66b52c9bfc62d0c12ac Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sat, 5 Nov 2011 21:41:16 +0000
Subject: ScenePresence part of the Avination animator fixes.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 61 ++++++++++++++++++++++--
1 file changed, 58 insertions(+), 3 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 1809b84..f0776a9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Xml;
using System.Collections.Generic;
using System.Reflection;
using System.Timers;
@@ -137,6 +138,18 @@ namespace OpenSim.Region.Framework.Scenes
//private int m_lastTerseSent;
private Vector3? m_forceToApply;
+ private int m_userFlags;
+ public int UserFlags
+ {
+ get { return m_userFlags; }
+ }
+ private bool m_flyingOld; // add for fly velocity control
+ public bool m_wasFlying; // add for fly velocity control
+
+ private int m_lastColCount = -1; //KF: Look for Collision chnages
+ private int m_updateCount = 0; //KF: Update Anims for a while
+ private static readonly int UPDATE_COUNT = 10; // how many frames to update for
+
private TeleportFlags m_teleportFlags;
public TeleportFlags TeleportFlags
{
@@ -756,6 +769,7 @@ namespace OpenSim.Region.Framework.Scenes
m_localId = m_scene.AllocateLocalId();
UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid);
+ m_userFlags = account.UserFlags;
if (account != null)
UserLevel = account.UserLevel;
@@ -1033,7 +1047,7 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Removes physics plugin scene representation of this agent if it exists.
///
- private void RemoveFromPhysicalScene()
+ public void RemoveFromPhysicalScene()
{
if (PhysicsActor != null)
{
@@ -1362,6 +1376,10 @@ namespace OpenSim.Region.Framework.Scenes
#endregion Inputs
+ // Make anims work for client side autopilot
+ if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0)
+ m_updateCount = UPDATE_COUNT;
+
if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
{
StandUp();
@@ -1392,6 +1410,9 @@ namespace OpenSim.Region.Framework.Scenes
if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
{
+ m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
+ Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
+
// TODO: This doesn't prevent the user from walking yet.
// Setting parent ID would fix this, if we knew what value
// to use. Or we could add a m_isSitting variable.
@@ -1726,6 +1747,9 @@ namespace OpenSim.Region.Framework.Scenes
///
public void MoveToTarget(Vector3 pos, bool noFly, bool landAtTarget)
{
+ if (SitGround)
+ StandUp();
+
m_log.DebugFormat(
"[SCENE PRESENCE]: Avatar {0} received request to move to position {1} in {2}",
Name, pos, m_scene.RegionInfo.RegionName);
@@ -2361,6 +2385,19 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 direc = vec * Rotation;
direc.Normalize();
+ if (PhysicsActor.Flying != m_flyingOld) // add for fly velocity control
+ {
+ m_flyingOld = PhysicsActor.Flying; // add for fly velocity control
+ if (!PhysicsActor.Flying)
+ m_wasFlying = true; // add for fly velocity control
+ }
+
+ if (PhysicsActor.IsColliding == true)
+ m_wasFlying = false; // add for fly velocity control
+
+ if ((vec.Z == 0f) && !PhysicsActor.Flying)
+ direc.Z = 0f; // Prevent camera WASD up.
+
direc *= 0.03f * 128f * SpeedModifier;
if (PhysicsActor != null)
@@ -2379,7 +2416,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.Info("[AGENT]: Stop Flying");
//}
}
- else if (!PhysicsActor.Flying && PhysicsActor.IsColliding)
+ if (!PhysicsActor.Flying && PhysicsActor.IsColliding)
{
if (direc.Z > 2.0f)
{
@@ -3303,13 +3340,27 @@ namespace OpenSim.Region.Framework.Scenes
// The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents(
// as of this comment the interval is set in AddToPhysicalScene
if (Animator != null)
- Animator.UpdateMovementAnimations();
+ {
+ if (m_updateCount > 0)
+ {
+ Animator.UpdateMovementAnimations();
+ m_updateCount--;
+ }
+ }
CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
Dictionary coldata = collisionData.m_objCollisionList;
CollisionPlane = Vector4.UnitW;
+ // No collisions at all means we may be flying. Update always
+ // to make falling work
+ if (m_lastColCount != coldata.Count || coldata.Count == 0)
+ {
+ m_updateCount = UPDATE_COUNT;
+ m_lastColCount = coldata.Count;
+ }
+
if (coldata.Count != 0 && Animator != null)
{
switch (Animator.CurrentMovementAnimation)
@@ -3410,6 +3461,10 @@ namespace OpenSim.Region.Framework.Scenes
{
lock (m_attachments)
{
+ // This may be true when the attachment comes back
+ // from serialization after login. Clear it.
+ gobj.IsDeleted = false;
+
m_attachments.Add(gobj);
}
}
--
cgit v1.1