[Simian]
* Fixed object duplication regression
* Cleaned up the mess that was adding an agent to the scene
* Sitting kind of works ("proper" sitting is extremely complex and requires a lot of computation)
git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2466 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
@@ -24,6 +24,7 @@ namespace Simian.Extensions
|
||||
const float AVATAR_TERMINAL_VELOCITY = 54f; //~120mph
|
||||
|
||||
static readonly UUID BIG_SPLASH_SOUND = new UUID("486475b9-1460-4969-871e-fad973b38015");
|
||||
static readonly Vector3 SEATING_FUDGE = new Vector3(0.3f, 0.0f, 0.0f);
|
||||
|
||||
const float SQRT_TWO = 1.41421356f;
|
||||
|
||||
@@ -73,6 +74,9 @@ namespace Simian.Extensions
|
||||
server.Scene.ForEachAgent(
|
||||
delegate(Agent agent)
|
||||
{
|
||||
if ((agent.Avatar.Prim.Flags & PrimFlags.Physics) == 0)
|
||||
return;
|
||||
|
||||
bool animsChanged = false;
|
||||
|
||||
// Create forward and left vectors from the current avatar rotation
|
||||
@@ -382,17 +386,19 @@ namespace Simian.Extensions
|
||||
if (agent.RequestedSitTarget != UUID.Zero)
|
||||
{
|
||||
SimulationObject obj;
|
||||
if (server.Scene.TryGetObject(agent.RequestedSitTarget, out obj))
|
||||
SimulationObject avObj;
|
||||
if (server.Scene.TryGetObject(agent.RequestedSitTarget, out obj) && server.Scene.TryGetObject(agent.ID, out avObj))
|
||||
{
|
||||
agent.Avatar.Prim.Flags &= ~PrimFlags.Physics;
|
||||
agent.Avatar.Prim.ParentID = obj.Prim.LocalID;
|
||||
agent.Avatar.Prim.Position = agent.RequestedSitOffset;
|
||||
|
||||
ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar.Prim,
|
||||
server.Scene.RegionHandle, agent.Avatar.Prim.Flags);
|
||||
|
||||
server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State);
|
||||
agent.Avatar.Prim.Position = Vector3.Zero;
|
||||
agent.Avatar.Prim.Position.X = obj.Prim.Scale.X * 0.5f;
|
||||
agent.Avatar.Prim.Position.Z = obj.Prim.Scale.Z * 0.5f;
|
||||
agent.Avatar.Prim.Position.Z += agent.Avatar.Prim.Scale.Z * 0.33f;
|
||||
|
||||
server.Scene.ObjectAdd(this, avObj, avObj.Prim.OwnerID, 0, PrimFlags.None);
|
||||
server.Avatars.SetDefaultAnimation(agent, Animations.SIT);
|
||||
server.Avatars.SendAnimations(agent);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -420,15 +426,20 @@ namespace Simian.Extensions
|
||||
{
|
||||
agent.Avatar.Prim.Position = obj.Prim.Position
|
||||
+ Vector3.Transform(obj.SitPosition, Matrix4.CreateFromQuaternion(obj.SitRotation))
|
||||
+ new Vector3(0f, 0f, 1f);
|
||||
+ Vector3.UnitZ;
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO: get position from course locations?
|
||||
agent.Avatar.Prim.Position = Vector3.Zero;
|
||||
}
|
||||
|
||||
agent.Avatar.Prim.ParentID = 0;
|
||||
|
||||
server.Avatars.SetDefaultAnimation(agent, Animations.STAND);
|
||||
server.Avatars.SendAnimations(agent);
|
||||
|
||||
agent.Avatar.Prim.Flags |= PrimFlags.Physics;
|
||||
}
|
||||
|
||||
ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar.Prim,
|
||||
|
||||
@@ -182,7 +182,9 @@ namespace Simian.Extensions
|
||||
{
|
||||
SimulationObject newObj = new SimulationObject(obj);
|
||||
newObj.Prim.Position += offset;
|
||||
newObj.Prim.ID = UUID.Random();
|
||||
newObj.Prim.ID = UUID.Zero;
|
||||
newObj.Prim.LocalID = 0;
|
||||
newObj.Prim.Properties.CreationDate = DateTime.Now;
|
||||
|
||||
server.Scene.ObjectAdd(this, newObj, agent.ID, 0, flags);
|
||||
}
|
||||
|
||||
@@ -221,9 +221,9 @@ namespace Simian.Extensions
|
||||
{
|
||||
sceneObjects.Remove(oldObj.Prim.LocalID, oldObj.Prim.ID);
|
||||
|
||||
// Copy the undo/redo steps to the new object
|
||||
obj.UndoSteps = new CircularQueue<Primitive>(oldObj.UndoSteps);
|
||||
obj.RedoSteps = new CircularQueue<Primitive>(oldObj.RedoSteps);
|
||||
// Point the new object at the old undo/redo queues
|
||||
obj.UndoSteps = oldObj.UndoSteps;
|
||||
obj.RedoSteps = oldObj.RedoSteps;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -681,6 +681,31 @@ namespace Simian.Extensions
|
||||
// Avatars always have physics
|
||||
agent.Avatar.Prim.Flags |= PrimFlags.Physics;
|
||||
|
||||
// Default avatar values
|
||||
agent.Avatar.Prim.Position = new Vector3(128f, 128f, 25f);
|
||||
agent.Avatar.Prim.Rotation = Quaternion.Identity;
|
||||
agent.Avatar.Prim.Scale = new Vector3(0.45f, 0.6f, 1.9f);
|
||||
agent.Avatar.Prim.PrimData.Material = Material.Flesh;
|
||||
agent.Avatar.Prim.PrimData.PCode = PCode.Avatar;
|
||||
agent.Avatar.Prim.Textures = new Primitive.TextureEntry(new UUID("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"));
|
||||
|
||||
// Set the avatar name
|
||||
NameValue[] name = new NameValue[2];
|
||||
name[0] = new NameValue("FirstName", NameValue.ValueType.String, NameValue.ClassType.ReadWrite,
|
||||
NameValue.SendtoType.SimViewer, agent.FirstName);
|
||||
name[1] = new NameValue("LastName", NameValue.ValueType.String, NameValue.ClassType.ReadWrite,
|
||||
NameValue.SendtoType.SimViewer, agent.LastName);
|
||||
agent.Avatar.Prim.NameValues = name;
|
||||
|
||||
// Give testers a provisionary balance of 1000L
|
||||
agent.Balance = 1000;
|
||||
|
||||
// Some default avatar prim properties
|
||||
agent.Avatar.Prim.Properties = new Primitive.ObjectProperties();
|
||||
agent.Avatar.Prim.Properties.CreationDate = Utils.UnixTimeToDateTime(agent.CreationTime);
|
||||
agent.Avatar.Prim.Properties.Name = agent.FullName;
|
||||
agent.Avatar.Prim.Properties.ObjectID = agent.ID;
|
||||
|
||||
if (agent.Avatar.Prim.LocalID == 0)
|
||||
{
|
||||
// Assign a unique LocalID to this agent
|
||||
@@ -693,21 +718,8 @@ namespace Simian.Extensions
|
||||
// Add the agent to the scene dictionary
|
||||
sceneAgents[agent.ID] = agent;
|
||||
|
||||
// Send an update out to the agent
|
||||
ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(agent.Avatar.Prim, regionHandle,
|
||||
agent.Avatar.Prim.Flags | creatorFlags);
|
||||
server.UDP.SendPacket(agent.ID, updateToOwner, PacketCategory.State);
|
||||
|
||||
// Send an update out to everyone else
|
||||
ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(agent.Avatar.Prim, regionHandle,
|
||||
agent.Avatar.Prim.Flags);
|
||||
server.Scene.ForEachAgent(
|
||||
delegate(Agent recipient)
|
||||
{
|
||||
if (recipient.ID != agent.ID)
|
||||
server.UDP.SendPacket(recipient.ID, updateToOthers, PacketCategory.State);
|
||||
}
|
||||
);
|
||||
// Send out an update to everyone
|
||||
//ObjectAdd(this, agent.Avatar, agent.Avatar.Prim.OwnerID, 0, PrimFlags.None);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -896,43 +908,15 @@ namespace Simian.Extensions
|
||||
|
||||
void CompleteAgentMovementHandler(Packet packet, Agent agent)
|
||||
{
|
||||
// Create a representation for this agent
|
||||
Avatar avatar = new Avatar();
|
||||
avatar.ID = agent.ID;
|
||||
avatar.LocalID = (uint)Interlocked.Increment(ref currentLocalID);
|
||||
avatar.Position = new Vector3(128f, 128f, 25f);
|
||||
avatar.Rotation = Quaternion.Identity;
|
||||
avatar.Scale = new Vector3(0.45f, 0.6f, 1.9f);
|
||||
avatar.PrimData.Material = Material.Flesh;
|
||||
avatar.PrimData.PCode = PCode.Avatar;
|
||||
|
||||
// Create a default outfit for the avatar
|
||||
Primitive.TextureEntry te = new Primitive.TextureEntry(new UUID("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"));
|
||||
avatar.Textures = te;
|
||||
|
||||
// Set the avatar name
|
||||
NameValue[] name = new NameValue[2];
|
||||
name[0] = new NameValue("FirstName", NameValue.ValueType.String, NameValue.ClassType.ReadWrite,
|
||||
NameValue.SendtoType.SimViewer, agent.FirstName);
|
||||
name[1] = new NameValue("LastName", NameValue.ValueType.String, NameValue.ClassType.ReadWrite,
|
||||
NameValue.SendtoType.SimViewer, agent.LastName);
|
||||
avatar.NameValues = name;
|
||||
|
||||
// Link this avatar up with the corresponding agent
|
||||
agent.Avatar.Prim = avatar;
|
||||
|
||||
// Give testers a provisionary balance of 1000L
|
||||
agent.Balance = 1000;
|
||||
|
||||
// Add this avatar as an object in the scene
|
||||
if (ObjectAdd(this, agent.Avatar, agent.ID, 0, PrimFlags.None))
|
||||
if (ObjectAdd(this, agent.Avatar, agent.Avatar.Prim.OwnerID, 0, PrimFlags.None))
|
||||
{
|
||||
// Send a response back to the client
|
||||
AgentMovementCompletePacket complete = new AgentMovementCompletePacket();
|
||||
complete.AgentData.AgentID = agent.ID;
|
||||
complete.AgentData.SessionID = agent.SessionID;
|
||||
complete.Data.LookAt = Vector3.UnitX;
|
||||
complete.Data.Position = avatar.Position;
|
||||
complete.Data.Position = agent.Avatar.Prim.Position;
|
||||
complete.Data.RegionHandle = regionHandle;
|
||||
complete.Data.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now);
|
||||
complete.SimData.ChannelVersion = Utils.StringToBytes("Simian");
|
||||
@@ -951,7 +935,7 @@ namespace Simian.Extensions
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Log("Received a CompleteAgentMovement from an avatar already in the scene, " +
|
||||
Logger.Log("Received a CompleteAgentMovement but failed to insert avatar into the scene: " +
|
||||
agent.FullName, Helpers.LogLevel.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user