aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs941
1 files changed, 449 insertions, 492 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 87fac0c..08c144a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -76,8 +76,18 @@ namespace OpenSim.Region.Framework.Scenes
76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
77 77
78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; 78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
79 79// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
80 public static byte[] DefaultTexture; 80 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
81 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
82 /// <summary>
83 /// Experimentally determined "fudge factor" to make sit-target positions
84 /// the same as in SecondLife. Fudge factor was tested for 36 different
85 /// test cases including prims of type box, sphere, cylinder, and torus,
86 /// with varying parameters for sit target location, prim size, prim
87 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
88 /// issue #1716
89 /// </summary>
90 private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
81 91
82 public UUID currentParcelUUID = UUID.Zero; 92 public UUID currentParcelUUID = UUID.Zero;
83 93
@@ -92,16 +102,18 @@ namespace OpenSim.Region.Framework.Scenes
92 //private SceneObjectPart proxyObjectPart = null; 102 //private SceneObjectPart proxyObjectPart = null;
93 public Vector3 lastKnownAllowedPosition; 103 public Vector3 lastKnownAllowedPosition;
94 public bool sentMessageAboutRestrictedParcelFlyingDown; 104 public bool sentMessageAboutRestrictedParcelFlyingDown;
105 public Vector4 CollisionPlane = Vector4.UnitW;
95 106
96 private Vector3 m_lastPosition; 107 private Vector3 m_lastPosition;
97 private Quaternion m_lastRotation; 108 private Quaternion m_lastRotation;
98 private Vector3 m_lastVelocity; 109 private Vector3 m_lastVelocity;
110 //private int m_lastTerseSent;
99 111
100 private bool m_updateflag; 112 private bool m_updateflag;
101 private byte m_movementflag; 113 private byte m_movementflag;
102 private readonly List<NewForce> m_forcesList = new List<NewForce>(); 114 private Vector3? m_forceToApply;
103 private uint m_requestedSitTargetID; 115 private uint m_requestedSitTargetID;
104 private UUID m_requestedSitTargetUUID = UUID.Zero; 116 private UUID m_requestedSitTargetUUID;
105 private SendCourseLocationsMethod m_sendCourseLocationsMethod; 117 private SendCourseLocationsMethod m_sendCourseLocationsMethod;
106 118
107 private bool m_startAnimationSet; 119 private bool m_startAnimationSet;
@@ -112,30 +124,24 @@ namespace OpenSim.Region.Framework.Scenes
112 124
113 private float m_sitAvatarHeight = 2.0f; 125 private float m_sitAvatarHeight = 2.0f;
114 126
115 // experimentally determined "fudge factor" to make sit-target positions
116 // the same as in SecondLife. Fudge factor was tested for 36 different
117 // test cases including prims of type box, sphere, cylinder, and torus,
118 // with varying parameters for sit target location, prim size, prim
119 // rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
120 // issue #1716
121 private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
122 private float m_godlevel; 127 private float m_godlevel;
123 128
124 private bool m_invulnerable = true; 129 private bool m_invulnerable = true;
125 130
126 private Vector3 m_LastChildAgentUpdatePosition; 131 private Vector3 m_lastChildAgentUpdatePosition;
132 private Vector3 m_lastChildAgentUpdateCamPosition;
127 133
128 private int m_perfMonMS; 134 private int m_perfMonMS;
129 135
130 private bool m_setAlwaysRun; 136 private bool m_setAlwaysRun;
131 137
132 private string m_movementAnimation = "DEFAULT"; 138 private string m_movementAnimation = "DEFAULT";
133 private long m_animPersistUntil = 0; 139 private int m_animTickFall;
134 private bool m_allowFalling = false; 140 private int m_animTickJump;
135 private bool m_useFlySlow = false; 141 private bool m_useFlySlow;
136 private bool m_usePreJump = false; 142 private bool m_usePreJump;
137 private bool m_forceFly = false; 143 private bool m_forceFly;
138 private bool m_flyDisabled = false; 144 private bool m_flyDisabled;
139 145
140 private float m_speedModifier = 1.0f; 146 private float m_speedModifier = 1.0f;
141 147
@@ -143,7 +149,7 @@ namespace OpenSim.Region.Framework.Scenes
143 149
144 public bool IsRestrictedToRegion; 150 public bool IsRestrictedToRegion;
145 151
146 public string JID = string.Empty; 152 public string JID = String.Empty;
147 153
148 // Agent moves with a PID controller causing a force to be exerted. 154 // Agent moves with a PID controller causing a force to be exerted.
149 private bool m_newCoarseLocations = true; 155 private bool m_newCoarseLocations = true;
@@ -158,43 +164,43 @@ namespace OpenSim.Region.Framework.Scenes
158 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 164 private readonly Vector3[] Dir_Vectors = new Vector3[6];
159 165
160 // Position of agent's camera in world (region cordinates) 166 // Position of agent's camera in world (region cordinates)
161 protected Vector3 m_CameraCenter = Vector3.Zero; 167 protected Vector3 m_CameraCenter;
162 protected Vector3 m_lastCameraCenter = Vector3.Zero; 168 protected Vector3 m_lastCameraCenter;
163 169
164 protected Timer m_reprioritization_timer; 170 protected Timer m_reprioritization_timer;
165 protected bool m_reprioritizing = false; 171 protected bool m_reprioritizing;
166 protected bool m_reprioritization_called = false; 172 protected bool m_reprioritization_called;
167 173
168 // Use these three vectors to figure out what the agent is looking at 174 // Use these three vectors to figure out what the agent is looking at
169 // Convert it to a Matrix and/or Quaternion 175 // Convert it to a Matrix and/or Quaternion
170 protected Vector3 m_CameraAtAxis = Vector3.Zero; 176 protected Vector3 m_CameraAtAxis;
171 protected Vector3 m_CameraLeftAxis = Vector3.Zero; 177 protected Vector3 m_CameraLeftAxis;
172 protected Vector3 m_CameraUpAxis = Vector3.Zero; 178 protected Vector3 m_CameraUpAxis;
173 private uint m_AgentControlFlags; 179 private AgentManager.ControlFlags m_AgentControlFlags;
174 private Quaternion m_headrotation = Quaternion.Identity; 180 private Quaternion m_headrotation = Quaternion.Identity;
175 private byte m_state; 181 private byte m_state;
176 182
177 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method 183 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
178 private Vector3 movementvector = Vector3.Zero; 184// private Vector3 movementvector;
179 185
180 private bool m_autopilotMoving; 186 private bool m_autopilotMoving;
181 private Vector3 m_autoPilotTarget = Vector3.Zero; 187 private Vector3 m_autoPilotTarget;
182 private bool m_sitAtAutoTarget; 188 private bool m_sitAtAutoTarget;
183 189
184 private string m_nextSitAnimation = String.Empty; 190 private string m_nextSitAnimation = String.Empty;
185 191
186 //PauPaw:Proper PID Controler for autopilot************ 192 //PauPaw:Proper PID Controler for autopilot************
187 private bool m_moveToPositionInProgress; 193 private bool m_moveToPositionInProgress;
188 private Vector3 m_moveToPositionTarget = Vector3.Zero; 194 private Vector3 m_moveToPositionTarget;
189 195
190 private bool m_followCamAuto = false; 196 private bool m_followCamAuto;
191 197
192 private int m_movementUpdateCount = 0; 198 private int m_movementUpdateCount;
193 199
194 private const int NumMovementsBetweenRayCast = 5; 200 private const int NumMovementsBetweenRayCast = 5;
195 201
196 private bool CameraConstraintActive = false; 202 private bool CameraConstraintActive;
197 //private int m_moveToPositionStateStatus = 0; 203 //private int m_moveToPositionStateStatus;
198 //***************************************************** 204 //*****************************************************
199 205
200 // Agent's Draw distance. 206 // Agent's Draw distance.
@@ -268,11 +274,9 @@ namespace OpenSim.Region.Framework.Scenes
268 get { return m_godlevel; } 274 get { return m_godlevel; }
269 } 275 }
270 276
271 private readonly ulong m_regionHandle;
272
273 public ulong RegionHandle 277 public ulong RegionHandle
274 { 278 {
275 get { return m_regionHandle; } 279 get { return m_rootRegionHandle; }
276 } 280 }
277 281
278 public Vector3 CameraPosition 282 public Vector3 CameraPosition
@@ -379,8 +383,8 @@ namespace OpenSim.Region.Framework.Scenes
379 383
380 public uint AgentControlFlags 384 public uint AgentControlFlags
381 { 385 {
382 get { return m_AgentControlFlags; } 386 get { return (uint)m_AgentControlFlags; }
383 set { m_AgentControlFlags = value; } 387 set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
384 } 388 }
385 389
386 /// <summary> 390 /// <summary>
@@ -411,31 +415,27 @@ namespace OpenSim.Region.Framework.Scenes
411 } 415 }
412 416
413 /// <summary> 417 /// <summary>
414 /// Absolute position of this avatar in 'region cordinates' 418 /// Position of this avatar relative to the region the avatar is in
415 /// </summary> 419 /// </summary>
416 public override Vector3 AbsolutePosition 420 public override Vector3 AbsolutePosition
417 { 421 {
418 get 422 get
419 { 423 {
420 if (m_physicsActor != null) 424 PhysicsActor actor = m_physicsActor;
421 { 425 if (actor != null)
422 m_pos.X = m_physicsActor.Position.X; 426 m_pos = actor.Position;
423 m_pos.Y = m_physicsActor.Position.Y;
424 m_pos.Z = m_physicsActor.Position.Z;
425 }
426 427
427 return m_parentPosition + m_pos; 428 return m_parentPosition + m_pos;
428 } 429 }
429 set 430 set
430 { 431 {
431 if (m_physicsActor != null) 432 PhysicsActor actor = m_physicsActor;
433 if (actor != null)
432 { 434 {
433 try 435 try
434 { 436 {
435 lock (m_scene.SyncRoot) 437 lock (m_scene.SyncRoot)
436 {
437 m_physicsActor.Position = value; 438 m_physicsActor.Position = value;
438 }
439 } 439 }
440 catch (Exception e) 440 catch (Exception e)
441 { 441 {
@@ -444,7 +444,7 @@ namespace OpenSim.Region.Framework.Scenes
444 } 444 }
445 445
446 m_pos = value; 446 m_pos = value;
447 m_parentPosition = new Vector3(0, 0, 0); 447 m_parentPosition = Vector3.Zero;
448 } 448 }
449 } 449 }
450 450
@@ -455,27 +455,21 @@ namespace OpenSim.Region.Framework.Scenes
455 { 455 {
456 get 456 get
457 { 457 {
458 if (m_physicsActor != null) 458 PhysicsActor actor = m_physicsActor;
459 { 459 if (actor != null)
460 m_velocity.X = m_physicsActor.Velocity.X; 460 m_velocity = actor.Velocity;
461 m_velocity.Y = m_physicsActor.Velocity.Y;
462 m_velocity.Z = m_physicsActor.Velocity.Z;
463 }
464 461
465 return m_velocity; 462 return m_velocity;
466 } 463 }
467 set 464 set
468 { 465 {
469 //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value); 466 PhysicsActor actor = m_physicsActor;
470 467 if (actor != null)
471 if (m_physicsActor != null)
472 { 468 {
473 try 469 try
474 { 470 {
475 lock (m_scene.SyncRoot) 471 lock (m_scene.SyncRoot)
476 { 472 actor.Velocity = value;
477 m_physicsActor.Velocity = value;
478 }
479 } 473 }
480 catch (Exception e) 474 catch (Exception e)
481 { 475 {
@@ -487,6 +481,12 @@ namespace OpenSim.Region.Framework.Scenes
487 } 481 }
488 } 482 }
489 483
484 public Quaternion Rotation
485 {
486 get { return m_bodyRot; }
487 set { m_bodyRot = value; }
488 }
489
490 /// <summary> 490 /// <summary>
491 /// If this is true, agent doesn't have a representation in this scene. 491 /// If this is true, agent doesn't have a representation in this scene.
492 /// this is an agent 'looking into' this scene from a nearby scene(region) 492 /// this is an agent 'looking into' this scene from a nearby scene(region)
@@ -627,7 +627,7 @@ namespace OpenSim.Region.Framework.Scenes
627 { 627 {
628 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 628 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
629 CreateSceneViewer(); 629 CreateSceneViewer();
630 m_regionHandle = reginfo.RegionHandle; 630 m_rootRegionHandle = reginfo.RegionHandle;
631 m_controllingClient = client; 631 m_controllingClient = client;
632 m_firstname = m_controllingClient.FirstName; 632 m_firstname = m_controllingClient.FirstName;
633 m_lastname = m_controllingClient.LastName; 633 m_lastname = m_controllingClient.LastName;
@@ -710,25 +710,25 @@ namespace OpenSim.Region.Framework.Scenes
710 710
711 private void SetDirectionVectors() 711 private void SetDirectionVectors()
712 { 712 {
713 Dir_Vectors[0] = new Vector3(1, 0, 0); //FORWARD 713 Dir_Vectors[0] = Vector3.UnitX; //FORWARD
714 Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK 714 Dir_Vectors[1] = -Vector3.UnitX; //BACK
715 Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT 715 Dir_Vectors[2] = Vector3.UnitY; //LEFT
716 Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT 716 Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
717 Dir_Vectors[4] = new Vector3(0, 0, 1); //UP 717 Dir_Vectors[4] = Vector3.UnitZ; //UP
718 Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN 718 Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
719 Dir_Vectors[5] = new Vector3(0, 0, -0.5f); //DOWN_Nudge 719 Dir_Vectors[5] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
720 } 720 }
721 721
722 private Vector3[] GetWalkDirectionVectors() 722 private Vector3[] GetWalkDirectionVectors()
723 { 723 {
724 Vector3[] vector = new Vector3[6]; 724 Vector3[] vector = new Vector3[6];
725 vector[0] = new Vector3(m_CameraUpAxis.Z, 0, -m_CameraAtAxis.Z); //FORWARD 725 vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
726 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0, m_CameraAtAxis.Z); //BACK 726 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
727 vector[2] = new Vector3(0, 1, 0); //LEFT 727 vector[2] = Vector3.UnitY; //LEFT
728 vector[3] = new Vector3(0, -1, 0); //RIGHT 728 vector[3] = -Vector3.UnitY; //RIGHT
729 vector[4] = new Vector3(m_CameraAtAxis.Z, 0, m_CameraUpAxis.Z); //UP 729 vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
730 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN 730 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
731 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN_Nudge 731 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
732 return vector; 732 return vector;
733 } 733 }
734 734
@@ -781,6 +781,8 @@ namespace OpenSim.Region.Framework.Scenes
781 if (gm != null) 781 if (gm != null)
782 m_grouptitle = gm.GetGroupTitle(m_uuid); 782 m_grouptitle = gm.GetGroupTitle(m_uuid);
783 783
784 m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
785
784 m_scene.SetRootAgentScene(m_uuid); 786 m_scene.SetRootAgentScene(m_uuid);
785 787
786 // Moved this from SendInitialData to ensure that m_appearance is initialized 788 // Moved this from SendInitialData to ensure that m_appearance is initialized
@@ -811,7 +813,6 @@ namespace OpenSim.Region.Framework.Scenes
811 pos = emergencyPos; 813 pos = emergencyPos;
812 } 814 }
813 815
814
815 float localAVHeight = 1.56f; 816 float localAVHeight = 1.56f;
816 if (m_avHeight != 127.0f) 817 if (m_avHeight != 127.0f)
817 { 818 {
@@ -906,6 +907,8 @@ namespace OpenSim.Region.Framework.Scenes
906 m_isChildAgent = true; 907 m_isChildAgent = true;
907 m_scene.SwapRootAgentCount(true); 908 m_scene.SwapRootAgentCount(true);
908 RemoveFromPhysicalScene(); 909 RemoveFromPhysicalScene();
910
911 // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
909 912
910 m_scene.EventManager.TriggerOnMakeChildAgent(this); 913 m_scene.EventManager.TriggerOnMakeChildAgent(this);
911 } 914 }
@@ -937,7 +940,7 @@ namespace OpenSim.Region.Framework.Scenes
937 isFlying = m_physicsActor.Flying; 940 isFlying = m_physicsActor.Flying;
938 941
939 RemoveFromPhysicalScene(); 942 RemoveFromPhysicalScene();
940 Velocity = new Vector3(0, 0, 0); 943 Velocity = Vector3.Zero;
941 AbsolutePosition = pos; 944 AbsolutePosition = pos;
942 AddToPhysicalScene(isFlying); 945 AddToPhysicalScene(isFlying);
943 if (m_appearance != null) 946 if (m_appearance != null)
@@ -985,12 +988,13 @@ namespace OpenSim.Region.Framework.Scenes
985 988
986 if (m_avHeight != 127.0f) 989 if (m_avHeight != 127.0f)
987 { 990 {
988 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (m_avHeight / 6f)); 991 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (m_avHeight / 6f));
989 } 992 }
990 else 993 else
991 { 994 {
992 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (1.56f / 6f)); 995 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
993 } 996 }
997
994 TrySetMovementAnimation("LAND"); 998 TrySetMovementAnimation("LAND");
995 SendFullUpdateToAllClients(); 999 SendFullUpdateToAllClients();
996 } 1000 }
@@ -1076,7 +1080,7 @@ namespace OpenSim.Region.Framework.Scenes
1076 } 1080 }
1077 1081
1078 m_isChildAgent = false; 1082 m_isChildAgent = false;
1079 bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); 1083 bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1080 MakeRootAgent(AbsolutePosition, m_flying); 1084 MakeRootAgent(AbsolutePosition, m_flying);
1081 1085
1082 if ((m_callbackURI != null) && !m_callbackURI.Equals("")) 1086 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
@@ -1103,9 +1107,12 @@ namespace OpenSim.Region.Framework.Scenes
1103 /// <param name="distance"></param> 1107 /// <param name="distance"></param>
1104 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance) 1108 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
1105 { 1109 {
1110 const float POSITION_TOLERANCE = 0.02f;
1111 const float VELOCITY_TOLERANCE = 0.02f;
1112 const float ROTATION_TOLERANCE = 0.02f;
1113
1106 if (m_followCamAuto) 1114 if (m_followCamAuto)
1107 { 1115 {
1108
1109 if (hitYN) 1116 if (hitYN)
1110 { 1117 {
1111 CameraConstraintActive = true; 1118 CameraConstraintActive = true;
@@ -1114,11 +1121,11 @@ namespace OpenSim.Region.Framework.Scenes
1114 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); 1121 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
1115 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); 1122 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
1116 } 1123 }
1117 else 1124 else
1118 { 1125 {
1119 if ((m_pos - m_lastPosition).Length() > 0.02f || 1126 if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
1120 (m_velocity - m_lastVelocity).Length() > 0.02f || 1127 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
1121 m_bodyRot != m_lastRotation) 1128 !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
1122 { 1129 {
1123 if (CameraConstraintActive) 1130 if (CameraConstraintActive)
1124 { 1131 {
@@ -1127,13 +1134,11 @@ namespace OpenSim.Region.Framework.Scenes
1127 } 1134 }
1128 } 1135 }
1129 } 1136 }
1130 } 1137 }
1131 } 1138 }
1132 1139
1133 Array m_dirControlFlags = Enum.GetValues(typeof(Dir_ControlFlags));
1134
1135 /// <summary> 1140 /// <summary>
1136 /// This is the event handler for client movement. If a client is moving, this event is triggering. 1141 /// This is the event handler for client movement. If a client is moving, this event is triggering.
1137 /// </summary> 1142 /// </summary>
1138 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 1143 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1139 { 1144 {
@@ -1149,15 +1154,13 @@ namespace OpenSim.Region.Framework.Scenes
1149 if (m_movementUpdateCount < 1) 1154 if (m_movementUpdateCount < 1)
1150 m_movementUpdateCount = 1; 1155 m_movementUpdateCount = 1;
1151 1156
1152 // Must check for standing up even when PhysicsActor is null, 1157 #region Sanity Checking
1153 // since sitting currently removes avatar from physical scene
1154 //m_log.Debug("agentPos:" + AbsolutePosition.ToString());
1155 1158
1156 // This is irritating. Really. 1159 // This is irritating. Really.
1157 if (!AbsolutePosition.IsFinite()) 1160 if (!AbsolutePosition.IsFinite())
1158 { 1161 {
1159 RemoveFromPhysicalScene(); 1162 RemoveFromPhysicalScene();
1160 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999902"); 1163 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
1161 1164
1162 m_pos = m_LastFinitePos; 1165 m_pos = m_LastFinitePos;
1163 if (!m_pos.IsFinite()) 1166 if (!m_pos.IsFinite())
@@ -1165,7 +1168,7 @@ namespace OpenSim.Region.Framework.Scenes
1165 m_pos.X = 127f; 1168 m_pos.X = 127f;
1166 m_pos.Y = 127f; 1169 m_pos.Y = 127f;
1167 m_pos.Z = 127f; 1170 m_pos.Z = 127f;
1168 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999903"); 1171 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
1169 } 1172 }
1170 1173
1171 AddToPhysicalScene(false); 1174 AddToPhysicalScene(false);
@@ -1175,18 +1178,11 @@ namespace OpenSim.Region.Framework.Scenes
1175 m_LastFinitePos = m_pos; 1178 m_LastFinitePos = m_pos;
1176 } 1179 }
1177 1180
1178 //m_physicsActor.AddForce(new PhysicsVector(999999999, 99999999, 999999999999999), true); 1181 #endregion Sanity Checking
1179 1182
1180 //ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); 1183 #region Inputs
1181 //if (land != null)
1182 //{
1183 //if (land.landData.landingType == (byte)1 && land.landData.userLocation != Vector3.Zero)
1184 //{
1185 // agent.startpos = land.landData.userLocation;
1186 //}
1187 //}
1188 1184
1189 uint flags = agentData.ControlFlags; 1185 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
1190 Quaternion bodyRotation = agentData.BodyRotation; 1186 Quaternion bodyRotation = agentData.BodyRotation;
1191 1187
1192 // Camera location in world. We'll need to raytrace 1188 // Camera location in world. We'll need to raytrace
@@ -1207,87 +1203,85 @@ namespace OpenSim.Region.Framework.Scenes
1207 // The Agent's Draw distance setting 1203 // The Agent's Draw distance setting
1208 m_DrawDistance = agentData.Far; 1204 m_DrawDistance = agentData.Far;
1209 1205
1210 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
1211 {
1212 StandUp();
1213 }
1214
1215 // Check if Client has camera in 'follow cam' or 'build' mode. 1206 // Check if Client has camera in 'follow cam' or 'build' mode.
1216 Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); 1207 Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
1217 1208
1218 m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f) 1209 m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
1219 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; 1210 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
1220 1211
1212 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1213 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1214
1215 #endregion Inputs
1216
1217 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
1218 {
1219 StandUp();
1220 }
1221
1221 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto); 1222 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
1222 // Raycast from the avatar's head to the camera to see if there's anything blocking the view 1223 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
1223 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) 1224 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
1224 { 1225 {
1225 if (m_followCamAuto) 1226 if (m_followCamAuto)
1226 { 1227 {
1227 Vector3 headadjustment = new Vector3(0, 0, 0.3f); 1228 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
1228 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - (m_pos + headadjustment)), Vector3.Distance(m_CameraCenter, (m_pos + headadjustment)) + 0.3f, RayCastCameraCallback); 1229 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
1229 } 1230 }
1230 } 1231 }
1231 1232
1232 m_mouseLook = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1233 m_leftButtonDown = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1234
1235 lock (scriptedcontrols) 1233 lock (scriptedcontrols)
1236 { 1234 {
1237 if (scriptedcontrols.Count > 0) 1235 if (scriptedcontrols.Count > 0)
1238 { 1236 {
1239 SendControlToScripts(flags); 1237 SendControlToScripts((uint)flags);
1240 flags = RemoveIgnoredControls(flags, IgnoredControls); 1238 flags = RemoveIgnoredControls(flags, IgnoredControls);
1241 } 1239 }
1242 } 1240 }
1243 1241
1244 if (PhysicsActor == null)
1245 {
1246 return;
1247 }
1248
1249 if (m_autopilotMoving) 1242 if (m_autopilotMoving)
1250 CheckAtSitTarget(); 1243 CheckAtSitTarget();
1251 1244
1252 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 1245 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
1253 { 1246 {
1254 // TODO: This doesn't prevent the user from walking yet. 1247 // TODO: This doesn't prevent the user from walking yet.
1255 // Setting parent ID would fix this, if we knew what value 1248 // Setting parent ID would fix this, if we knew what value
1256 // to use. Or we could add a m_isSitting variable. 1249 // to use. Or we could add a m_isSitting variable.
1257
1258 TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); 1250 TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
1259 } 1251 }
1252
1260 // In the future, these values might need to go global. 1253 // In the future, these values might need to go global.
1261 // Here's where you get them. 1254 // Here's where you get them.
1262
1263 m_AgentControlFlags = flags; 1255 m_AgentControlFlags = flags;
1264 m_headrotation = agentData.HeadRotation; 1256 m_headrotation = agentData.HeadRotation;
1265 m_state = agentData.State; 1257 m_state = agentData.State;
1266 1258
1259 PhysicsActor actor = PhysicsActor;
1260 if (actor == null)
1261 {
1262 return;
1263 }
1264
1267 if (m_allowMovement) 1265 if (m_allowMovement)
1268 { 1266 {
1269 int i = 0; 1267 int i = 0;
1270 bool update_movementflag = false; 1268 bool update_movementflag = false;
1271 bool update_rotation = false; 1269 bool update_rotation = false;
1272 bool DCFlagKeyPressed = false; 1270 bool DCFlagKeyPressed = false;
1273 Vector3 agent_control_v3 = new Vector3(0, 0, 0); 1271 Vector3 agent_control_v3 = Vector3.Zero;
1274 Quaternion q = bodyRotation; 1272 Quaternion q = bodyRotation;
1275 if (PhysicsActor != null)
1276 {
1277 bool oldflying = PhysicsActor.Flying;
1278 1273
1279 if (m_forceFly) 1274 bool oldflying = PhysicsActor.Flying;
1280 PhysicsActor.Flying = true;
1281 else if (m_flyDisabled)
1282 PhysicsActor.Flying = false;
1283 else
1284 PhysicsActor.Flying = ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1285 1275
1286 if (PhysicsActor.Flying != oldflying) 1276 if (m_forceFly)
1287 { 1277 actor.Flying = true;
1288 update_movementflag = true; 1278 else if (m_flyDisabled)
1289 } 1279 actor.Flying = false;
1290 } 1280 else
1281 actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1282
1283 if (actor.Flying != oldflying)
1284 update_movementflag = true;
1291 1285
1292 if (q != m_bodyRot) 1286 if (q != m_bodyRot)
1293 { 1287 {
@@ -1309,10 +1303,9 @@ namespace OpenSim.Region.Framework.Scenes
1309 else 1303 else
1310 dirVectors = Dir_Vectors; 1304 dirVectors = Dir_Vectors;
1311 1305
1312 1306 foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
1313 foreach (Dir_ControlFlags DCF in m_dirControlFlags)
1314 { 1307 {
1315 if ((flags & (uint)DCF) != 0) 1308 if (((uint)flags & (uint)DCF) != 0)
1316 { 1309 {
1317 bResetMoveToPosition = true; 1310 bResetMoveToPosition = true;
1318 DCFlagKeyPressed = true; 1311 DCFlagKeyPressed = true;
@@ -1358,7 +1351,7 @@ namespace OpenSim.Region.Framework.Scenes
1358 if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving)) 1351 if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
1359 { 1352 {
1360 //Check the error term of the current position in relation to the target position 1353 //Check the error term of the current position in relation to the target position
1361 if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5) 1354 if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5f)
1362 { 1355 {
1363 // we are close enough to the target 1356 // we are close enough to the target
1364 m_moveToPositionTarget = Vector3.Zero; 1357 m_moveToPositionTarget = Vector3.Zero;
@@ -1439,8 +1432,8 @@ namespace OpenSim.Region.Framework.Scenes
1439 if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly) 1432 if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
1440 { 1433 {
1441 // Are the landing controls requirements filled? 1434 // Are the landing controls requirements filled?
1442 bool controlland = (((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || 1435 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
1443 ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 1436 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
1444 1437
1445 // Are the collision requirements fulfilled? 1438 // Are the collision requirements fulfilled?
1446 bool colliding = (m_physicsActor.IsColliding == true); 1439 bool colliding = (m_physicsActor.IsColliding == true);
@@ -1537,7 +1530,7 @@ namespace OpenSim.Region.Framework.Scenes
1537 if (part != null) 1530 if (part != null)
1538 { 1531 {
1539 AbsolutePosition = part.AbsolutePosition; 1532 AbsolutePosition = part.AbsolutePosition;
1540 Velocity = new Vector3(0, 0, 0); 1533 Velocity = Vector3.Zero;
1541 SendFullUpdateToAllClients(); 1534 SendFullUpdateToAllClients();
1542 1535
1543 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); 1536 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
@@ -1607,7 +1600,7 @@ namespace OpenSim.Region.Framework.Scenes
1607 } 1600 }
1608 1601
1609 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); 1602 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
1610 m_parentPosition = new Vector3(); 1603 m_parentPosition = Vector3.Zero;
1611 1604
1612 m_parentID = 0; 1605 m_parentID = 0;
1613 SendFullUpdateToAllClients(); 1606 SendFullUpdateToAllClients();
@@ -1834,7 +1827,7 @@ namespace OpenSim.Region.Framework.Scenes
1834 //Quaternion result = (sitTargetOrient * vq) * nq; 1827 //Quaternion result = (sitTargetOrient * vq) * nq;
1835 1828
1836 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); 1829 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
1837 m_pos += m_sitTargetCorrectionOffset; 1830 m_pos += SIT_TARGET_ADJUSTMENT;
1838 m_bodyRot = sitTargetOrient; 1831 m_bodyRot = sitTargetOrient;
1839 //Rotation = sitTargetOrient; 1832 //Rotation = sitTargetOrient;
1840 m_parentPosition = part.AbsolutePosition; 1833 m_parentPosition = part.AbsolutePosition;
@@ -1854,7 +1847,7 @@ namespace OpenSim.Region.Framework.Scenes
1854 } 1847 }
1855 m_parentID = m_requestedSitTargetID; 1848 m_parentID = m_requestedSitTargetID;
1856 1849
1857 Velocity = new Vector3(0, 0, 0); 1850 Velocity = Vector3.Zero;
1858 RemoveFromPhysicalScene(); 1851 RemoveFromPhysicalScene();
1859 1852
1860 TrySetMovementAnimation(sitAnimation); 1853 TrySetMovementAnimation(sitAnimation);
@@ -1925,14 +1918,10 @@ namespace OpenSim.Region.Framework.Scenes
1925 } 1918 }
1926 1919
1927 1920
1928 AssetBase Animasset = new AssetBase(); 1921 AssetBase Animasset = new AssetBase(UUID.Random(), "Random Animation", (sbyte)AssetType.Animation);
1929 Animasset.Data = anim.ToBytes(); 1922 Animasset.Data = anim.ToBytes();
1930 Animasset.Temporary = true; 1923 Animasset.Temporary = true;
1931 Animasset.Local = true; 1924 Animasset.Local = true;
1932 Animasset.FullID = UUID.Random();
1933 Animasset.ID = Animasset.FullID.ToString();
1934 Animasset.Name = "Random Animation";
1935 Animasset.Type = (sbyte)AssetType.Animation;
1936 Animasset.Description = "dance"; 1925 Animasset.Description = "dance";
1937 //BinBVHAnimation bbvhanim = new BinBVHAnimation(Animasset.Data); 1926 //BinBVHAnimation bbvhanim = new BinBVHAnimation(Animasset.Data);
1938 1927
@@ -2011,7 +2000,7 @@ namespace OpenSim.Region.Framework.Scenes
2011 protected void TrySetMovementAnimation(string anim) 2000 protected void TrySetMovementAnimation(string anim)
2012 { 2001 {
2013 //m_log.DebugFormat("Updating movement animation to {0}", anim); 2002 //m_log.DebugFormat("Updating movement animation to {0}", anim);
2014 2003
2015 if (!m_isChildAgent) 2004 if (!m_isChildAgent)
2016 { 2005 {
2017 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero)) 2006 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
@@ -2046,200 +2035,169 @@ namespace OpenSim.Region.Framework.Scenes
2046 /// </summary> 2035 /// </summary>
2047 public string GetMovementAnimation() 2036 public string GetMovementAnimation()
2048 { 2037 {
2049 if ((m_animPersistUntil > 0) && (m_animPersistUntil > DateTime.Now.Ticks)) 2038 const float FALL_DELAY = 0.33f;
2050 { 2039 const float PREJUMP_DELAY = 0.25f;
2051 //We don't want our existing state to end yet.
2052 return m_movementAnimation;
2053 2040
2054 } 2041 #region Inputs
2055 else if (m_movementflag != 0) 2042
2043 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
2044 PhysicsActor actor = m_physicsActor;
2045
2046 // Create forward and left vectors from the current avatar rotation
2047 Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
2048 Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
2049 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
2050
2051 // Check control flags
2052 bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
2053 bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
2054 bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
2055 bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
2056 //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
2057 //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
2058 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
2059 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
2060 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2061 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
2062
2063 // Direction in which the avatar is trying to move
2064 Vector3 move = Vector3.Zero;
2065 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
2066 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
2067 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
2068 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
2069 if (heldUp) { move.Z += 1; }
2070 if (heldDown) { move.Z -= 1; }
2071
2072 // Is the avatar trying to move?
2073// bool moving = (move != Vector3.Zero);
2074 bool jumping = m_animTickJump != 0;
2075
2076 #endregion Inputs
2077
2078 #region Flying
2079
2080 if (actor != null && actor.Flying)
2056 { 2081 {
2057 //We're moving 2082 m_animTickFall = 0;
2058 m_allowFalling = true; 2083 m_animTickJump = 0;
2059 if (PhysicsActor != null && PhysicsActor.IsColliding) 2084
2085 if (move.X != 0f || move.Y != 0f)
2060 { 2086 {
2061 //And colliding. Can you guess what it is yet? 2087 return (m_useFlySlow ? "FLYSLOW" : "FLY");
2062 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) 2088 }
2063 { 2089 else if (move.Z > 0f)
2064 //Down key is being pressed. 2090 {
2065 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) + (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0) 2091 return "HOVER_UP";
2066 { 2092 }
2067 return "CROUCHWALK"; 2093 else if (move.Z < 0f)
2068 } 2094 {
2069 else 2095 if (actor != null && actor.IsColliding)
2070 { 2096 return "LAND";
2071 return "CROUCH";
2072 }
2073 }
2074 else if (m_setAlwaysRun)
2075 {
2076 return "RUN";
2077 }
2078 else 2097 else
2079 { 2098 return "HOVER_DOWN";
2080 //If we're prejumping then inhibit this, it's a problem
2081 //caused by a false positive on IsColliding
2082 if (m_movementAnimation == "PREJUMP")
2083 {
2084 return "PREJUMP";
2085 }
2086 else
2087 {
2088 return "WALK";
2089 }
2090 }
2091
2092 } 2099 }
2093 else 2100 else
2094 { 2101 {
2095 //We're not colliding. Colliding isn't cool these days. 2102 return "HOVER";
2096 if (PhysicsActor != null && PhysicsActor.Flying) 2103 }
2097 { 2104 }
2098 //Are we moving forwards or backwards?
2099 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
2100 {
2101 //Then we really are flying
2102 if (m_setAlwaysRun)
2103 {
2104 return "FLY";
2105 }
2106 else
2107 {
2108 if (m_useFlySlow == false)
2109 {
2110 return "FLY";
2111 }
2112 else
2113 {
2114 return "FLYSLOW";
2115 }
2116 }
2117 }
2118 else
2119 {
2120 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
2121 {
2122 return "HOVER_UP";
2123 }
2124 else
2125 {
2126 return "HOVER_DOWN";
2127 }
2128 }
2129 2105
2130 } 2106 #endregion Flying
2131 else if (m_movementAnimation == "JUMP")
2132 {
2133 //If we were already jumping, continue to jump until we collide
2134 return "JUMP";
2135 2107
2136 } 2108 #region Falling/Floating/Landing
2137 else if (m_movementAnimation == "PREJUMP" && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
2138 {
2139 //If we were in a prejump, and the UP key is no longer being held down
2140 //then we're not going to fly, so we're jumping
2141 return "JUMP";
2142 2109
2143 } 2110 if (actor == null || !actor.IsColliding)
2144 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2111 {
2145 { 2112 float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2146 //They're pressing up, so we're either going to fly or jump 2113 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
2147 return "PREJUMP"; 2114
2148 } 2115 if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
2149 else 2116 {
2150 { 2117 // Just started falling
2151 //If we're moving and not flying and not jumping and not colliding.. 2118 m_animTickFall = Environment.TickCount;
2152 2119 }
2153 if (m_movementAnimation == "WALK" || m_movementAnimation == "RUN") 2120 else if (!jumping && fallElapsed > FALL_DELAY)
2154 { 2121 {
2155 //Let's not enter a FALLDOWN state here, since we're probably 2122 // Falling long enough to trigger the animation
2156 //not colliding because we're going down hill. 2123 return "FALLDOWN";
2157 return m_movementAnimation;
2158 }
2159 //Record the time we enter this state so we know whether to "land" or not
2160 m_animPersistUntil = DateTime.Now.Ticks;
2161 return "FALLDOWN";
2162
2163 }
2164 } 2124 }
2125
2126 return m_movementAnimation;
2165 } 2127 }
2166 else 2128
2129 #endregion Falling/Floating/Landing
2130
2131 #region Ground Movement
2132
2133 if (m_movementAnimation == "FALLDOWN")
2167 { 2134 {
2168 //We're not moving. 2135 m_animTickFall = Environment.TickCount;
2169 if (PhysicsActor != null && PhysicsActor.IsColliding)
2170 {
2171 //But we are colliding.
2172 if (m_movementAnimation == "FALLDOWN")
2173 {
2174 //We're re-using the m_animPersistUntil value here to see how long we've been falling
2175 if ((DateTime.Now.Ticks - m_animPersistUntil) > TimeSpan.TicksPerSecond)
2176 {
2177 //Make sure we don't change state for a bit
2178 m_animPersistUntil = DateTime.Now.Ticks + TimeSpan.TicksPerSecond;
2179 return "LAND";
2180 }
2181 else
2182 {
2183 //We haven't been falling very long, we were probably just walking down hill
2184 return "STAND";
2185 }
2186 }
2187 else if (m_movementAnimation == "JUMP" || m_movementAnimation == "HOVER_DOWN")
2188 {
2189 //Make sure we don't change state for a bit
2190 m_animPersistUntil = DateTime.Now.Ticks + (1 * TimeSpan.TicksPerSecond);
2191 return "SOFT_LAND";
2192 2136
2193 } 2137 // TODO: SOFT_LAND support
2194 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2138 return "LAND";
2195 { 2139 }
2196 return "PREJUMP"; 2140 else if (m_movementAnimation == "LAND")
2197 } 2141 {
2198 else if (PhysicsActor != null && PhysicsActor.Flying) 2142 float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2199 { 2143
2200 m_allowFalling = true; 2144 if (landElapsed <= FALL_DELAY)
2201 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2145 return "LAND";
2202 { 2146 }
2203 return "HOVER_UP";
2204 }
2205 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)
2206 {
2207 return "HOVER_DOWN";
2208 }
2209 else
2210 {
2211 return "HOVER";
2212 }
2213 }
2214 else
2215 {
2216 return "STAND";
2217 }
2218 2147
2148 m_animTickFall = 0;
2149
2150 if (move.Z > 0f)
2151 {
2152 // Jumping
2153 if (!jumping)
2154 {
2155 // Begin prejump
2156 m_animTickJump = Environment.TickCount;
2157 return "PREJUMP";
2219 } 2158 }
2220 else 2159 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
2221 { 2160 {
2222 //We're not colliding. 2161 // Start actual jump
2223 if (PhysicsActor != null && PhysicsActor.Flying) 2162 if (m_animTickJump == -1)
2224 { 2163 {
2225 2164 // Already jumping! End the current jump
2226 return "HOVER"; 2165 m_animTickJump = 0;
2227 2166 return "JUMP";
2228 } 2167 }
2229 else if ((m_movementAnimation == "JUMP" || m_movementAnimation == "PREJUMP") && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
2230 {
2231 2168
2232 return "JUMP"; 2169 m_animTickJump = -1;
2170 return "JUMP";
2171 }
2172 }
2173 else
2174 {
2175 // Not jumping
2176 m_animTickJump = 0;
2233 2177
2234 } 2178 if (move.X != 0f || move.Y != 0f)
2179 {
2180 // Walking / crouchwalking / running
2181 if (move.Z < 0f)
2182 return "CROUCHWALK";
2183 else if (m_setAlwaysRun)
2184 return "RUN";
2235 else 2185 else
2236 { 2186 return "WALK";
2237 //Record the time we enter this state so we know whether to "land" or not 2187 }
2238 m_animPersistUntil = DateTime.Now.Ticks; 2188 else
2239 return "FALLDOWN"; // this falling animation is invoked too frequently when capsule tilt correction is used - why? 2189 {
2240 } 2190 // Not walking
2191 if (move.Z < 0f)
2192 return "CROUCH";
2193 else
2194 return "STAND";
2241 } 2195 }
2242 } 2196 }
2197
2198 #endregion Ground Movement
2199
2200 return m_movementAnimation;
2243 } 2201 }
2244 2202
2245 /// <summary> 2203 /// <summary>
@@ -2247,24 +2205,16 @@ namespace OpenSim.Region.Framework.Scenes
2247 /// </summary> 2205 /// </summary>
2248 protected void UpdateMovementAnimations() 2206 protected void UpdateMovementAnimations()
2249 { 2207 {
2250 string movementAnimation = GetMovementAnimation(); 2208 m_movementAnimation = GetMovementAnimation();
2251 2209
2252 if (movementAnimation == "FALLDOWN" && m_allowFalling == false) 2210 if (m_movementAnimation == "PREJUMP" && !m_usePreJump)
2253 {
2254 movementAnimation = m_movementAnimation;
2255 }
2256 else
2257 {
2258 m_movementAnimation = movementAnimation;
2259 }
2260 if (movementAnimation == "PREJUMP" && m_usePreJump == false)
2261 { 2211 {
2262 //This was the previous behavior before PREJUMP 2212 // This was the previous behavior before PREJUMP
2263 TrySetMovementAnimation("JUMP"); 2213 TrySetMovementAnimation("JUMP");
2264 } 2214 }
2265 else 2215 else
2266 { 2216 {
2267 TrySetMovementAnimation(movementAnimation); 2217 TrySetMovementAnimation(m_movementAnimation);
2268 } 2218 }
2269 } 2219 }
2270 2220
@@ -2277,7 +2227,7 @@ namespace OpenSim.Region.Framework.Scenes
2277 { 2227 {
2278 if (m_isChildAgent) 2228 if (m_isChildAgent)
2279 { 2229 {
2280 m_log.Debug("DEBUG: AddNewMovement: child agent, Making root agent!"); 2230 m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
2281 2231
2282 // we have to reset the user's child agent connections. 2232 // we have to reset the user's child agent connections.
2283 // Likely, here they've lost the eventqueue for other regions so border 2233 // Likely, here they've lost the eventqueue for other regions so border
@@ -2286,7 +2236,7 @@ namespace OpenSim.Region.Framework.Scenes
2286 List<ulong> regions = new List<ulong>(KnownChildRegionHandles); 2236 List<ulong> regions = new List<ulong>(KnownChildRegionHandles);
2287 regions.Remove(m_scene.RegionInfo.RegionHandle); 2237 regions.Remove(m_scene.RegionInfo.RegionHandle);
2288 2238
2289 MakeRootAgent(new Vector3(127, 127, 127), true); 2239 MakeRootAgent(new Vector3(127f, 127f, 127f), true);
2290 2240
2291 // Async command 2241 // Async command
2292 if (m_scene.SceneGridService != null) 2242 if (m_scene.SceneGridService != null)
@@ -2298,47 +2248,45 @@ namespace OpenSim.Region.Framework.Scenes
2298 System.Threading.Thread.Sleep(500); 2248 System.Threading.Thread.Sleep(500);
2299 } 2249 }
2300 2250
2301
2302 if (m_scene.SceneGridService != null) 2251 if (m_scene.SceneGridService != null)
2303 { 2252 {
2304 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>()); 2253 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>());
2305 } 2254 }
2306 2255
2307
2308
2309 return; 2256 return;
2310 } 2257 }
2311 2258
2312 m_perfMonMS = Environment.TickCount; 2259 m_perfMonMS = Environment.TickCount;
2313 2260
2314 m_rotation = rotation; 2261 Rotation = rotation;
2315 NewForce newVelocity = new NewForce();
2316 Vector3 direc = vec * rotation; 2262 Vector3 direc = vec * rotation;
2317 direc.Normalize(); 2263 direc.Normalize();
2318 2264
2319 direc *= 0.03f * 128f * m_speedModifier; 2265 direc *= 0.03f * 128f * m_speedModifier;
2320 if (m_physicsActor.Flying) 2266
2321 { 2267 PhysicsActor actor = m_physicsActor;
2322 direc *= 4; 2268 if (actor != null)
2323 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2324 //bool colliding = (m_physicsActor.IsColliding==true);
2325 //if (controlland)
2326 // m_log.Info("[AGENT]: landCommand");
2327 //if (colliding)
2328 // m_log.Info("[AGENT]: colliding");
2329 //if (m_physicsActor.Flying && colliding && controlland)
2330 //{
2331 // StopFlying();
2332 // m_log.Info("[AGENT]: Stop FLying");
2333 //}
2334 }
2335 else
2336 { 2269 {
2337 if (!m_physicsActor.Flying && m_physicsActor.IsColliding) 2270 if (actor.Flying)
2271 {
2272 direc *= 4.0f;
2273 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2274 //bool colliding = (m_physicsActor.IsColliding==true);
2275 //if (controlland)
2276 // m_log.Info("[AGENT]: landCommand");
2277 //if (colliding)
2278 // m_log.Info("[AGENT]: colliding");
2279 //if (m_physicsActor.Flying && colliding && controlland)
2280 //{
2281 // StopFlying();
2282 // m_log.Info("[AGENT]: Stop FLying");
2283 //}
2284 }
2285 else if (!actor.Flying && actor.IsColliding)
2338 { 2286 {
2339 if (direc.Z > 2.0f) 2287 if (direc.Z > 2.0f)
2340 { 2288 {
2341 direc.Z *= 3; 2289 direc.Z *= 3.0f;
2342 2290
2343 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored. 2291 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
2344 TrySetMovementAnimation("PREJUMP"); 2292 TrySetMovementAnimation("PREJUMP");
@@ -2347,10 +2295,8 @@ namespace OpenSim.Region.Framework.Scenes
2347 } 2295 }
2348 } 2296 }
2349 2297
2350 newVelocity.X = direc.X; 2298 // TODO: Add the force instead of only setting it to support multiple forces per frame?
2351 newVelocity.Y = direc.Y; 2299 m_forceToApply = direc;
2352 newVelocity.Z = direc.Z;
2353 m_forcesList.Add(newVelocity);
2354 2300
2355 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2301 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2356 } 2302 }
@@ -2361,8 +2307,10 @@ namespace OpenSim.Region.Framework.Scenes
2361 2307
2362 public override void Update() 2308 public override void Update()
2363 { 2309 {
2364 const float VELOCITY_TOLERANCE = 0.01f; 2310 const float ROTATION_TOLERANCE = 0.01f;
2365 const float POSITION_TOLERANCE = 10.0f; 2311 const float VELOCITY_TOLERANCE = 0.001f;
2312 const float POSITION_TOLERANCE = 0.05f;
2313 //const int TIME_MS_TOLERANCE = 3000;
2366 2314
2367 SendPrimUpdates(); 2315 SendPrimUpdates();
2368 2316
@@ -2374,17 +2322,25 @@ namespace OpenSim.Region.Framework.Scenes
2374 2322
2375 if (m_isChildAgent == false) 2323 if (m_isChildAgent == false)
2376 { 2324 {
2325// PhysicsActor actor = m_physicsActor;
2326
2327 // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
2328 // grab the latest PhysicsActor velocity, whereas m_velocity is often
2329 // storing a requested force instead of an actual traveling velocity
2330
2377 // Throw away duplicate or insignificant updates 2331 // Throw away duplicate or insignificant updates
2378 if (m_bodyRot != m_lastRotation || 2332 if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
2379 (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || 2333 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
2380 (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE) 2334 !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
2335 //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
2381 { 2336 {
2382 SendTerseUpdateToAllClients(); 2337 SendTerseUpdateToAllClients();
2383 2338
2384 // Update the "last" values 2339 // Update the "last" values
2385 m_lastPosition = m_pos; 2340 m_lastPosition = m_pos;
2386 m_lastRotation = m_bodyRot; 2341 m_lastRotation = m_bodyRot;
2387 m_lastVelocity = m_velocity; 2342 m_lastVelocity = Velocity;
2343 //m_lastTerseSent = Environment.TickCount;
2388 } 2344 }
2389 2345
2390 // followed suggestion from mic bowman. reversed the two lines below. 2346 // followed suggestion from mic bowman. reversed the two lines below.
@@ -2410,11 +2366,16 @@ namespace OpenSim.Region.Framework.Scenes
2410 { 2366 {
2411 m_perfMonMS = Environment.TickCount; 2367 m_perfMonMS = Environment.TickCount;
2412 2368
2369 PhysicsActor actor = m_physicsActor;
2370 Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
2371
2413 Vector3 pos = m_pos; 2372 Vector3 pos = m_pos;
2414 pos.Z -= m_appearance.HipOffset; 2373 pos.Z += m_appearance.HipOffset;
2415 2374
2416 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, 2375 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
2417 pos, m_velocity, Vector3.Zero, m_bodyRot, Vector4.UnitW, m_uuid, null, GetUpdatePriority(remoteClient))); 2376
2377 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
2378 pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
2418 2379
2419 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2380 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2420 m_scene.StatsReporter.AddAgentUpdates(1); 2381 m_scene.StatsReporter.AddAgentUpdates(1);
@@ -2510,7 +2471,7 @@ namespace OpenSim.Region.Framework.Scenes
2510 return; 2471 return;
2511 2472
2512 Vector3 pos = m_pos; 2473 Vector3 pos = m_pos;
2513 pos.Z -= m_appearance.HipOffset; 2474 pos.Z += m_appearance.HipOffset;
2514 2475
2515 remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, 2476 remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
2516 LocalId, pos, m_appearance.Texture.GetBytes(), 2477 LocalId, pos, m_appearance.Texture.GetBytes(),
@@ -2581,7 +2542,7 @@ namespace OpenSim.Region.Framework.Scenes
2581 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); 2542 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
2582 2543
2583 Vector3 pos = m_pos; 2544 Vector3 pos = m_pos;
2584 pos.Z -= m_appearance.HipOffset; 2545 pos.Z += m_appearance.HipOffset;
2585 2546
2586 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2547 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2587 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2548 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2690,7 +2651,7 @@ namespace OpenSim.Region.Framework.Scenes
2690 } 2651 }
2691 2652
2692 Vector3 pos = m_pos; 2653 Vector3 pos = m_pos;
2693 pos.Z -= m_appearance.HipOffset; 2654 pos.Z += m_appearance.HipOffset;
2694 2655
2695 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2656 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2696 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2657 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2778,7 +2739,8 @@ namespace OpenSim.Region.Framework.Scenes
2778 } 2739 }
2779 2740
2780 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 2741 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
2781 if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance) 2742 if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
2743 Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
2782 { 2744 {
2783 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); 2745 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
2784 cadu.ActiveGroupID = UUID.Zero.Guid; 2746 cadu.ActiveGroupID = UUID.Zero.Guid;
@@ -2792,7 +2754,7 @@ namespace OpenSim.Region.Framework.Scenes
2792 cadu.godlevel = m_godlevel; 2754 cadu.godlevel = m_godlevel;
2793 cadu.GroupAccess = 0; 2755 cadu.GroupAccess = 0;
2794 cadu.Position = new sLLVector3(AbsolutePosition); 2756 cadu.Position = new sLLVector3(AbsolutePosition);
2795 cadu.regionHandle = m_scene.RegionInfo.RegionHandle; 2757 cadu.regionHandle = m_rootRegionHandle;
2796 float multiplier = 1; 2758 float multiplier = 1;
2797 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); 2759 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
2798 if (innacurateNeighbors != 0) 2760 if (innacurateNeighbors != 0)
@@ -2812,11 +2774,9 @@ namespace OpenSim.Region.Framework.Scenes
2812 agentpos.CopyFrom(cadu); 2774 agentpos.CopyFrom(cadu);
2813 2775
2814 m_scene.SendOutChildAgentUpdates(agentpos, this); 2776 m_scene.SendOutChildAgentUpdates(agentpos, this);
2815
2816 m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
2817 m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
2818 m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
2819 2777
2778 m_lastChildAgentUpdatePosition = AbsolutePosition;
2779 m_lastChildAgentUpdateCamPosition = CameraPosition;
2820 } 2780 }
2821 } 2781 }
2822 2782
@@ -2941,9 +2901,9 @@ namespace OpenSim.Region.Framework.Scenes
2941 m_inTransit = true; 2901 m_inTransit = true;
2942 2902
2943 if ((m_physicsActor != null) && m_physicsActor.Flying) 2903 if ((m_physicsActor != null) && m_physicsActor.Flying)
2944 m_AgentControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; 2904 m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2945 else if ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0) 2905 else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
2946 m_AgentControlFlags &= ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; 2906 m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2947 } 2907 }
2948 2908
2949 public void NotInTransit() 2909 public void NotInTransit()
@@ -2959,7 +2919,7 @@ namespace OpenSim.Region.Framework.Scenes
2959 public void Reset() 2919 public void Reset()
2960 { 2920 {
2961 // Put the child agent back at the center 2921 // Put the child agent back at the center
2962 AbsolutePosition = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 70); 2922 AbsolutePosition = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
2963 ResetAnimations(); 2923 ResetAnimations();
2964 } 2924 }
2965 2925
@@ -3069,9 +3029,11 @@ namespace OpenSim.Region.Framework.Scenes
3069 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize; 3029 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
3070 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize; 3030 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
3071 3031
3032 Vector3 offset = new Vector3(shiftx, shifty, 0f);
3033
3072 m_DrawDistance = cAgentData.Far; 3034 m_DrawDistance = cAgentData.Far;
3073 if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!! 3035 if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
3074 m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z); 3036 m_pos = cAgentData.Position + offset;
3075 3037
3076 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance) 3038 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
3077 { 3039 {
@@ -3079,8 +3041,7 @@ namespace OpenSim.Region.Framework.Scenes
3079 ReprioritizeUpdates(); 3041 ReprioritizeUpdates();
3080 } 3042 }
3081 3043
3082 // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region 3044 m_CameraCenter = cAgentData.Center + offset;
3083 m_CameraCenter = cAgentData.Center;
3084 3045
3085 m_avHeight = cAgentData.Size.Z; 3046 m_avHeight = cAgentData.Size.Z;
3086 //SetHeight(cAgentData.AVHeight); 3047 //SetHeight(cAgentData.AVHeight);
@@ -3093,16 +3054,16 @@ namespace OpenSim.Region.Framework.Scenes
3093 m_sceneViewer.Reset(); 3054 m_sceneViewer.Reset();
3094 3055
3095 //cAgentData.AVHeight; 3056 //cAgentData.AVHeight;
3096 //cAgentData.regionHandle; 3057 m_rootRegionHandle = cAgentData.RegionHandle;
3097 //m_velocity = cAgentData.Velocity; 3058 //m_velocity = cAgentData.Velocity;
3098 } 3059 }
3099 3060
3100 public void CopyTo(AgentData cAgent) 3061 public void CopyTo(AgentData cAgent)
3101 { 3062 {
3102 cAgent.AgentID = UUID; 3063 cAgent.AgentID = UUID;
3103 cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle; 3064 cAgent.RegionHandle = m_rootRegionHandle;
3104 3065
3105 cAgent.Position = m_pos; 3066 cAgent.Position = AbsolutePosition;
3106 cAgent.Velocity = m_velocity; 3067 cAgent.Velocity = m_velocity;
3107 cAgent.Center = m_CameraCenter; 3068 cAgent.Center = m_CameraCenter;
3108 // Don't copy the size; it is inferred from apearance parameters 3069 // Don't copy the size; it is inferred from apearance parameters
@@ -3129,7 +3090,7 @@ namespace OpenSim.Region.Framework.Scenes
3129 3090
3130 cAgent.HeadRotation = m_headrotation; 3091 cAgent.HeadRotation = m_headrotation;
3131 cAgent.BodyRotation = m_bodyRot; 3092 cAgent.BodyRotation = m_bodyRot;
3132 cAgent.ControlFlags = m_AgentControlFlags; 3093 cAgent.ControlFlags = (uint)m_AgentControlFlags;
3133 3094
3134 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) 3095 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
3135 cAgent.GodLevel = (byte)m_godlevel; 3096 cAgent.GodLevel = (byte)m_godlevel;
@@ -3199,7 +3160,8 @@ namespace OpenSim.Region.Framework.Scenes
3199 3160
3200 public void CopyFrom(AgentData cAgent) 3161 public void CopyFrom(AgentData cAgent)
3201 { 3162 {
3202 m_rootRegionHandle= cAgent.RegionHandle; 3163 m_rootRegionHandle = cAgent.RegionHandle;
3164
3203 m_callbackURI = cAgent.CallbackURI; 3165 m_callbackURI = cAgent.CallbackURI;
3204 3166
3205 m_pos = cAgent.Position; 3167 m_pos = cAgent.Position;
@@ -3217,7 +3179,7 @@ namespace OpenSim.Region.Framework.Scenes
3217 3179
3218 m_headrotation = cAgent.HeadRotation; 3180 m_headrotation = cAgent.HeadRotation;
3219 m_bodyRot = cAgent.BodyRotation; 3181 m_bodyRot = cAgent.BodyRotation;
3220 m_AgentControlFlags = cAgent.ControlFlags; 3182 m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
3221 3183
3222 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) 3184 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
3223 m_godlevel = cAgent.GodLevel; 3185 m_godlevel = cAgent.GodLevel;
@@ -3291,47 +3253,18 @@ namespace OpenSim.Region.Framework.Scenes
3291 /// </summary> 3253 /// </summary>
3292 public override void UpdateMovement() 3254 public override void UpdateMovement()
3293 { 3255 {
3294 lock (m_forcesList) 3256 if (m_forceToApply.HasValue)
3295 { 3257 {
3296 if (m_forcesList.Count > 0) 3258 Vector3 force = m_forceToApply.Value;
3297 {
3298 //we are only interested in the last velocity added to the list [Although they are called forces, they are actually velocities]
3299 NewForce force = m_forcesList[m_forcesList.Count - 1];
3300 3259
3301 m_updateflag = true; 3260 m_updateflag = true;
3302 try 3261// movementvector = force;
3303 { 3262 Velocity = force;
3304 movementvector.X = force.X;
3305 movementvector.Y = force.Y;
3306 movementvector.Z = force.Z;
3307 Velocity = movementvector;
3308 }
3309 catch (NullReferenceException)
3310 {
3311 // Under extreme load, this returns a NullReference Exception that we can ignore.
3312 // Ignoring this causes no movement to be sent to the physics engine...
3313 // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
3314 }
3315 3263
3316 m_forcesList.Clear(); 3264 m_forceToApply = null;
3317 }
3318 } 3265 }
3319 } 3266 }
3320 3267
3321 static ScenePresence()
3322 {
3323 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3324 DefaultTexture = textu.GetBytes();
3325
3326 }
3327
3328 public class NewForce
3329 {
3330 public float X;
3331 public float Y;
3332 public float Z;
3333 }
3334
3335 public override void SetText(string text, Vector3 color, double alpha) 3268 public override void SetText(string text, Vector3 color, double alpha)
3336 { 3269 {
3337 throw new Exception("Can't set Text on avatar."); 3270 throw new Exception("Can't set Text on avatar.");
@@ -3342,7 +3275,6 @@ namespace OpenSim.Region.Framework.Scenes
3342 /// </summary> 3275 /// </summary>
3343 public void AddToPhysicalScene(bool isFlying) 3276 public void AddToPhysicalScene(bool isFlying)
3344 { 3277 {
3345
3346 PhysicsScene scene = m_scene.PhysicsScene; 3278 PhysicsScene scene = m_scene.PhysicsScene;
3347 3279
3348 Vector3 pVec = AbsolutePosition; 3280 Vector3 pVec = AbsolutePosition;
@@ -3388,15 +3320,48 @@ namespace OpenSim.Region.Framework.Scenes
3388 // as of this comment the interval is set in AddToPhysicalScene 3320 // as of this comment the interval is set in AddToPhysicalScene
3389 UpdateMovementAnimations(); 3321 UpdateMovementAnimations();
3390 3322
3323 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
3324 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
3325
3326 CollisionPlane = Vector4.UnitW;
3327
3328 if (coldata.Count != 0)
3329 {
3330 switch (m_movementAnimation)
3331 {
3332 case "STAND":
3333 case "WALK":
3334 case "RUN":
3335 case "CROUCH":
3336 case "CROUCHWALK":
3337 {
3338 ContactPoint lowest;
3339 lowest.SurfaceNormal = Vector3.Zero;
3340 lowest.Position = Vector3.Zero;
3341 lowest.Position.Z = Single.NaN;
3342
3343 foreach (ContactPoint contact in coldata.Values)
3344 {
3345 if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
3346 {
3347 lowest = contact;
3348 }
3349 }
3350
3351 CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
3352 }
3353 break;
3354 }
3355 }
3356
3391 if (m_invulnerable) 3357 if (m_invulnerable)
3392 return; 3358 return;
3393 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3359
3394 Dictionary<uint, float> coldata = collisionData.m_objCollisionList;
3395 float starthealth = Health; 3360 float starthealth = Health;
3396 uint killerObj = 0; 3361 uint killerObj = 0;
3397 foreach (uint localid in coldata.Keys) 3362 foreach (uint localid in coldata.Keys)
3398 { 3363 {
3399 if (coldata[localid] <= 0.10f || m_invulnerable) 3364 if (coldata[localid].PenetrationDepth <= 0.10f || m_invulnerable)
3400 continue; 3365 continue;
3401 //if (localid == 0) 3366 //if (localid == 0)
3402 //continue; 3367 //continue;
@@ -3406,9 +3371,9 @@ namespace OpenSim.Region.Framework.Scenes
3406 if (part != null && part.ParentGroup.Damage != -1.0f) 3371 if (part != null && part.ParentGroup.Damage != -1.0f)
3407 Health -= part.ParentGroup.Damage; 3372 Health -= part.ParentGroup.Damage;
3408 else 3373 else
3409 Health -= coldata[localid] * 5; 3374 Health -= coldata[localid].PenetrationDepth * 5.0f;
3410 3375
3411 if (Health <= 0) 3376 if (Health <= 0.0f)
3412 { 3377 {
3413 if (localid != 0) 3378 if (localid != 0)
3414 killerObj = localid; 3379 killerObj = localid;
@@ -3471,11 +3436,6 @@ namespace OpenSim.Region.Framework.Scenes
3471 3436
3472 public ScenePresence() 3437 public ScenePresence()
3473 { 3438 {
3474 if (DefaultTexture == null)
3475 {
3476 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3477 DefaultTexture = textu.GetBytes();
3478 }
3479 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 3439 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
3480 CreateSceneViewer(); 3440 CreateSceneViewer();
3481 } 3441 }
@@ -3632,19 +3592,10 @@ namespace OpenSim.Region.Framework.Scenes
3632 IgnoredControls &= ~(ScriptControlled)controls; 3592 IgnoredControls &= ~(ScriptControlled)controls;
3633 if (scriptedcontrols.ContainsKey(Script_item_UUID)) 3593 if (scriptedcontrols.ContainsKey(Script_item_UUID))
3634 scriptedcontrols.Remove(Script_item_UUID); 3594 scriptedcontrols.Remove(Script_item_UUID);
3635
3636 } 3595 }
3637 else 3596 else
3638 { 3597 {
3639 3598 scriptedcontrols[Script_item_UUID] = obj;
3640 if (scriptedcontrols.ContainsKey(Script_item_UUID))
3641 {
3642 scriptedcontrols[Script_item_UUID] = obj;
3643 }
3644 else
3645 {
3646 scriptedcontrols.Add(Script_item_UUID, obj);
3647 }
3648 } 3599 }
3649 } 3600 }
3650 ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true); 3601 ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
@@ -3662,12 +3613,14 @@ namespace OpenSim.Region.Framework.Scenes
3662 3613
3663 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) 3614 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
3664 { 3615 {
3616 ScriptControllers takecontrols;
3617
3665 lock (scriptedcontrols) 3618 lock (scriptedcontrols)
3666 { 3619 {
3667 if (scriptedcontrols.ContainsKey(Script_item_UUID)) 3620 if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
3668 { 3621 {
3669 ScriptControllers takecontrolls = scriptedcontrols[Script_item_UUID]; 3622 ScriptControlled sctc = takecontrols.eventControls;
3670 ScriptControlled sctc = takecontrolls.eventControls; 3623
3671 ControllingClient.SendTakeControls((int)sctc, false, false); 3624 ControllingClient.SendTakeControls((int)sctc, false, false);
3672 ControllingClient.SendTakeControls((int)sctc, true, false); 3625 ControllingClient.SendTakeControls((int)sctc, true, false);
3673 3626
@@ -3678,7 +3631,6 @@ namespace OpenSim.Region.Framework.Scenes
3678 IgnoredControls |= scData.ignoreControls; 3631 IgnoredControls |= scData.ignoreControls;
3679 } 3632 }
3680 } 3633 }
3681
3682 } 3634 }
3683 } 3635 }
3684 3636
@@ -3745,9 +3697,11 @@ namespace OpenSim.Region.Framework.Scenes
3745 { 3697 {
3746 lock (scriptedcontrols) 3698 lock (scriptedcontrols)
3747 { 3699 {
3748 foreach (UUID scriptUUID in scriptedcontrols.Keys) 3700 foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols)
3749 { 3701 {
3750 ScriptControllers scriptControlData = scriptedcontrols[scriptUUID]; 3702 UUID scriptUUID = kvp.Key;
3703 ScriptControllers scriptControlData = kvp.Value;
3704
3751 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us 3705 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
3752 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle 3706 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
3753 ScriptControlled localChange = localHeld ^ localLast; // the changed bits 3707 ScriptControlled localChange = localHeld ^ localLast; // the changed bits
@@ -3763,37 +3717,40 @@ namespace OpenSim.Region.Framework.Scenes
3763 LastCommands = allflags; 3717 LastCommands = allflags;
3764 } 3718 }
3765 3719
3766 internal static uint RemoveIgnoredControls(uint flags, ScriptControlled Ignored) 3720 internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
3767 { 3721 {
3768 if (Ignored == ScriptControlled.CONTROL_ZERO) 3722 if (ignored == ScriptControlled.CONTROL_ZERO)
3769 return flags; 3723 return flags;
3770 if ((Ignored & ScriptControlled.CONTROL_BACK) != 0) 3724
3771 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); 3725 if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
3772 if ((Ignored & ScriptControlled.CONTROL_FWD) != 0) 3726 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
3773 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS); 3727 if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
3774 if ((Ignored & ScriptControlled.CONTROL_DOWN) != 0) 3728 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
3775 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG); 3729 if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
3776 if ((Ignored & ScriptControlled.CONTROL_UP) != 0) 3730 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
3777 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS); 3731 if ((ignored & ScriptControlled.CONTROL_UP) != 0)
3778 if ((Ignored & ScriptControlled.CONTROL_LEFT) != 0) 3732 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
3779 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); 3733 if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
3780 if ((Ignored & ScriptControlled.CONTROL_RIGHT) != 0) 3734 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
3781 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG); 3735 if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
3782 if ((Ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0) 3736 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
3783 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG); 3737 if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
3784 if ((Ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0) 3738 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
3785 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS); 3739 if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
3786 if ((Ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0) 3740 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
3787 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); 3741 if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
3788 if ((Ignored & ScriptControlled.CONTROL_LBUTTON) != 0) 3742 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
3789 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN); 3743 if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
3790 //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, 3744 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
3791 //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, 3745
3792 //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, 3746 //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
3793 //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, 3747 //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
3794 //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, 3748 //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
3795 //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, 3749 //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
3796 //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG 3750 //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
3751 //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
3752 //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
3753
3797 return flags; 3754 return flags;
3798 } 3755 }
3799 3756
@@ -3950,7 +3907,7 @@ namespace OpenSim.Region.Framework.Scenes
3950 } 3907 }
3951 else 3908 else
3952 { 3909 {
3953 group = Scene.SceneGraph.GetGroupByPrim(data.localID); 3910 group = Scene.GetGroupByPrim(data.localID);
3954 if (group != null) 3911 if (group != null)
3955 return GetSOGUpdatePriority(group); 3912 return GetSOGUpdatePriority(group);
3956 } 3913 }