diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 974ee455..7ff4e0c0 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -29,6 +29,8 @@ namespace Simian public Vector3 HomePosition; public Vector3 HomeLookAt; public Vector3 CurrentLookAt; + public UUID RequestedSitTarget; + public Vector3 RequestedSitOffset; public ulong CurrentRegionHandle; // Profile diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index 198caba5..bcb75341 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -45,6 +45,8 @@ namespace Simian.Extensions { this.server = server; + server.UDP.RegisterPacketCallback(PacketType.AgentRequestSit, AgentRequestSitHandler); + server.UDP.RegisterPacketCallback(PacketType.AgentSit, AgentSitHandler); server.UDP.RegisterPacketCallback(PacketType.AgentUpdate, AgentUpdateHandler); server.UDP.RegisterPacketCallback(PacketType.SetAlwaysRun, SetAlwaysRunHandler); @@ -346,6 +348,62 @@ namespace Simian.Extensions ); } + void AgentRequestSitHandler(Packet packet, Agent agent) + { + AgentRequestSitPacket request = (AgentRequestSitPacket)packet; + + SimulationObject obj; + if (server.Scene.TryGetObject(request.TargetObject.TargetID, out obj)) + { + agent.RequestedSitTarget = request.TargetObject.TargetID; + agent.RequestedSitOffset = request.TargetObject.Offset; + + AvatarSitResponsePacket response = new AvatarSitResponsePacket(); + response.SitObject.ID = request.TargetObject.TargetID; + response.SitTransform.AutoPilot = true; + response.SitTransform.CameraAtOffset = Vector3.Zero; + response.SitTransform.CameraEyeOffset = Vector3.Zero; + response.SitTransform.ForceMouselook = false; + response.SitTransform.SitPosition = request.TargetObject.Offset; + response.SitTransform.SitRotation = obj.SitRotation; + + server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.State); + } + else + { + //TODO: send error + } + } + + void AgentSitHandler(Packet packet, Agent agent) + { + AgentSitPacket sit = (AgentSitPacket)packet; + + if (agent.RequestedSitTarget != UUID.Zero) + { + SimulationObject obj; + if (server.Scene.TryGetObject(agent.RequestedSitTarget, out obj)) + { + agent.Avatar.ParentID = obj.Prim.LocalID; + agent.Avatar.Position = agent.RequestedSitOffset; + + ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, + server.Scene.RegionHandle, agent.Flags); + + server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State); + + server.Avatars.SetDefaultAnimation(agent, Animations.SIT); + } + else + { + //TODO: send error + } + + agent.RequestedSitTarget = UUID.Zero; + agent.RequestedSitOffset = Vector3.Zero; + } + } + void AgentUpdateHandler(Packet packet, Agent agent) { AgentUpdatePacket update = (AgentUpdatePacket)packet; @@ -355,6 +413,24 @@ namespace Simian.Extensions agent.Avatar.PrimData.State = update.AgentData.State; // FIXME: Are these two different state variables? agent.Flags = (PrimFlags)update.AgentData.Flags; + if (agent.Avatar.ParentID > 0 && (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) == AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) + { + SimulationObject obj; + if (server.Scene.TryGetObject(agent.Avatar.ParentID, out obj)) + { + agent.Avatar.Position = obj.Prim.Position + + Vector3.Transform(obj.SitPosition, Matrix4.CreateFromQuaternion(obj.SitRotation)) + + new Vector3(0f, 0f, 1f); + } + else + { + //TODO: get position from course locations? + agent.Avatar.Position = Vector3.Zero; + } + agent.Avatar.ParentID = 0; + server.Avatars.SetDefaultAnimation(agent, Animations.STAND); + } + ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, server.Scene.RegionHandle, agent.Flags); diff --git a/Programs/Simian/SimulationObject.cs b/Programs/Simian/SimulationObject.cs index df7c1721..370b8b89 100644 --- a/Programs/Simian/SimulationObject.cs +++ b/Programs/Simian/SimulationObject.cs @@ -25,6 +25,10 @@ namespace Simian public Vector3 RotationAxis = Vector3.UnitY; /// A continual rotational impulse public Vector3 Torque; + /// Seat offset + public Vector3 SitPosition; + /// Seat rotation + public Quaternion SitRotation = Quaternion.Identity; protected Simian Server; protected SimpleMesh[] Meshes;