From 1c35fa6468a3a244188e1d00e1f405f0bca89c7d Mon Sep 17 00:00:00 2001 From: Date: Mon, 18 Aug 2008 09:25:10 +0000 Subject: [PATCH] Moved Simian's RegionHandle property to main Simian class and AgentUpdate handling to Movement extension class. Added broadcasting of ObjectUpdate packets to all users when AgentUpdate is received. Added required inventory param to LogoutRequestReply. git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2106 52acb1d6-8a22-11de-b505-999d5b087335 --- .../Simian/Extensions/ConnectionManagement.cs | 4 +- Programs/Simian/Extensions/Movement.cs | 81 +++++++++++++++++- Programs/Simian/Extensions/SceneManager.cs | 83 +------------------ 3 files changed, 83 insertions(+), 85 deletions(-) diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs index 00a1153b..4c45370d 100644 --- a/Programs/Simian/Extensions/ConnectionManagement.cs +++ b/Programs/Simian/Extensions/ConnectionManagement.cs @@ -75,7 +75,9 @@ namespace Simian LogoutReplyPacket reply = new LogoutReplyPacket(); reply.AgentData.AgentID = agent.AgentID; reply.AgentData.SessionID = agent.SessionID; - reply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[0]; + reply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; + reply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); + reply.InventoryData[0].ItemID = UUID.Zero; lock (server.Agents) { diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index cbe7939a..5bef1364 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -94,8 +94,85 @@ namespace Simian.Extensions { AgentUpdatePacket update = (AgentUpdatePacket)packet; - agent.Avatar.Rotation = update.AgentData.BodyRotation; - agent.ControlFlags = (AgentManager.ControlFlags)update.AgentData.ControlFlags; + lock (Server.Agents) + { + agent.Avatar.Rotation = update.AgentData.BodyRotation; + agent.ControlFlags = (AgentManager.ControlFlags)update.AgentData.ControlFlags; + + ObjectUpdatePacket fullUpdate = BuildFullUpdate(agent, agent.Avatar, update.AgentData.State, update.AgentData.Flags); + + foreach (Agent recipient in Server.Agents.Values) + recipient.SendPacket(fullUpdate); + } + } + + ObjectUpdatePacket BuildFullUpdate(Agent agent, LLObject obj, byte state, uint flags) + { + byte[] objectData = new byte[60]; + int pos = 0; + agent.Avatar.Position.GetBytes().CopyTo(objectData, pos); + pos += 12; + agent.Avatar.Velocity.GetBytes().CopyTo(objectData, pos); + pos += 12; + agent.Avatar.Acceleration.GetBytes().CopyTo(objectData, pos); + pos += 12; + agent.Avatar.Rotation.GetBytes().CopyTo(objectData, pos); + pos += 12; + agent.Avatar.AngularVelocity.GetBytes().CopyTo(objectData, pos); + + ObjectUpdatePacket update = new ObjectUpdatePacket(); + update.RegionData.RegionHandle = Server.RegionHandle; + update.RegionData.TimeDilation = Helpers.FloatToByte(1f, 0f, 1f); + update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; + update.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock(); + update.ObjectData[0].ClickAction = (byte)0; + update.ObjectData[0].CRC = 0; + update.ObjectData[0].ExtraParams = new byte[0]; + update.ObjectData[0].Flags = 0; + update.ObjectData[0].FullID = obj.ID; + update.ObjectData[0].Gain = 0; + update.ObjectData[0].ID = obj.LocalID; + update.ObjectData[0].JointAxisOrAnchor = Vector3.Zero; + update.ObjectData[0].JointPivot = Vector3.Zero; + update.ObjectData[0].JointType = (byte)0; + update.ObjectData[0].Material = (byte)3; + update.ObjectData[0].MediaURL = new byte[0]; + update.ObjectData[0].NameValue = new byte[0]; + update.ObjectData[0].ObjectData = objectData; + update.ObjectData[0].OwnerID = UUID.Zero; + update.ObjectData[0].ParentID = 0; + update.ObjectData[0].PathBegin = 0; + update.ObjectData[0].PathCurve = (byte)32; + update.ObjectData[0].PathEnd = 0; + update.ObjectData[0].PathRadiusOffset = (sbyte)0; + update.ObjectData[0].PathRevolutions = (byte)0; + update.ObjectData[0].PathScaleX = (byte)100; + update.ObjectData[0].PathScaleY = (byte)150; + update.ObjectData[0].PathShearX = (byte)0; + update.ObjectData[0].PathShearY = (byte)0; + update.ObjectData[0].PathSkew = (sbyte)0; + update.ObjectData[0].PathTaperX = (sbyte)0; + update.ObjectData[0].PathTaperY = (sbyte)0; + update.ObjectData[0].PathTwist = (sbyte)0; + update.ObjectData[0].PathTwistBegin = (sbyte)0; + update.ObjectData[0].PCode = (byte)PCode.Avatar; + update.ObjectData[0].ProfileBegin = 0; + update.ObjectData[0].ProfileCurve = (byte)0; + update.ObjectData[0].ProfileEnd = 0; + update.ObjectData[0].ProfileHollow = 0; + update.ObjectData[0].PSBlock = new byte[0]; + update.ObjectData[0].TextColor = Vector3.Zero.GetBytes(); + update.ObjectData[0].TextureAnim = new byte[0]; + update.ObjectData[0].TextureEntry = new byte[63]; + update.ObjectData[0].Radius = 0f; + update.ObjectData[0].Scale = obj.Scale; + update.ObjectData[0].Sound = UUID.Zero; + update.ObjectData[0].State = state; + update.ObjectData[0].Text = new byte[0]; + update.ObjectData[0].UpdateFlags = flags; + update.ObjectData[0].Data = new byte[0]; + + return update; } } diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 9047d045..b472bffd 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -11,7 +11,6 @@ namespace Simian Simian server; int currentLocalID = 0; int currentWearablesSerialNum = 0; - ulong regionHandle; public SceneManager(Simian server) { @@ -20,12 +19,7 @@ namespace Simian public void Start() { - uint regionX = 256000; - uint regionY = 256000; - regionHandle = Helpers.UIntsToLong(regionX, regionY); - server.UDPServer.RegisterPacketCallback(PacketType.CompleteAgentMovement, new UDPServer.PacketCallback(CompleteAgentMovementHandler)); - server.UDPServer.RegisterPacketCallback(PacketType.AgentUpdate, new UDPServer.PacketCallback(AgentUpdateHandler)); server.UDPServer.RegisterPacketCallback(PacketType.AgentWearablesRequest, new UDPServer.PacketCallback(AgentWearablesRequestHandler)); } @@ -53,20 +47,13 @@ namespace Simian complete.AgentData.SessionID = agent.SessionID; complete.Data.LookAt = Vector3.UnitX; complete.Data.Position = avatar.Position; - complete.Data.RegionHandle = regionHandle; + complete.Data.RegionHandle = server.RegionHandle; complete.Data.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now); complete.SimData.ChannelVersion = Utils.StringToBytes("Simian"); agent.SendPacket(complete); } - void AgentUpdateHandler(Packet packet, Agent agent) - { - AgentUpdatePacket update = (AgentUpdatePacket)packet; - - SendFullUpdate(agent, agent.Avatar, update.AgentData.State, update.AgentData.Flags); - } - void AgentWearablesRequestHandler(Packet packet, Agent agent) { /*AgentWearablesUpdatePacket update = new AgentWearablesUpdatePacket(); @@ -80,73 +67,5 @@ namespace Simian agent.SendPacket(update);*/ } - void SendFullUpdate(Agent agent, LLObject obj, byte state, uint flags) - { - byte[] objectData = new byte[60]; - int pos = 0; - agent.Avatar.Position.GetBytes().CopyTo(objectData, pos); - pos += 12; - agent.Avatar.Velocity.GetBytes().CopyTo(objectData, pos); - pos += 12; - agent.Avatar.Acceleration.GetBytes().CopyTo(objectData, pos); - pos += 12; - agent.Avatar.Rotation.GetBytes().CopyTo(objectData, pos); - pos += 12; - agent.Avatar.AngularVelocity.GetBytes().CopyTo(objectData, pos); - - ObjectUpdatePacket update = new ObjectUpdatePacket(); - update.RegionData.RegionHandle = regionHandle; - update.RegionData.TimeDilation = Helpers.FloatToByte(1f, 0f, 1f); - update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; - update.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock(); - update.ObjectData[0].ClickAction = (byte)0; - update.ObjectData[0].CRC = 0; - update.ObjectData[0].ExtraParams = new byte[0]; - update.ObjectData[0].Flags = 0; - update.ObjectData[0].FullID = obj.ID; - update.ObjectData[0].Gain = 0; - update.ObjectData[0].ID = obj.LocalID; - update.ObjectData[0].JointAxisOrAnchor = Vector3.Zero; - update.ObjectData[0].JointPivot = Vector3.Zero; - update.ObjectData[0].JointType = (byte)0; - update.ObjectData[0].Material = (byte)3; - update.ObjectData[0].MediaURL = new byte[0]; - update.ObjectData[0].NameValue = new byte[0]; - update.ObjectData[0].ObjectData = objectData; - update.ObjectData[0].OwnerID = UUID.Zero; - update.ObjectData[0].ParentID = 0; - update.ObjectData[0].PathBegin = 0; - update.ObjectData[0].PathCurve = (byte)32; - update.ObjectData[0].PathEnd = 0; - update.ObjectData[0].PathRadiusOffset = (sbyte)0; - update.ObjectData[0].PathRevolutions = (byte)0; - update.ObjectData[0].PathScaleX = (byte)100; - update.ObjectData[0].PathScaleY = (byte)150; - update.ObjectData[0].PathShearX = (byte)0; - update.ObjectData[0].PathShearY = (byte)0; - update.ObjectData[0].PathSkew = (sbyte)0; - update.ObjectData[0].PathTaperX = (sbyte)0; - update.ObjectData[0].PathTaperY = (sbyte)0; - update.ObjectData[0].PathTwist = (sbyte)0; - update.ObjectData[0].PathTwistBegin = (sbyte)0; - update.ObjectData[0].PCode = (byte)PCode.Avatar; - update.ObjectData[0].ProfileBegin = 0; - update.ObjectData[0].ProfileCurve = (byte)0; - update.ObjectData[0].ProfileEnd = 0; - update.ObjectData[0].ProfileHollow = 0; - update.ObjectData[0].PSBlock = new byte[0]; - update.ObjectData[0].TextColor = Vector3.Zero.GetBytes(); - update.ObjectData[0].TextureAnim = new byte[0]; - update.ObjectData[0].TextureEntry = new byte[63]; - update.ObjectData[0].Radius = 0f; - update.ObjectData[0].Scale = obj.Scale; - update.ObjectData[0].Sound = UUID.Zero; - update.ObjectData[0].State = state; - update.ObjectData[0].Text = new byte[0]; - update.ObjectData[0].UpdateFlags = flags; - update.ObjectData[0].Data = new byte[0]; - - agent.SendPacket(update); - } } }