From c892ddcd2031466499ade7b101ba007d920af2fb Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Fri, 6 Jun 2008 12:51:20 +0000 Subject: * This wraps the autopilot request to the client's sit response. An interesting, but successful way to do it. * This also takes care of a few error situations that were previously never seen. --- OpenSim/Framework/IClientAPI.cs | 1 + .../Region/ClientStack/LindenUDP/LLClientView.cs | 59 ++++++++- .../Environment/Modules/World/NPC/NPCAvatar.cs | 1 + OpenSim/Region/Environment/Scenes/Scene.cs | 1 + .../Environment/Scenes/SceneExternalChecks.cs | 3 + .../Region/Environment/Scenes/SceneObjectGroup.cs | 7 +- OpenSim/Region/Environment/Scenes/ScenePresence.cs | 144 +++++++++++++++++---- .../Region/Examples/SimpleModule/MyNpcCharacter.cs | 2 +- 8 files changed, 186 insertions(+), 32 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index f5e98c8..0ece1a3 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -838,6 +838,7 @@ namespace OpenSim.Framework event RequestObjectPropertiesFamily OnObjectGroupRequest; event ScriptReset OnScriptReset; + event UpdateVector OnAutoPilotGo; [Obsolete("IClientAPI.OutPacket SHOULD NOT EXIST outside of LLClientView please refactor appropriately.")] void OutPacket(Packet newPack, ThrottleOutPacketType packType); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index b28a4a6..b2291bc 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -269,6 +269,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private RequestObjectPropertiesFamily handlerObjectGroupRequest = null; private ScriptReset handlerScriptReset = null; + private UpdateVector handlerAutoPilotGo = null; /* Properties */ @@ -900,6 +901,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event EstateDebugRegionRequest OnEstateDebugRegionRequest; public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; public event ScriptReset OnScriptReset; + public event UpdateVector OnAutoPilotGo; #region Scene/Avatar to Client @@ -1125,7 +1127,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP patches[0] = patchx + 0 + patchy * 16; - Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches); + LayerDataPacket layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches); layerpack.Header.Zerocoded = true; OutPacket(layerpack, ThrottleOutPacketType.Land); } @@ -3966,7 +3968,50 @@ namespace OpenSim.Region.ClientStack.LindenUDP get { return m_packetProcessingEnabled; } set { m_packetProcessingEnabled = value; } } + public void DecipherGenericMessage(string gmMethod, LLUUID gmInvoice, GenericMessagePacket.ParamListBlock[] gmParams) + { + switch (gmMethod) + { + case "autopilot": + float locx = 0f; + float locy = 0f; + float locz = 0f; + uint regionX = 0; + uint regionY = 0; + try + + { + Helpers.LongToUInts(Scene.RegionInfo.RegionHandle,out regionX, out regionY); + locx = Convert.ToSingle(Helpers.FieldToUTF8String(gmParams[0].Parameter)) - (float)regionX; + locy = Convert.ToSingle(Helpers.FieldToUTF8String(gmParams[1].Parameter)) - (float)regionY; + locz = Convert.ToSingle(Helpers.FieldToUTF8String(gmParams[2].Parameter)); + } + catch (InvalidCastException) + { + m_log.Error("[CLIENT]: Invalid autopilot request"); + return; + } + + handlerAutoPilotGo = OnAutoPilotGo; + if (handlerAutoPilotGo != null) + { + handlerAutoPilotGo(0, new LLVector3(locx, locy, locz), this); + } + m_log.InfoFormat("[CLIENT]: Client Requests autopilot to position <{0},{1},{2}>", locx, locy, locz); + + break; + default: + m_log.Debug("[CLIENT]: Unknown Generic Message, Method: " + gmMethod + ". Invoice: " + gmInvoice.ToString() + ". Dumping Params:"); + for (int hi = 0; hi < gmParams.Length; hi++) + { + System.Console.WriteLine(gmParams[hi].ToString()); + } + //gmpack.MethodData. + break; + + } + } protected void ProcessInPacket(Packet Pack) { ack_pack(Pack); @@ -3998,6 +4043,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP { #region Scene/Avatar + case PacketType.GenericMessage: + GenericMessagePacket gmpack = (GenericMessagePacket)Pack; + + DecipherGenericMessage(Helpers.FieldToUTF8String(gmpack.MethodData.Method),gmpack.MethodData.Invoice,gmpack.ParamList); + + break; case PacketType.AvatarPropertiesRequest: AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack; @@ -5933,10 +5984,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP // TODO: handle this packet m_log.Warn("[CLIENT]: unhandled CreateGroupRequest packet"); break; - case PacketType.GenericMessage: + //case PacketType.GenericMessage: // TODO: handle this packet - m_log.Warn("[CLIENT]: unhandled GenericMessage packet"); - break; + //m_log.Warn("[CLIENT]: unhandled GenericMessage packet"); + //break; case PacketType.MapItemRequest: // TODO: handle this packet m_log.Warn("[CLIENT]: unhandled MapItemRequest packet"); diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index caa3b5c..b8ca482 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -289,6 +289,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event EstateDebugRegionRequest OnEstateDebugRegionRequest; public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; public event ScriptReset OnScriptReset; + public event UpdateVector OnAutoPilotGo; #pragma warning restore 67 #endregion diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 706be06..211f320 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1736,6 +1736,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnObjectGroupRequest += m_innerScene.HandleObjectGroupUpdate; client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; client.OnScriptReset += ProcessScriptReset; + // EventManager.TriggerOnNewClient(client); } diff --git a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs index 47dd0bc..eac9e25 100644 --- a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs +++ b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs @@ -62,6 +62,9 @@ namespace OpenSim.Region.Environment.Scenes public uint ExternalChecksGenerateClientFlags(LLUUID userID, LLUUID objectID) { SceneObjectPart part=m_scene.GetSceneObjectPart(objectID); + + if (part == null) + return 0; uint perms=part.GetEffectiveObjectFlags() | (uint)LLObject.ObjectFlags.ObjectModify | diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 94d888c..0948d69 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -472,6 +472,7 @@ namespace OpenSim.Region.Environment.Scenes UpdateParentIDs(); } + /// /// /// @@ -488,12 +489,12 @@ namespace OpenSim.Region.Environment.Scenes newPart.LinkNum = m_parts.Count; m_parts.Add(newPart.UUID, newPart); SetPartAsRoot(newPart); - - AttachToBackup(); + // one of these is a proxy. + if (shape.PCode != (byte)PCode.None && shape.PCode != (byte)PCode.ParticleSystem) + AttachToBackup(); //ApplyPhysics(scene.m_physicalPrim); } - /// /// /// 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 private Dictionary scriptedcontrols = new Dictionary(); private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO; private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO; + private SceneObjectGroup proxyObjectGroup = null; + private SceneObjectPart proxyObjectPart = null; public Vector3 lastKnownAllowedPosition = new Vector3(); public bool sentMessageAboutRestrictedParcelFlyingDown = false; @@ -89,6 +91,8 @@ namespace OpenSim.Region.Environment.Scenes private readonly List m_forcesList = new List(); private short m_updateCount = 0; private uint m_requestedSitTargetID = 0; + private LLUUID m_requestedSitTargetUUID = LLUUID.Zero; + private LLVector3 m_requestedSitOffset = new LLVector3(); private LLVector3 m_LastFinitePos = new LLVector3(); @@ -144,6 +148,10 @@ namespace OpenSim.Region.Environment.Scenes //Reuse the LLVector3 instead of creating a new one on the UpdateMovement method private LLVector3 movementvector = new LLVector3(); + private bool m_autopilotMoving = false; + private LLVector3 m_autoPilotTarget = LLVector3.Zero; + private bool m_sitAtAutoTarget = false; + private List m_knownPrimUUID = new List(); // Agent's Draw distance. @@ -439,6 +447,7 @@ namespace OpenSim.Region.Environment.Scenes m_controllingClient.OnStartAnim += HandleStartAnim; m_controllingClient.OnStopAnim += HandleStopAnim; m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls; + m_controllingClient.OnAutoPilotGo += DoAutoPilot; // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); @@ -472,6 +481,8 @@ namespace OpenSim.Region.Environment.Scenes // } } + + public uint GenerateClientFlags(LLUUID ObjectID) { return m_scene.ExternalChecks.ExternalChecksGenerateClientFlags(m_uuid, ObjectID); @@ -835,6 +846,9 @@ namespace OpenSim.Region.Environment.Scenes return; } + if (m_autopilotMoving) + CheckAtSitTarget(); + if ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) { // 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 bool DCFlagKeyPressed = false; Vector3 agent_control_v3 = new Vector3(0, 0, 0); Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z); - bool oldflying = PhysicsActor.Flying; - - PhysicsActor.Flying = ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); - if (PhysicsActor.Flying != oldflying) + if (PhysicsActor != null) { - update_movementflag = true; - } + bool oldflying = PhysicsActor.Flying; + PhysicsActor.Flying = ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); + if (PhysicsActor.Flying != oldflying) + { + update_movementflag = true; + } + } if (q != m_bodyRot) { m_bodyRot = q; @@ -930,11 +946,78 @@ namespace OpenSim.Region.Environment.Scenes } } + + m_scene.EventManager.TriggerOnClientMovement(this); m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); } + public void DoAutoPilot(uint not_used, LLVector3 Pos, IClientAPI remote_client) + { + m_autopilotMoving = true; + m_autoPilotTarget = Pos; + m_sitAtAutoTarget = false; + PrimitiveBaseShape proxy = PrimitiveBaseShape.Default; + //proxy.PCode = (byte)PCode.ParticleSystem; + uint nextUUID = m_scene.NextLocalId; + + proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, Pos, new LLQuaternion(Rotation.x, Rotation.y, Rotation.z, Rotation.w), proxy); + if (proxyObjectGroup != null) + { + proxyObjectGroup.SendGroupFullUpdate(); + remote_client.SendSitResponse(proxyObjectGroup.UUID, LLVector3.Zero, LLQuaternion.Identity, true, LLVector3.Zero, LLVector3.Zero, false); + m_scene.DeleteSceneObject(proxyObjectGroup); + } + else + { + m_autopilotMoving = false; + m_autoPilotTarget = LLVector3.Zero; + ControllingClient.SendAlertMessage("Autopilot cancelled"); + } + + } + + private void CheckAtSitTarget() + { + //m_log.Debug("[AUTOPILOT]: " + Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget).ToString()); + if (Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget) <= 1.5) + { + + if (m_sitAtAutoTarget) + { + SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetUUID); + if (part != null) + { + AbsolutePosition = part.AbsolutePosition; + Velocity = new LLVector3(0, 0, 0); + SendFullUpdateToAllClients(); + + //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); + } + //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, LLQuaternion.Identity, false, LLVector3.Zero, LLVector3.Zero, false); + m_requestedSitTargetUUID = LLUUID.Zero; + } + else + { + //ControllingClient.SendAlertMessage("Autopilot cancelled"); + //SendTerseUpdateToAllClients(); + //PrimitiveBaseShape proxy = PrimitiveBaseShape.Default; + //proxy.PCode = (byte)PCode.ParticleSystem; + ////uint nextUUID = m_scene.NextLocalId; + + //proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, m_autoPilotTarget, LLQuaternion.Identity, proxy); + //if (proxyObjectGroup != null) + //{ + //proxyObjectGroup.SendGroupFullUpdate(); + //ControllingClient.SendSitResponse(LLUUID.Zero, m_autoPilotTarget, LLQuaternion.Identity, true, LLVector3.Zero, LLVector3.Zero, false); + //m_scene.DeleteSceneObject(proxyObjectGroup); + //} + } + m_autoPilotTarget = LLVector3.Zero; + m_autopilotMoving = false; + } + } /// /// Perform the logic necessary to stand the client up. This method also executes /// the stand animation. @@ -963,7 +1046,7 @@ namespace OpenSim.Region.Environment.Scenes m_parentID = 0; SendFullUpdateToAllClients(); - + m_requestedSitTargetID = 0; if (m_physicsActor != null) { SetHeight(m_avHeight); @@ -1005,7 +1088,11 @@ namespace OpenSim.Region.Environment.Scenes } pos = part.AbsolutePosition + offset; - + //if (Math.Abs(part.AbsolutePosition.Z - AbsolutePosition.Z) > 1) + //{ + // offset = pos; + //autopilot = false; + //} if (m_physicsActor != null) { // 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 } ControllingClient.SendSitResponse(targetID, offset, sitOrientation, autopilot, LLVector3.Zero, LLVector3.Zero, false); - + m_requestedSitTargetUUID = targetID; // This calls HandleAgentSit twice, once from here, and the client calls // HandleAgentSit itself after it gets to the location // It doesn't get to the location until we've moved them there though // which happens in HandleAgentSit :P + m_autopilotMoving = autopilot; + m_autoPilotTarget = pos; + m_sitAtAutoTarget = autopilot; if (!autopilot) HandleAgentSit(remoteClient, UUID); } @@ -1064,32 +1154,38 @@ namespace OpenSim.Region.Environment.Scenes { SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID); - if (part != null) + if (m_sitAtAutoTarget || !m_autopilotMoving) { - if (part.GetAvatarOnSitTarget() == UUID) + if (part != null) { - Vector3 sitTargetPos = part.GetSitTargetPosition(); - Quaternion sitTargetOrient = part.GetSitTargetOrientation(); + if (part.GetAvatarOnSitTarget() == UUID) + { + Vector3 sitTargetPos = part.GetSitTargetPosition(); + Quaternion sitTargetOrient = part.GetSitTargetOrientation(); - //Quaternion vq = new Quaternion(sitTargetPos.x, sitTargetPos.y+0.2f, sitTargetPos.z+0.2f, 0); - //Quaternion nq = new Quaternion(sitTargetOrient.w, -sitTargetOrient.x, -sitTargetOrient.y, -sitTargetOrient.z); + //Quaternion vq = new Quaternion(sitTargetPos.x, sitTargetPos.y+0.2f, sitTargetPos.z+0.2f, 0); + //Quaternion nq = new Quaternion(sitTargetOrient.w, -sitTargetOrient.x, -sitTargetOrient.y, -sitTargetOrient.z); - //Quaternion result = (sitTargetOrient * vq) * nq; + //Quaternion result = (sitTargetOrient * vq) * nq; - m_pos = new LLVector3(sitTargetPos.x, sitTargetPos.y, sitTargetPos.z); - m_bodyRot = sitTargetOrient; - //Rotation = sitTargetOrient; - m_parentPosition = part.AbsolutePosition; + m_pos = new LLVector3(sitTargetPos.x, sitTargetPos.y, sitTargetPos.z); + m_bodyRot = sitTargetOrient; + //Rotation = sitTargetOrient; + m_parentPosition = part.AbsolutePosition; - //SendTerseUpdateToAllClients(); + //SendTerseUpdateToAllClients(); + } + else + { + m_pos -= part.AbsolutePosition; + m_parentPosition = part.AbsolutePosition; + } } else { - m_pos -= part.AbsolutePosition; - m_parentPosition = part.AbsolutePosition; + return; } } - m_parentID = m_requestedSitTargetID; Velocity = new LLVector3(0, 0, 0); diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 6825fbc..dcbbc68 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -194,7 +194,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event EstateDebugRegionRequest OnEstateDebugRegionRequest; public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; public event ScriptReset OnScriptReset; - + public event UpdateVector OnAutoPilotGo; #pragma warning restore 67 -- cgit v1.1