From 2cf117cc6c2c7cf106fa83785621577a8b713529 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Sun, 28 Oct 2007 03:58:46 +0000 Subject: Added preliminary support for sitting on prims --- OpenSim/Region/Environment/Scenes/ScenePresence.cs | 93 ++++++++++++++++++---- 1 file changed, 77 insertions(+), 16 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes/ScenePresence.cs') diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 256b6b5..716aaa6 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -51,6 +51,7 @@ namespace OpenSim.Region.Environment.Scenes private byte m_movementflag = 0; private readonly List m_forcesList = new List(); private short m_updateCount = 0; + private uint m_requestedSitTargetID = 0; private Quaternion bodyRot; private byte[] m_visualParams; @@ -216,6 +217,13 @@ namespace OpenSim.Region.Environment.Scenes set { m_isChildAgent = value; } } + private uint m_parentID = 0; + public uint ParentID + { + get { return m_parentID; } + set { m_parentID = value; } + } + #endregion #region Constructor(s) @@ -245,6 +253,8 @@ namespace OpenSim.Region.Environment.Scenes m_controllingClient.OnCompleteMovementToRegion += CompleteMovement; m_controllingClient.OnCompleteMovementToRegion += SendInitialData; m_controllingClient.OnAgentUpdate += HandleAgentUpdate; + m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit; + m_controllingClient.OnAgentSit += HandleAgentSit; // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack); // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); @@ -454,33 +464,44 @@ namespace OpenSim.Region.Environment.Scenes update_movementflag = true; } + if ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_STAND_UP) != 0) + { + StandUp(); + update_movementflag = true; + } + if (q != bodyRot) { bodyRot = q; update_rotation = true; } - foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof(Dir_ControlFlags))) + + if (m_parentID == 0) { - if ((flags & (uint)DCF) != 0) + foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof(Dir_ControlFlags))) { - DCFlagKeyPressed = true; - agent_control_v3 += Dir_Vectors[i]; - if ((m_movementflag & (uint)DCF) == 0) + if ((flags & (uint)DCF) != 0) { - m_movementflag += (byte)(uint)DCF; - update_movementflag = true; + DCFlagKeyPressed = true; + agent_control_v3 += Dir_Vectors[i]; + if ((m_movementflag & (uint)DCF) == 0) + { + m_movementflag += (byte)(uint)DCF; + update_movementflag = true; + } } - } - else - { - if ((m_movementflag & (uint)DCF) != 0) + else { - m_movementflag -= (byte)(uint)DCF; - update_movementflag = true; + if ((m_movementflag & (uint)DCF) != 0) + { + m_movementflag -= (byte)(uint)DCF; + update_movementflag = true; + } } + i++; } - i++; } + if ((update_movementflag) || (update_rotation && DCFlagKeyPressed)) { AddNewMovement(agent_control_v3, q); @@ -488,6 +509,46 @@ namespace OpenSim.Region.Environment.Scenes UpdateMovementAnimations(update_movementflag); } + protected void StandUp() + { + if (m_parentID != 0) + { + SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID); + if (part != null) + AbsolutePosition = part.AbsolutePosition; + m_parentID = 0; + SendFullUpdateToAllClients(); + } + } + + public void HandleAgentRequestSit(IClientAPI remoteClient, LLUUID agentID, LLUUID targetID) + { + if (m_parentID != 0) + { + StandUp(); + UpdateMovementAnimations(true); + } + + SceneObjectPart part = m_scene.GetSceneObjectPart(targetID); + + if (part != null) + { + m_requestedSitTargetID = part.LocalID; + } + else + { + MainLog.Instance.Warn("Sit requested on unknown object: " + targetID.ToString()); + } + } + + public void HandleAgentSit(IClientAPI remoteClient, LLUUID agentID) + { + AbsolutePosition = new LLVector3(0F, 0F, 0F); + m_parentID = m_requestedSitTargetID; + SendAnimPack(Animations.AnimsLLUUID["SIT"], 1); + SendFullUpdateToAllClients(); + } + protected void UpdateMovementAnimations(bool update_movementflag) { if (update_movementflag) @@ -641,7 +702,7 @@ namespace OpenSim.Region.Environment.Scenes public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar) { remoteAvatar.m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid, - LocalId, AbsolutePosition, m_textureEntry.ToBytes()); + LocalId, AbsolutePosition, m_textureEntry.ToBytes(), m_parentID); } public void SendFullUpdateToAllClients() @@ -667,7 +728,7 @@ namespace OpenSim.Region.Environment.Scenes public void SendInitialData() { m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid, LocalId, - AbsolutePosition, m_textureEntry.ToBytes()); + AbsolutePosition, m_textureEntry.ToBytes(), m_parentID); if (!m_isChildAgent) { m_scene.InformClientOfNeighbours(m_controllingClient); -- cgit v1.1