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;