diff --git a/Programs/examples/TestClient/Commands/Appearance/CloneCommand.cs b/Programs/examples/TestClient/Commands/Appearance/CloneCommand.cs index cfe4c3cc..4f5d58a3 100644 --- a/Programs/examples/TestClient/Commands/Appearance/CloneCommand.cs +++ b/Programs/examples/TestClient/Commands/Appearance/CloneCommand.cs @@ -1,19 +1,23 @@ using System; using System.Collections.Generic; using System.Linq; +using LibreMetaverse; using OpenMetaverse.Packets; namespace OpenMetaverse.TestClient { public class CloneCommand : Command { - uint SerialNum = 2; + uint _serialNum = 2; + readonly CacheDictionary Appearances = new(100, new LruRemovalStrategy()); public CloneCommand(TestClient testClient) { Name = "clone"; Description = "Clone the appearance of a nearby avatar. Usage: clone [name]"; Category = CommandCategory.Appearance; + + testClient.Network.RegisterCallback(PacketType.AvatarAppearance, AvatarAppearanceHandler); } public override string Execute(string[] args, UUID fromAgentID) @@ -35,11 +39,11 @@ namespace OpenMetaverse.TestClient UUID target = matches[0].AgentID; targetName += $" ({target})"; - if (Client.Appearances.ContainsKey(target)) + if (Appearances.ContainsKey(target)) { #region AvatarAppearance to AgentSetAppearance - AvatarAppearancePacket appearance = Client.Appearances[target]; + AvatarAppearancePacket appearance = Appearances[target]; AgentSetAppearancePacket set = new AgentSetAppearancePacket { @@ -47,14 +51,14 @@ namespace OpenMetaverse.TestClient { AgentID = Client.Self.AgentID, SessionID = Client.Self.SessionID, - SerialNum = SerialNum++, + SerialNum = _serialNum++, Size = new Vector3(2f, 2f, 2f) // HACK }, WearableData = Array.Empty(), VisualParam = new AgentSetAppearancePacket.VisualParamBlock[appearance.VisualParam.Length] }; - for (int i = 0; i < appearance.VisualParam.Length; i++) + for (var i = 0; i < appearance.VisualParam.Length; ++i) { set.VisualParam[i] = new AgentSetAppearancePacket.VisualParamBlock { @@ -72,16 +76,26 @@ namespace OpenMetaverse.TestClient // Send the new appearance packet Client.Network.SendPacket(set); - return "Cloned " + targetName; + return $"Cloned {targetName}"; } else { - return "Don't know the appearance of avatar " + targetName; + return $"Don't have an appearance cached for {targetName}"; } } else { - return "Couldn't find avatar " + targetName; + return $"Could not find {targetName}"; + } + } + + private void AvatarAppearanceHandler(object sender, PacketReceivedEventArgs e) + { + AvatarAppearancePacket appearance = (AvatarAppearancePacket)e.Packet; + + lock (Appearances) + { + Appearances[appearance.Sender.ID] = appearance; } } } diff --git a/Programs/examples/TestClient/TestClient.cs b/Programs/examples/TestClient/TestClient.cs index ead6027c..64fee94f 100644 --- a/Programs/examples/TestClient/TestClient.cs +++ b/Programs/examples/TestClient/TestClient.cs @@ -11,7 +11,6 @@ namespace OpenMetaverse.TestClient { public UUID GroupID = UUID.Zero; public Dictionary GroupMembers; - public Dictionary Appearances = new Dictionary(); public Dictionary Commands = new Dictionary(); public bool Running = true; public bool GroupCommands = false; @@ -27,13 +26,15 @@ namespace OpenMetaverse.TestClient private UUID GroupMembersRequestID; public Dictionary GroupsCache = null; private readonly ManualResetEvent GroupsEvent = new ManualResetEvent(false); + private CloneCommand CloneManager; /// - /// + /// Constructor /// public TestClient(ClientManager manager) { ClientManager = manager; + CloneManager = new CloneCommand(this); updateTimer = new System.Timers.Timer(500); updateTimer.Elapsed += updateTimer_Elapsed; @@ -57,7 +58,6 @@ namespace OpenMetaverse.TestClient Groups.GroupMembersReply += GroupMembersHandler; Inventory.InventoryObjectOffered += Inventory_OnInventoryObjectReceived; - Network.RegisterCallback(PacketType.AvatarAppearance, AvatarAppearanceHandler); Network.RegisterCallback(PacketType.AlertMessage, AlertMessageHandler); VoiceManager = new VoiceManager(this); @@ -233,15 +233,6 @@ namespace OpenMetaverse.TestClient GroupMembers = e.Members; } - private void AvatarAppearanceHandler(object sender, PacketReceivedEventArgs e) - { - Packet packet = e.Packet; - - AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; - - lock (Appearances) Appearances[appearance.Sender.ID] = appearance; - } - private void AlertMessageHandler(object sender, PacketReceivedEventArgs e) { Packet packet = e.Packet;