aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs281
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs170
3 files changed, 235 insertions, 220 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index db3b834..2d1b0df 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
48 48
49 public AnimationSet Animations 49 public AnimationSet Animations
50 { 50 {
51 get { return m_animations; } 51 get { return m_animations; }
52 } 52 }
53 protected AnimationSet m_animations = new AnimationSet(); 53 protected AnimationSet m_animations = new AnimationSet();
54 54
@@ -56,25 +56,27 @@ namespace OpenSim.Region.Framework.Scenes.Animation
56 /// The current movement animation 56 /// The current movement animation
57 /// </value> 57 /// </value>
58 public string CurrentMovementAnimation { get; private set; } 58 public string CurrentMovementAnimation { get; private set; }
59 59
60 private int m_animTickFall; 60 private int m_animTickFall;
61 public int m_animTickJump; // ScenePresence has to see this to control +Z force 61 private int m_animTickLand;
62 public bool m_jumping = false; 62 private int m_animTickJump;
63 public float m_jumpVelocity = 0f; 63
64// private int m_landing = 0; 64 public bool m_jumping = false;
65
66 // private int m_landing = 0;
65 67
66 /// <summary> 68 /// <summary>
67 /// Is the avatar falling? 69 /// Is the avatar falling?
68 /// </summary> 70 /// </summary>
69 public bool Falling { get; private set; } 71 public bool Falling { get; private set; }
70 72
71 private float m_fallHeight; 73 private float m_lastFallVelocity;
72 74
73 /// <value> 75 /// <value>
74 /// The scene presence that this animator applies to 76 /// The scene presence that this animator applies to
75 /// </value> 77 /// </value>
76 protected ScenePresence m_scenePresence; 78 protected ScenePresence m_scenePresence;
77 79
78 public ScenePresenceAnimator(ScenePresence sp) 80 public ScenePresenceAnimator(ScenePresence sp)
79 { 81 {
80 m_scenePresence = sp; 82 m_scenePresence = sp;
@@ -89,7 +91,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
89 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} for {1}", animID, m_scenePresence.Name); 91 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} for {1}", animID, m_scenePresence.Name);
90 if (m_scenePresence.Scene.DebugAnimations) 92 if (m_scenePresence.Scene.DebugAnimations)
91 m_log.DebugFormat( 93 m_log.DebugFormat(
92 "[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}", 94 "[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}",
93 GetAnimName(animID), animID, m_scenePresence.Name); 95 GetAnimName(animID), animID, m_scenePresence.Name);
94 96
95 if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID)) 97 if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID))
@@ -111,7 +113,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
111 if (animID == UUID.Zero) 113 if (animID == UUID.Zero)
112 return; 114 return;
113 115
114// m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}", animID, name, m_scenePresence.Name); 116 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}", animID, name, m_scenePresence.Name);
115 117
116 AddAnimation(animID, objectID); 118 AddAnimation(animID, objectID);
117 } 119 }
@@ -131,7 +133,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
131 133
132 if (m_scenePresence.Scene.DebugAnimations) 134 if (m_scenePresence.Scene.DebugAnimations)
133 m_log.DebugFormat( 135 m_log.DebugFormat(
134 "[SCENE PRESENCE ANIMATOR]: Removing animation {0} {1} for {2}", 136 "[SCENE PRESENCE ANIMATOR]: Removing animation {0} {1} for {2}",
135 GetAnimName(animID), animID, m_scenePresence.Name); 137 GetAnimName(animID), animID, m_scenePresence.Name);
136 138
137 if (m_animations.Remove(animID, allowNoDefault)) 139 if (m_animations.Remove(animID, allowNoDefault))
@@ -153,7 +155,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
153 else 155 else
154 m_animations.Remove(animID, false); 156 m_animations.Remove(animID, false);
155 } 157 }
156 if(sendPack) 158 if (sendPack)
157 SendAnimPack(); 159 SendAnimPack();
158 } 160 }
159 161
@@ -205,7 +207,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
205 207
206 if (aoSitGndAnim != UUID.Zero) 208 if (aoSitGndAnim != UUID.Zero)
207 { 209 {
208 avnChangeAnim(aoSitGndAnim, false, false); 210 avnChangeAnim(aoSitGndAnim, false, true);
209 aoSitGndAnim = UUID.Zero; 211 aoSitGndAnim = UUID.Zero;
210 } 212 }
211 213
@@ -238,9 +240,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation
238 if (m_animations.TrySetDefaultAnimation( 240 if (m_animations.TrySetDefaultAnimation(
239 anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID)) 241 anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID))
240 { 242 {
241 // m_log.DebugFormat( 243// m_log.DebugFormat(
242 // "[SCENE PRESENCE ANIMATOR]: Updating movement animation to {0} for {1}", 244// "[SCENE PRESENCE ANIMATOR]: Updating movement animation to {0} for {1}",
243 // anim, m_scenePresence.Name); 245// anim, m_scenePresence.Name);
244 246
245 // 16384 is CHANGED_ANIMATION 247 // 16384 is CHANGED_ANIMATION
246 m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION }); 248 m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION });
@@ -258,83 +260,119 @@ namespace OpenSim.Region.Framework.Scenes.Animation
258 return ret; 260 return ret;
259 } 261 }
260 262
263 public enum motionControlStates : byte
264 {
265 sitted = 0,
266 flying,
267 falling,
268 jumping,
269 landing,
270 onsurface
271 }
272
273 public motionControlStates currentControlState = motionControlStates.onsurface;
274
261 /// <summary> 275 /// <summary>
262 /// This method determines the proper movement related animation 276 /// This method determines the proper movement related animation
263 /// </summary> 277 /// </summary>
264 private string DetermineMovementAnimation() 278 private string DetermineMovementAnimation()
265 { 279 {
266 const float FALL_DELAY = 800f; 280 const int FALL_DELAY = 800;
267 const float PREJUMP_DELAY = 200f; 281 const int PREJUMP_DELAY = 200;
268 const float JUMP_PERIOD = 800f; 282 const int JUMP_PERIOD = 800;
269 #region Inputs 283 #region Inputs
270 284
285 if (m_scenePresence.IsInTransit)
286 return CurrentMovementAnimation;
287
271 if (m_scenePresence.SitGround) 288 if (m_scenePresence.SitGround)
289 {
290 currentControlState = motionControlStates.sitted;
272 return "SITGROUND"; 291 return "SITGROUND";
292 }
273 if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero) 293 if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero)
294 {
295 currentControlState = motionControlStates.sitted;
274 return "SIT"; 296 return "SIT";
297 }
275 298
276 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; 299 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
277 PhysicsActor actor = m_scenePresence.PhysicsActor; 300 PhysicsActor actor = m_scenePresence.PhysicsActor;
278 301
279 // Create forward and left vectors from the current avatar rotation 302 const AgentManager.ControlFlags ANYXYMASK = (
280 Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_scenePresence.Rotation); 303 AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS |
281 Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix); 304 AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG |
282 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); 305 AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS |
306 AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG
307 );
283 308
284 // Check control flags 309 // Check control flags
285 bool heldForward = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS); 310/* not in use
286 bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); 311 bool heldForward = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS)) != 0);
287 bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); 312 bool heldBack = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG)) != 0);
288 bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); 313 bool heldLeft = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS)) != 0);
314 bool heldRight = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG)) != 0);
315*/
289 bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; 316 bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
290 bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; 317 bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
291 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; 318// bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS)) != 0);
292 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; 319 // excluded nudge up so it doesn't trigger jump state
320 bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS)) != 0);
321 bool heldDown = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG)) != 0);
293 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; 322 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
294 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; 323 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
295 if (heldForward || heldBack || heldLeft || heldRight || heldUp || heldDown) 324
325 bool heldOnXY = ((controlFlags & ANYXYMASK) != 0);
326 if (heldOnXY || heldUp || heldDown)
296 { 327 {
297 heldTurnLeft = false; 328 heldTurnLeft = false;
298 heldTurnRight = false; 329 heldTurnRight = false;
299 } 330 }
300 331
301 // Direction in which the avatar is trying to move
302 Vector3 move = Vector3.Zero;
303 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
304 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
305 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
306 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
307 if (heldUp) { move.Z += 1; }
308 if (heldDown) { move.Z -= 1; }
309
310 // Is the avatar trying to move?
311// bool moving = (move != Vector3.Zero);
312 #endregion Inputs 332 #endregion Inputs
313 333
334 // no physics actor case
335 if (actor == null)
336 {
337 // well what to do?
338
339 currentControlState = motionControlStates.onsurface;
340 if (heldOnXY)
341 return "WALK";
342
343 return "STAND";
344 }
345
314 #region Flying 346 #region Flying
315 347
316 if (actor != null && actor.Flying) 348 bool isColliding = actor.IsColliding;
349
350 if (actor.Flying)
317 { 351 {
318 m_animTickFall = 0; 352 m_animTickFall = 0;
319 m_animTickJump = 0; 353 m_animTickJump = 0;
320 m_jumping = false; 354 m_jumping = false;
321 Falling = false; 355 Falling = false;
322 m_jumpVelocity = 0f;
323 actor.Selected = false;
324 m_fallHeight = actor.Position.Z; // save latest flying height
325 356
326 if (move.X != 0f || move.Y != 0f) 357 currentControlState = motionControlStates.flying;
358
359 if (heldOnXY)
327 { 360 {
328 return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY"); 361 return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY");
329 } 362 }
330 else if (move.Z > 0f) 363 else if (heldUp)
331 { 364 {
332 return "HOVER_UP"; 365 return "HOVER_UP";
333 } 366 }
334 else if (move.Z < 0f) 367 else if (heldDown)
335 { 368 {
336 if (actor != null && actor.IsColliding) 369 if (isColliding)
370 {
371 actor.Flying = false;
372 currentControlState = motionControlStates.landing;
373 m_animTickLand = Environment.TickCount;
337 return "LAND"; 374 return "LAND";
375 }
338 else 376 else
339 return "HOVER_DOWN"; 377 return "HOVER_DOWN";
340 } 378 }
@@ -343,81 +381,88 @@ namespace OpenSim.Region.Framework.Scenes.Animation
343 return "HOVER"; 381 return "HOVER";
344 } 382 }
345 } 383 }
384 else
385 {
386 if (isColliding && currentControlState == motionControlStates.flying)
387 {
388 currentControlState = motionControlStates.landing;
389 m_animTickLand = Environment.TickCount;
390 return "LAND";
391 }
392 }
346 393
347 #endregion Flying 394 #endregion Flying
348 395
349 #region Falling/Floating/Landing 396 #region Falling/Floating/Landing
350 397
351 if ((actor == null || !actor.IsColliding) && !m_jumping) 398 if (!isColliding && currentControlState != motionControlStates.jumping)
352 { 399 {
353 float fallElapsed = (float)(Environment.TickCount - m_animTickFall); 400 float fallVelocity = actor.Velocity.Z;
354 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
355 401
356 if (!m_jumping && (fallVelocity < -3.0f)) 402 if (fallVelocity < -2.5f)
357 Falling = true; 403 Falling = true;
358 404
359 if (m_animTickFall == 0 || (fallVelocity >= 0.0f)) 405 if (m_animTickFall == 0 || (fallVelocity >= -0.5f))
360 { 406 {
361 // not falling yet, or going up
362 // reset start of fall time
363 m_animTickFall = Environment.TickCount; 407 m_animTickFall = Environment.TickCount;
364 } 408 }
365 else if (!m_jumping && (fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f) && (m_scenePresence.WasFlying)) 409 else
366 { 410 {
367 // Falling long enough to trigger the animation 411 int fallElapsed = (Environment.TickCount - m_animTickFall);
368 return "FALLDOWN"; 412 if ((fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f))
413 {
414 currentControlState = motionControlStates.falling;
415 m_lastFallVelocity = fallVelocity;
416 // Falling long enough to trigger the animation
417 return "FALLDOWN";
418 }
369 } 419 }
370 420
371 // Check if the user has stopped walking just now 421 // Check if the user has stopped walking just now
372 if (CurrentMovementAnimation == "WALK" && (move == Vector3.Zero)) 422 if (CurrentMovementAnimation == "WALK" && !heldOnXY && !heldDown && !heldUp)
373 return "STAND"; 423 return "STAND";
374 424
375 return CurrentMovementAnimation; 425 return CurrentMovementAnimation;
376 } 426 }
377 427
378 #endregion Falling/Floating/Landing 428 m_animTickFall = 0;
379 429
430 #endregion Falling/Floating/Landing
380 431
381 #region Jumping // section added for jumping... 432 #region Jumping // section added for jumping...
382 433
383 int jumptime; 434 if (isColliding && heldUp && currentControlState != motionControlStates.jumping)
384 jumptime = Environment.TickCount - m_animTickJump; 435 {
385
386 if ((move.Z > 0f) && (!m_jumping))
387 {
388 // Start jumping, prejump 436 // Start jumping, prejump
389 m_animTickFall = 0; 437 currentControlState = motionControlStates.jumping;
390 m_jumping = true; 438 m_jumping = true;
391 Falling = false; 439 Falling = false;
392 actor.Selected = true; // borrowed for jumping flag
393 m_animTickJump = Environment.TickCount; 440 m_animTickJump = Environment.TickCount;
394 m_jumpVelocity = 0.35f;
395 return "PREJUMP"; 441 return "PREJUMP";
396 } 442 }
397 443
398 if (m_jumping) 444 if (currentControlState == motionControlStates.jumping)
399 { 445 {
446 int jumptime = Environment.TickCount - m_animTickJump;
400 if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) 447 if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding)
401 { 448 {
402 // end jumping 449 // end jumping
403 m_jumping = false; 450 m_jumping = false;
404 Falling = false; 451 Falling = false;
405 actor.Selected = false; // borrowed for jumping flag 452 actor.Selected = false; // borrowed for jumping flag
406 m_jumpVelocity = 0f; 453 m_animTickLand = Environment.TickCount;
407 m_animTickFall = Environment.TickCount; 454 currentControlState = motionControlStates.landing;
408 return "LAND"; 455 return "LAND";
409 } 456 }
410 else if (jumptime > JUMP_PERIOD) 457 else if (jumptime > JUMP_PERIOD)
411 { 458 {
412 // jump down 459 // jump down
413 m_jumpVelocity = 0f;
414 return "JUMP"; 460 return "JUMP";
415 } 461 }
416 else if (jumptime > PREJUMP_DELAY) 462 else if (jumptime > PREJUMP_DELAY)
417 { 463 {
418 // jump up 464 // jump up
419 m_jumping = true; 465 m_jumping = true;
420 m_jumpVelocity = 10f;
421 return "JUMP"; 466 return "JUMP";
422 } 467 }
423 } 468 }
@@ -426,45 +471,52 @@ namespace OpenSim.Region.Framework.Scenes.Animation
426 471
427 #region Ground Movement 472 #region Ground Movement
428 473
429 if (CurrentMovementAnimation == "FALLDOWN") 474 if (currentControlState == motionControlStates.falling)
430 { 475 {
431 Falling = false; 476 Falling = false;
432 m_animTickFall = Environment.TickCount; 477 currentControlState = motionControlStates.landing;
478 m_animTickLand = Environment.TickCount;
433 // TODO: SOFT_LAND support 479 // TODO: SOFT_LAND support
434 float fallHeight = m_fallHeight - actor.Position.Z; 480 float fallVsq = m_lastFallVelocity * m_lastFallVelocity;
435 if (fallHeight > 15.0f) 481 if (fallVsq > 300f) // aprox 20*h
436 return "STANDUP"; 482 return "STANDUP";
437 else if (fallHeight > 8.0f) 483 else if (fallVsq > 160f)
438 return "SOFT_LAND"; 484 return "SOFT_LAND";
439 else 485 else
440 return "LAND"; 486 return "LAND";
441 } 487 }
442 else if ((CurrentMovementAnimation == "LAND") || (CurrentMovementAnimation == "SOFT_LAND") || (CurrentMovementAnimation == "STANDUP")) 488
489
490 if (currentControlState == motionControlStates.landing)
443 { 491 {
444 int landElapsed = Environment.TickCount - m_animTickFall; 492 Falling = false;
493 int landElapsed = Environment.TickCount - m_animTickLand;
445 int limit = 1000; 494 int limit = 1000;
446 if (CurrentMovementAnimation == "LAND") 495 if (CurrentMovementAnimation == "LAND")
447 limit = 350; 496 limit = 350;
448 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client 497 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client
449 498
450 if ((m_animTickFall != 0) && (landElapsed <= limit)) 499 if ((m_animTickLand != 0) && (landElapsed <= limit))
451 { 500 {
452 return CurrentMovementAnimation; 501 return CurrentMovementAnimation;
453 } 502 }
454 else 503 else
455 { 504 {
456 m_fallHeight = actor.Position.Z; // save latest flying height 505 currentControlState = motionControlStates.onsurface;
506 m_animTickLand = 0;
457 return "STAND"; 507 return "STAND";
458 } 508 }
459 } 509 }
460 510
511
461 // next section moved outside paren. and realigned for jumping 512 // next section moved outside paren. and realigned for jumping
462 if (move.X != 0f || move.Y != 0f) 513
514 if (heldOnXY)
463 { 515 {
464 m_fallHeight = actor.Position.Z; // save latest flying height 516 currentControlState = motionControlStates.onsurface;
465 Falling = false; 517 Falling = false;
466 // Walking / crouchwalking / running 518 // Walking / crouchwalking / running
467 if (move.Z < 0f) 519 if (heldDown)
468 { 520 {
469 return "CROUCHWALK"; 521 return "CROUCHWALK";
470 } 522 }
@@ -480,9 +532,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
480 } 532 }
481 else if (!m_jumping) 533 else if (!m_jumping)
482 { 534 {
535 currentControlState = motionControlStates.onsurface;
483 Falling = false; 536 Falling = false;
484 // Not walking 537 // Not walking
485 if (move.Z < 0) 538 if(heldDown)
486 return "CROUCH"; 539 return "CROUCH";
487 else if (heldTurnLeft) 540 else if (heldTurnLeft)
488 return "TURNLEFT"; 541 return "TURNLEFT";
@@ -493,8 +546,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
493 } 546 }
494 #endregion Ground Movement 547 #endregion Ground Movement
495 548
496 Falling = false;
497
498 return CurrentMovementAnimation; 549 return CurrentMovementAnimation;
499 } 550 }
500 551
@@ -504,7 +555,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
504 /// <returns>'true' if the animation was changed</returns> 555 /// <returns>'true' if the animation was changed</returns>
505 public bool UpdateMovementAnimations() 556 public bool UpdateMovementAnimations()
506 { 557 {
507// m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Updating movement animations for {0}", m_scenePresence.Name); 558 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Updating movement animations for {0}", m_scenePresence.Name);
508 559
509 bool ret = false; 560 bool ret = false;
510 lock (m_animations) 561 lock (m_animations)
@@ -552,19 +603,19 @@ namespace OpenSim.Region.Framework.Scenes.Animation
552 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 603 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
553 return animIDs; 604 return animIDs;
554 } 605 }
555 606
556 public BinBVHAnimation GenerateRandomAnimation() 607 public BinBVHAnimation GenerateRandomAnimation()
557 { 608 {
558 int rnditerations = 3; 609 int rnditerations = 3;
559 BinBVHAnimation anim = new BinBVHAnimation(); 610 BinBVHAnimation anim = new BinBVHAnimation();
560 List<string> parts = new List<string>(); 611 List<string> parts = new List<string>();
561 parts.Add("mPelvis");parts.Add("mHead");parts.Add("mTorso"); 612 parts.Add("mPelvis"); parts.Add("mHead"); parts.Add("mTorso");
562 parts.Add("mHipLeft");parts.Add("mHipRight");parts.Add("mHipLeft");parts.Add("mKneeLeft"); 613 parts.Add("mHipLeft"); parts.Add("mHipRight"); parts.Add("mHipLeft"); parts.Add("mKneeLeft");
563 parts.Add("mKneeRight");parts.Add("mCollarLeft");parts.Add("mCollarRight");parts.Add("mNeck"); 614 parts.Add("mKneeRight"); parts.Add("mCollarLeft"); parts.Add("mCollarRight"); parts.Add("mNeck");
564 parts.Add("mElbowLeft");parts.Add("mElbowRight");parts.Add("mWristLeft");parts.Add("mWristRight"); 615 parts.Add("mElbowLeft"); parts.Add("mElbowRight"); parts.Add("mWristLeft"); parts.Add("mWristRight");
565 parts.Add("mShoulderLeft");parts.Add("mShoulderRight");parts.Add("mAnkleLeft");parts.Add("mAnkleRight"); 616 parts.Add("mShoulderLeft"); parts.Add("mShoulderRight"); parts.Add("mAnkleLeft"); parts.Add("mAnkleRight");
566 parts.Add("mEyeRight");parts.Add("mChest");parts.Add("mToeLeft");parts.Add("mToeRight"); 617 parts.Add("mEyeRight"); parts.Add("mChest"); parts.Add("mToeLeft"); parts.Add("mToeRight");
567 parts.Add("mFootLeft");parts.Add("mFootRight");parts.Add("mEyeLeft"); 618 parts.Add("mFootLeft"); parts.Add("mFootRight"); parts.Add("mEyeLeft");
568 anim.HandPose = 1; 619 anim.HandPose = 1;
569 anim.InPoint = 0; 620 anim.InPoint = 0;
570 anim.OutPoint = (rnditerations * .10f); 621 anim.OutPoint = (rnditerations * .10f);
@@ -588,12 +639,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
588 for (int i = 0; i < rnditerations; i++) 639 for (int i = 0; i < rnditerations; i++)
589 { 640 {
590 anim.Joints[j].rotationkeys[i] = new binBVHJointKey(); 641 anim.Joints[j].rotationkeys[i] = new binBVHJointKey();
591 anim.Joints[j].rotationkeys[i].time = (i*.10f); 642 anim.Joints[j].rotationkeys[i].time = (i * .10f);
592 anim.Joints[j].rotationkeys[i].key_element.X = ((float) rnd.NextDouble()*2 - 1); 643 anim.Joints[j].rotationkeys[i].key_element.X = ((float)rnd.NextDouble() * 2 - 1);
593 anim.Joints[j].rotationkeys[i].key_element.Y = ((float) rnd.NextDouble()*2 - 1); 644 anim.Joints[j].rotationkeys[i].key_element.Y = ((float)rnd.NextDouble() * 2 - 1);
594 anim.Joints[j].rotationkeys[i].key_element.Z = ((float) rnd.NextDouble()*2 - 1); 645 anim.Joints[j].rotationkeys[i].key_element.Z = ((float)rnd.NextDouble() * 2 - 1);
595 anim.Joints[j].positionkeys[i] = new binBVHJointKey(); 646 anim.Joints[j].positionkeys[i] = new binBVHJointKey();
596 anim.Joints[j].positionkeys[i].time = (i*.10f); 647 anim.Joints[j].positionkeys[i].time = (i * .10f);
597 anim.Joints[j].positionkeys[i].key_element.X = 0; 648 anim.Joints[j].positionkeys[i].key_element.X = 0;
598 anim.Joints[j].positionkeys[i].key_element.Y = 0; 649 anim.Joints[j].positionkeys[i].key_element.Y = 0;
599 anim.Joints[j].positionkeys[i].key_element.Z = 0; 650 anim.Joints[j].positionkeys[i].key_element.Z = 0;
@@ -620,22 +671,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
620 /// <param name="objectIDs"></param> 671 /// <param name="objectIDs"></param>
621 public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) 672 public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
622 { 673 {
623/*
624 if (m_scenePresence.IsChildAgent)
625 return;
626
627// m_log.DebugFormat(
628// "[SCENE PRESENCE ANIMATOR]: Sending anim pack with animations '{0}', sequence '{1}', uuids '{2}'",
629// string.Join(",", Array.ConvertAll<UUID, string>(animations, a => a.ToString())),
630// string.Join(",", Array.ConvertAll<int, string>(seqs, s => s.ToString())),
631// string.Join(",", Array.ConvertAll<UUID, string>(objectIDs, o => o.ToString())));
632
633 m_scenePresence.Scene.ForEachClient(
634 delegate(IClientAPI client)
635 {
636 client.SendAnimations(animations, seqs, m_scenePresence.ControllingClient.AgentId, objectIDs);
637 });
638 */
639 m_scenePresence.SendAnimPack(animations, seqs, objectIDs); 674 m_scenePresence.SendAnimPack(animations, seqs, objectIDs);
640 } 675 }
641 676
@@ -645,7 +680,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
645 sequenceNums = null; 680 sequenceNums = null;
646 objectIDs = null; 681 objectIDs = null;
647 682
648 if(m_animations != null) 683 if (m_animations != null)
649 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 684 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
650 } 685 }
651 686
@@ -668,7 +703,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
668 public void SendAnimPack() 703 public void SendAnimPack()
669 { 704 {
670 //m_log.Debug("Sending animation pack to all"); 705 //m_log.Debug("Sending animation pack to all");
671 706
672 if (m_scenePresence.IsChildAgent) 707 if (m_scenePresence.IsChildAgent)
673 return; 708 return;
674 709
@@ -678,7 +713,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
678 713
679 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 714 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
680 715
681// SendAnimPack(animIDs, sequenceNums, objectIDs); 716 // SendAnimPack(animIDs, sequenceNums, objectIDs);
682 m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs); 717 m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs);
683 } 718 }
684 719
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index e003a59..5197f58 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1063,6 +1063,10 @@ namespace OpenSim.Region.Framework.Scenes
1063 if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) 1063 if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
1064 return; 1064 return;
1065 1065
1066 if (type != (sbyte)AssetType.Link || type != (sbyte)AssetType.LinkFolder)
1067 return;
1068
1069
1066 ScenePresence presence; 1070 ScenePresence presence;
1067 if (TryGetScenePresence(remoteClient.AgentId, out presence)) 1071 if (TryGetScenePresence(remoteClient.AgentId, out presence))
1068 { 1072 {
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5946979..42d3684 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -287,14 +287,7 @@ namespace OpenSim.Region.Framework.Scenes
287 set { PhysicsActor.Flying = value; } 287 set { PhysicsActor.Flying = value; }
288 } 288 }
289 289
290 // add for fly velocity control 290 public bool IsColliding
291 private bool FlyingOld {get; set;}
292 public bool WasFlying
293 {
294 get; private set;
295 }
296
297 public bool IsColliding
298 { 291 {
299 get { return PhysicsActor != null && PhysicsActor.IsColliding; } 292 get { return PhysicsActor != null && PhysicsActor.IsColliding; }
300 // We would expect setting IsColliding to be private but it's used by a hack in Scene 293 // We would expect setting IsColliding to be private but it's used by a hack in Scene
@@ -936,7 +929,7 @@ namespace OpenSim.Region.Framework.Scenes
936 /// <remarks> 929 /// <remarks>
937 /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers. 930 /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers.
938 /// </remarks> 931 /// </remarks>
939 private float AgentControlStopSlowWhilstMoving = 0.5f; 932 private float AgentControlStopSlowWhilstMoving = 0.2f;
940 933
941 private bool m_forceFly; 934 private bool m_forceFly;
942 935
@@ -2174,7 +2167,7 @@ namespace OpenSim.Region.Framework.Scenes
2174 bool DCFlagKeyPressed = false; 2167 bool DCFlagKeyPressed = false;
2175 Vector3 agent_control_v3 = Vector3.Zero; 2168 Vector3 agent_control_v3 = Vector3.Zero;
2176 2169
2177 bool newFlying = actor.Flying; 2170 bool newFlying = false;
2178 2171
2179 if (ForceFly) 2172 if (ForceFly)
2180 newFlying = true; 2173 newFlying = true;
@@ -2286,11 +2279,11 @@ namespace OpenSim.Region.Framework.Scenes
2286 if (Flying && !ForceFly) 2279 if (Flying && !ForceFly)
2287 { 2280 {
2288 // Need to stop in mid air if user holds down AGENT_CONTROL_STOP 2281 // Need to stop in mid air if user holds down AGENT_CONTROL_STOP
2289 if (AgentControlStopActive) 2282 // if (AgentControlStopActive)
2290 { 2283 // {
2291 agent_control_v3 = Vector3.Zero; 2284 // agent_control_v3 = Vector3.Zero;
2292 } 2285 // }
2293 else 2286 // else
2294 { 2287 {
2295 // Landing detection code 2288 // Landing detection code
2296 2289
@@ -2298,38 +2291,44 @@ namespace OpenSim.Region.Framework.Scenes
2298 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || 2291 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
2299 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 2292 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2300 2293
2301 //m_log.Debug("[CONTROL]: " +flags); 2294 //m_log.Debug("[CONTROL]: " +flags);
2302 // Applies a satisfying roll effect to the avatar when flying. 2295 // Applies a satisfying roll effect to the avatar when flying.
2303 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) 2296 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
2304 { 2297 {
2305 ApplyFlyingRoll( 2298 ApplyFlyingRoll(
2306 FLY_ROLL_RADIANS_PER_UPDATE, 2299 FLY_ROLL_RADIANS_PER_UPDATE,
2307 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, 2300 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0,
2308 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); 2301 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0);
2309 } 2302 }
2310 else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && 2303 else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 &&
2311 (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) 2304 (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
2312 { 2305 {
2313 ApplyFlyingRoll( 2306 ApplyFlyingRoll(
2314 -FLY_ROLL_RADIANS_PER_UPDATE, 2307 -FLY_ROLL_RADIANS_PER_UPDATE,
2315 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, 2308 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0,
2316 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); 2309 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0);
2317 } 2310 }
2318 else 2311 else
2319 { 2312 {
2320 if (m_AngularVelocity.Z != 0) 2313 if (m_AngularVelocity.Z != 0)
2321 m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); 2314 m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE);
2322 }
2323
2324 if (Flying && IsColliding && controlland)
2325 {
2326 // nesting this check because LengthSquared() is expensive and we don't
2327 // want to do it every step when flying.
2328 if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
2329 StopFlying();
2330 } 2315 }
2316
2317 /*
2318 if (Flying && IsColliding && controlland)
2319 {
2320 // nesting this check because LengthSquared() is expensive and we don't
2321 // want to do it every step when flying.
2322 if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
2323 StopFlying();
2324 }
2325 */
2331 } 2326 }
2332 } 2327 }
2328 else if (IsColliding && agent_control_v3.Z < 0f)
2329 agent_control_v3.Z = 0;
2330// else if(AgentControlStopActive %% Velocity.Z <0.01f)
2331
2333 2332
2334// m_log.DebugFormat("[SCENE PRESENCE]: MovementFlag {0} for {1}", MovementFlag, Name); 2333// m_log.DebugFormat("[SCENE PRESENCE]: MovementFlag {0} for {1}", MovementFlag, Name);
2335 2334
@@ -2342,32 +2341,22 @@ namespace OpenSim.Region.Framework.Scenes
2342 if (update_movementflag 2341 if (update_movementflag
2343 || (update_rotation && DCFlagKeyPressed && (!AgentControlStopActive || MovementFlag != 0))) 2342 || (update_rotation && DCFlagKeyPressed && (!AgentControlStopActive || MovementFlag != 0)))
2344 { 2343 {
2345// if (update_movementflag || !AgentControlStopActive || MovementFlag != 0)
2346// {
2347// m_log.DebugFormat(
2348// "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, mf = {4}, ur = {5}",
2349// m_scene.RegionInfo.RegionName, agent_control_v3, Name,
2350// update_movementflag, MovementFlag, update_rotation);
2351
2352 float speedModifier;
2353 2344
2354 if (AgentControlStopActive) 2345 if (AgentControlStopActive)
2355 speedModifier = AgentControlStopSlowWhilstMoving; 2346 {
2347// if (MovementFlag == 0 && Animator.Falling)
2348 if (MovementFlag == 0 && Animator.currentControlState == ScenePresenceAnimator.motionControlStates.falling)
2349 {
2350 AddNewMovement(agent_control_v3, AgentControlStopSlowWhilstMoving, true);
2351 }
2356 else 2352 else
2357 speedModifier = 1; 2353 AddNewMovement(agent_control_v3, AgentControlStopSlowWhilstMoving);
2354 }
2355
2356 else
2357 AddNewMovement(agent_control_v3);
2358 2358
2359 AddNewMovement(agent_control_v3, speedModifier);
2360// }
2361 } 2359 }
2362// else
2363// {
2364// if (!update_movementflag)
2365// {
2366// m_log.DebugFormat(
2367// "[SCENE PRESENCE]: In {0} ignoring requested update of {1} for {2} as update_movementflag = false",
2368// m_scene.RegionInfo.RegionName, agent_control_v3, Name);
2369// }
2370// }
2371 2360
2372 if (update_movementflag && ParentID == 0) 2361 if (update_movementflag && ParentID == 0)
2373 { 2362 {
@@ -3246,68 +3235,55 @@ namespace OpenSim.Region.Framework.Scenes
3246 /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> 3235 /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param>
3247 /// <param name="thisAddSpeedModifier"> 3236 /// <param name="thisAddSpeedModifier">
3248 /// Optional additional speed modifier for this particular add. Default is 1</param> 3237 /// Optional additional speed modifier for this particular add. Default is 1</param>
3249 public void AddNewMovement(Vector3 vec, float thisAddSpeedModifier = 1) 3238 public void AddNewMovement(Vector3 vec, float thisAddSpeedModifier = 1, bool breaking = false)
3250 { 3239 {
3251// m_log.DebugFormat( 3240 // m_log.DebugFormat(
3252// "[SCENE PRESENCE]: Adding new movement {0} with rotation {1}, thisAddSpeedModifier {2} for {3}", 3241 // "[SCENE PRESENCE]: Adding new movement {0} with rotation {1}, thisAddSpeedModifier {2} for {3}",
3253// vec, Rotation, thisAddSpeedModifier, Name); 3242 // vec, Rotation, thisAddSpeedModifier, Name);
3254 3243
3244 // rotate from avatar coord space to world
3245 // for now all controls assume this is only a rotation around Z
3246 // if not all checks below need to be done before this rotation
3255 Vector3 direc = vec * Rotation; 3247 Vector3 direc = vec * Rotation;
3256 direc.Normalize(); 3248 direc.Normalize();
3257 3249
3258 if (Flying != FlyingOld) // add for fly velocity control 3250 // mouse look situation ?
3259 {
3260 FlyingOld = Flying; // add for fly velocity control
3261 if (!Flying)
3262 WasFlying = true; // add for fly velocity control
3263 }
3264
3265 if (IsColliding)
3266 WasFlying = false; // add for fly velocity control
3267
3268 if ((vec.Z == 0f) && !Flying) 3251 if ((vec.Z == 0f) && !Flying)
3269 direc.Z = 0f; // Prevent camera WASD up. 3252 direc.Z = 0f; // Prevent camera WASD up.
3270 3253
3254 // odd rescalings
3271 direc *= 0.03f * 128f * SpeedModifier * thisAddSpeedModifier; 3255 direc *= 0.03f * 128f * SpeedModifier * thisAddSpeedModifier;
3272 3256
3273// m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name); 3257 // m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name);
3274 3258
3275 if (PhysicsActor != null) 3259 if (Animator.currentControlState == ScenePresenceAnimator.motionControlStates.falling)
3276 { 3260 {
3277 if (Flying) 3261 if (breaking)
3278 { 3262 direc.Z = -9999f; //hack to tell physics to stop on Z
3263 else
3264 direc = Vector3.Zero;
3265 }
3266 else if (Flying)
3267 {
3268 if (IsColliding && direc.Z < 0)
3269 // landing situation, prevent avatar moving or it may fail to land
3270 // animator will handle this condition and do the land
3271 direc = Vector3.Zero;
3272 else
3279 direc *= 4.0f; 3273 direc *= 4.0f;
3280 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 3274 }
3281 //if (controlland) 3275 else if (IsColliding)
3282 // m_log.Info("[AGENT]: landCommand"); 3276 {
3283 //if (IsColliding) 3277 if (direc.Z > 2.0f) // reinforce jumps
3284 // m_log.Info("[AGENT]: colliding");
3285 //if (Flying && IsColliding && controlland)
3286 //{
3287 // StopFlying();
3288 // m_log.Info("[AGENT]: Stop Flying");
3289 //}
3290 }
3291 if (Animator.Falling && WasFlying) // if falling from flying, disable motion add
3292 {
3293 direc *= 0.0f;
3294 }
3295 else if (!Flying && IsColliding)
3296 { 3278 {
3297 if (direc.Z > 2.0f) 3279 direc.Z *= 2.6f;
3298 {
3299 direc.Z *= 2.6f;
3300
3301 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
3302// Animator.TrySetMovementAnimation("PREJUMP");
3303// Animator.TrySetMovementAnimation("JUMP");
3304 }
3305 } 3280 }
3281 else if (direc.Z < 0) // on a surface moving down (pg down) only changes animation
3282 direc.Z = 0;
3306 } 3283 }
3307 3284
3308// m_log.DebugFormat("[SCENE PRESENCE]: Setting force to apply to {0} for {1}", direc, Name); 3285 // m_log.DebugFormat("[SCENE PRESENCE]: Setting force to apply to {0} for {1}", direc, Name);
3309 3286
3310 // TODO: Add the force instead of only setting it to support multiple forces per frame?
3311 m_forceToApply = direc; 3287 m_forceToApply = direc;
3312 Animator.UpdateMovementAnimations(); 3288 Animator.UpdateMovementAnimations();
3313 } 3289 }