diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index ac198ed6..f4774e41 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -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, diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index 4968fb40..0790170f 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -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); } diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 3a20192c..7923131f 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -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(oldObj.UndoSteps); - obj.RedoSteps = new CircularQueue(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); } }