diff --git a/Programs/Simian.Tests/SceneManagerTests.cs b/Programs/Simian.Tests/SceneManagerTests.cs new file mode 100644 index 00000000..7f69feab --- /dev/null +++ b/Programs/Simian.Tests/SceneManagerTests.cs @@ -0,0 +1,107 @@ +using System; +using System.Threading; +using OpenMetaverse; +using OpenMetaverse.Packets; +using ExtensionLoader; +using Simian; +using Simian.Extensions; +using NUnit.Framework; + +namespace SimianTests +{ + [TestFixture(Description = "Simian.Extensions.SceneManager")] + public class SceneManagerTest + { + Simian.Simian simian; + SceneManager sceneManager; + Random rand = new Random(); + Agent agent; + Agent observer; + + [SetUp] + public void Start() + { + simian = new Simian.Simian(); + simian.UDP = new UDPManager(); + (simian.UDP as IExtension).Start(simian); + sceneManager = new SceneManager(); + sceneManager.Start(simian); + + agent = CreateDummyAgent(); + simian.Agents.Add(agent.Avatar.ID, agent); + + observer = CreateDummyAgent(); + simian.Agents.Add(observer.Avatar.ID, observer); + } + + [TearDown] + public void Stop() + { + sceneManager.Stop(); + (simian.UDP as IExtension).Stop(); + } + + [Test] + public void AvatarAppearanceTest() + { + Primitive.TextureEntry textures = new Primitive.TextureEntry(AppearanceManager.DEFAULT_AVATAR_TEXTURE); + byte[] visualParams = new byte[218]; + rand.NextBytes(visualParams); + + UUID receivedAgentID = UUID.Zero; + Primitive.TextureEntry receivedTextureEntry = null; + byte[] receivedVisualParams = null; + + AutoResetEvent callbackEvent = new AutoResetEvent(false); + OutgoingPacketCallback callback = new OutgoingPacketCallback( + delegate(Packet packet, UUID agentID, PacketCategory category) + { + if (packet is AvatarAppearancePacket) + { + AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; + + receivedAgentID = appearance.Sender.ID; + receivedTextureEntry = new Primitive.TextureEntry(appearance.ObjectData.TextureEntry, 0, appearance.ObjectData.TextureEntry.Length); + receivedVisualParams = new byte[appearance.VisualParam.Length]; + for (int i = 0; i < receivedVisualParams.Length; i++) + receivedVisualParams[i] = appearance.VisualParam[i].ParamValue; + + callbackEvent.Set(); + } + + return false; + } + ); + + simian.UDP.OnOutgoingPacket += callback; + sceneManager.AvatarAppearance(this, agent, textures, visualParams); + + Assert.IsTrue(callbackEvent.WaitOne(1000, false), "Timed out waiting for callback"); + simian.UDP.OnOutgoingPacket -= callback; + + Assert.That(receivedAgentID == agent.Avatar.ID, "Agent ID mismatch"); + + Assert.That(receivedVisualParams.Length == 218, "VisualParams has an incorrect length"); + for (int i = 0; i < 218; i++) + Assert.That(receivedVisualParams[i] == visualParams[i], "VisualParam mismatch at position " + i); + + Assert.That(receivedTextureEntry.DefaultTexture.TextureID == textures.DefaultTexture.TextureID, "Default texture mismatch"); + for (int i = 0; i < receivedTextureEntry.FaceTextures.Length; i++) + { + Assert.That( + (receivedTextureEntry.FaceTextures[i] == null && textures.FaceTextures[i] == null) || + (receivedTextureEntry.FaceTextures[i].TextureID == textures.FaceTextures[i].TextureID), "TextureEntry mismatch at position " + i); + } + } + + static Agent CreateDummyAgent() + { + Agent agent = new Agent(); + agent.Avatar.ID = UUID.Random(); + agent.SessionID = UUID.Random(); + agent.Avatar.Position = new Vector3(128f, 128f, 40f); + agent.Avatar.Rotation = Quaternion.Identity; + return agent; + } + } +} diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 487a1347..77f51fa1 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -10,7 +10,6 @@ namespace Simian public class Agent { // Account - public UUID AgentID; public string FirstName; public string LastName; public string PasswordHash; diff --git a/Programs/Simian/Extensions/AccountManager.cs b/Programs/Simian/Extensions/AccountManager.cs index 80fba9bf..c47d6ffb 100644 --- a/Programs/Simian/Extensions/AccountManager.cs +++ b/Programs/Simian/Extensions/AccountManager.cs @@ -26,7 +26,7 @@ namespace Simian.Extensions public void AddAccount(Agent agent) { - accounts.Add(agent.FullName, agent.AgentID, agent); + accounts.Add(agent.FullName, agent.Avatar.ID, agent); } public bool RemoveAccount(UUID agentID) @@ -102,7 +102,7 @@ namespace Simian.Extensions OSD.DeserializeMembers(ref agentRef, (OSDMap)array[i]); agent = (Agent)agentRef; - accounts.Add(agent.FullName, agent.AgentID, agent); + accounts.Add(agent.FullName, agent.Avatar.ID, agent); } Logger.Log(String.Format("Deserialized the agent store with {0} entries", accounts.Count), diff --git a/Programs/Simian/Extensions/AuthFreeForAll.cs b/Programs/Simian/Extensions/AuthFreeForAll.cs index 8fd9d20b..ec4c9256 100644 --- a/Programs/Simian/Extensions/AuthFreeForAll.cs +++ b/Programs/Simian/Extensions/AuthFreeForAll.cs @@ -31,7 +31,7 @@ namespace Simian.Extensions // Account doesn't exist, create it now agent = new Agent(); agent.AccessLevel = "M"; - agent.AgentID = UUID.Random(); + agent.Avatar.ID = UUID.Random(); agent.Balance = 1000; agent.CreationTime = Utils.DateTimeToUnixTime(DateTime.Now); agent.CurrentLookAt = Vector3.Zero; @@ -47,46 +47,46 @@ namespace Simian.Extensions // Create a very basic inventory skeleton UUID rootFolder = UUID.Random(); - server.Inventory.CreateRootFolder(agent.AgentID, rootFolder, "Inventory", agent.AgentID); + server.Inventory.CreateRootFolder(agent.Avatar.ID, rootFolder, "Inventory", agent.Avatar.ID); UUID libraryRootFolder = UUID.Random(); - server.Inventory.CreateRootFolder(agent.AgentID, libraryRootFolder, "Library", agent.AgentID); + server.Inventory.CreateRootFolder(agent.Avatar.ID, libraryRootFolder, "Library", agent.Avatar.ID); agent.InventoryRoot = rootFolder; - agent.InventoryLibraryOwner = agent.AgentID; + agent.InventoryLibraryOwner = agent.Avatar.ID; agent.InventoryLibraryRoot = libraryRootFolder; // Create some inventory items for appearance UUID clothingFolder = UUID.Random(); - server.Inventory.CreateFolder(agent.AgentID, clothingFolder, "Clothing", AssetType.Clothing, - agent.InventoryRoot, agent.AgentID); + server.Inventory.CreateFolder(agent.Avatar.ID, clothingFolder, "Clothing", AssetType.Clothing, + agent.InventoryRoot, agent.Avatar.ID); UUID defaultOutfitFolder = UUID.Random(); - server.Inventory.CreateFolder(agent.AgentID, defaultOutfitFolder, "Default Outfit", AssetType.Unknown, - clothingFolder, agent.AgentID); + server.Inventory.CreateFolder(agent.Avatar.ID, defaultOutfitFolder, "Default Outfit", AssetType.Unknown, + clothingFolder, agent.Avatar.ID); UUID hairAsset = new UUID("dc675529-7ba5-4976-b91d-dcb9e5e36188"); - UUID hairItem = server.Inventory.CreateItem(agent.AgentID, "Default Hair", "Default Hair", + UUID hairItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Hair", "Default Hair", InventoryType.Wearable, AssetType.Bodypart, hairAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); UUID pantsAsset = new UUID("3e8ee2d6-4f21-4a55-832d-77daa505edff"); - UUID pantsItem = server.Inventory.CreateItem(agent.AgentID, "Default Pants", "Default Pants", + UUID pantsItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Pants", "Default Pants", InventoryType.Wearable, AssetType.Clothing, pantsAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); UUID shapeAsset = new UUID("530a2614-052e-49a2-af0e-534bb3c05af0"); - UUID shapeItem = server.Inventory.CreateItem(agent.AgentID, "Default Shape", "Default Shape", + UUID shapeItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Shape", "Default Shape", InventoryType.Wearable, AssetType.Clothing, shapeAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); UUID shirtAsset = new UUID("6a714f37-fe53-4230-b46f-8db384465981"); - UUID shirtItem = server.Inventory.CreateItem(agent.AgentID, "Default Shirt", "Default Shirt", + UUID shirtItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Shirt", "Default Shirt", InventoryType.Wearable, AssetType.Clothing, shirtAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); UUID skinAsset = new UUID("5f787f25-f761-4a35-9764-6418ee4774c4"); - UUID skinItem = server.Inventory.CreateItem(agent.AgentID, "Default Skin", "Default Skin", + UUID skinItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Skin", "Default Skin", InventoryType.Wearable, AssetType.Clothing, skinAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); UUID eyesAsset = new UUID("78d20332-9b07-44a2-bf74-3b368605f4b5"); - UUID eyesItem = server.Inventory.CreateItem(agent.AgentID, "Default Eyes", "Default Eyes", + UUID eyesItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Eyes", "Default Eyes", InventoryType.Wearable, AssetType.Bodypart, eyesAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); agent.HairItem = hairItem; agent.PantsItem = pantsItem; @@ -101,7 +101,7 @@ namespace Simian.Extensions } if (password == agent.PasswordHash) - return agent.AgentID; + return agent.Avatar.ID; else return UUID.Zero; } diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index 7bad13e9..b6c488dd 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -71,10 +71,10 @@ namespace Simian.Extensions public void SendAnimations(Agent agent) { AvatarAnimationPacket sendAnim = new AvatarAnimationPacket(); - sendAnim.Sender.ID = agent.AgentID; + sendAnim.Sender.ID = agent.Avatar.ID; sendAnim.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1]; sendAnim.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock(); - sendAnim.AnimationSourceList[0].ObjectID = agent.AgentID; + sendAnim.AnimationSourceList[0].ObjectID = agent.Avatar.ID; UUID[] animIDS; int[] sequenceNums; @@ -95,9 +95,9 @@ namespace Simian.Extensions { SoundTriggerPacket sound = new SoundTriggerPacket(); sound.SoundData.Handle = server.RegionHandle; - sound.SoundData.ObjectID = agent.AgentID; - sound.SoundData.ParentID = agent.AgentID; - sound.SoundData.OwnerID = agent.AgentID; + sound.SoundData.ObjectID = agent.Avatar.ID; + sound.SoundData.ParentID = agent.Avatar.ID; + sound.SoundData.OwnerID = agent.Avatar.ID; sound.SoundData.Position = agent.Avatar.Position; sound.SoundData.SoundID = soundID; sound.SoundData.Gain = gain; @@ -109,7 +109,7 @@ namespace Simian.Extensions { // Remove the avatar from the scene SimulationObject obj; - if (server.Scene.TryGetObject(agent.AgentID, out obj)) + if (server.Scene.TryGetObject(agent.Avatar.ID, out obj)) server.Scene.ObjectRemove(this, obj.Prim.LocalID); else Logger.Log("Disconnecting an agent that is not in the scene", Helpers.LogLevel.Warning); @@ -121,7 +121,7 @@ namespace Simian.Extensions OfflineNotificationPacket offline = new OfflineNotificationPacket(); offline.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[1]; offline.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); - offline.AgentBlock[0].AgentID = agent.AgentID; + offline.AgentBlock[0].AgentID = agent.Avatar.ID; server.UDP.BroadcastPacket(offline, PacketCategory.State); } @@ -129,7 +129,7 @@ namespace Simian.Extensions { AlertMessagePacket alert = new AlertMessagePacket(); alert.AlertData.Message = Utils.StringToBytes(message); - server.UDP.SendPacket(agent.AgentID, alert, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, alert, PacketCategory.Transaction); } void AgentAnimationHandler(Packet packet, Agent agent) @@ -175,7 +175,7 @@ namespace Simian.Extensions if (server.Agents.TryGetValue(request.AgentData.AvatarID, out foundAgent)) { AvatarPropertiesReplyPacket reply = new AvatarPropertiesReplyPacket(); - reply.AgentData.AgentID = agent.AgentID; + reply.AgentData.AgentID = agent.Avatar.ID; reply.AgentData.AvatarID = request.AgentData.AvatarID; reply.PropertiesData.AboutText = Utils.StringToBytes(foundAgent.ProfileAboutText); reply.PropertiesData.BornOn = Utils.StringToBytes(foundAgent.ProfileBornOn); @@ -187,7 +187,7 @@ namespace Simian.Extensions reply.PropertiesData.PartnerID = foundAgent.PartnerID; reply.PropertiesData.ProfileURL = Utils.StringToBytes(foundAgent.ProfileURL); - server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); } else { @@ -215,19 +215,19 @@ namespace Simian.Extensions { Dictionary wearables = new Dictionary(); - TryAddWearable(agent.AgentID, wearables, WearableType.Shape, agent.ShapeItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Skin, agent.SkinItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Hair, agent.HairItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Eyes, agent.EyesItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Shirt, agent.ShirtItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Pants, agent.PantsItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Shoes, agent.ShoesItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Socks, agent.SocksItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Jacket, agent.JacketItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Gloves, agent.GlovesItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Undershirt, agent.UndershirtItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Underpants, agent.UnderpantsItem); - TryAddWearable(agent.AgentID, wearables, WearableType.Skirt, agent.SkirtItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Shape, agent.ShapeItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Skin, agent.SkinItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Hair, agent.HairItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Eyes, agent.EyesItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Shirt, agent.ShirtItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Pants, agent.PantsItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Shoes, agent.ShoesItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Socks, agent.SocksItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Jacket, agent.JacketItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Gloves, agent.GlovesItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Undershirt, agent.UndershirtItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Underpants, agent.UnderpantsItem); + TryAddWearable(agent.Avatar.ID, wearables, WearableType.Skirt, agent.SkirtItem); return wearables; } @@ -235,7 +235,7 @@ namespace Simian.Extensions void SendWearables(Agent agent) { AgentWearablesUpdatePacket update = new AgentWearablesUpdatePacket(); - update.AgentData.AgentID = agent.AgentID; + update.AgentData.AgentID = agent.Avatar.ID; Dictionary wearables = GetCurrentWearables(agent); update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[wearables.Count]; @@ -256,7 +256,7 @@ namespace Simian.Extensions Logger.DebugLog(String.Format("Sending info about {0} wearables", wearables.Count)); - server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.Asset); } void AgentWearablesRequestHandler(Packet packet, Agent agent) @@ -356,7 +356,7 @@ namespace Simian.Extensions AgentCachedTexturePacket cached = (AgentCachedTexturePacket)packet; AgentCachedTextureResponsePacket response = new AgentCachedTextureResponsePacket(); - response.AgentData.AgentID = agent.AgentID; + response.AgentData.AgentID = agent.Avatar.ID; response.AgentData.SerialNum = cached.AgentData.SerialNum; response.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[cached.WearableData.Length]; @@ -372,7 +372,7 @@ namespace Simian.Extensions response.Header.Zerocoded = true; - server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Transaction); } void SoundTriggerHandler(Packet packet, Agent agent) @@ -408,7 +408,7 @@ namespace Simian.Extensions } } - server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); } void CoarseLocationTimer_Elapsed(object sender) @@ -428,7 +428,7 @@ namespace Simian.Extensions // Fill in this avatar update.AgentData[0] = new CoarseLocationUpdatePacket.AgentDataBlock(); - update.AgentData[0].AgentID = recipient.AgentID; + update.AgentData[0].AgentID = recipient.Avatar.ID; update.Location[0] = new CoarseLocationUpdatePacket.LocationBlock(); update.Location[0].X = (byte)((int)recipient.Avatar.Position.X); update.Location[0].Y = (byte)((int)recipient.Avatar.Position.Y); @@ -440,7 +440,7 @@ namespace Simian.Extensions if (agent != recipient) { update.AgentData[i] = new CoarseLocationUpdatePacket.AgentDataBlock(); - update.AgentData[i].AgentID = agent.AgentID; + update.AgentData[i].AgentID = agent.Avatar.ID; update.Location[i] = new CoarseLocationUpdatePacket.LocationBlock(); update.Location[i].X = (byte)((int)agent.Avatar.Position.X); update.Location[i].Y = (byte)((int)agent.Avatar.Position.Y); @@ -449,7 +449,7 @@ namespace Simian.Extensions } } - server.UDP.SendPacket(recipient.AgentID, update, PacketCategory.State); + server.UDP.SendPacket(recipient.Avatar.ID, update, PacketCategory.State); } } } diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs index d79986c9..1415170c 100644 --- a/Programs/Simian/Extensions/ConnectionManagement.cs +++ b/Programs/Simian/Extensions/ConnectionManagement.cs @@ -57,7 +57,7 @@ namespace Simian.Extensions handshake.RegionInfo.TerrainStartHeight11 = 40f; handshake.RegionInfo2.RegionID = UUID.Random(); - server.UDP.SendPacket(agent.AgentID, handshake, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, handshake, PacketCategory.Transaction); } void StartPingCheckHandler(Packet packet, Agent agent) @@ -68,7 +68,7 @@ namespace Simian.Extensions complete.Header.Reliable = false; complete.PingID.PingID = start.PingID.PingID; - server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Overhead); + server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Overhead); } void LogoutRequestHandler(Packet packet, Agent agent) @@ -76,13 +76,13 @@ namespace Simian.Extensions LogoutRequestPacket request = (LogoutRequestPacket)packet; LogoutReplyPacket reply = new LogoutReplyPacket(); - reply.AgentData.AgentID = agent.AgentID; + reply.AgentData.AgentID = agent.Avatar.ID; reply.AgentData.SessionID = agent.SessionID; reply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; reply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); reply.InventoryData[0].ItemID = UUID.Zero; - server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); server.Avatars.Disconnect(agent); } diff --git a/Programs/Simian/Extensions/FriendManager.cs b/Programs/Simian/Extensions/FriendManager.cs index 64598009..66de15c7 100644 --- a/Programs/Simian/Extensions/FriendManager.cs +++ b/Programs/Simian/Extensions/FriendManager.cs @@ -47,20 +47,20 @@ namespace Simian.Extensions sendIM.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; sendIM.MessageBlock.Dialog = im.MessageBlock.Dialog; sendIM.MessageBlock.Offline = (byte)InstantMessageOnline.Online; - sendIM.MessageBlock.ID = agent.AgentID; + sendIM.MessageBlock.ID = agent.Avatar.ID; sendIM.MessageBlock.Message = im.MessageBlock.Message; sendIM.MessageBlock.BinaryBucket = new byte[0]; sendIM.MessageBlock.Timestamp = 0; sendIM.MessageBlock.Position = agent.Avatar.Position; - sendIM.AgentData.AgentID = agent.AgentID; + sendIM.AgentData.AgentID = agent.Avatar.ID; - server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); + server.UDP.SendPacket(recipient.Avatar.ID, sendIM, PacketCategory.Transaction); if (dialog == InstantMessageDialog.FriendshipAccepted) { - bool receiverOnline = server.Agents.ContainsKey(agent.AgentID); - bool senderOnline = server.Agents.ContainsKey(recipient.AgentID); + bool receiverOnline = server.Agents.ContainsKey(agent.Avatar.ID); + bool senderOnline = server.Agents.ContainsKey(recipient.Avatar.ID); if (receiverOnline) { @@ -69,16 +69,16 @@ namespace Simian.Extensions OnlineNotificationPacket notify = new OnlineNotificationPacket(); notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); - notify.AgentBlock[0].AgentID = agent.AgentID; - server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = agent.Avatar.ID; + server.UDP.SendPacket(recipient.Avatar.ID, notify, PacketCategory.State); } else { OfflineNotificationPacket notify = new OfflineNotificationPacket(); notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); - notify.AgentBlock[0].AgentID = agent.AgentID; - server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = agent.Avatar.ID; + server.UDP.SendPacket(recipient.Avatar.ID, notify, PacketCategory.State); } } @@ -89,16 +89,16 @@ namespace Simian.Extensions OnlineNotificationPacket notify = new OnlineNotificationPacket(); notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); - notify.AgentBlock[0].AgentID = recipient.AgentID; - server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = recipient.Avatar.ID; + server.UDP.SendPacket(agent.Avatar.ID, notify, PacketCategory.State); } else { OfflineNotificationPacket notify = new OfflineNotificationPacket(); notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); - notify.AgentBlock[0].AgentID = recipient.AgentID; - server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = recipient.Avatar.ID; + server.UDP.SendPacket(agent.Avatar.ID, notify, PacketCategory.State); } } } diff --git a/Programs/Simian/Extensions/ImageDelivery.cs b/Programs/Simian/Extensions/ImageDelivery.cs index dd0ecea9..8cba68cb 100644 --- a/Programs/Simian/Extensions/ImageDelivery.cs +++ b/Programs/Simian/Extensions/ImageDelivery.cs @@ -179,7 +179,7 @@ namespace Simian.Extensions ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket(); notfound.ImageID.ID = block.Image; - server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture); + server.UDP.SendPacket(agent.Avatar.ID, notfound, PacketCategory.Texture); } } } @@ -216,7 +216,7 @@ namespace Simian.Extensions Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture); + server.UDP.SendPacket(agent.Avatar.ID, data, PacketCategory.Texture); // Check if ImagePacket packets need to be sent to complete this transfer if (download.CurrentPacket <= download.StopPacket) @@ -257,7 +257,7 @@ namespace Simian.Extensions imagePacketSize), Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture); + server.UDP.SendPacket(agent.Avatar.ID, transfer, PacketCategory.Texture); ++download.CurrentPacket; } diff --git a/Programs/Simian/Extensions/InventoryManager.cs b/Programs/Simian/Extensions/InventoryManager.cs index ce433d80..87df7adb 100644 --- a/Programs/Simian/Extensions/InventoryManager.cs +++ b/Programs/Simian/Extensions/InventoryManager.cs @@ -79,10 +79,10 @@ namespace Simian.Extensions parentID = agent.InventoryRoot; // Create the inventory item - CreateItem(agent.AgentID, Utils.BytesToString(create.InventoryBlock.Name), "Created in Simian", + CreateItem(agent.Avatar.ID, Utils.BytesToString(create.InventoryBlock.Name), "Created in Simian", (InventoryType)create.InventoryBlock.InvType, assetType, assetID, parentID, - PermissionMask.All, (PermissionMask)create.InventoryBlock.NextOwnerMask, agent.AgentID, - agent.AgentID, create.InventoryBlock.TransactionID, create.InventoryBlock.CallbackID, true); + PermissionMask.All, (PermissionMask)create.InventoryBlock.NextOwnerMask, agent.Avatar.ID, + agent.Avatar.ID, create.InventoryBlock.TransactionID, create.InventoryBlock.CallbackID, true); } void CreateInventoryFolderHandler(Packet packet, Agent agent) @@ -93,8 +93,8 @@ namespace Simian.Extensions if (folderID == UUID.Zero) folderID = agent.InventoryRoot; - CreateFolder(agent.AgentID, folderID, Utils.BytesToString(create.FolderData.Name), - (AssetType)create.FolderData.Type, create.FolderData.ParentID, agent.AgentID); + CreateFolder(agent.Avatar.ID, folderID, Utils.BytesToString(create.FolderData.Name), + (AssetType)create.FolderData.Type, create.FolderData.ParentID, agent.Avatar.ID); } void UpdateInventoryItemHandler(Packet packet, Agent agent) @@ -106,7 +106,7 @@ namespace Simian.Extensions for (int i = 0; i < update.InventoryData.Length; i++) { UpdateInventoryItemPacket.InventoryDataBlock block = update.InventoryData[i]; - Dictionary agentInventory = GetAgentInventory(agent.AgentID); + Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); InventoryObject obj; if (agentInventory.TryGetValue(block.ItemID, out obj) && obj is InventoryItem) @@ -162,7 +162,7 @@ namespace Simian.Extensions bool sendItems = fetch.InventoryData.FetchItems; InventorySortOrder order = (InventorySortOrder)fetch.InventoryData.SortOrder; - Dictionary agentInventory = GetAgentInventory(agent.AgentID); + Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); // TODO: Use OwnerID // TODO: Do we need to obey InventorySortOrder? @@ -271,7 +271,7 @@ namespace Simian.Extensions folderBlocks.Length - splitPoints[i]; InventoryDescendentsPacket descendents = new InventoryDescendentsPacket(); - descendents.AgentData.AgentID = agent.AgentID; + descendents.AgentData.AgentID = agent.Avatar.ID; descendents.AgentData.FolderID = folder.ID; descendents.AgentData.OwnerID = folder.OwnerID; descendents.AgentData.Descendents = descendCount; @@ -282,7 +282,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) descendents.FolderData[j] = folderBlocks[splitPoints[i] + j]; - server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, descendents, PacketCategory.Inventory); } } else @@ -290,7 +290,7 @@ namespace Simian.Extensions Logger.DebugLog("Sending a single InventoryDescendents for folders"); InventoryDescendentsPacket descendents = new InventoryDescendentsPacket(); - descendents.AgentData.AgentID = agent.AgentID; + descendents.AgentData.AgentID = agent.Avatar.ID; descendents.AgentData.FolderID = folder.ID; descendents.AgentData.OwnerID = folder.OwnerID; descendents.AgentData.Descendents = descendCount; @@ -298,7 +298,7 @@ namespace Simian.Extensions descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[0]; descendents.ItemData = new InventoryDescendentsPacket.ItemDataBlock[0]; - server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, descendents, PacketCategory.Inventory); } if (itemBlocks.Length > 0) @@ -313,7 +313,7 @@ namespace Simian.Extensions itemBlocks.Length - splitPoints[i]; InventoryDescendentsPacket descendents = new InventoryDescendentsPacket(); - descendents.AgentData.AgentID = agent.AgentID; + descendents.AgentData.AgentID = agent.Avatar.ID; descendents.AgentData.FolderID = folder.ID; descendents.AgentData.OwnerID = folder.OwnerID; descendents.AgentData.Descendents = descendCount; @@ -324,7 +324,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) descendents.ItemData[j] = itemBlocks[splitPoints[i] + j]; - server.UDP.SendPacket(agent.AgentID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, descendents, PacketCategory.Inventory); } } } @@ -349,7 +349,7 @@ namespace Simian.Extensions for (int i = 0; i < fetch.InventoryData.Length; i++) { UUID itemID = fetch.InventoryData[i].ItemID; - Dictionary agentInventory = GetAgentInventory(agent.AgentID); + Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); blocks[i] = new FetchInventoryReplyPacket.InventoryDataBlock(); blocks[i].ItemID = itemID; @@ -398,13 +398,13 @@ namespace Simian.Extensions blocks.Length - splitPoints[i]; FetchInventoryReplyPacket reply = new FetchInventoryReplyPacket(); - reply.AgentData.AgentID = agent.AgentID; + reply.AgentData.AgentID = agent.Avatar.ID; reply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[count]; for (int j = 0; j < count; j++) reply.InventoryData[j] = blocks[splitPoints[i] + j]; - server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Inventory); } } @@ -436,9 +436,9 @@ namespace Simian.Extensions newName = item.Name; // Create the copy - CreateItem(agent.AgentID, newName, item.Description, item.InventoryType, item.AssetType, + CreateItem(agent.Avatar.ID, newName, item.Description, item.InventoryType, item.AssetType, item.AssetID, folderObj.ID, item.Permissions.OwnerMask, item.Permissions.NextOwnerMask, - agent.AgentID, item.CreatorID, UUID.Zero, block.CallbackID, true); + agent.Avatar.ID, item.CreatorID, UUID.Zero, block.CallbackID, true); } else { @@ -460,7 +460,7 @@ namespace Simian.Extensions MoveInventoryItemPacket move = (MoveInventoryItemPacket)packet; // TODO: What is move.AgentData.Stamp for? - Dictionary agentInventory = GetAgentInventory(agent.AgentID); + Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); for (int i = 0; i < move.InventoryData.Length; i++) { @@ -478,7 +478,7 @@ namespace Simian.Extensions MoveInventoryFolderPacket move = (MoveInventoryFolderPacket)packet; // TODO: What is move.AgentData.Stamp for? - Dictionary agentInventory = GetAgentInventory(agent.AgentID); + Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); for (int i = 0; i < move.InventoryData.Length; i++) { @@ -493,7 +493,7 @@ namespace Simian.Extensions void SendBulkUpdate(Agent agent, InventoryObject obj, UUID transactionID, uint callbackID) { BulkUpdateInventoryPacket update = new BulkUpdateInventoryPacket(); - update.AgentData.AgentID = agent.AgentID; + update.AgentData.AgentID = agent.Avatar.ID; update.AgentData.TransactionID = transactionID; if (obj is InventoryItem) @@ -541,7 +541,7 @@ namespace Simian.Extensions Logger.DebugLog("Sending bulk update for inventory object " + obj.ID); - server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.Inventory); } void MoveInventory(Agent agent, Dictionary agentInventory, UUID objectID, @@ -593,7 +593,7 @@ namespace Simian.Extensions { PurgeInventoryDescendentsPacket purge = (PurgeInventoryDescendentsPacket)packet; - Dictionary agentInventory = GetAgentInventory(agent.AgentID); + Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); InventoryObject obj; if (agentInventory.TryGetValue(purge.InventoryData.FolderID, out obj) && obj is InventoryFolder) diff --git a/Programs/Simian/Extensions/Messaging.cs b/Programs/Simian/Extensions/Messaging.cs index c0de013a..4410198d 100644 --- a/Programs/Simian/Extensions/Messaging.cs +++ b/Programs/Simian/Extensions/Messaging.cs @@ -39,8 +39,8 @@ namespace Simian.Extensions ChatFromSimulatorPacket chat = new ChatFromSimulatorPacket(); chat.ChatData.Audible = (byte)ChatAudibleLevel.Fully; chat.ChatData.ChatType = viewerChat.ChatData.Type; - chat.ChatData.OwnerID = agent.AgentID; - chat.ChatData.SourceID = agent.AgentID; + chat.ChatData.OwnerID = agent.Avatar.ID; + chat.ChatData.SourceID = agent.Avatar.ID; chat.ChatData.SourceType = (byte)ChatSourceType.Agent; chat.ChatData.Position = agent.Avatar.Position; chat.ChatData.FromName = Utils.StringToBytes(agent.Avatar.Name); @@ -70,15 +70,15 @@ namespace Simian.Extensions sendIM.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; sendIM.MessageBlock.Dialog = im.MessageBlock.Dialog; sendIM.MessageBlock.Offline = (byte)InstantMessageOnline.Online; - sendIM.MessageBlock.ID = agent.AgentID; + sendIM.MessageBlock.ID = agent.Avatar.ID; sendIM.MessageBlock.Message = im.MessageBlock.Message; sendIM.MessageBlock.BinaryBucket = new byte[0]; sendIM.MessageBlock.Timestamp = 0; sendIM.MessageBlock.Position = agent.Avatar.Position; - sendIM.AgentData.AgentID = agent.AgentID; + sendIM.AgentData.AgentID = agent.Avatar.ID; - server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); + server.UDP.SendPacket(recipient.Avatar.ID, sendIM, PacketCategory.Transaction); } } } diff --git a/Programs/Simian/Extensions/Money.cs b/Programs/Simian/Extensions/Money.cs index 8364360e..fd72d0b0 100644 --- a/Programs/Simian/Extensions/Money.cs +++ b/Programs/Simian/Extensions/Money.cs @@ -30,12 +30,12 @@ namespace Simian.Extensions void SendBalance(Agent agent, UUID transactionID, string message) { MoneyBalanceReplyPacket reply = new MoneyBalanceReplyPacket(); - reply.MoneyData.AgentID = agent.AgentID; + reply.MoneyData.AgentID = agent.Avatar.ID; reply.MoneyData.MoneyBalance = agent.Balance; reply.MoneyData.TransactionID = transactionID; reply.MoneyData.Description = Utils.StringToBytes(message); - server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); } void MoneyBalanceRequestHandler(Packet packet, Agent agent) diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index 69ed5b40..26705a77 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -125,7 +125,7 @@ namespace Simian.Extensions prim.GroupID = add.AgentData.GroupID; prim.ID = UUID.Random(); prim.MediaURL = String.Empty; - prim.OwnerID = agent.AgentID; + prim.OwnerID = agent.Avatar.ID; prim.Position = position; prim.PrimData.Material = (Material)add.ObjectData.Material; @@ -150,10 +150,10 @@ namespace Simian.Extensions prim.PrimData.PCode = pcode; prim.Properties.CreationDate = DateTime.Now; - prim.Properties.CreatorID = agent.AgentID; + prim.Properties.CreatorID = agent.Avatar.ID; prim.Properties.Description = String.Empty; prim.Properties.GroupID = add.AgentData.GroupID; - prim.Properties.LastOwnerID = agent.AgentID; + prim.Properties.LastOwnerID = agent.Avatar.ID; prim.Properties.Name = "New Object"; prim.Properties.ObjectID = prim.ID; prim.Properties.OwnerID = prim.OwnerID; @@ -200,7 +200,7 @@ namespace Simian.Extensions kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = dupeID; - server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.Avatar.ID, kill, PacketCategory.State); } } } @@ -246,7 +246,7 @@ namespace Simian.Extensions { properties.ObjectData[0].BaseMask = (uint)PermissionMask.All; properties.ObjectData[0].CreationDate = Utils.DateTimeToUnixTime(DateTime.Now); - properties.ObjectData[0].CreatorID = agent.AgentID; + properties.ObjectData[0].CreatorID = agent.Avatar.ID; properties.ObjectData[0].Description = Utils.StringToBytes(String.Empty); properties.ObjectData[0].EveryoneMask = (uint)PermissionMask.All; properties.ObjectData[0].GroupID = UUID.Zero; @@ -255,7 +255,7 @@ namespace Simian.Extensions properties.ObjectData[0].Name = Utils.StringToBytes(String.Empty); properties.ObjectData[0].NextOwnerMask = (uint)PermissionMask.All; properties.ObjectData[0].ObjectID = obj.Prim.ID; - properties.ObjectData[0].OwnerID = agent.AgentID; + properties.ObjectData[0].OwnerID = agent.Avatar.ID; properties.ObjectData[0].OwnerMask = (uint)PermissionMask.All; properties.ObjectData[0].OwnershipCost = 0; properties.ObjectData[0].SalePrice = 0; @@ -265,7 +265,7 @@ namespace Simian.Extensions properties.ObjectData[0].TouchName = new byte[0]; } - server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, properties, PacketCategory.Transaction); } else { @@ -282,7 +282,7 @@ namespace Simian.Extensions kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = select.ObjectData[i].ObjectLocalID; - server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.Avatar.ID, kill, PacketCategory.State); } } @@ -318,7 +318,7 @@ namespace Simian.Extensions //TODO: send an error message return; } - else if (obj.Prim.OwnerID != agent.AgentID) + else if (obj.Prim.OwnerID != agent.Avatar.ID) { //TODO: send an error message return; @@ -391,7 +391,7 @@ namespace Simian.Extensions //TODO: send an error message return; } - else if (obj.Prim.OwnerID != agent.AgentID) + else if (obj.Prim.OwnerID != agent.Avatar.ID) { //TODO: send an error message return; @@ -585,13 +585,13 @@ namespace Simian.Extensions break; case DeRezDestination.TrashFolder: InventoryObject invObj; - if (server.Inventory.TryGetInventory(agent.AgentID, derez.AgentBlock.DestinationID, out invObj) && + if (server.Inventory.TryGetInventory(agent.Avatar.ID, derez.AgentBlock.DestinationID, out invObj) && invObj is InventoryFolder) { // FIXME: Handle children InventoryFolder trash = (InventoryFolder)invObj; - server.Inventory.CreateItem(agent.AgentID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object, - AssetType.Object, obj.Prim.ID, trash.ID, PermissionMask.All, PermissionMask.All, agent.AgentID, + server.Inventory.CreateItem(agent.Avatar.ID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object, + AssetType.Object, obj.Prim.ID, trash.ID, PermissionMask.All, PermissionMask.All, agent.Avatar.ID, obj.Prim.Properties.CreatorID, derez.AgentBlock.TransactionID, 0, true); server.Scene.ObjectRemove(this, obj.Prim.LocalID); @@ -685,7 +685,7 @@ namespace Simian.Extensions kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = block.ObjectLocalID; - server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.Avatar.ID, kill, PacketCategory.State); } } } @@ -732,7 +732,7 @@ namespace Simian.Extensions props.ObjectData.Name = Utils.StringToBytes(String.Empty); props.ObjectData.NextOwnerMask = (uint)PermissionMask.All; props.ObjectData.ObjectID = obj.Prim.ID; - props.ObjectData.OwnerID = agent.AgentID; + props.ObjectData.OwnerID = agent.Avatar.ID; props.ObjectData.OwnerMask = (uint)PermissionMask.All; props.ObjectData.OwnershipCost = 0; props.ObjectData.RequestFlags = (uint)ReportType.None; @@ -740,7 +740,7 @@ namespace Simian.Extensions props.ObjectData.SaleType = (byte)SaleType.Not; } - server.UDP.SendPacket(agent.AgentID, props, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, props, PacketCategory.Transaction); } else { diff --git a/Programs/Simian/Extensions/ParcelManager.cs b/Programs/Simian/Extensions/ParcelManager.cs index e6235132..da810122 100644 --- a/Programs/Simian/Extensions/ParcelManager.cs +++ b/Programs/Simian/Extensions/ParcelManager.cs @@ -74,11 +74,11 @@ namespace Simian.Extensions if (parcels.TryGetValue(parcelOverlay[y * 64 + x], out parcel)) { // Set the ownership/sale flag - if (parcel.OwnerID == agent.AgentID) + if (parcel.OwnerID == agent.Avatar.ID) tempByte = (byte)ParcelOverlayType.OwnedBySelf; else if (parcel.AuctionID != 0) tempByte = (byte)ParcelOverlayType.Auction; - else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == agent.AgentID)) + else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == agent.Avatar.ID)) tempByte = (byte)ParcelOverlayType.ForSale; else if (parcel.GroupID != UUID.Zero) tempByte = (byte)ParcelOverlayType.OwnedByGroup; @@ -108,7 +108,7 @@ namespace Simian.Extensions ParcelOverlayPacket overlay = new ParcelOverlayPacket(); overlay.ParcelData.SequenceID = sequenceID; overlay.ParcelData.Data = byteArray; - server.UDP.SendPacket(agent.AgentID, overlay, PacketCategory.State); + server.UDP.SendPacket(agent.Avatar.ID, overlay, PacketCategory.State); byteArrayCount = 0; ++sequenceID; @@ -215,9 +215,9 @@ namespace Simian.Extensions properties.ParcelData.UserLookAt = parcel.UserLookAt; // HACK: Make everyone think they are the owner of this parcel - properties.ParcelData.OwnerID = agent.AgentID; + properties.ParcelData.OwnerID = agent.Avatar.ID; - server.UDP.SendPacket(agent.AgentID, properties, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, properties, PacketCategory.Transaction); } else { diff --git a/Programs/Simian/Extensions/Periscope.cs b/Programs/Simian/Extensions/Periscope.cs index 6c525c33..130040db 100644 --- a/Programs/Simian/Extensions/Periscope.cs +++ b/Programs/Simian/Extensions/Periscope.cs @@ -71,7 +71,7 @@ namespace Simian.Extensions { SimulationObject simObj = new SimulationObject(prim, server); if (MasterAgent != null) - simObj.Prim.OwnerID = MasterAgent.AgentID; + simObj.Prim.OwnerID = MasterAgent.Avatar.ID; server.Scene.ObjectAdd(this, simObj, PrimFlags.None); } @@ -85,14 +85,14 @@ namespace Simian.Extensions { // Add the avatar to both the agents list and the scene objects Agent agent = new Agent(); - agent.AgentID = avatar.ID; + agent.Avatar.ID = avatar.ID; agent.Avatar = avatar; agent.CurrentRegionHandle = server.RegionHandle; agent.FirstName = avatar.FirstName; agent.LastName = avatar.LastName; lock (server.Agents) - server.Agents[agent.AgentID] = agent; + server.Agents[agent.Avatar.ID] = agent; SimulationObject simObj = new SimulationObject(avatar, server); server.Scene.ObjectAdd(this, simObj, avatar.Flags); @@ -137,7 +137,7 @@ namespace Simian.Extensions server.Scene.AvatarAppearance(this, agent, te, vp); - if (agent.AgentID == client.Self.AgentID) + if (agent.Avatar.ID == client.Self.AgentID) server.Scene.AvatarAppearance(this, MasterAgent, te, vp); } else @@ -230,7 +230,7 @@ namespace Simian.Extensions { RegionHandshakePacket handshake = (RegionHandshakePacket)packet; - handshake.RegionInfo.SimOwner = (MasterAgent != null ? MasterAgent.AgentID : UUID.Zero); + handshake.RegionInfo.SimOwner = (MasterAgent != null ? MasterAgent.Avatar.ID : UUID.Zero); // TODO: Need more methods to manipulate the scene so we can apply these properties. // Right now this only gets sent out to people who are logged in when the master avatar @@ -355,7 +355,7 @@ namespace Simian.Extensions } } - if (MasterAgent == null || update.AgentData.AgentID == MasterAgent.AgentID) + if (MasterAgent == null || update.AgentData.AgentID == MasterAgent.Avatar.ID) { update.AgentData.AgentID = client.Self.AgentID; update.AgentData.SessionID = client.Self.SessionID; @@ -367,7 +367,7 @@ namespace Simian.Extensions { ObjectGrabPacket grab = (ObjectGrabPacket)packet; - if (MasterAgent == null || grab.AgentData.AgentID == MasterAgent.AgentID) + if (MasterAgent == null || grab.AgentData.AgentID == MasterAgent.Avatar.ID) { grab.AgentData.AgentID = client.Self.AgentID; grab.AgentData.SessionID = client.Self.SessionID; @@ -380,7 +380,7 @@ namespace Simian.Extensions { ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)packet; - if (MasterAgent == null || grabUpdate.AgentData.AgentID == MasterAgent.AgentID) + if (MasterAgent == null || grabUpdate.AgentData.AgentID == MasterAgent.Avatar.ID) { grabUpdate.AgentData.AgentID = client.Self.AgentID; grabUpdate.AgentData.SessionID = client.Self.SessionID; @@ -393,7 +393,7 @@ namespace Simian.Extensions { ObjectDeGrabPacket degrab = (ObjectDeGrabPacket)packet; - if (MasterAgent == null || degrab.AgentData.AgentID == MasterAgent.AgentID) + if (MasterAgent == null || degrab.AgentData.AgentID == MasterAgent.Avatar.ID) { degrab.AgentData.AgentID = client.Self.AgentID; degrab.AgentData.SessionID = client.Self.SessionID; @@ -406,7 +406,7 @@ namespace Simian.Extensions { ViewerEffectPacket effect = (ViewerEffectPacket)packet; - if (MasterAgent == null || effect.AgentData.AgentID == MasterAgent.AgentID) + if (MasterAgent == null || effect.AgentData.AgentID == MasterAgent.Avatar.ID) { effect.AgentData.AgentID = client.Self.AgentID; effect.AgentData.SessionID = client.Self.SessionID; @@ -419,7 +419,7 @@ namespace Simian.Extensions { AgentAnimationPacket animation = (AgentAnimationPacket)packet; - if (MasterAgent == null || animation.AgentData.AgentID == MasterAgent.AgentID) + if (MasterAgent == null || animation.AgentData.AgentID == MasterAgent.Avatar.ID) { animation.AgentData.AgentID = client.Self.AgentID; animation.AgentData.SessionID = client.Self.SessionID; diff --git a/Programs/Simian/Extensions/PeriscopeImageDelivery.cs b/Programs/Simian/Extensions/PeriscopeImageDelivery.cs index aea97a8c..1080fc28 100644 --- a/Programs/Simian/Extensions/PeriscopeImageDelivery.cs +++ b/Programs/Simian/Extensions/PeriscopeImageDelivery.cs @@ -108,7 +108,7 @@ namespace Simian.Extensions ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket(); notfound.ImageID.ID = id; - server.UDP.SendPacket(download.Agent.AgentID, notfound, PacketCategory.Texture); + server.UDP.SendPacket(download.Agent.Avatar.ID, notfound, PacketCategory.Texture); } } else @@ -147,7 +147,7 @@ namespace Simian.Extensions Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture); + server.UDP.SendPacket(agent.Avatar.ID, data, PacketCategory.Texture); // Check if ImagePacket packets need to be sent to complete this transfer if (download.CurrentPacket <= download.StopPacket) @@ -188,7 +188,7 @@ namespace Simian.Extensions imagePacketSize), Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture); + server.UDP.SendPacket(agent.Avatar.ID, transfer, PacketCategory.Texture); ++download.CurrentPacket; } diff --git a/Programs/Simian/Extensions/PeriscopeTransferManager.cs b/Programs/Simian/Extensions/PeriscopeTransferManager.cs index b0cf4d2d..1ff8ec9e 100644 --- a/Programs/Simian/Extensions/PeriscopeTransferManager.cs +++ b/Programs/Simian/Extensions/PeriscopeTransferManager.cs @@ -65,7 +65,7 @@ namespace Simian.Extensions complete.AssetBlock.Success = true; complete.AssetBlock.Type = request.AssetBlock.Type; complete.AssetBlock.UUID = assetID; - server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Inventory); } else { @@ -94,7 +94,7 @@ namespace Simian.Extensions lock (CurrentUploads) CurrentUploads[xfer.XferID.ID] = asset; - server.UDP.SendPacket(agent.AgentID, xfer, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, xfer, PacketCategory.Inventory); } } @@ -123,7 +123,7 @@ namespace Simian.Extensions ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket(); confirm.XferID.ID = xfer.XferID.ID; confirm.XferID.Packet = xfer.XferID.Packet; - server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, confirm, PacketCategory.Asset); } else { @@ -134,7 +134,7 @@ namespace Simian.Extensions ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket(); confirm.XferID.ID = xfer.XferID.ID; confirm.XferID.Packet = xfer.XferID.Packet; - server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, confirm, PacketCategory.Asset); if ((xfer.XferID.Packet & (uint)0x80000000) != 0) { @@ -150,7 +150,7 @@ namespace Simian.Extensions complete.AssetBlock.Success = true; complete.AssetBlock.Type = (sbyte)asset.AssetType; complete.AssetBlock.UUID = asset.AssetID; - server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Asset); } } } @@ -221,7 +221,7 @@ namespace Simian.Extensions lock (currentDownloads) { currentDownloads.Add(client.Assets.RequestAsset(assetID, type, false), - new KeyValuePair(agent.AgentID, request.TransferInfo.TransferID)); + new KeyValuePair(agent.Avatar.ID, request.TransferInfo.TransferID)); } } } @@ -286,7 +286,7 @@ namespace Simian.Extensions response.TransferInfo.Status = (int)StatusCode.OK; response.TransferInfo.TargetType = (int)TargetType.Unknown; // Doesn't seem to be used by the client - server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Asset); // Transfer system does not wait for ACKs, just sends all of the // packets for this transfer out @@ -310,7 +310,7 @@ namespace Simian.Extensions else transfer.TransferData.Status = (int)StatusCode.OK; - server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, transfer, PacketCategory.Asset); } } @@ -349,7 +349,7 @@ namespace Simian.Extensions response.TransferInfo.Status = (int)StatusCode.UnknownSource; response.TransferInfo.TargetType = (int)TargetType.Unknown; - server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Asset); } } else diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 00de2d6b..23acc7a7 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -90,8 +90,8 @@ namespace Simian.Extensions { foreach (Agent recipient in server.Agents.Values) { - if (recipient.AgentID != obj.Prim.OwnerID) - server.UDP.SendPacket(recipient.AgentID, updateToOthers, PacketCategory.State); + if (recipient.Avatar.ID != obj.Prim.OwnerID) + server.UDP.SendPacket(recipient.Avatar.ID, updateToOthers, PacketCategory.State); } } @@ -244,7 +244,7 @@ namespace Simian.Extensions foreach (Agent recipient in server.Agents.Values) { if (recipient != agent) - server.UDP.SendPacket(recipient.AgentID, appearance, PacketCategory.State); + server.UDP.SendPacket(recipient.Avatar.ID, appearance, PacketCategory.State); } } } @@ -286,7 +286,7 @@ namespace Simian.Extensions // Create a representation for this agent Avatar avatar = new Avatar(); - avatar.ID = agent.AgentID; + avatar.ID = agent.Avatar.ID; avatar.LocalID = (uint)Interlocked.Increment(ref currentLocalID); avatar.Position = new Vector3(128f, 128f, 25f); avatar.Rotation = Quaternion.Identity; @@ -317,7 +317,7 @@ namespace Simian.Extensions { // Send a response back to the client AgentMovementCompletePacket complete = new AgentMovementCompletePacket(); - complete.AgentData.AgentID = agent.AgentID; + complete.AgentData.AgentID = agent.Avatar.ID; complete.AgentData.SessionID = agent.SessionID; complete.Data.LookAt = Vector3.UnitX; complete.Data.Position = avatar.Position; @@ -325,7 +325,7 @@ namespace Simian.Extensions complete.Data.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now); complete.SimData.ChannelVersion = Utils.StringToBytes("Simian"); - server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Transaction); + server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Transaction); // Send updates and appearances for every avatar to this new avatar SynchronizeStateTo(agent); @@ -334,7 +334,7 @@ namespace Simian.Extensions OnlineNotificationPacket online = new OnlineNotificationPacket(); online.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[1]; online.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); - online.AgentBlock[0].AgentID = agent.AgentID; + online.AgentBlock[0].AgentID = agent.Avatar.ID; server.UDP.BroadcastPacket(online, PacketCategory.State); } else @@ -355,7 +355,7 @@ namespace Simian.Extensions { ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(obj.Prim, obj.Prim.RegionHandle, obj.Prim.Flags); - server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State); + server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.State); }); // Send appearances for all avatars @@ -367,7 +367,7 @@ namespace Simian.Extensions { // Send appearances for this avatar AvatarAppearancePacket appearance = BuildAppearancePacket(otherAgent); - server.UDP.SendPacket(agent.AgentID, appearance, PacketCategory.State); + server.UDP.SendPacket(agent.Avatar.ID, appearance, PacketCategory.State); } } } @@ -420,7 +420,7 @@ namespace Simian.Extensions int[] patches = new int[1]; patches[0] = (y * 16) + x; LayerDataPacket layer = TerrainCompressor.CreateLandPacket(heightmap, patches); - server.UDP.SendPacket(agent.AgentID, layer, PacketCategory.Terrain); + server.UDP.SendPacket(agent.Avatar.ID, layer, PacketCategory.Terrain); } } } @@ -430,7 +430,7 @@ namespace Simian.Extensions { AvatarAppearancePacket appearance = new AvatarAppearancePacket(); appearance.ObjectData.TextureEntry = agent.Avatar.Textures.ToBytes(); - appearance.Sender.ID = agent.AgentID; + appearance.Sender.ID = agent.Avatar.ID; appearance.Sender.IsTrial = false; appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[agent.VisualParams.Length]; diff --git a/Programs/Simian/Extensions/TransferManager.cs b/Programs/Simian/Extensions/TransferManager.cs index 1c647cb3..061139fd 100644 --- a/Programs/Simian/Extensions/TransferManager.cs +++ b/Programs/Simian/Extensions/TransferManager.cs @@ -60,7 +60,7 @@ namespace Simian.Extensions complete.AssetBlock.Success = true; complete.AssetBlock.Type = request.AssetBlock.Type; complete.AssetBlock.UUID = assetID; - server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Inventory); } else { @@ -89,7 +89,7 @@ namespace Simian.Extensions lock (CurrentUploads) CurrentUploads[xfer.XferID.ID] = asset; - server.UDP.SendPacket(agent.AgentID, xfer, PacketCategory.Inventory); + server.UDP.SendPacket(agent.Avatar.ID, xfer, PacketCategory.Inventory); } } @@ -118,7 +118,7 @@ namespace Simian.Extensions ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket(); confirm.XferID.ID = xfer.XferID.ID; confirm.XferID.Packet = xfer.XferID.Packet; - server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, confirm, PacketCategory.Asset); } else { @@ -129,7 +129,7 @@ namespace Simian.Extensions ConfirmXferPacketPacket confirm = new ConfirmXferPacketPacket(); confirm.XferID.ID = xfer.XferID.ID; confirm.XferID.Packet = xfer.XferID.Packet; - server.UDP.SendPacket(agent.AgentID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, confirm, PacketCategory.Asset); if ((xfer.XferID.Packet & (uint)0x80000000) != 0) { @@ -145,7 +145,7 @@ namespace Simian.Extensions complete.AssetBlock.Success = true; complete.AssetBlock.Type = (sbyte)asset.AssetType; complete.AssetBlock.UUID = asset.AssetID; - server.UDP.SendPacket(agent.AgentID, complete, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Asset); } } } @@ -221,7 +221,7 @@ namespace Simian.Extensions response.TransferInfo.Status = (int)StatusCode.OK; response.TransferInfo.TargetType = (int)TargetType.Unknown; // Doesn't seem to be used by the client - server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Asset); // Transfer system does not wait for ACKs, just sends all of the // packets for this transfer out @@ -245,7 +245,7 @@ namespace Simian.Extensions else transfer.TransferData.Status = (int)StatusCode.OK; - server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, transfer, PacketCategory.Asset); } } else @@ -265,7 +265,7 @@ namespace Simian.Extensions response.TransferInfo.Status = (int)StatusCode.UnknownSource; response.TransferInfo.TargetType = (int)TargetType.Unknown; - server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Asset); } } else if (source == SourceType.SimEstate) diff --git a/Programs/Simian/Extensions/UDPManager.cs b/Programs/Simian/Extensions/UDPManager.cs index e1a2166d..85681879 100644 --- a/Programs/Simian/Extensions/UDPManager.cs +++ b/Programs/Simian/Extensions/UDPManager.cs @@ -76,6 +76,8 @@ namespace Simian Simian server; UDPServer udpServer; + public event OutgoingPacketCallback OnOutgoingPacket; + public UDPManager() { } @@ -108,12 +110,14 @@ namespace Simian public void SendPacket(UUID agentID, Packet packet, PacketCategory category) { - udpServer.SendPacket(agentID, packet, category); + if (OnOutgoingPacket == null || OnOutgoingPacket(packet, agentID, category)) + udpServer.SendPacket(agentID, packet, category); } public void BroadcastPacket(Packet packet, PacketCategory category) { - udpServer.BroadcastPacket(packet, category); + if (OnOutgoingPacket == null || OnOutgoingPacket(packet, UUID.Zero, category)) + udpServer.BroadcastPacket(packet, category); } public void RegisterPacketCallback(PacketType type, PacketCallback callback) @@ -158,17 +162,17 @@ namespace Simian public void AddClient(Agent agent, IPEndPoint endpoint) { UDPClient client = new UDPClient(this, agent, endpoint); - clients.Add(agent.AgentID, endpoint, client); + clients.Add(agent.Avatar.ID, endpoint, client); } public bool RemoveClient(Agent agent) { UDPClient client; - if (clients.TryGetValue(agent.AgentID, out client)) + if (clients.TryGetValue(agent.Avatar.ID, out client)) { client.Shutdown(); - lock (server.Agents) server.Agents.Remove(agent.AgentID); - return clients.Remove(agent.AgentID, client.Address); + lock (server.Agents) server.Agents.Remove(agent.Avatar.ID); + return clients.Remove(agent.Avatar.ID, client.Address); } else return false; @@ -453,7 +457,7 @@ namespace Simian { // FIXME: Sanity check that the agent isn't already logged in here AddClient(agent, address); - if (clients.TryGetValue(agent.AgentID, out client)) + if (clients.TryGetValue(agent.Avatar.ID, out client)) { Logger.Log("Activated UDP circuit " + useCircuitCode.CircuitCode.Code, Helpers.LogLevel.Info); } @@ -596,7 +600,7 @@ namespace Simian if (unassociatedAgents.TryGetValue(circuitCode, out agent)) { unassociatedAgents.Remove(circuitCode); - lock (server.Agents) server.Agents[agent.AgentID] = agent; + lock (server.Agents) server.Agents[agent.Avatar.ID] = agent; return true; } else diff --git a/Programs/Simian/Interfaces/IUDPProvider.cs b/Programs/Simian/Interfaces/IUDPProvider.cs index f7351c4e..49ff50c4 100644 --- a/Programs/Simian/Interfaces/IUDPProvider.cs +++ b/Programs/Simian/Interfaces/IUDPProvider.cs @@ -31,9 +31,21 @@ namespace Simian /// of a registered type is received /// public delegate void PacketCallback(Packet packet, Agent agent); + /// + /// Triggered whenever a packet is going to be sent out to one or more + /// clients + /// + /// The packet that will be sent out + /// The UUID of the agent receiving this packet. Equal + /// to UUID.Zero if this packet will be broadcast to all connected agents + /// The specified category of the outgoing packet + /// True to continue sending this packet, otherwise false + public delegate bool OutgoingPacketCallback(Packet packet, UUID agentID, PacketCategory category); public interface IUDPProvider { + event OutgoingPacketCallback OnOutgoingPacket; + void AddClient(Agent agent, IPEndPoint endpoint); bool RemoveClient(Agent agent); uint CreateCircuit(Agent agent); diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 79920051..5d5b0805 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -299,7 +299,7 @@ namespace Simian IPAddress simIP = addresses.AddressList.Length > 0 ? addresses.AddressList[addresses.AddressList.Length - 1] :IPAddress.Loopback; - response.AgentID = agent.AgentID; + response.AgentID = agent.Avatar.ID; response.SecureSessionID = agent.SecureSessionID; response.SessionID = agent.SessionID; response.CircuitCode = agent.CircuitCode; diff --git a/prebuild.xml b/prebuild.xml index 212b7e31..d949463b 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -758,6 +758,30 @@ + + + + + ../../bin/ + + + + + ../../bin/ + + + + ../../bin/ + + + + + + + + + +