Simian: Committing first pass at sit/unsit support (offset is still incorrect)

git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2464 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
2009-03-03 19:08:04 +00:00
parent 18b5f70e53
commit c8312a0777
3 changed files with 82 additions and 0 deletions

View File

@@ -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);