diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 265 |
1 files changed, 170 insertions, 95 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 9f330fd..3c749aa 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -360,15 +360,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
360 | /// <summary> | 360 | /// <summary> |
361 | /// Record user movement inputs. | 361 | /// Record user movement inputs. |
362 | /// </summary> | 362 | /// </summary> |
363 | public byte MovementFlag { get; private set; } | 363 | public uint MovementFlag { get; private set; } |
364 | 364 | ||
365 | private bool m_updateflag; | 365 | /// <summary> |
366 | 366 | /// Is the agent stop control flag currently active? | |
367 | public bool Updated | 367 | /// </summary> |
368 | { | 368 | public bool AgentControlStopActive { get; private set; } |
369 | set { m_updateflag = value; } | ||
370 | get { return m_updateflag; } | ||
371 | } | ||
372 | 369 | ||
373 | private bool m_invulnerable = true; | 370 | private bool m_invulnerable = true; |
374 | 371 | ||
@@ -513,6 +510,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
513 | } | 510 | } |
514 | else | 511 | else |
515 | { | 512 | { |
513 | // m_log.DebugFormat("[SCENE PRESENCE]: Fetching abs pos where PhysicsActor == null and parent part {0} for {1}", Name, Scene.Name); | ||
516 | // Obtain the correct position of a seated avatar. | 514 | // Obtain the correct position of a seated avatar. |
517 | // In addition to providing the correct position while | 515 | // In addition to providing the correct position while |
518 | // the avatar is seated, this value will also | 516 | // the avatar is seated, this value will also |
@@ -536,7 +534,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
536 | } | 534 | } |
537 | set | 535 | set |
538 | { | 536 | { |
539 | // m_log.DebugFormat("[SCENE PRESENCE]: Setting position of {0} in {1} to {2}", Name, Scene.Name, value); | 537 | // m_log.DebugFormat("[SCENE PRESENCE]: Setting position of {0} to {1} in {2}", Name, value, Scene.Name); |
540 | // Util.PrintCallStack(); | 538 | // Util.PrintCallStack(); |
541 | 539 | ||
542 | if (PhysicsActor != null) | 540 | if (PhysicsActor != null) |
@@ -553,10 +551,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
553 | 551 | ||
554 | // Don't update while sitting. The PhysicsActor above is null whilst sitting. | 552 | // Don't update while sitting. The PhysicsActor above is null whilst sitting. |
555 | if (ParentID == 0) | 553 | if (ParentID == 0) |
556 | { | ||
557 | m_pos = value; | 554 | m_pos = value; |
558 | // ParentPosition = Vector3.Zero; | ||
559 | } | ||
560 | 555 | ||
561 | //m_log.DebugFormat( | 556 | //m_log.DebugFormat( |
562 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", | 557 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", |
@@ -819,6 +814,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
819 | set { m_speedModifier = value; } | 814 | set { m_speedModifier = value; } |
820 | } | 815 | } |
821 | 816 | ||
817 | /// <summary> | ||
818 | /// Modifier for agent movement if we get an AGENT_CONTROL_STOP whilst walking or running | ||
819 | /// </summary> | ||
820 | /// <remarks> | ||
821 | /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers. | ||
822 | /// </remarks> | ||
823 | private float AgentControlStopSlowWhilstMoving = 0.5f; | ||
824 | |||
822 | private bool m_forceFly; | 825 | private bool m_forceFly; |
823 | 826 | ||
824 | public bool ForceFly | 827 | public bool ForceFly |
@@ -1899,7 +1902,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1899 | if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None) | 1902 | if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None) |
1900 | ControllingClient.SendAgentTerseUpdate(this); | 1903 | ControllingClient.SendAgentTerseUpdate(this); |
1901 | 1904 | ||
1902 | |||
1903 | PhysicsActor actor = PhysicsActor; | 1905 | PhysicsActor actor = PhysicsActor; |
1904 | if (actor == null) | 1906 | if (actor == null) |
1905 | { | 1907 | { |
@@ -1909,12 +1911,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1909 | 1911 | ||
1910 | if (AllowMovement && !SitGround) | 1912 | if (AllowMovement && !SitGround) |
1911 | { | 1913 | { |
1912 | Quaternion bodyRotation = agentData.BodyRotation; | 1914 | // m_log.DebugFormat("[SCENE PRESENCE]: Initial body rotation {0} for {1}", agentData.BodyRotation, Name); |
1915 | |||
1913 | bool update_rotation = false; | 1916 | bool update_rotation = false; |
1914 | 1917 | ||
1915 | if (bodyRotation != Rotation) | 1918 | if (agentData.BodyRotation != Rotation) |
1916 | { | 1919 | { |
1917 | Rotation = bodyRotation; | 1920 | Rotation = agentData.BodyRotation; |
1918 | update_rotation = true; | 1921 | update_rotation = true; |
1919 | } | 1922 | } |
1920 | 1923 | ||
@@ -1960,10 +1963,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1960 | else | 1963 | else |
1961 | dirVectors = Dir_Vectors; | 1964 | dirVectors = Dir_Vectors; |
1962 | 1965 | ||
1963 | // The fact that MovementFlag is a byte needs to be fixed | ||
1964 | // it really should be a uint | ||
1965 | // A DIR_CONTROL_FLAG occurs when the user is trying to move in a particular direction. | 1966 | // A DIR_CONTROL_FLAG occurs when the user is trying to move in a particular direction. |
1966 | uint nudgehack = 250; | ||
1967 | foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS) | 1967 | foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS) |
1968 | { | 1968 | { |
1969 | if (((uint)flags & (uint)DCF) != 0) | 1969 | if (((uint)flags & (uint)DCF) != 0) |
@@ -1980,29 +1980,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
1980 | // Why did I get this? | 1980 | // Why did I get this? |
1981 | } | 1981 | } |
1982 | 1982 | ||
1983 | if ((MovementFlag & (byte)(uint)DCF) == 0) | 1983 | if (((MovementFlag & (uint)DCF) == 0) & !AgentControlStopActive) |
1984 | { | 1984 | { |
1985 | if (DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE || | ||
1986 | DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT_NUDGE) | ||
1987 | { | ||
1988 | MovementFlag |= (byte)nudgehack; | ||
1989 | } | ||
1990 | |||
1991 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); | 1985 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); |
1992 | MovementFlag += (byte)(uint)DCF; | 1986 | MovementFlag += (uint)DCF; |
1993 | update_movementflag = true; | 1987 | update_movementflag = true; |
1994 | } | 1988 | } |
1995 | } | 1989 | } |
1996 | else | 1990 | else |
1997 | { | 1991 | { |
1998 | if ((MovementFlag & (byte)(uint)DCF) != 0 || | 1992 | if ((MovementFlag & (uint)DCF) != 0) |
1999 | ((DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE || | ||
2000 | DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT_NUDGE) | ||
2001 | && ((MovementFlag & (byte)nudgehack) == nudgehack)) | ||
2002 | ) // This or is for Nudge forward | ||
2003 | { | 1993 | { |
2004 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); | 1994 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); |
2005 | MovementFlag -= ((byte)(uint)DCF); | 1995 | MovementFlag -= (uint)DCF; |
2006 | update_movementflag = true; | 1996 | update_movementflag = true; |
2007 | 1997 | ||
2008 | /* | 1998 | /* |
@@ -2022,6 +2012,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2022 | i++; | 2012 | i++; |
2023 | } | 2013 | } |
2024 | 2014 | ||
2015 | // Detect AGENT_CONTROL_STOP state changes | ||
2016 | if (AgentControlStopActive != ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STOP) != 0)) | ||
2017 | { | ||
2018 | AgentControlStopActive = !AgentControlStopActive; | ||
2019 | update_movementflag = true; | ||
2020 | } | ||
2021 | |||
2025 | if (MovingToTarget) | 2022 | if (MovingToTarget) |
2026 | { | 2023 | { |
2027 | // If the user has pressed a key then we want to cancel any move to target. | 2024 | // If the user has pressed a key then we want to cancel any move to target. |
@@ -2047,53 +2044,79 @@ namespace OpenSim.Region.Framework.Scenes | |||
2047 | // Only do this if we're flying | 2044 | // Only do this if we're flying |
2048 | if (Flying && !ForceFly) | 2045 | if (Flying && !ForceFly) |
2049 | { | 2046 | { |
2050 | // Landing detection code | 2047 | // Need to stop in mid air if user holds down AGENT_CONTROL_STOP |
2051 | 2048 | if (AgentControlStopActive) | |
2052 | // Are the landing controls requirements filled? | ||
2053 | bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || | ||
2054 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); | ||
2055 | |||
2056 | //m_log.Debug("[CONTROL]: " +flags); | ||
2057 | // Applies a satisfying roll effect to the avatar when flying. | ||
2058 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) | ||
2059 | { | ||
2060 | ApplyFlyingRoll( | ||
2061 | FLY_ROLL_RADIANS_PER_UPDATE, | ||
2062 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
2063 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
2064 | } | ||
2065 | else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && | ||
2066 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) | ||
2067 | { | 2049 | { |
2068 | ApplyFlyingRoll( | 2050 | agent_control_v3 = Vector3.Zero; |
2069 | -FLY_ROLL_RADIANS_PER_UPDATE, | ||
2070 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
2071 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
2072 | } | 2051 | } |
2073 | else | 2052 | else |
2074 | { | 2053 | { |
2075 | if (m_AngularVelocity.Z != 0) | 2054 | // Landing detection code |
2076 | m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); | ||
2077 | } | ||
2078 | 2055 | ||
2079 | if (Flying && IsColliding && controlland) | 2056 | // Are the landing controls requirements filled? |
2080 | { | 2057 | bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || |
2081 | // nesting this check because LengthSquared() is expensive and we don't | 2058 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); |
2082 | // want to do it every step when flying. | 2059 | |
2083 | if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) | 2060 | //m_log.Debug("[CONTROL]: " +flags); |
2084 | StopFlying(); | 2061 | // Applies a satisfying roll effect to the avatar when flying. |
2062 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) | ||
2063 | { | ||
2064 | ApplyFlyingRoll( | ||
2065 | FLY_ROLL_RADIANS_PER_UPDATE, | ||
2066 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
2067 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
2068 | } | ||
2069 | else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && | ||
2070 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) | ||
2071 | { | ||
2072 | ApplyFlyingRoll( | ||
2073 | -FLY_ROLL_RADIANS_PER_UPDATE, | ||
2074 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
2075 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
2076 | } | ||
2077 | else | ||
2078 | { | ||
2079 | if (m_AngularVelocity.Z != 0) | ||
2080 | m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); | ||
2081 | } | ||
2082 | |||
2083 | if (Flying && IsColliding && controlland) | ||
2084 | { | ||
2085 | // nesting this check because LengthSquared() is expensive and we don't | ||
2086 | // want to do it every step when flying. | ||
2087 | if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) | ||
2088 | StopFlying(); | ||
2089 | } | ||
2085 | } | 2090 | } |
2086 | } | 2091 | } |
2087 | 2092 | ||
2093 | // m_log.DebugFormat("[SCENE PRESENCE]: MovementFlag {0} for {1}", MovementFlag, Name); | ||
2094 | |||
2088 | // If the agent update does move the avatar, then calculate the force ready for the velocity update, | 2095 | // If the agent update does move the avatar, then calculate the force ready for the velocity update, |
2089 | // which occurs later in the main scene loop | 2096 | // which occurs later in the main scene loop |
2090 | if (update_movementflag || (update_rotation && DCFlagKeyPressed)) | 2097 | // We also need to update if the user rotates their avatar whilst it is slow walking/running (if they |
2098 | // held down AGENT_CONTROL_STOP whilst normal walking/running). However, we do not want to update | ||
2099 | // if the user rotated whilst holding down AGENT_CONTROL_STOP when already still (which locks the | ||
2100 | // avatar location in place). | ||
2101 | if (update_movementflag | ||
2102 | || (update_rotation && DCFlagKeyPressed && (!AgentControlStopActive || MovementFlag != 0))) | ||
2091 | { | 2103 | { |
2092 | // m_log.DebugFormat( | 2104 | // if (update_movementflag || !AgentControlStopActive || MovementFlag != 0) |
2093 | // "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, ur = {4}", | 2105 | // { |
2094 | // m_scene.RegionInfo.RegionName, agent_control_v3, Name, update_movementflag, update_rotation); | 2106 | // m_log.DebugFormat( |
2107 | // "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, mf = {4}, ur = {5}", | ||
2108 | // m_scene.RegionInfo.RegionName, agent_control_v3, Name, | ||
2109 | // update_movementflag, MovementFlag, update_rotation); | ||
2110 | |||
2111 | float speedModifier; | ||
2112 | |||
2113 | if (AgentControlStopActive) | ||
2114 | speedModifier = AgentControlStopSlowWhilstMoving; | ||
2115 | else | ||
2116 | speedModifier = 1; | ||
2095 | 2117 | ||
2096 | AddNewMovement(agent_control_v3); | 2118 | AddNewMovement(agent_control_v3, speedModifier); |
2119 | // } | ||
2097 | } | 2120 | } |
2098 | // else | 2121 | // else |
2099 | // { | 2122 | // { |
@@ -2106,7 +2129,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2106 | // } | 2129 | // } |
2107 | 2130 | ||
2108 | if (update_movementflag && ParentID == 0) | 2131 | if (update_movementflag && ParentID == 0) |
2132 | { | ||
2133 | // m_log.DebugFormat("[SCENE PRESENCE]: Updating movement animations for {0}", Name); | ||
2109 | Animator.UpdateMovementAnimations(); | 2134 | Animator.UpdateMovementAnimations(); |
2135 | } | ||
2110 | 2136 | ||
2111 | SendControlsToScripts(flagsForScripts); | 2137 | SendControlsToScripts(flagsForScripts); |
2112 | } | 2138 | } |
@@ -2435,17 +2461,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2435 | { | 2461 | { |
2436 | // m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name); | 2462 | // m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name); |
2437 | 2463 | ||
2464 | bool satOnObject = IsSatOnObject; | ||
2465 | SceneObjectPart part = ParentPart; | ||
2438 | SitGround = false; | 2466 | SitGround = false; |
2439 | 2467 | ||
2440 | /* move this down so avatar gets physical in the new position and not where it is siting | 2468 | if (satOnObject) |
2441 | if (PhysicsActor == null) | ||
2442 | AddToPhysicalScene(false); | ||
2443 | */ | ||
2444 | |||
2445 | if (ParentID != 0) | ||
2446 | { | 2469 | { |
2447 | PrevSitOffset = m_pos; // Save sit offset | 2470 | PrevSitOffset = m_pos; // Save sit offset |
2448 | SceneObjectPart part = ParentPart; | ||
2449 | UnRegisterSeatControls(part.ParentGroup.UUID); | 2471 | UnRegisterSeatControls(part.ParentGroup.UUID); |
2450 | 2472 | ||
2451 | TaskInventoryDictionary taskIDict = part.TaskInventory; | 2473 | TaskInventoryDictionary taskIDict = part.TaskInventory; |
@@ -2464,28 +2486,64 @@ namespace OpenSim.Region.Framework.Scenes | |||
2464 | } | 2486 | } |
2465 | 2487 | ||
2466 | part.ParentGroup.DeleteAvatar(UUID); | 2488 | part.ParentGroup.DeleteAvatar(UUID); |
2467 | // ParentPosition = part.GetWorldPosition(); | 2489 | Vector3 sitPartWorldPosition = part.GetWorldPosition(); |
2468 | ControllingClient.SendClearFollowCamProperties(part.ParentUUID); | 2490 | ControllingClient.SendClearFollowCamProperties(part.ParentUUID); |
2469 | 2491 | ||
2470 | // m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); | ||
2471 | // ParentPosition = Vector3.Zero; | ||
2472 | m_pos = part.AbsolutePosition + (m_pos * part.GetWorldRotation()) + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); | ||
2473 | if (part.SitTargetAvatar == UUID) | ||
2474 | m_bodyRot = part.GetWorldRotation() * part.SitTargetOrientation; | ||
2475 | |||
2476 | ParentID = 0; | 2492 | ParentID = 0; |
2477 | ParentPart = null; | 2493 | ParentPart = null; |
2478 | 2494 | ||
2479 | if (PhysicsActor == null) | 2495 | Quaternion standRotation; |
2480 | AddToPhysicalScene(false); | 2496 | |
2497 | if (part.SitTargetAvatar == UUID) | ||
2498 | { | ||
2499 | standRotation = part.GetWorldRotation(); | ||
2500 | |||
2501 | if (!part.IsRoot) | ||
2502 | standRotation = standRotation * part.SitTargetOrientation; | ||
2503 | // standRotation = part.RotationOffset * part.SitTargetOrientation; | ||
2504 | // else | ||
2505 | // standRotation = part.SitTargetOrientation; | ||
2506 | |||
2507 | } | ||
2508 | else | ||
2509 | { | ||
2510 | standRotation = Rotation; | ||
2511 | } | ||
2512 | |||
2513 | //Vector3 standPos = ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); | ||
2514 | //Vector3 standPos = ParentPosition; | ||
2515 | |||
2516 | // Vector3 standPositionAdjustment | ||
2517 | // = part.SitTargetPosition + new Vector3(0.5f, 0f, m_sitAvatarHeight / 2f); | ||
2518 | Vector3 adjustmentForSitPosition = part.SitTargetPosition * part.GetWorldRotation(); | ||
2481 | 2519 | ||
2520 | // XXX: This is based on the physics capsule sizes. Need to find a better way to read this rather than | ||
2521 | // hardcoding here. | ||
2522 | Vector3 adjustmentForSitPose = new Vector3(0.74f, 0f, 0f) * standRotation; | ||
2523 | |||
2524 | Vector3 standPos = sitPartWorldPosition + adjustmentForSitPosition + adjustmentForSitPose; | ||
2525 | |||
2526 | // m_log.DebugFormat( | ||
2527 | // "[SCENE PRESENCE]: Setting stand to pos {0}, (adjustmentForSitPosition {1}, adjustmentForSitPose {2}) rotation {3} for {4} in {5}", | ||
2528 | // standPos, adjustmentForSitPosition, adjustmentForSitPose, standRotation, Name, Scene.Name); | ||
2529 | |||
2530 | Rotation = standRotation; | ||
2531 | AbsolutePosition = standPos; | ||
2532 | } | ||
2533 | |||
2534 | // We need to wait until we have calculated proper stand positions before sitting up the physical | ||
2535 | // avatar to avoid race conditions. | ||
2536 | if (PhysicsActor == null) | ||
2537 | AddToPhysicalScene(false); | ||
2538 | |||
2539 | if (satOnObject) | ||
2540 | { | ||
2482 | SendAvatarDataToAllAgents(); | 2541 | SendAvatarDataToAllAgents(); |
2483 | m_requestedSitTargetID = 0; | 2542 | m_requestedSitTargetID = 0; |
2484 | 2543 | ||
2485 | part.RemoveSittingAvatar(UUID); | 2544 | part.RemoveSittingAvatar(UUID); |
2486 | 2545 | ||
2487 | if (part != null) | 2546 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); |
2488 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); | ||
2489 | } | 2547 | } |
2490 | 2548 | ||
2491 | else if (PhysicsActor == null) | 2549 | else if (PhysicsActor == null) |
@@ -2543,7 +2601,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2543 | m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; | 2601 | m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; |
2544 | 2602 | ||
2545 | bool canSit = false; | 2603 | bool canSit = false; |
2546 | Vector3 pos = part.AbsolutePosition + offset; | ||
2547 | 2604 | ||
2548 | if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) | 2605 | if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero) |
2549 | { | 2606 | { |
@@ -2553,6 +2610,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2553 | 2610 | ||
2554 | offset = part.SitTargetPosition; | 2611 | offset = part.SitTargetPosition; |
2555 | sitOrientation = part.SitTargetOrientation; | 2612 | sitOrientation = part.SitTargetOrientation; |
2613 | |||
2614 | if (!part.IsRoot) | ||
2615 | { | ||
2616 | // m_log.DebugFormat("Old sit orient {0}", sitOrientation); | ||
2617 | sitOrientation = part.RotationOffset * sitOrientation; | ||
2618 | // m_log.DebugFormat("New sit orient {0}", sitOrientation); | ||
2619 | // m_log.DebugFormat("Old sit offset {0}", offset); | ||
2620 | offset = offset * part.RotationOffset; | ||
2621 | // m_log.DebugFormat("New sit offset {0}", offset); | ||
2622 | } | ||
2623 | |||
2556 | canSit = true; | 2624 | canSit = true; |
2557 | } | 2625 | } |
2558 | else | 2626 | else |
@@ -2560,9 +2628,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2560 | if (PhysicsSit(part,offset)) // physics engine | 2628 | if (PhysicsSit(part,offset)) // physics engine |
2561 | return; | 2629 | return; |
2562 | 2630 | ||
2631 | Vector3 pos = part.AbsolutePosition + offset; | ||
2632 | |||
2563 | if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) | 2633 | if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) |
2564 | { | 2634 | { |
2565 | |||
2566 | AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); | 2635 | AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); |
2567 | canSit = true; | 2636 | canSit = true; |
2568 | } | 2637 | } |
@@ -2588,8 +2657,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2588 | cameraEyeOffset = part.GetCameraEyeOffset(); | 2657 | cameraEyeOffset = part.GetCameraEyeOffset(); |
2589 | forceMouselook = part.GetForceMouselook(); | 2658 | forceMouselook = part.GetForceMouselook(); |
2590 | 2659 | ||
2660 | // An viewer expects to specify sit positions as offsets to the root prim, even if a child prim is | ||
2661 | // being sat upon. | ||
2662 | offset += part.OffsetPosition; | ||
2663 | |||
2591 | ControllingClient.SendSitResponse( | 2664 | ControllingClient.SendSitResponse( |
2592 | part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); | 2665 | part.ParentGroup.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); |
2593 | 2666 | ||
2594 | m_requestedSitTargetUUID = part.UUID; | 2667 | m_requestedSitTargetUUID = part.UUID; |
2595 | 2668 | ||
@@ -2870,10 +2943,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2870 | /// Rotate the avatar to the given rotation and apply a movement in the given relative vector | 2943 | /// Rotate the avatar to the given rotation and apply a movement in the given relative vector |
2871 | /// </summary> | 2944 | /// </summary> |
2872 | /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> | 2945 | /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> |
2873 | public void AddNewMovement(Vector3 vec) | 2946 | /// <param name="thisAddSpeedModifier"> |
2947 | /// Optional additional speed modifier for this particular add. Default is 1</param> | ||
2948 | public void AddNewMovement(Vector3 vec, float thisAddSpeedModifier = 1) | ||
2874 | { | 2949 | { |
2875 | // m_log.DebugFormat( | 2950 | // m_log.DebugFormat( |
2876 | // "[SCENE PRESENCE]: Adding new movement {0} with rotation {1} for {2}", vec, Rotation, Name); | 2951 | // "[SCENE PRESENCE]: Adding new movement {0} with rotation {1}, thisAddSpeedModifier {2} for {3}", |
2952 | // vec, Rotation, thisAddSpeedModifier, Name); | ||
2877 | 2953 | ||
2878 | Vector3 direc = vec * Rotation; | 2954 | Vector3 direc = vec * Rotation; |
2879 | direc.Normalize(); | 2955 | direc.Normalize(); |
@@ -2891,7 +2967,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2891 | if ((vec.Z == 0f) && !Flying) | 2967 | if ((vec.Z == 0f) && !Flying) |
2892 | direc.Z = 0f; // Prevent camera WASD up. | 2968 | direc.Z = 0f; // Prevent camera WASD up. |
2893 | 2969 | ||
2894 | direc *= 0.03f * 128f * SpeedModifier; | 2970 | direc *= 0.03f * 128f * SpeedModifier * thisAddSpeedModifier; |
2895 | 2971 | ||
2896 | // m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name); | 2972 | // m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name); |
2897 | 2973 | ||
@@ -3037,6 +3113,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3037 | lastTerseUpdateToAllClientsTick = currentTick; | 3113 | lastTerseUpdateToAllClientsTick = currentTick; |
3038 | lastPositionSentToAllClients = OffsetPosition; | 3114 | lastPositionSentToAllClients = OffsetPosition; |
3039 | 3115 | ||
3116 | // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); | ||
3040 | m_scene.ForEachClient(SendTerseUpdateToClient); | 3117 | m_scene.ForEachClient(SendTerseUpdateToClient); |
3041 | } | 3118 | } |
3042 | TriggerScenePresenceUpdated(); | 3119 | TriggerScenePresenceUpdated(); |
@@ -3806,8 +3883,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3806 | { | 3883 | { |
3807 | Vector3 force = m_forceToApply.Value; | 3884 | Vector3 force = m_forceToApply.Value; |
3808 | 3885 | ||
3809 | Updated = true; | ||
3810 | |||
3811 | Velocity = force; | 3886 | Velocity = force; |
3812 | 3887 | ||
3813 | m_forceToApply = null; | 3888 | m_forceToApply = null; |