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.cs290
1 files changed, 211 insertions, 79 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5604e3d..cebd108 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Scenes
73// { 73// {
74// m_log.Debug("[ScenePresence] Destructor called"); 74// m_log.Debug("[ScenePresence] Destructor called");
75// } 75// }
76 76
77 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 77 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
78 78
79 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; 79 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
@@ -89,7 +89,9 @@ namespace OpenSim.Region.Framework.Scenes
89 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis 89 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
90 /// issue #1716 90 /// issue #1716
91 /// </summary> 91 /// </summary>
92 private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f); 92// private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
93 // Value revised by KF 091121 by comparison with SL.
94 private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f);
93 95
94 public UUID currentParcelUUID = UUID.Zero; 96 public UUID currentParcelUUID = UUID.Zero;
95 97
@@ -113,7 +115,9 @@ namespace OpenSim.Region.Framework.Scenes
113 public Vector3 lastKnownAllowedPosition; 115 public Vector3 lastKnownAllowedPosition;
114 public bool sentMessageAboutRestrictedParcelFlyingDown; 116 public bool sentMessageAboutRestrictedParcelFlyingDown;
115 public Vector4 CollisionPlane = Vector4.UnitW; 117 public Vector4 CollisionPlane = Vector4.UnitW;
116 118
119 private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
120 private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
117 private Vector3 m_lastPosition; 121 private Vector3 m_lastPosition;
118 private Quaternion m_lastRotation; 122 private Quaternion m_lastRotation;
119 private Vector3 m_lastVelocity; 123 private Vector3 m_lastVelocity;
@@ -144,7 +148,6 @@ namespace OpenSim.Region.Framework.Scenes
144 private int m_perfMonMS; 148 private int m_perfMonMS;
145 149
146 private bool m_setAlwaysRun; 150 private bool m_setAlwaysRun;
147
148 private bool m_forceFly; 151 private bool m_forceFly;
149 private bool m_flyDisabled; 152 private bool m_flyDisabled;
150 153
@@ -168,7 +171,8 @@ namespace OpenSim.Region.Framework.Scenes
168 protected RegionInfo m_regionInfo; 171 protected RegionInfo m_regionInfo;
169 protected ulong crossingFromRegion; 172 protected ulong crossingFromRegion;
170 173
171 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 174 private readonly Vector3[] Dir_Vectors = new Vector3[11];
175 private bool m_isNudging = false;
172 176
173 // Position of agent's camera in world (region cordinates) 177 // Position of agent's camera in world (region cordinates)
174 protected Vector3 m_CameraCenter; 178 protected Vector3 m_CameraCenter;
@@ -203,6 +207,9 @@ namespace OpenSim.Region.Framework.Scenes
203 private bool m_followCamAuto; 207 private bool m_followCamAuto;
204 208
205 private int m_movementUpdateCount; 209 private int m_movementUpdateCount;
210 private int m_lastColCount = -1; //KF: Look for Collision chnages
211 private int m_updateCount = 0; //KF: Update Anims for a while
212 private static readonly int UPDATE_COUNT = 10; // how many frames to update for
206 213
207 private const int NumMovementsBetweenRayCast = 5; 214 private const int NumMovementsBetweenRayCast = 5;
208 215
@@ -232,6 +239,10 @@ namespace OpenSim.Region.Framework.Scenes
232 DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, 239 DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
233 DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, 240 DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
234 DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, 241 DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
242 DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS,
243 DIR_CONTROL_FLAG_BACK_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG,
244 DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS,
245 DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG,
235 DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG 246 DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
236 } 247 }
237 248
@@ -658,9 +669,7 @@ namespace OpenSim.Region.Framework.Scenes
658 669
659 AdjustKnownSeeds(); 670 AdjustKnownSeeds();
660 671
661 // TODO: I think, this won't send anything, as we are still a child here... 672 Animator.TrySetMovementAnimation("STAND");
662 Animator.TrySetMovementAnimation("STAND");
663
664 // we created a new ScenePresence (a new child agent) in a fresh region. 673 // we created a new ScenePresence (a new child agent) in a fresh region.
665 // Request info about all the (root) agents in this region 674 // Request info about all the (root) agents in this region
666 // Note: This won't send data *to* other clients in that region (children don't send) 675 // Note: This won't send data *to* other clients in that region (children don't send)
@@ -716,21 +725,47 @@ namespace OpenSim.Region.Framework.Scenes
716 Dir_Vectors[3] = -Vector3.UnitY; //RIGHT 725 Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
717 Dir_Vectors[4] = Vector3.UnitZ; //UP 726 Dir_Vectors[4] = Vector3.UnitZ; //UP
718 Dir_Vectors[5] = -Vector3.UnitZ; //DOWN 727 Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
719 Dir_Vectors[5] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge 728 Dir_Vectors[6] = new Vector3(0.5f, 0f, 0f); //FORWARD_NUDGE
729 Dir_Vectors[7] = new Vector3(-0.5f, 0f, 0f); //BACK_NUDGE
730 Dir_Vectors[8] = new Vector3(0f, 0.5f, 0f); //LEFT_NUDGE
731 Dir_Vectors[9] = new Vector3(0f, -0.5f, 0f); //RIGHT_NUDGE
732 Dir_Vectors[10] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
720 } 733 }
721 734
722 private Vector3[] GetWalkDirectionVectors() 735 private Vector3[] GetWalkDirectionVectors()
723 { 736 {
724 Vector3[] vector = new Vector3[6]; 737 Vector3[] vector = new Vector3[11];
725 vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD 738 vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
726 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK 739 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
727 vector[2] = Vector3.UnitY; //LEFT 740 vector[2] = Vector3.UnitY; //LEFT
728 vector[3] = -Vector3.UnitY; //RIGHT 741 vector[3] = -Vector3.UnitY; //RIGHT
729 vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP 742 vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
730 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN 743 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
731 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge 744 vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
745 vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
746 vector[8] = Vector3.UnitY; //LEFT_NUDGE
747 vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
748 vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE
732 return vector; 749 return vector;
733 } 750 }
751
752 private bool[] GetDirectionIsNudge()
753 {
754 bool[] isNudge = new bool[11];
755 isNudge[0] = false; //FORWARD
756 isNudge[1] = false; //BACK
757 isNudge[2] = false; //LEFT
758 isNudge[3] = false; //RIGHT
759 isNudge[4] = false; //UP
760 isNudge[5] = false; //DOWN
761 isNudge[6] = true; //FORWARD_NUDGE
762 isNudge[7] = true; //BACK_NUDGE
763 isNudge[8] = true; //LEFT_NUDGE
764 isNudge[9] = true; //RIGHT_NUDGE
765 isNudge[10] = true; //DOWN_Nudge
766 return isNudge;
767 }
768
734 769
735 #endregion 770 #endregion
736 771
@@ -994,7 +1029,9 @@ namespace OpenSim.Region.Framework.Scenes
994 { 1029 {
995 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f)); 1030 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
996 } 1031 }
997 1032
1033 m_updateCount = UPDATE_COUNT; //KF: Trigger Anim updates to catch falling anim.
1034
998 ControllingClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, 1035 ControllingClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
999 AbsolutePosition, Velocity, Vector3.Zero, m_bodyRot, new Vector4(0,0,1,AbsolutePosition.Z - 0.5f), m_uuid, null, GetUpdatePriority(ControllingClient))); 1036 AbsolutePosition, Velocity, Vector3.Zero, m_bodyRot, new Vector4(0,0,1,AbsolutePosition.Z - 0.5f), m_uuid, null, GetUpdatePriority(ControllingClient)));
1000 } 1037 }
@@ -1147,7 +1184,6 @@ namespace OpenSim.Region.Framework.Scenes
1147 // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent"); 1184 // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
1148 // return; 1185 // return;
1149 //} 1186 //}
1150
1151 m_perfMonMS = Environment.TickCount; 1187 m_perfMonMS = Environment.TickCount;
1152 1188
1153 ++m_movementUpdateCount; 1189 ++m_movementUpdateCount;
@@ -1229,7 +1265,6 @@ namespace OpenSim.Region.Framework.Scenes
1229 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback); 1265 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
1230 } 1266 }
1231 } 1267 }
1232
1233 lock (scriptedcontrols) 1268 lock (scriptedcontrols)
1234 { 1269 {
1235 if (scriptedcontrols.Count > 0) 1270 if (scriptedcontrols.Count > 0)
@@ -1244,9 +1279,7 @@ namespace OpenSim.Region.Framework.Scenes
1244 1279
1245 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 1280 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
1246 { 1281 {
1247 // TODO: This doesn't prevent the user from walking yet. 1282 m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
1248 // Setting parent ID would fix this, if we knew what value
1249 // to use. Or we could add a m_isSitting variable.
1250 Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); 1283 Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
1251 } 1284 }
1252 1285
@@ -1261,7 +1294,6 @@ namespace OpenSim.Region.Framework.Scenes
1261 { 1294 {
1262 return; 1295 return;
1263 } 1296 }
1264
1265 if (m_allowMovement) 1297 if (m_allowMovement)
1266 { 1298 {
1267 int i = 0; 1299 int i = 0;
@@ -1289,6 +1321,11 @@ namespace OpenSim.Region.Framework.Scenes
1289 update_rotation = true; 1321 update_rotation = true;
1290 } 1322 }
1291 1323
1324 //guilty until proven innocent..
1325 bool Nudging = true;
1326 //Basically, if there is at least one non-nudge control then we don't need
1327 //to worry about stopping the avatar
1328
1292 if (m_parentID == 0) 1329 if (m_parentID == 0)
1293 { 1330 {
1294 bool bAllowUpdateMoveToPosition = false; 1331 bool bAllowUpdateMoveToPosition = false;
@@ -1303,6 +1340,12 @@ namespace OpenSim.Region.Framework.Scenes
1303 else 1340 else
1304 dirVectors = Dir_Vectors; 1341 dirVectors = Dir_Vectors;
1305 1342
1343 bool[] isNudge = GetDirectionIsNudge();
1344
1345
1346
1347
1348
1306 foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS) 1349 foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
1307 { 1350 {
1308 if (((uint)flags & (uint)DCF) != 0) 1351 if (((uint)flags & (uint)DCF) != 0)
@@ -1312,6 +1355,10 @@ namespace OpenSim.Region.Framework.Scenes
1312 try 1355 try
1313 { 1356 {
1314 agent_control_v3 += dirVectors[i]; 1357 agent_control_v3 += dirVectors[i];
1358 if (isNudge[i] == false)
1359 {
1360 Nudging = false;
1361 }
1315 } 1362 }
1316 catch (IndexOutOfRangeException) 1363 catch (IndexOutOfRangeException)
1317 { 1364 {
@@ -1373,6 +1420,9 @@ namespace OpenSim.Region.Framework.Scenes
1373 // Ignore z component of vector 1420 // Ignore z component of vector
1374 Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f); 1421 Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
1375 LocalVectorToTarget2D.Normalize(); 1422 LocalVectorToTarget2D.Normalize();
1423
1424 //We're not nudging
1425 Nudging = false;
1376 agent_control_v3 += LocalVectorToTarget2D; 1426 agent_control_v3 += LocalVectorToTarget2D;
1377 1427
1378 // update avatar movement flags. the avatar coordinate system is as follows: 1428 // update avatar movement flags. the avatar coordinate system is as follows:
@@ -1455,7 +1505,7 @@ namespace OpenSim.Region.Framework.Scenes
1455 // m_log.DebugFormat( 1505 // m_log.DebugFormat(
1456 // "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3); 1506 // "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3);
1457 1507
1458 AddNewMovement(agent_control_v3, q); 1508 AddNewMovement(agent_control_v3, q, Nudging);
1459 1509
1460 if (update_movementflag) 1510 if (update_movementflag)
1461 Animator.UpdateMovementAnimations(); 1511 Animator.UpdateMovementAnimations();
@@ -1538,7 +1588,7 @@ namespace OpenSim.Region.Framework.Scenes
1538 Velocity = Vector3.Zero; 1588 Velocity = Vector3.Zero;
1539 SendFullUpdateToAllClients(); 1589 SendFullUpdateToAllClients();
1540 1590
1541 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); 1591 HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); //KF ??
1542 } 1592 }
1543 //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false); 1593 //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false);
1544 m_requestedSitTargetUUID = UUID.Zero; 1594 m_requestedSitTargetUUID = UUID.Zero;
@@ -1576,21 +1626,19 @@ namespace OpenSim.Region.Framework.Scenes
1576 SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID); 1626 SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
1577 if (part != null) 1627 if (part != null)
1578 { 1628 {
1629 part.TaskInventory.LockItemsForRead(true);
1579 TaskInventoryDictionary taskIDict = part.TaskInventory; 1630 TaskInventoryDictionary taskIDict = part.TaskInventory;
1580 if (taskIDict != null) 1631 if (taskIDict != null)
1581 { 1632 {
1582 lock (taskIDict) 1633 foreach (UUID taskID in taskIDict.Keys)
1583 { 1634 {
1584 foreach (UUID taskID in taskIDict.Keys) 1635 UnRegisterControlEventsToScript(LocalId, taskID);
1585 { 1636 taskIDict[taskID].PermsMask &= ~(
1586 UnRegisterControlEventsToScript(LocalId, taskID); 1637 2048 | //PERMISSION_CONTROL_CAMERA
1587 taskIDict[taskID].PermsMask &= ~( 1638 4); // PERMISSION_TAKE_CONTROLS
1588 2048 | //PERMISSION_CONTROL_CAMERA
1589 4); // PERMISSION_TAKE_CONTROLS
1590 }
1591 } 1639 }
1592
1593 } 1640 }
1641 part.TaskInventory.LockItemsForRead(false);
1594 // Reset sit target. 1642 // Reset sit target.
1595 if (part.GetAvatarOnSitTarget() == UUID) 1643 if (part.GetAvatarOnSitTarget() == UUID)
1596 part.SetAvatarOnSitTarget(UUID.Zero); 1644 part.SetAvatarOnSitTarget(UUID.Zero);
@@ -1603,9 +1651,9 @@ namespace OpenSim.Region.Framework.Scenes
1603 { 1651 {
1604 AddToPhysicalScene(false); 1652 AddToPhysicalScene(false);
1605 } 1653 }
1606
1607 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); 1654 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
1608 m_parentPosition = Vector3.Zero; 1655 m_parentPosition = Vector3.Zero;
1656//Console.WriteLine("Stand Pos {0}", m_pos);
1609 1657
1610 m_parentID = 0; 1658 m_parentID = 0;
1611 SendFullUpdateToAllClients(); 1659 SendFullUpdateToAllClients();
@@ -1651,7 +1699,7 @@ namespace OpenSim.Region.Framework.Scenes
1651 bool SitTargetisSet = 1699 bool SitTargetisSet =
1652 (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 1f && 1700 (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 1f &&
1653 avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f)); 1701 avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f));
1654 1702 // this test is probably failing
1655 if (SitTargetisSet && SitTargetUnOccupied) 1703 if (SitTargetisSet && SitTargetUnOccupied)
1656 { 1704 {
1657 //switch the target to this prim 1705 //switch the target to this prim
@@ -1678,31 +1726,58 @@ namespace OpenSim.Region.Framework.Scenes
1678 { 1726 {
1679 // TODO: determine position to sit at based on scene geometry; don't trust offset from client 1727 // TODO: determine position to sit at based on scene geometry; don't trust offset from client
1680 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it 1728 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
1681 1729
1730 // part is the prim to sit on
1731 // offset is the vector distance from that prim center to the click-spot
1732 // UUID is the UUID of the Avatar doing the clicking
1733
1734 m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
1735
1682 // Is a sit target available? 1736 // Is a sit target available?
1683 Vector3 avSitOffSet = part.SitTargetPosition; 1737 Vector3 avSitOffSet = part.SitTargetPosition;
1684 Quaternion avSitOrientation = part.SitTargetOrientation; 1738 Quaternion avSitOrientation = part.SitTargetOrientation;
1685 UUID avOnTargetAlready = part.GetAvatarOnSitTarget(); 1739 UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
1686 1740
1687 bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero)); 1741 bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
1688 bool SitTargetisSet = 1742// bool SitTargetisSet =
1689 (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 0f && 1743// (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 0f &&
1690 avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f)); 1744// avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f));
1691 1745
1692 if (SitTargetisSet && SitTargetUnOccupied) 1746 bool SitTargetisSet = ((Vector3.Zero != avSitOffSet) || (Quaternion.Identity != avSitOrientation));
1693 { 1747
1694 part.SetAvatarOnSitTarget(UUID); 1748//Console.WriteLine("SendSitResponse offset=" + offset + " UnOccup=" + SitTargetUnOccupied +
1695 offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); 1749// " TargSet=" + SitTargetisSet);
1696 sitOrientation = avSitOrientation; 1750 // Sit analysis rewritten by KF 091125
1697 autopilot = false; 1751 if (SitTargetisSet) // scipted sit
1698 } 1752 {
1753 if (SitTargetUnOccupied)
1754 {
1755 part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
1756 offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
1757 sitOrientation = avSitOrientation; // Change rotatione to the scripted one
1758 autopilot = false; // Jump direct to scripted llSitPos()
1759 }
1760 else return;
1761 }
1762 else // Not Scripted
1763 {
1764 if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) ) // large prim
1765 {
1766 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
1767 m_avUnscriptedSitPos = offset * partIRot; // sit where clicked
1768 pos = part.AbsolutePosition + (offset * partIRot);
1769 }
1770 else // small prim
1771 {
1772 if (SitTargetUnOccupied)
1773 {
1774 m_avUnscriptedSitPos = Vector3.Zero; // Sit on unoccupied small prim center
1775 pos = part.AbsolutePosition;
1776 }
1777 else return; // occupied small
1778 } // end large/small
1779 } // end Scripted/not
1699 1780
1700 pos = part.AbsolutePosition + offset;
1701 //if (Math.Abs(part.AbsolutePosition.Z - AbsolutePosition.Z) > 1)
1702 //{
1703 // offset = pos;
1704 //autopilot = false;
1705 //}
1706 if (m_physicsActor != null) 1781 if (m_physicsActor != null)
1707 { 1782 {
1708 // If we're not using the client autopilot, we're immediately warping the avatar to the location 1783 // If we're not using the client autopilot, we're immediately warping the avatar to the location
@@ -1710,17 +1785,17 @@ namespace OpenSim.Region.Framework.Scenes
1710 m_sitAvatarHeight = m_physicsActor.Size.Z; 1785 m_sitAvatarHeight = m_physicsActor.Size.Z;
1711 1786
1712 if (autopilot) 1787 if (autopilot)
1713 { 1788 { // its not a scripted sit
1714 if (Util.GetDistanceTo(AbsolutePosition, pos) < 4.5) 1789 if (Util.GetDistanceTo(AbsolutePosition, pos) < 4.5)
1715 { 1790 {
1716 autopilot = false; 1791 autopilot = false; // close enough
1717 1792
1718 RemoveFromPhysicalScene(); 1793 RemoveFromPhysicalScene();
1719 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); 1794 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to Prim
1720 } 1795 } // else the autopilot will get us close
1721 } 1796 }
1722 else 1797 else
1723 { 1798 { // its a scripted sit
1724 RemoveFromPhysicalScene(); 1799 RemoveFromPhysicalScene();
1725 } 1800 }
1726 } 1801 }
@@ -1823,29 +1898,52 @@ namespace OpenSim.Region.Framework.Scenes
1823 { 1898 {
1824 if (part.GetAvatarOnSitTarget() == UUID) 1899 if (part.GetAvatarOnSitTarget() == UUID)
1825 { 1900 {
1901 // Scripted sit
1826 Vector3 sitTargetPos = part.SitTargetPosition; 1902 Vector3 sitTargetPos = part.SitTargetPosition;
1827 Quaternion sitTargetOrient = part.SitTargetOrientation; 1903 Quaternion sitTargetOrient = part.SitTargetOrientation;
1828
1829 //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0);
1830 //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w);
1831
1832 //Quaternion result = (sitTargetOrient * vq) * nq;
1833
1834 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); 1904 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
1835 m_pos += SIT_TARGET_ADJUSTMENT; 1905 m_pos += SIT_TARGET_ADJUSTMENT;
1836 m_bodyRot = sitTargetOrient; 1906 m_bodyRot = sitTargetOrient;
1837 //Rotation = sitTargetOrient;
1838 m_parentPosition = part.AbsolutePosition; 1907 m_parentPosition = part.AbsolutePosition;
1839
1840 //SendTerseUpdateToAllClients();
1841 } 1908 }
1842 else 1909 else
1843 { 1910 {
1844 m_pos -= part.AbsolutePosition; 1911 // Non-scripted sit by Kitto Flora 21Nov09
1912 // Calculate angle of line from prim to Av
1913 Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
1914 float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
1915 float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
1916 if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
1917 if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
1918 float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
1919 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
1920 // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
1921 // Av sits at world euler <0,0, z>, translated by part rotation
1922 m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
1845 m_parentPosition = part.AbsolutePosition; 1923 m_parentPosition = part.AbsolutePosition;
1846 } 1924 if(m_avUnscriptedSitPos != Vector3.Zero)
1847 } 1925 { // sit where clicked on big prim
1848 else 1926 m_pos = m_avUnscriptedSitPos + (new Vector3(0.0f, 0f, 0.625f) * partIRot);
1927 }
1928 else
1929 { // sit at center of small prim
1930 m_pos = new Vector3(0f, 0f, 0.05f) +
1931 (new Vector3(0.0f, 0f, 0.625f) * partIRot) +
1932 (new Vector3(0.25f, 0f, 0.0f) * m_bodyRot);
1933 //Set up raytrace to find top surface of prim
1934 Vector3 size = part.Scale;
1935 float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
1936 Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
1937 Vector3 down = new Vector3(0f, 0f, -1f);
1938 m_scene.PhysicsScene.RaycastWorld(
1939 start, // Vector3 position,
1940 down, // Vector3 direction,
1941 mag, // float length,
1942 SitAltitudeCallback); // retMethod
1943 } // end small/big
1944 } // end scripted/not
1945 }
1946 else // no Av
1849 { 1947 {
1850 return; 1948 return;
1851 } 1949 }
@@ -1857,11 +1955,21 @@ namespace OpenSim.Region.Framework.Scenes
1857 1955
1858 Animator.TrySetMovementAnimation(sitAnimation); 1956 Animator.TrySetMovementAnimation(sitAnimation);
1859 SendFullUpdateToAllClients(); 1957 SendFullUpdateToAllClients();
1860 // This may seem stupid, but Our Full updates don't send avatar rotation :P
1861 // So we're also sending a terse update (which has avatar rotation)
1862 // [Update] We do now.
1863 //SendTerseUpdateToAllClients();
1864 } 1958 }
1959
1960 public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
1961 {
1962 if(hitYN)
1963 {
1964 // m_pos = Av offset from prim center to make look like on center
1965 // m_parentPosition = Actual center pos of prim
1966 // collisionPoint = spot on prim where we want to sit
1967 SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
1968 Vector3 offset = (collisionPoint - m_parentPosition) * Quaternion.Inverse(part.RotationOffset);
1969 m_pos += offset;
1970// Console.WriteLine("m_pos={0}, offset={1} newsit={2}", m_pos, offset, newsit);
1971 }
1972 }
1865 1973
1866 /// <summary> 1974 /// <summary>
1867 /// Event handler for the 'Always run' setting on the client 1975 /// Event handler for the 'Always run' setting on the client
@@ -1891,7 +1999,7 @@ namespace OpenSim.Region.Framework.Scenes
1891 /// </summary> 1999 /// </summary>
1892 /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> 2000 /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param>
1893 /// <param name="rotation">The direction in which this avatar should now face. 2001 /// <param name="rotation">The direction in which this avatar should now face.
1894 public void AddNewMovement(Vector3 vec, Quaternion rotation) 2002 public void AddNewMovement(Vector3 vec, Quaternion rotation, bool Nudging)
1895 { 2003 {
1896 if (m_isChildAgent) 2004 if (m_isChildAgent)
1897 { 2005 {
@@ -1965,7 +2073,7 @@ namespace OpenSim.Region.Framework.Scenes
1965 2073
1966 // TODO: Add the force instead of only setting it to support multiple forces per frame? 2074 // TODO: Add the force instead of only setting it to support multiple forces per frame?
1967 m_forceToApply = direc; 2075 m_forceToApply = direc;
1968 2076 m_isNudging = Nudging;
1969 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2077 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
1970 } 2078 }
1971 2079
@@ -1980,7 +2088,7 @@ namespace OpenSim.Region.Framework.Scenes
1980 const float POSITION_TOLERANCE = 0.05f; 2088 const float POSITION_TOLERANCE = 0.05f;
1981 //const int TIME_MS_TOLERANCE = 3000; 2089 //const int TIME_MS_TOLERANCE = 3000;
1982 2090
1983 SendPrimUpdates(); 2091
1984 2092
1985 if (m_newCoarseLocations) 2093 if (m_newCoarseLocations)
1986 { 2094 {
@@ -2016,6 +2124,9 @@ namespace OpenSim.Region.Framework.Scenes
2016 CheckForBorderCrossing(); 2124 CheckForBorderCrossing();
2017 CheckForSignificantMovement(); // sends update to the modules. 2125 CheckForSignificantMovement(); // sends update to the modules.
2018 } 2126 }
2127
2128 //Sending prim updates AFTER the avatar terse updates are sent
2129 SendPrimUpdates();
2019 } 2130 }
2020 2131
2021 #endregion 2132 #endregion
@@ -2869,14 +2980,25 @@ namespace OpenSim.Region.Framework.Scenes
2869 { 2980 {
2870 if (m_forceToApply.HasValue) 2981 if (m_forceToApply.HasValue)
2871 { 2982 {
2872 Vector3 force = m_forceToApply.Value;
2873 2983
2984 Vector3 force = m_forceToApply.Value;
2874 m_updateflag = true; 2985 m_updateflag = true;
2875// movementvector = force;
2876 Velocity = force; 2986 Velocity = force;
2877 2987
2878 m_forceToApply = null; 2988 m_forceToApply = null;
2879 } 2989 }
2990 else
2991 {
2992 if (m_isNudging)
2993 {
2994 Vector3 force = Vector3.Zero;
2995
2996 m_updateflag = true;
2997 Velocity = force;
2998 m_isNudging = false;
2999 m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
3000 }
3001 }
2880 } 3002 }
2881 3003
2882 public override void SetText(string text, Vector3 color, double alpha) 3004 public override void SetText(string text, Vector3 color, double alpha)
@@ -2926,19 +3048,29 @@ namespace OpenSim.Region.Framework.Scenes
2926 // Event called by the physics plugin to tell the avatar about a collision. 3048 // Event called by the physics plugin to tell the avatar about a collision.
2927 private void PhysicsCollisionUpdate(EventArgs e) 3049 private void PhysicsCollisionUpdate(EventArgs e)
2928 { 3050 {
3051 if (m_updateCount > 0) //KF: Update Anims for a short period. Many Anim
3052 { // changes are very asynchronous.
3053 Animator.UpdateMovementAnimations();
3054 m_updateCount--;
3055 }
3056
2929 if (e == null) 3057 if (e == null)
2930 return; 3058 return;
2931 3059
2932 //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
2933 // The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents( 3060 // The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents(
2934 // as of this comment the interval is set in AddToPhysicalScene 3061 // as of this comment the interval is set in AddToPhysicalScene
2935 Animator.UpdateMovementAnimations(); 3062
2936
2937 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3063 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
2938 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList; 3064 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
2939 3065
2940 CollisionPlane = Vector4.UnitW; 3066 CollisionPlane = Vector4.UnitW;
2941 3067
3068 if (m_lastColCount != coldata.Count)
3069 {
3070 m_updateCount = 10;
3071 m_lastColCount = coldata.Count;
3072 }
3073
2942 if (coldata.Count != 0) 3074 if (coldata.Count != 0)
2943 { 3075 {
2944 switch (Animator.CurrentMovementAnimation) 3076 switch (Animator.CurrentMovementAnimation)
@@ -3585,4 +3717,4 @@ namespace OpenSim.Region.Framework.Scenes
3585 } 3717 }
3586 } 3718 }
3587 } 3719 }
3588} \ No newline at end of file 3720}