private void AgentUpdateHandler(Packet packet, LLAgent agent) { AgentUpdatePacket update = (AgentUpdatePacket)packet; // Update rotation if the agent is not sitting on anything if (agent.Parent == null) { agent.RelativeRotation = update.AgentData.BodyRotation; } agent.CameraPosition = update.AgentData.CameraCenter; agent.CameraAtAxis = update.AgentData.CameraAtAxis; agent.CameraLeftAxis = update.AgentData.CameraLeftAxis; agent.CameraUpAxis = update.AgentData.CameraUpAxis; agent.DrawDistance = update.AgentData.Far; agent.ControlFlags = (AgentManager.ControlFlags)update.AgentData.ControlFlags; agent.State = (AgentState)update.AgentData.State; agent.HideTitle = update.AgentData.Flags != 0; #region Standing ILinkable parent = agent.Parent; if (parent != null && (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) == AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) { agent.SetParent(null, true, true); agent.RelativePosition = parent.ScenePosition + Vector3.Transform(agent.SitPosition, Matrix4.CreateFromQuaternion(agent.SitRotation)) + Vector3.UnitZ; agent.Animations.ResetDefaultAnimation(); m_scene.SendPresenceAnimations(this, agent); agent.CollisionsEnabled = true; agent.DynamicsEnabled = true; m_scene.EntityAddOrUpdate(this, agent, UpdateFlags.Position | UpdateFlags.Rotation, (uint)LLUpdateFlags.PrimFlags); return; } #endregion Standing #region Inputs // Create forward and left vectors from the current avatar rotation Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(agent.RelativeRotation); Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix); Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); // Check control flags bool heldForward = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS; bool heldBack = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG; bool heldLeft = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS; bool heldRight = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG; //bool heldTurnLeft = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; //bool heldTurnRight = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; bool heldUp = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; bool heldDown = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; bool flying = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; //bool mouselook = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; bool nudgeForward = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS; bool nudgeBack = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG; bool nudgeLeft = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS; bool nudgeRight = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG; bool nudgeUp = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS; bool nudgeDown = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG; // direction in which the avatar is trying to move Vector3 move = Vector3.Zero; if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; } else if (nudgeForward) { move.X += fwd.X * 0.5f; move.Y += fwd.Y * 0.5f; } if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; } else if (nudgeBack) { move.X -= fwd.X * 0.5f; move.Y -= fwd.Y * 0.5f; } if (heldLeft) { move.X += left.X; move.Y += left.Y; } else if (nudgeLeft) { move.X += left.X * 0.5f; move.Y += left.Y * 0.5f; } if (heldRight) { move.X -= left.X; move.Y -= left.Y; } else if (nudgeRight) { move.X -= left.X * 0.5f; move.Y -= left.Y * 0.5f; } if (heldUp) { move.Z += 1f; } else if (nudgeUp) { move.Z += 0.5f; } if (heldDown) { move.Z -= 1f; } else if (nudgeDown) { move.Z -= 0.5f; } bool jumping = agent.JumpStart != 0; float speed = (flying ? FLY_SPEED : agent.IsRunning && !jumping ? RUN_SPEED : WALK_SPEED); if ((heldForward || heldBack) && (heldLeft || heldRight)) { speed /= SQRT_TWO; } #endregion Inputs agent.InputVelocity = move * speed; agent.LastMovementState = agent.MovementState; agent.MovementState = (flying ? MovementState.Flying : agent.IsRunning && !jumping ? MovementState.Running : MovementState.Walking); }
private void AgentRequestSitHandler(Packet packet, LLAgent agent) { AgentRequestSitPacket request = (AgentRequestSitPacket)packet; agent.RequestedSitTarget = request.TargetObject.TargetID; agent.RequestedSitOffset = request.TargetObject.Offset; //TODO: move to AgentSitHandler when we figure out how to make the client send AgentSit ISceneEntity seat; if (m_scene.TryGetEntity(agent.RequestedSitTarget, out seat) && seat is ILinkable) { agent.SetParent((ILinkable)seat, false, false); AvatarSitResponsePacket response = new AvatarSitResponsePacket(); response.SitObject.ID = agent.RequestedSitTarget; if (seat is LLPrimitive) { LLPrimitive prim = (LLPrimitive)seat; if (prim.SitPosition != Vector3.Zero) { // llSitTarget is set response.SitTransform.SitPosition = prim.SitPosition; response.SitTransform.SitRotation = prim.SitRotation; agent.RelativePosition = LLUtil.GetSitTarget(prim.SitPosition, agent.Scale); agent.RelativeRotation = prim.SitRotation; } else { // No sit target set Vector3 sitPos = LLUtil.GetSitTarget(agent.RequestedSitOffset, agent.Scale); response.SitTransform.SitPosition = sitPos; response.SitTransform.SitRotation = Quaternion.Identity; agent.RelativePosition = sitPos; agent.RelativeRotation = Quaternion.Identity; } } m_udp.SendPacket(agent, response, ThrottleCategory.Task, false); m_scene.EntityAddOrUpdate(this, agent, UpdateFlags.Parent, 0); agent.Animations.SetDefaultAnimation(OpenMetaverse.Animations.SIT, 1); m_scene.SendPresenceAnimations(this, agent); if (m_lslScriptEngine != null) m_lslScriptEngine.PostObjectEvent(seat.ID, "changed", new object[] { CHANGED_LINK }, new DetectParams[0]); } else { //TODO: send error message } }
private void AgentRequestSitHandler(Packet packet, LLAgent agent) { AgentRequestSitPacket request = (AgentRequestSitPacket)packet; agent.RequestedSitTarget = request.TargetObject.TargetID; agent.RequestedSitOffset = request.TargetObject.Offset; //TODO: move to AgentSitHandler when we figure out how to make the client send AgentSit ISceneEntity seat; if (m_scene.TryGetEntity(agent.RequestedSitTarget, out seat) && seat is ILinkable) { agent.SetParent((ILinkable)seat, false, false); AvatarSitResponsePacket response = new AvatarSitResponsePacket(); response.SitObject.ID = agent.RequestedSitTarget; if (seat is LLPrimitive) { LLPrimitive prim = (LLPrimitive)seat; if (prim.SitPosition != Vector3.Zero) { // llSitTarget is set response.SitTransform.SitPosition = prim.SitPosition; response.SitTransform.SitRotation = prim.SitRotation; agent.RelativePosition = LLUtil.GetSitTarget(prim.SitPosition, agent.Scale); agent.RelativeRotation = prim.SitRotation; } else { // No sit target set Vector3 sitPos = LLUtil.GetSitTarget(agent.RequestedSitOffset, agent.Scale); response.SitTransform.SitPosition = sitPos; response.SitTransform.SitRotation = Quaternion.Identity; agent.RelativePosition = sitPos; agent.RelativeRotation = Quaternion.Identity; } } m_udp.SendPacket(agent, response, ThrottleCategory.Task, false); m_scene.EntityAddOrUpdate(this, agent, UpdateFlags.Parent, 0); agent.Animations.SetDefaultAnimation(OpenMetaverse.Animations.SIT, 1); m_scene.SendPresenceAnimations(this, agent); if (m_lslScriptEngine != null) { m_lslScriptEngine.PostObjectEvent(seat.ID, "changed", new object[] { CHANGED_LINK }, new DetectParams[0]); } } else { //TODO: send error message } }
private void AgentUpdateHandler(Packet packet, LLAgent agent) { AgentUpdatePacket update = (AgentUpdatePacket)packet; // Update rotation if the agent is not sitting on anything if (agent.Parent == null) agent.RelativeRotation = update.AgentData.BodyRotation; agent.CameraPosition = update.AgentData.CameraCenter; agent.CameraAtAxis = update.AgentData.CameraAtAxis; agent.CameraLeftAxis = update.AgentData.CameraLeftAxis; agent.CameraUpAxis = update.AgentData.CameraUpAxis; agent.DrawDistance = update.AgentData.Far; agent.ControlFlags = (AgentManager.ControlFlags)update.AgentData.ControlFlags; agent.State = (AgentState)update.AgentData.State; agent.HideTitle = update.AgentData.Flags != 0; #region Standing ILinkable parent = agent.Parent; if (parent != null && (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) == AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) { agent.SetParent(null, true, true); agent.RelativePosition = parent.ScenePosition + Vector3.Transform(agent.SitPosition, Matrix4.CreateFromQuaternion(agent.SitRotation)) + Vector3.UnitZ; agent.Animations.ResetDefaultAnimation(); m_scene.SendPresenceAnimations(this, agent); agent.CollisionsEnabled = true; agent.DynamicsEnabled = true; m_scene.EntityAddOrUpdate(this, agent, UpdateFlags.Position | UpdateFlags.Rotation, (uint)LLUpdateFlags.PrimFlags); return; } #endregion Standing #region Inputs // Create forward and left vectors from the current avatar rotation Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(agent.RelativeRotation); Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix); Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); // Check control flags bool heldForward = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS; bool heldBack = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG; bool heldLeft = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS; bool heldRight = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG; //bool heldTurnLeft = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; //bool heldTurnRight = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; bool heldUp = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; bool heldDown = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; bool flying = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; //bool mouselook = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; bool nudgeForward = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS; bool nudgeBack = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG; bool nudgeLeft = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS; bool nudgeRight = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG; bool nudgeUp = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS; bool nudgeDown = (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG; // direction in which the avatar is trying to move Vector3 move = Vector3.Zero; if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; } else if (nudgeForward) { move.X += fwd.X * 0.5f; move.Y += fwd.Y * 0.5f; } if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; } else if (nudgeBack) { move.X -= fwd.X * 0.5f; move.Y -= fwd.Y * 0.5f; } if (heldLeft) { move.X += left.X; move.Y += left.Y; } else if (nudgeLeft) { move.X += left.X * 0.5f; move.Y += left.Y * 0.5f; } if (heldRight) { move.X -= left.X; move.Y -= left.Y; } else if (nudgeRight) { move.X -= left.X * 0.5f; move.Y -= left.Y * 0.5f; } if (heldUp) { move.Z += 1f; } else if (nudgeUp) { move.Z += 0.5f; } if (heldDown) { move.Z -= 1f; } else if (nudgeDown) { move.Z -= 0.5f; } bool jumping = agent.JumpStart != 0; float speed = (flying ? FLY_SPEED : agent.IsRunning && !jumping ? RUN_SPEED : WALK_SPEED); if ((heldForward || heldBack) && (heldLeft || heldRight)) speed /= SQRT_TWO; #endregion Inputs agent.InputVelocity = move * speed; agent.LastMovementState = agent.MovementState; agent.MovementState = (flying ? MovementState.Flying : agent.IsRunning && !jumping ? MovementState.Running : MovementState.Walking); }