aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs144
1 files changed, 120 insertions, 24 deletions
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 0fdd720..aca0f9d 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -80,6 +80,8 @@ namespace OpenSim.Region.Environment.Scenes
80 private Dictionary<LLUUID, ScriptControllers> scriptedcontrols = new Dictionary<LLUUID, ScriptControllers>(); 80 private Dictionary<LLUUID, ScriptControllers> scriptedcontrols = new Dictionary<LLUUID, ScriptControllers>();
81 private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO; 81 private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
82 private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO; 82 private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
83 private SceneObjectGroup proxyObjectGroup = null;
84 private SceneObjectPart proxyObjectPart = null;
83 85
84 public Vector3 lastKnownAllowedPosition = new Vector3(); 86 public Vector3 lastKnownAllowedPosition = new Vector3();
85 public bool sentMessageAboutRestrictedParcelFlyingDown = false; 87 public bool sentMessageAboutRestrictedParcelFlyingDown = false;
@@ -89,6 +91,8 @@ namespace OpenSim.Region.Environment.Scenes
89 private readonly List<NewForce> m_forcesList = new List<NewForce>(); 91 private readonly List<NewForce> m_forcesList = new List<NewForce>();
90 private short m_updateCount = 0; 92 private short m_updateCount = 0;
91 private uint m_requestedSitTargetID = 0; 93 private uint m_requestedSitTargetID = 0;
94 private LLUUID m_requestedSitTargetUUID = LLUUID.Zero;
95
92 private LLVector3 m_requestedSitOffset = new LLVector3(); 96 private LLVector3 m_requestedSitOffset = new LLVector3();
93 97
94 private LLVector3 m_LastFinitePos = new LLVector3(); 98 private LLVector3 m_LastFinitePos = new LLVector3();
@@ -144,6 +148,10 @@ namespace OpenSim.Region.Environment.Scenes
144 //Reuse the LLVector3 instead of creating a new one on the UpdateMovement method 148 //Reuse the LLVector3 instead of creating a new one on the UpdateMovement method
145 private LLVector3 movementvector = new LLVector3(); 149 private LLVector3 movementvector = new LLVector3();
146 150
151 private bool m_autopilotMoving = false;
152 private LLVector3 m_autoPilotTarget = LLVector3.Zero;
153 private bool m_sitAtAutoTarget = false;
154
147 private List<LLUUID> m_knownPrimUUID = new List<LLUUID>(); 155 private List<LLUUID> m_knownPrimUUID = new List<LLUUID>();
148 156
149 // Agent's Draw distance. 157 // Agent's Draw distance.
@@ -439,6 +447,7 @@ namespace OpenSim.Region.Environment.Scenes
439 m_controllingClient.OnStartAnim += HandleStartAnim; 447 m_controllingClient.OnStartAnim += HandleStartAnim;
440 m_controllingClient.OnStopAnim += HandleStopAnim; 448 m_controllingClient.OnStopAnim += HandleStopAnim;
441 m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls; 449 m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls;
450 m_controllingClient.OnAutoPilotGo += DoAutoPilot;
442 451
443 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); 452 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
444 // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); 453 // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
@@ -472,6 +481,8 @@ namespace OpenSim.Region.Environment.Scenes
472 // } 481 // }
473 } 482 }
474 483
484
485
475 public uint GenerateClientFlags(LLUUID ObjectID) 486 public uint GenerateClientFlags(LLUUID ObjectID)
476 { 487 {
477 return m_scene.ExternalChecks.ExternalChecksGenerateClientFlags(m_uuid, ObjectID); 488 return m_scene.ExternalChecks.ExternalChecksGenerateClientFlags(m_uuid, ObjectID);
@@ -835,6 +846,9 @@ namespace OpenSim.Region.Environment.Scenes
835 return; 846 return;
836 } 847 }
837 848
849 if (m_autopilotMoving)
850 CheckAtSitTarget();
851
838 if ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 852 if ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
839 { 853 {
840 // TODO: This doesn't enable the "stand up" button on the viewer yet (probably a parent ID problem) 854 // TODO: This doesn't enable the "stand up" button on the viewer yet (probably a parent ID problem)
@@ -856,14 +870,16 @@ namespace OpenSim.Region.Environment.Scenes
856 bool DCFlagKeyPressed = false; 870 bool DCFlagKeyPressed = false;
857 Vector3 agent_control_v3 = new Vector3(0, 0, 0); 871 Vector3 agent_control_v3 = new Vector3(0, 0, 0);
858 Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z); 872 Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
859 bool oldflying = PhysicsActor.Flying; 873 if (PhysicsActor != null)
860
861 PhysicsActor.Flying = ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
862 if (PhysicsActor.Flying != oldflying)
863 { 874 {
864 update_movementflag = true; 875 bool oldflying = PhysicsActor.Flying;
865 }
866 876
877 PhysicsActor.Flying = ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
878 if (PhysicsActor.Flying != oldflying)
879 {
880 update_movementflag = true;
881 }
882 }
867 if (q != m_bodyRot) 883 if (q != m_bodyRot)
868 { 884 {
869 m_bodyRot = q; 885 m_bodyRot = q;
@@ -930,11 +946,78 @@ namespace OpenSim.Region.Environment.Scenes
930 } 946 }
931 } 947 }
932 948
949
950
933 m_scene.EventManager.TriggerOnClientMovement(this); 951 m_scene.EventManager.TriggerOnClientMovement(this);
934 952
935 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); 953 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
936 } 954 }
937 955
956 public void DoAutoPilot(uint not_used, LLVector3 Pos, IClientAPI remote_client)
957 {
958 m_autopilotMoving = true;
959 m_autoPilotTarget = Pos;
960 m_sitAtAutoTarget = false;
961 PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
962 //proxy.PCode = (byte)PCode.ParticleSystem;
963 uint nextUUID = m_scene.NextLocalId;
964
965 proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, Pos, new LLQuaternion(Rotation.x, Rotation.y, Rotation.z, Rotation.w), proxy);
966 if (proxyObjectGroup != null)
967 {
968 proxyObjectGroup.SendGroupFullUpdate();
969 remote_client.SendSitResponse(proxyObjectGroup.UUID, LLVector3.Zero, LLQuaternion.Identity, true, LLVector3.Zero, LLVector3.Zero, false);
970 m_scene.DeleteSceneObject(proxyObjectGroup);
971 }
972 else
973 {
974 m_autopilotMoving = false;
975 m_autoPilotTarget = LLVector3.Zero;
976 ControllingClient.SendAlertMessage("Autopilot cancelled");
977 }
978
979 }
980
981 private void CheckAtSitTarget()
982 {
983 //m_log.Debug("[AUTOPILOT]: " + Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget).ToString());
984 if (Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget) <= 1.5)
985 {
986
987 if (m_sitAtAutoTarget)
988 {
989 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetUUID);
990 if (part != null)
991 {
992 AbsolutePosition = part.AbsolutePosition;
993 Velocity = new LLVector3(0, 0, 0);
994 SendFullUpdateToAllClients();
995
996 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
997 }
998 //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, LLQuaternion.Identity, false, LLVector3.Zero, LLVector3.Zero, false);
999 m_requestedSitTargetUUID = LLUUID.Zero;
1000 }
1001 else
1002 {
1003 //ControllingClient.SendAlertMessage("Autopilot cancelled");
1004 //SendTerseUpdateToAllClients();
1005 //PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
1006 //proxy.PCode = (byte)PCode.ParticleSystem;
1007 ////uint nextUUID = m_scene.NextLocalId;
1008
1009 //proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, m_autoPilotTarget, LLQuaternion.Identity, proxy);
1010 //if (proxyObjectGroup != null)
1011 //{
1012 //proxyObjectGroup.SendGroupFullUpdate();
1013 //ControllingClient.SendSitResponse(LLUUID.Zero, m_autoPilotTarget, LLQuaternion.Identity, true, LLVector3.Zero, LLVector3.Zero, false);
1014 //m_scene.DeleteSceneObject(proxyObjectGroup);
1015 //}
1016 }
1017 m_autoPilotTarget = LLVector3.Zero;
1018 m_autopilotMoving = false;
1019 }
1020 }
938 /// <summary> 1021 /// <summary>
939 /// Perform the logic necessary to stand the client up. This method also executes 1022 /// Perform the logic necessary to stand the client up. This method also executes
940 /// the stand animation. 1023 /// the stand animation.
@@ -963,7 +1046,7 @@ namespace OpenSim.Region.Environment.Scenes
963 1046
964 m_parentID = 0; 1047 m_parentID = 0;
965 SendFullUpdateToAllClients(); 1048 SendFullUpdateToAllClients();
966 1049 m_requestedSitTargetID = 0;
967 if (m_physicsActor != null) 1050 if (m_physicsActor != null)
968 { 1051 {
969 SetHeight(m_avHeight); 1052 SetHeight(m_avHeight);
@@ -1005,7 +1088,11 @@ namespace OpenSim.Region.Environment.Scenes
1005 } 1088 }
1006 1089
1007 pos = part.AbsolutePosition + offset; 1090 pos = part.AbsolutePosition + offset;
1008 1091 //if (Math.Abs(part.AbsolutePosition.Z - AbsolutePosition.Z) > 1)
1092 //{
1093 // offset = pos;
1094 //autopilot = false;
1095 //}
1009 if (m_physicsActor != null) 1096 if (m_physicsActor != null)
1010 { 1097 {
1011 // If we're not using the client autopilot, we're immediately warping the avatar to the location 1098 // If we're not using the client autopilot, we're immediately warping the avatar to the location
@@ -1030,11 +1117,14 @@ namespace OpenSim.Region.Environment.Scenes
1030 } 1117 }
1031 1118
1032 ControllingClient.SendSitResponse(targetID, offset, sitOrientation, autopilot, LLVector3.Zero, LLVector3.Zero, false); 1119 ControllingClient.SendSitResponse(targetID, offset, sitOrientation, autopilot, LLVector3.Zero, LLVector3.Zero, false);
1033 1120 m_requestedSitTargetUUID = targetID;
1034 // This calls HandleAgentSit twice, once from here, and the client calls 1121 // This calls HandleAgentSit twice, once from here, and the client calls
1035 // HandleAgentSit itself after it gets to the location 1122 // HandleAgentSit itself after it gets to the location
1036 // It doesn't get to the location until we've moved them there though 1123 // It doesn't get to the location until we've moved them there though
1037 // which happens in HandleAgentSit :P 1124 // which happens in HandleAgentSit :P
1125 m_autopilotMoving = autopilot;
1126 m_autoPilotTarget = pos;
1127 m_sitAtAutoTarget = autopilot;
1038 if (!autopilot) 1128 if (!autopilot)
1039 HandleAgentSit(remoteClient, UUID); 1129 HandleAgentSit(remoteClient, UUID);
1040 } 1130 }
@@ -1064,32 +1154,38 @@ namespace OpenSim.Region.Environment.Scenes
1064 { 1154 {
1065 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID); 1155 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
1066 1156
1067 if (part != null) 1157 if (m_sitAtAutoTarget || !m_autopilotMoving)
1068 { 1158 {
1069 if (part.GetAvatarOnSitTarget() == UUID) 1159 if (part != null)
1070 { 1160 {
1071 Vector3 sitTargetPos = part.GetSitTargetPosition(); 1161 if (part.GetAvatarOnSitTarget() == UUID)
1072 Quaternion sitTargetOrient = part.GetSitTargetOrientation(); 1162 {
1163 Vector3 sitTargetPos = part.GetSitTargetPosition();
1164 Quaternion sitTargetOrient = part.GetSitTargetOrientation();
1073 1165
1074 //Quaternion vq = new Quaternion(sitTargetPos.x, sitTargetPos.y+0.2f, sitTargetPos.z+0.2f, 0); 1166 //Quaternion vq = new Quaternion(sitTargetPos.x, sitTargetPos.y+0.2f, sitTargetPos.z+0.2f, 0);
1075 //Quaternion nq = new Quaternion(sitTargetOrient.w, -sitTargetOrient.x, -sitTargetOrient.y, -sitTargetOrient.z); 1167 //Quaternion nq = new Quaternion(sitTargetOrient.w, -sitTargetOrient.x, -sitTargetOrient.y, -sitTargetOrient.z);
1076 1168
1077 //Quaternion result = (sitTargetOrient * vq) * nq; 1169 //Quaternion result = (sitTargetOrient * vq) * nq;
1078 1170
1079 m_pos = new LLVector3(sitTargetPos.x, sitTargetPos.y, sitTargetPos.z); 1171 m_pos = new LLVector3(sitTargetPos.x, sitTargetPos.y, sitTargetPos.z);
1080 m_bodyRot = sitTargetOrient; 1172 m_bodyRot = sitTargetOrient;
1081 //Rotation = sitTargetOrient; 1173 //Rotation = sitTargetOrient;
1082 m_parentPosition = part.AbsolutePosition; 1174 m_parentPosition = part.AbsolutePosition;
1083 1175
1084 //SendTerseUpdateToAllClients(); 1176 //SendTerseUpdateToAllClients();
1177 }
1178 else
1179 {
1180 m_pos -= part.AbsolutePosition;
1181 m_parentPosition = part.AbsolutePosition;
1182 }
1085 } 1183 }
1086 else 1184 else
1087 { 1185 {
1088 m_pos -= part.AbsolutePosition; 1186 return;
1089 m_parentPosition = part.AbsolutePosition;
1090 } 1187 }
1091 } 1188 }
1092
1093 m_parentID = m_requestedSitTargetID; 1189 m_parentID = m_requestedSitTargetID;
1094 1190
1095 Velocity = new LLVector3(0, 0, 0); 1191 Velocity = new LLVector3(0, 0, 0);