diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index a8aa24d7..c11aac8a 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -23,6 +23,7 @@ namespace Simian public Dictionary Inventory = new Dictionary(); public Dictionary Library = new Dictionary(); public Dictionary Wearables = new Dictionary(); + public byte[] VisualParams = new byte[218]; // TODO: Replace byte with enum public byte State; public LLObject.ObjectFlags Flags; diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index 6cc2ee18..b043a1bf 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -118,23 +118,14 @@ namespace Simian.Extensions { AgentSetAppearancePacket set = (AgentSetAppearancePacket)packet; + Logger.DebugLog("Updating avatar appearance"); + agent.Avatar.Textures = new LLObject.TextureEntry(set.ObjectData.TextureEntry, 0, set.ObjectData.TextureEntry.Length); - Logger.DebugLog("Updating avatar appearance"); - - AvatarAppearancePacket appearance = new AvatarAppearancePacket(); - appearance.ObjectData.TextureEntry = set.ObjectData.TextureEntry; - appearance.Sender.ID = agent.AgentID; - appearance.Sender.IsTrial = false; - - // TODO: Store these visual params in Agent - appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[set.VisualParam.Length]; + // Update agent visual params for (int i = 0; i < set.VisualParam.Length; i++) - { - appearance.VisualParam[i] = new AvatarAppearancePacket.VisualParamBlock(); - appearance.VisualParam[i].ParamValue = set.VisualParam[i].ParamValue; - } + agent.VisualParams[i] = set.VisualParam[i].ParamValue; //TODO: What is WearableData used for? @@ -142,6 +133,9 @@ namespace Simian.Extensions agent.State, agent.Flags | LLObject.ObjectFlags.ObjectYouOwner); agent.SendPacket(update); + // Send out this appearance to all other connected avatars + AvatarAppearancePacket appearance = BuildAppearancePacket(agent); + lock (Server.Agents) { foreach (Agent recipient in Server.Agents.Values) @@ -151,5 +145,22 @@ namespace Simian.Extensions } } } + + public static AvatarAppearancePacket BuildAppearancePacket(Agent agent) + { + AvatarAppearancePacket appearance = new AvatarAppearancePacket(); + appearance.ObjectData.TextureEntry = agent.Avatar.Textures.ToBytes(); + appearance.Sender.ID = agent.AgentID; + appearance.Sender.IsTrial = false; + + appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; + for (int i = 0; i < 218; i++) + { + appearance.VisualParam[i] = new AvatarAppearancePacket.VisualParamBlock(); + appearance.VisualParam[i].ParamValue = agent.VisualParams[i]; + } + + return appearance; + } } } diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index ccef2051..3916d75a 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -231,7 +231,15 @@ namespace Simian.Extensions { ViewerEffectPacket effect = (ViewerEffectPacket)packet; - // TODO: Do something with these + effect.AgentData.AgentID = UUID.Zero; + effect.AgentData.SessionID = UUID.Zero; + + // Broadcast this to everyone + lock (Server.Agents) + { + foreach (Agent recipient in Server.Agents.Values) + recipient.SendPacket(effect); + } } public static ObjectUpdatePacket BuildFullUpdate(Agent agent, LLObject obj, ulong regionHandle, byte state, LLObject.ObjectFlags flags) diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 54444133..ac2c88b5 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -72,6 +72,22 @@ namespace Simian.Extensions agent.SendPacket(complete); + lock (server.Agents) + { + foreach (Agent otherAgent in server.Agents.Values) + { + // Send ObjectUpdate packets for this avatar + ObjectUpdatePacket update = Movement.BuildFullUpdate(otherAgent, otherAgent.Avatar, + server.RegionHandle, otherAgent.State, otherAgent.Flags); + agent.SendPacket(update); + + // Send appearances for this avatar + AvatarAppearancePacket appearance = AvatarManager.BuildAppearancePacket(otherAgent); + agent.SendPacket(appearance); + } + } + + // Send terrain data SendLayerData(agent); }