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