diff --git a/Programs/Simian.Tests/SceneManagerTests.cs b/Programs/Simian.Tests/SceneManagerTests.cs index 5aa9e76a..ffd06761 100644 --- a/Programs/Simian.Tests/SceneManagerTests.cs +++ b/Programs/Simian.Tests/SceneManagerTests.cs @@ -80,7 +80,7 @@ namespace SimianTests 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(receivedAgentID == agent.ID, "Agent ID mismatch"); Assert.That(receivedVisualParams.Length == 218, "VisualParams has an incorrect length"); for (int i = 0; i < 218; i++) @@ -95,13 +95,13 @@ namespace SimianTests } } - static Agent CreateDummyAgent() + Agent CreateDummyAgent() { - Agent agent = new Agent(); - agent.Avatar.ID = UUID.Random(); + Agent agent = new Agent(new SimulationObject(new Avatar(), simian)); + agent.Avatar.Prim.ID = UUID.Random(); agent.SessionID = UUID.Random(); - agent.Avatar.Position = new Vector3(128f, 128f, 40f); - agent.Avatar.Rotation = Quaternion.Identity; + agent.Avatar.Prim.Position = new Vector3(128f, 128f, 40f); + agent.Avatar.Prim.Rotation = Quaternion.Identity; return agent; } } diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 7ff4e0c0..278bb7eb 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -65,7 +65,7 @@ namespace Simian // Temporary [NonSerialized] - public Avatar Avatar = new Avatar(); + public SimulationObject Avatar; [NonSerialized] public UUID SessionID; [NonSerialized] @@ -85,7 +85,14 @@ namespace Simian [NonSerialized] public AnimationSet Animations = new AnimationSet(); [NonSerialized] - public PrimFlags Flags; + public AgentState State; + [NonSerialized] + public bool HideTitle; + + public UUID ID + { + get { return Avatar.Prim.ID; } + } public string FullName { @@ -105,26 +112,9 @@ namespace Simian } } - public Vector3 GetSimulatorPosition(ISceneProvider scene) + public Agent(SimulationObject avatar) { - SimulationObject parent; - Vector3 position = Avatar.Position; - - if (Avatar.ParentID != 0 && scene.TryGetObject(Avatar.ParentID, out parent)) - position += Vector3.Transform(parent.Prim.Position, Matrix4.CreateFromQuaternion(parent.Prim.Rotation)); - - return position; - } - - public Quaternion GetSimulatorRotation(ISceneProvider scene) - { - SimulationObject parent; - Quaternion rotation = Avatar.Rotation; - - if (Avatar.ParentID != 0 && scene.TryGetObject(Avatar.ParentID, out parent)) - rotation *= parent.Prim.Rotation; - - return rotation; + Avatar = avatar; } } } diff --git a/Programs/Simian/Extensions/AccountManager.cs b/Programs/Simian/Extensions/AccountManager.cs index 60a0b3e8..fb0e2f6a 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.Avatar.ID, agent); + accounts.Add(agent.FullName, agent.ID, agent); } public bool RemoveAccount(UUID agentID) @@ -47,9 +47,6 @@ namespace Simian.Extensions agent.SessionID = UUID.Random(); agent.SecureSessionID = UUID.Random(); - // Avatar flags - agent.Flags = PrimFlags.Physics; - return agent; } else @@ -79,7 +76,7 @@ namespace Simian.Extensions accounts.ForEach(delegate(Agent agent) { OSDMap agentMap = OSD.SerializeMembers(agent); - agentMap["AgentID"] = OSD.FromUUID(agent.Avatar.ID); + agentMap["AgentID"] = OSD.FromUUID(agent.ID); array.Add(agentMap); }); @@ -97,14 +94,17 @@ namespace Simian.Extensions for (int i = 0; i < array.Count; i++) { - Agent agent = new Agent(); + Avatar avatar = new Avatar(); + SimulationObject obj = new SimulationObject(avatar, server); + Agent agent = new Agent(obj); object agentRef = (object)agent; OSDMap map = array[i] as OSDMap; OSD.DeserializeMembers(ref agentRef, map); agent = (Agent)agentRef; - agent.Avatar.ID = map["AgentID"].AsUUID(); - accounts.Add(agent.FullName, agent.Avatar.ID, agent); + agent.Avatar.Prim.ID = map["AgentID"].AsUUID(); + + accounts.Add(agent.FullName, agent.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 8758f788..a86b38ab 100644 --- a/Programs/Simian/Extensions/AuthFreeForAll.cs +++ b/Programs/Simian/Extensions/AuthFreeForAll.cs @@ -29,64 +29,66 @@ namespace Simian.Extensions if (!server.Accounts.TryGetAccount(fullName, out agent)) { // Account doesn't exist, create it now - agent = new Agent(); + Avatar avatar = new Avatar(); + SimulationObject obj = new SimulationObject(avatar, server); + agent = new Agent(obj); agent.AccessLevel = "M"; - agent.Avatar.ID = UUID.Random(); + agent.Avatar.Prim.ID = UUID.Random(); agent.Balance = 1000; agent.CreationTime = Utils.DateTimeToUnixTime(DateTime.Now); agent.CurrentLookAt = Vector3.UnitZ; - agent.Avatar.Position = new Vector3(128f, 128f, 25f); + agent.Avatar.Prim.Position = new Vector3(128f, 128f, 25f); agent.CurrentRegionHandle = Utils.UIntsToLong(256 * server.Scene.RegionX, 256 * server.Scene.RegionY); agent.FirstName = firstName; agent.GodLevel = 0; agent.HomeLookAt = agent.CurrentLookAt; - agent.HomePosition = agent.Avatar.Position; + agent.HomePosition = agent.Avatar.Prim.Position; agent.HomeRegionHandle = agent.CurrentRegionHandle; agent.LastName = lastName; agent.PasswordHash = password; // Create a very basic inventory skeleton UUID rootFolder = UUID.Random(); - server.Inventory.CreateRootFolder(agent.Avatar.ID, rootFolder, "Inventory", agent.Avatar.ID); + server.Inventory.CreateRootFolder(agent.ID, rootFolder, "Inventory", agent.ID); UUID libraryRootFolder = UUID.Random(); - server.Inventory.CreateRootFolder(agent.Avatar.ID, libraryRootFolder, "Library", agent.Avatar.ID); + server.Inventory.CreateRootFolder(agent.ID, libraryRootFolder, "Library", agent.ID); agent.InventoryRoot = rootFolder; - agent.InventoryLibraryOwner = agent.Avatar.ID; + agent.InventoryLibraryOwner = agent.ID; agent.InventoryLibraryRoot = libraryRootFolder; // Create some inventory items for appearance UUID clothingFolder = UUID.Random(); - server.Inventory.CreateFolder(agent.Avatar.ID, clothingFolder, "Clothing", AssetType.Clothing, - agent.InventoryRoot, agent.Avatar.ID); + server.Inventory.CreateFolder(agent.ID, clothingFolder, "Clothing", AssetType.Clothing, + agent.InventoryRoot, agent.ID); UUID defaultOutfitFolder = UUID.Random(); - server.Inventory.CreateFolder(agent.Avatar.ID, defaultOutfitFolder, "Default Outfit", AssetType.Unknown, - clothingFolder, agent.Avatar.ID); + server.Inventory.CreateFolder(agent.ID, defaultOutfitFolder, "Default Outfit", AssetType.Unknown, + clothingFolder, agent.ID); UUID hairAsset = new UUID("dc675529-7ba5-4976-b91d-dcb9e5e36188"); - UUID hairItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Hair", "Default Hair", + UUID hairItem = server.Inventory.CreateItem(agent.ID, "Default Hair", "Default Hair", InventoryType.Wearable, AssetType.Bodypart, hairAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.ID, agent.ID, UUID.Random(), 0, false); UUID pantsAsset = new UUID("3e8ee2d6-4f21-4a55-832d-77daa505edff"); - UUID pantsItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Pants", "Default Pants", + UUID pantsItem = server.Inventory.CreateItem(agent.ID, "Default Pants", "Default Pants", InventoryType.Wearable, AssetType.Clothing, pantsAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.ID, agent.ID, UUID.Random(), 0, false); UUID shapeAsset = new UUID("530a2614-052e-49a2-af0e-534bb3c05af0"); - UUID shapeItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Shape", "Default Shape", + UUID shapeItem = server.Inventory.CreateItem(agent.ID, "Default Shape", "Default Shape", InventoryType.Wearable, AssetType.Clothing, shapeAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.ID, agent.ID, UUID.Random(), 0, false); UUID shirtAsset = new UUID("6a714f37-fe53-4230-b46f-8db384465981"); - UUID shirtItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Shirt", "Default Shirt", + UUID shirtItem = server.Inventory.CreateItem(agent.ID, "Default Shirt", "Default Shirt", InventoryType.Wearable, AssetType.Clothing, shirtAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.ID, agent.ID, UUID.Random(), 0, false); UUID skinAsset = new UUID("5f787f25-f761-4a35-9764-6418ee4774c4"); - UUID skinItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Skin", "Default Skin", + UUID skinItem = server.Inventory.CreateItem(agent.ID, "Default Skin", "Default Skin", InventoryType.Wearable, AssetType.Clothing, skinAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.ID, agent.ID, UUID.Random(), 0, false); UUID eyesAsset = new UUID("78d20332-9b07-44a2-bf74-3b368605f4b5"); - UUID eyesItem = server.Inventory.CreateItem(agent.Avatar.ID, "Default Eyes", "Default Eyes", + UUID eyesItem = server.Inventory.CreateItem(agent.ID, "Default Eyes", "Default Eyes", InventoryType.Wearable, AssetType.Bodypart, eyesAsset, defaultOutfitFolder, - PermissionMask.All, PermissionMask.All, agent.Avatar.ID, agent.Avatar.ID, UUID.Random(), 0, false); + PermissionMask.All, PermissionMask.All, agent.ID, agent.ID, UUID.Random(), 0, false); agent.HairItem = hairItem; agent.PantsItem = pantsItem; @@ -101,7 +103,7 @@ namespace Simian.Extensions } if (password == agent.PasswordHash) - return agent.Avatar.ID; + return agent.ID; else return UUID.Zero; } diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index 65412757..589449fa 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -71,19 +71,19 @@ namespace Simian.Extensions public void SendAnimations(Agent agent) { - server.Scene.ObjectAnimate(this, agent.Avatar.ID, agent.Avatar.ID, agent.Animations.GetAnimations()); + server.Scene.ObjectAnimate(this, agent.ID, agent.ID, agent.Animations.GetAnimations()); } public void TriggerSound(Agent agent, UUID soundID, float gain) { - server.Scene.TriggerSound(this, agent.Avatar.ID, agent.Avatar.ID, agent.Avatar.ID, soundID, agent.Avatar.Position, gain); + server.Scene.TriggerSound(this, agent.ID, agent.ID, agent.ID, soundID, agent.Avatar.Prim.Position, gain); } public void SendAlert(Agent agent, string message) { AlertMessagePacket alert = new AlertMessagePacket(); alert.AlertData.Message = Utils.StringToBytes(message); - server.UDP.SendPacket(agent.Avatar.ID, alert, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, alert, PacketCategory.Transaction); } void AgentAnimationHandler(Packet packet, Agent agent) @@ -135,7 +135,7 @@ namespace Simian.Extensions if (server.Scene.TryGetAgent(request.AgentData.AvatarID, out foundAgent)) { AvatarPropertiesReplyPacket reply = new AvatarPropertiesReplyPacket(); - reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.AgentID = agent.ID; reply.AgentData.AvatarID = request.AgentData.AvatarID; reply.PropertiesData.AboutText = Utils.StringToBytes(foundAgent.ProfileAboutText); reply.PropertiesData.BornOn = Utils.StringToBytes(foundAgent.ProfileBornOn); @@ -147,7 +147,7 @@ namespace Simian.Extensions reply.PropertiesData.PartnerID = foundAgent.PartnerID; reply.PropertiesData.ProfileURL = Utils.StringToBytes(foundAgent.ProfileURL); - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } else { @@ -175,19 +175,19 @@ namespace Simian.Extensions { Dictionary wearables = new Dictionary(); - 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); + TryAddWearable(agent.ID, wearables, WearableType.Shape, agent.ShapeItem); + TryAddWearable(agent.ID, wearables, WearableType.Skin, agent.SkinItem); + TryAddWearable(agent.ID, wearables, WearableType.Hair, agent.HairItem); + TryAddWearable(agent.ID, wearables, WearableType.Eyes, agent.EyesItem); + TryAddWearable(agent.ID, wearables, WearableType.Shirt, agent.ShirtItem); + TryAddWearable(agent.ID, wearables, WearableType.Pants, agent.PantsItem); + TryAddWearable(agent.ID, wearables, WearableType.Shoes, agent.ShoesItem); + TryAddWearable(agent.ID, wearables, WearableType.Socks, agent.SocksItem); + TryAddWearable(agent.ID, wearables, WearableType.Jacket, agent.JacketItem); + TryAddWearable(agent.ID, wearables, WearableType.Gloves, agent.GlovesItem); + TryAddWearable(agent.ID, wearables, WearableType.Undershirt, agent.UndershirtItem); + TryAddWearable(agent.ID, wearables, WearableType.Underpants, agent.UnderpantsItem); + TryAddWearable(agent.ID, wearables, WearableType.Skirt, agent.SkirtItem); return wearables; } @@ -195,7 +195,7 @@ namespace Simian.Extensions void SendWearables(Agent agent) { AgentWearablesUpdatePacket update = new AgentWearablesUpdatePacket(); - update.AgentData.AgentID = agent.Avatar.ID; + update.AgentData.AgentID = agent.ID; Dictionary wearables = GetCurrentWearables(agent); update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[wearables.Count]; @@ -216,7 +216,7 @@ namespace Simian.Extensions Logger.DebugLog(String.Format("Sending info about {0} wearables", wearables.Count)); - server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.Asset); + server.UDP.SendPacket(agent.ID, update, PacketCategory.Asset); } void AgentWearablesRequestHandler(Packet packet, Agent agent) @@ -316,7 +316,7 @@ namespace Simian.Extensions AgentCachedTexturePacket cached = (AgentCachedTexturePacket)packet; AgentCachedTextureResponsePacket response = new AgentCachedTextureResponsePacket(); - response.AgentData.AgentID = agent.Avatar.ID; + response.AgentData.AgentID = agent.ID; response.AgentData.SerialNum = cached.AgentData.SerialNum; response.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[cached.WearableData.Length]; @@ -332,7 +332,7 @@ namespace Simian.Extensions response.Header.Zerocoded = true; - server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, response, PacketCategory.Transaction); } void AgentHeightWidthHandler(Packet packet, Agent agent) @@ -377,7 +377,7 @@ namespace Simian.Extensions } } - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } void CoarseLocationTimer_Elapsed(object sender) @@ -390,11 +390,11 @@ namespace Simian.Extensions delegate(Agent agent) { CoarseLocationUpdatePacket.AgentDataBlock dataBlock = new CoarseLocationUpdatePacket.AgentDataBlock(); - dataBlock.AgentID = agent.Avatar.ID; + dataBlock.AgentID = agent.ID; CoarseLocationUpdatePacket.LocationBlock locationBlock = new CoarseLocationUpdatePacket.LocationBlock(); - locationBlock.X = (byte)agent.Avatar.Position.X; - locationBlock.Y = (byte)agent.Avatar.Position.Y; - locationBlock.Z = (byte)((int)agent.Avatar.Position.Z / 4); + locationBlock.X = (byte)agent.Avatar.Prim.Position.X; + locationBlock.Y = (byte)agent.Avatar.Prim.Position.Y; + locationBlock.Z = (byte)((int)agent.Avatar.Prim.Position.Z / 4); agentDatas.Add(dataBlock); agentLocations.Add(locationBlock); @@ -413,7 +413,7 @@ namespace Simian.Extensions int count = 0; for (int i = 0; i < agentDatas.Count; i++) { - if (agentDatas[i].AgentID != agent.Avatar.ID) + if (agentDatas[i].AgentID != agent.ID) ++count; } @@ -423,7 +423,7 @@ namespace Simian.Extensions int j = 0; for (int i = 0; i < agentDatas.Count; i++) { - if (agentDatas[i].AgentID != agent.Avatar.ID) + if (agentDatas[i].AgentID != agent.ID) { update.AgentData[j] = agentDatas[i]; update.Location[j] = agentLocations[i]; @@ -431,7 +431,7 @@ namespace Simian.Extensions } } - server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.State); + server.UDP.SendPacket(agent.ID, update, PacketCategory.State); } ); } diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs index 1ec2d551..81c817d4 100644 --- a/Programs/Simian/Extensions/ConnectionManagement.cs +++ b/Programs/Simian/Extensions/ConnectionManagement.cs @@ -55,7 +55,7 @@ namespace Simian.Extensions handshake.RegionInfo.TerrainStartHeight11 = 40f; handshake.RegionInfo2.RegionID = server.Scene.RegionID; - server.UDP.SendPacket(agent.Avatar.ID, handshake, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, handshake, PacketCategory.Transaction); } void StartPingCheckHandler(Packet packet, Agent agent) @@ -66,21 +66,21 @@ namespace Simian.Extensions complete.Header.Reliable = false; complete.PingID.PingID = start.PingID.PingID; - server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Overhead); + server.UDP.SendPacket(agent.ID, complete, PacketCategory.Overhead); } void LogoutRequestHandler(Packet packet, Agent agent) { LogoutReplyPacket reply = new LogoutReplyPacket(); - reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.AgentID = agent.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.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); - server.Scene.ObjectRemove(this, agent.Avatar.ID); + server.Scene.ObjectRemove(this, agent.ID); } } } diff --git a/Programs/Simian/Extensions/FriendManager.cs b/Programs/Simian/Extensions/FriendManager.cs index c94ba476..93324665 100644 --- a/Programs/Simian/Extensions/FriendManager.cs +++ b/Programs/Simian/Extensions/FriendManager.cs @@ -37,27 +37,27 @@ namespace Simian.Extensions if (server.Scene.TryGetAgent(im.MessageBlock.ToAgentID, out recipient)) { ImprovedInstantMessagePacket sendIM = new ImprovedInstantMessagePacket(); - sendIM.MessageBlock.RegionID = UUID.Random(); //FIXME + sendIM.MessageBlock.RegionID = server.Scene.RegionID; sendIM.MessageBlock.ParentEstateID = 1; sendIM.MessageBlock.FromGroup = false; - sendIM.MessageBlock.FromAgentName = Utils.StringToBytes(agent.Avatar.Name); + sendIM.MessageBlock.FromAgentName = Utils.StringToBytes(agent.FullName); sendIM.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; sendIM.MessageBlock.Dialog = im.MessageBlock.Dialog; sendIM.MessageBlock.Offline = (byte)InstantMessageOnline.Online; - sendIM.MessageBlock.ID = agent.Avatar.ID; + sendIM.MessageBlock.ID = agent.ID; sendIM.MessageBlock.Message = im.MessageBlock.Message; sendIM.MessageBlock.BinaryBucket = new byte[0]; sendIM.MessageBlock.Timestamp = 0; - sendIM.MessageBlock.Position = agent.Avatar.Position; + sendIM.MessageBlock.Position = agent.Avatar.GetSimulatorPosition(); - sendIM.AgentData.AgentID = agent.Avatar.ID; + sendIM.AgentData.AgentID = agent.ID; - server.UDP.SendPacket(recipient.Avatar.ID, sendIM, PacketCategory.Transaction); + server.UDP.SendPacket(recipient.ID, sendIM, PacketCategory.Transaction); if (dialog == InstantMessageDialog.FriendshipAccepted) { - bool receiverOnline = server.Scene.ContainsObject(agent.Avatar.ID); - bool senderOnline = server.Scene.ContainsObject(recipient.Avatar.ID); + bool receiverOnline = server.Scene.ContainsObject(agent.ID); + bool senderOnline = server.Scene.ContainsObject(recipient.ID); if (receiverOnline) { @@ -66,16 +66,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.Avatar.ID; - server.UDP.SendPacket(recipient.Avatar.ID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = agent.ID; + server.UDP.SendPacket(recipient.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.Avatar.ID; - server.UDP.SendPacket(recipient.Avatar.ID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = agent.ID; + server.UDP.SendPacket(recipient.ID, notify, PacketCategory.State); } } @@ -86,16 +86,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.Avatar.ID; - server.UDP.SendPacket(agent.Avatar.ID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = recipient.ID; + server.UDP.SendPacket(agent.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.Avatar.ID; - server.UDP.SendPacket(agent.Avatar.ID, notify, PacketCategory.State); + notify.AgentBlock[0].AgentID = recipient.ID; + server.UDP.SendPacket(agent.ID, notify, PacketCategory.State); } } } diff --git a/Programs/Simian/Extensions/ImageDelivery.cs b/Programs/Simian/Extensions/ImageDelivery.cs index 2e52199a..fce886cc 100644 --- a/Programs/Simian/Extensions/ImageDelivery.cs +++ b/Programs/Simian/Extensions/ImageDelivery.cs @@ -180,7 +180,7 @@ namespace Simian.Extensions ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket(); notfound.ImageID.ID = block.Image; - server.UDP.SendPacket(agent.Avatar.ID, notfound, PacketCategory.Texture); + server.UDP.SendPacket(agent.ID, notfound, PacketCategory.Texture); } } } @@ -217,7 +217,7 @@ namespace Simian.Extensions Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.Avatar.ID, data, PacketCategory.Texture); + server.UDP.SendPacket(agent.ID, data, PacketCategory.Texture); // Check if ImagePacket packets need to be sent to complete this transfer if (download.CurrentPacket <= download.StopPacket) @@ -258,7 +258,7 @@ namespace Simian.Extensions imagePacketSize), Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.Avatar.ID, transfer, PacketCategory.Texture); + server.UDP.SendPacket(agent.ID, transfer, PacketCategory.Texture); ++download.CurrentPacket; } diff --git a/Programs/Simian/Extensions/InventoryManager.cs b/Programs/Simian/Extensions/InventoryManager.cs index 891cd1ce..4e476dd4 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.Avatar.ID, Utils.BytesToString(create.InventoryBlock.Name), "Created in Simian", + CreateItem(agent.ID, Utils.BytesToString(create.InventoryBlock.Name), "Created in Simian", (InventoryType)create.InventoryBlock.InvType, assetType, assetID, parentID, - PermissionMask.All, (PermissionMask)create.InventoryBlock.NextOwnerMask, agent.Avatar.ID, - agent.Avatar.ID, create.InventoryBlock.TransactionID, create.InventoryBlock.CallbackID, true); + PermissionMask.All, (PermissionMask)create.InventoryBlock.NextOwnerMask, agent.ID, + agent.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.Avatar.ID, folderID, Utils.BytesToString(create.FolderData.Name), - (AssetType)create.FolderData.Type, create.FolderData.ParentID, agent.Avatar.ID); + CreateFolder(agent.ID, folderID, Utils.BytesToString(create.FolderData.Name), + (AssetType)create.FolderData.Type, create.FolderData.ParentID, agent.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.Avatar.ID); + Dictionary agentInventory = GetAgentInventory(agent.ID); InventoryObject obj; if (agentInventory.TryGetValue(block.ItemID, out obj) && obj is InventoryItem) @@ -163,7 +163,7 @@ namespace Simian.Extensions // TODO: Obey SortOrder //InventorySortOrder order = (InventorySortOrder)fetch.InventoryData.SortOrder; - Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); + Dictionary agentInventory = GetAgentInventory(agent.ID); // TODO: Use OwnerID // TODO: Do we need to obey InventorySortOrder? @@ -272,7 +272,7 @@ namespace Simian.Extensions folderBlocks.Length - splitPoints[i]; InventoryDescendentsPacket descendents = new InventoryDescendentsPacket(); - descendents.AgentData.AgentID = agent.Avatar.ID; + descendents.AgentData.AgentID = agent.ID; descendents.AgentData.FolderID = folder.ID; descendents.AgentData.OwnerID = folder.OwnerID; descendents.AgentData.Descendents = descendCount; @@ -283,7 +283,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) descendents.FolderData[j] = folderBlocks[splitPoints[i] + j]; - server.UDP.SendPacket(agent.Avatar.ID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, descendents, PacketCategory.Inventory); } } else @@ -291,7 +291,7 @@ namespace Simian.Extensions Logger.DebugLog("Sending a single InventoryDescendents for folders"); InventoryDescendentsPacket descendents = new InventoryDescendentsPacket(); - descendents.AgentData.AgentID = agent.Avatar.ID; + descendents.AgentData.AgentID = agent.ID; descendents.AgentData.FolderID = folder.ID; descendents.AgentData.OwnerID = folder.OwnerID; descendents.AgentData.Descendents = descendCount; @@ -299,7 +299,7 @@ namespace Simian.Extensions descendents.FolderData = new InventoryDescendentsPacket.FolderDataBlock[0]; descendents.ItemData = new InventoryDescendentsPacket.ItemDataBlock[0]; - server.UDP.SendPacket(agent.Avatar.ID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, descendents, PacketCategory.Inventory); } if (itemBlocks.Length > 0) @@ -314,7 +314,7 @@ namespace Simian.Extensions itemBlocks.Length - splitPoints[i]; InventoryDescendentsPacket descendents = new InventoryDescendentsPacket(); - descendents.AgentData.AgentID = agent.Avatar.ID; + descendents.AgentData.AgentID = agent.ID; descendents.AgentData.FolderID = folder.ID; descendents.AgentData.OwnerID = folder.OwnerID; descendents.AgentData.Descendents = descendCount; @@ -325,7 +325,7 @@ namespace Simian.Extensions for (int j = 0; j < count; j++) descendents.ItemData[j] = itemBlocks[splitPoints[i] + j]; - server.UDP.SendPacket(agent.Avatar.ID, descendents, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, descendents, PacketCategory.Inventory); } } } @@ -350,7 +350,7 @@ namespace Simian.Extensions for (int i = 0; i < fetch.InventoryData.Length; i++) { UUID itemID = fetch.InventoryData[i].ItemID; - Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); + Dictionary agentInventory = GetAgentInventory(agent.ID); blocks[i] = new FetchInventoryReplyPacket.InventoryDataBlock(); blocks[i].ItemID = itemID; @@ -399,13 +399,13 @@ namespace Simian.Extensions blocks.Length - splitPoints[i]; FetchInventoryReplyPacket reply = new FetchInventoryReplyPacket(); - reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.AgentID = agent.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.Avatar.ID, reply, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Inventory); } } @@ -437,9 +437,9 @@ namespace Simian.Extensions newName = item.Name; // Create the copy - CreateItem(agent.Avatar.ID, newName, item.Description, item.InventoryType, item.AssetType, + CreateItem(agent.ID, newName, item.Description, item.InventoryType, item.AssetType, item.AssetID, folderObj.ID, item.Permissions.OwnerMask, item.Permissions.NextOwnerMask, - agent.Avatar.ID, item.CreatorID, UUID.Zero, block.CallbackID, true); + agent.ID, item.CreatorID, UUID.Zero, block.CallbackID, true); } else { @@ -461,7 +461,7 @@ namespace Simian.Extensions MoveInventoryItemPacket move = (MoveInventoryItemPacket)packet; // TODO: What is move.AgentData.Stamp for? - Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); + Dictionary agentInventory = GetAgentInventory(agent.ID); for (int i = 0; i < move.InventoryData.Length; i++) { @@ -479,7 +479,7 @@ namespace Simian.Extensions MoveInventoryFolderPacket move = (MoveInventoryFolderPacket)packet; // TODO: What is move.AgentData.Stamp for? - Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); + Dictionary agentInventory = GetAgentInventory(agent.ID); for (int i = 0; i < move.InventoryData.Length; i++) { @@ -494,7 +494,7 @@ namespace Simian.Extensions void SendBulkUpdate(Agent agent, InventoryObject obj, UUID transactionID, uint callbackID) { BulkUpdateInventoryPacket update = new BulkUpdateInventoryPacket(); - update.AgentData.AgentID = agent.Avatar.ID; + update.AgentData.AgentID = agent.ID; update.AgentData.TransactionID = transactionID; if (obj is InventoryItem) @@ -542,7 +542,7 @@ namespace Simian.Extensions Logger.DebugLog("Sending bulk update for inventory object " + obj.ID); - server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, update, PacketCategory.Inventory); } void MoveInventory(Agent agent, Dictionary agentInventory, UUID objectID, @@ -594,7 +594,7 @@ namespace Simian.Extensions { PurgeInventoryDescendentsPacket purge = (PurgeInventoryDescendentsPacket)packet; - Dictionary agentInventory = GetAgentInventory(agent.Avatar.ID); + Dictionary agentInventory = GetAgentInventory(agent.ID); InventoryObject obj; if (agentInventory.TryGetValue(purge.InventoryData.FolderID, out obj) && obj is InventoryFolder) diff --git a/Programs/Simian/Extensions/LindenLogin.cs b/Programs/Simian/Extensions/LindenLogin.cs index 021245f1..175a93bd 100644 --- a/Programs/Simian/Extensions/LindenLogin.cs +++ b/Programs/Simian/Extensions/LindenLogin.cs @@ -203,7 +203,7 @@ namespace Simian.Extensions agent.CurrentRegionHandle = server.Scene.RegionHandle; agent.HomeRegionHandle = server.Scene.RegionHandle; - response.AgentID = agent.Avatar.ID; + response.AgentID = agent.ID; response.SecureSessionID = agent.SecureSessionID; response.SessionID = agent.SessionID; response.CircuitCode = agent.CircuitCode; diff --git a/Programs/Simian/Extensions/MapLocal.cs b/Programs/Simian/Extensions/MapLocal.cs index a37b6266..3ec49dec 100644 --- a/Programs/Simian/Extensions/MapLocal.cs +++ b/Programs/Simian/Extensions/MapLocal.cs @@ -47,7 +47,7 @@ namespace Simian.Extensions GridLayerType type = (GridLayerType)request.AgentData.Flags; MapLayerReplyPacket reply = new MapLayerReplyPacket(); - reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.AgentID = agent.ID; reply.AgentData.Flags = (uint)type; reply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1]; reply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock(); @@ -57,7 +57,7 @@ namespace Simian.Extensions reply.LayerData[0].Right = UInt16.MaxValue; reply.LayerData[0].ImageID = new UUID("89556747-24cb-43ed-920b-47caed15465f"); - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } void MapBlockRequestHandler(Packet packet, Agent agent) @@ -66,7 +66,7 @@ namespace Simian.Extensions GridLayerType type = (GridLayerType)request.AgentData.Flags; MapBlockReplyPacket reply = new MapBlockReplyPacket(); - reply.AgentData.AgentID = agent.Avatar.ID; + reply.AgentData.AgentID = agent.ID; reply.AgentData.Flags = (uint)type; reply.Data = new MapBlockReplyPacket.DataBlock[2]; @@ -91,7 +91,7 @@ namespace Simian.Extensions reply.Data[1].X = (ushort)(server.Scene.RegionX + 1); reply.Data[1].Y = (ushort)server.Scene.RegionY; - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } void TeleportRequestHandler(Packet packet, Agent agent) @@ -103,26 +103,26 @@ namespace Simian.Extensions if (request.Info.RegionID == server.Scene.RegionID) { // Local teleport - agent.Avatar.Position = request.Info.Position; + agent.Avatar.Prim.Position = request.Info.Position; agent.CurrentLookAt = request.Info.LookAt; TeleportLocalPacket reply = new TeleportLocalPacket(); - reply.Info.AgentID = agent.Avatar.ID; + reply.Info.AgentID = agent.ID; reply.Info.LocationID = 0; // Unused by the client reply.Info.LookAt = agent.CurrentLookAt; - reply.Info.Position = agent.Avatar.Position; + reply.Info.Position = agent.Avatar.Prim.Position; // TODO: Need a "Flying" boolean for Agent reply.Info.TeleportFlags = (uint)TeleportFlags.ViaRegionID; - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } else { TeleportFailedPacket reply = new TeleportFailedPacket(); - reply.Info.AgentID = agent.Avatar.ID; + reply.Info.AgentID = agent.ID; reply.Info.Reason = Utils.StringToBytes("Unknown region"); - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } } @@ -135,18 +135,18 @@ namespace Simian.Extensions if (request.Info.RegionHandle == server.Scene.RegionHandle) { // Local teleport - agent.Avatar.Position = request.Info.Position; + agent.Avatar.Prim.Position = request.Info.Position; agent.CurrentLookAt = request.Info.LookAt; TeleportLocalPacket reply = new TeleportLocalPacket(); - reply.Info.AgentID = agent.Avatar.ID; + reply.Info.AgentID = agent.ID; reply.Info.LocationID = 0; // Unused by the client reply.Info.LookAt = agent.CurrentLookAt; - reply.Info.Position = agent.Avatar.Position; + reply.Info.Position = agent.Avatar.Prim.Position; // TODO: Need a "Flying" boolean for Agent reply.Info.TeleportFlags = (uint)TeleportFlags.ViaLocation; - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } else if (request.Info.RegionHandle == Utils.UIntsToLong((server.Scene.RegionX + 1) * 256, server.Scene.RegionY * 256)) { @@ -156,10 +156,10 @@ namespace Simian.Extensions else { TeleportFailedPacket reply = new TeleportFailedPacket(); - reply.Info.AgentID = agent.Avatar.ID; + reply.Info.AgentID = agent.ID; reply.Info.Reason = Utils.StringToBytes("Unknown region"); - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } } @@ -203,7 +203,7 @@ namespace Simian.Extensions link.RegionName, x, y, destination), Helpers.LogLevel.Info); OSDMap info = new OSDMap(); - info.Add("AgentID", OSD.FromUUID(agent.Avatar.ID)); + info.Add("AgentID", OSD.FromUUID(agent.ID)); info.Add("LocationID", OSD.FromInteger(4)); // Unused by the client info.Add("RegionHandle", OSD.FromULong(link.RegionHandle)); info.Add("SeedCapability", OSD.FromUri(seedCap)); @@ -226,7 +226,7 @@ namespace Simian.Extensions Helpers.LogLevel.Warning); TeleportFinishPacket teleport = new TeleportFinishPacket(); - teleport.Info.AgentID = agent.Avatar.ID; + teleport.Info.AgentID = agent.ID; teleport.Info.LocationID = 0; // Unused by the client teleport.Info.RegionHandle = link.RegionHandle; teleport.Info.SeedCapability = Utils.StringToBytes(seedCap.ToString()); @@ -235,11 +235,11 @@ namespace Simian.Extensions teleport.Info.SimPort = (ushort)link.UDPPort; teleport.Info.TeleportFlags = (uint)TeleportFlags.ViaLocation; - server.UDP.SendPacket(agent.Avatar.ID, teleport, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, teleport, PacketCategory.Transaction); } // Remove the agent from the local scene (will also tear down the UDP connection) - //server.Scene.ObjectRemove(this, agent.Avatar.ID); + //server.Scene.ObjectRemove(this, agent.ID); return true; } @@ -401,7 +401,7 @@ namespace Simian.Extensions WriteStringMember(writer, "secure_session_id", agent.SecureSessionID.ToString()); WriteStringMember(writer, "firstname", agent.FirstName); WriteStringMember(writer, "lastname", agent.LastName); - WriteStringMember(writer, "agent_id", agent.Avatar.ID.ToString()); + WriteStringMember(writer, "agent_id", agent.ID.ToString()); WriteStringMember(writer, "circuit_code", agent.CircuitCode.ToString()); WriteStringMember(writer, "startpos_x", destPos.X.ToString(Utils.EnUsCulture)); WriteStringMember(writer, "startpos_y", destPos.Y.ToString(Utils.EnUsCulture)); @@ -513,10 +513,10 @@ namespace Simian.Extensions { try { - destination = new Uri(destination, "/agent/" + agent.Avatar.ID.ToString() + "/"); + destination = new Uri(destination, "/agent/" + agent.ID.ToString() + "/"); OSDMap args = new OSDMap(); - args["agent_id"] = OSD.FromUUID(agent.Avatar.ID); + args["agent_id"] = OSD.FromUUID(agent.ID); args["base_folder"] = OSD.FromUUID(UUID.Zero); args["caps_path"] = OSD.FromString(seedCapFragment); args["children_seeds"] = OSD.FromBoolean(false); @@ -565,11 +565,11 @@ namespace Simian.Extensions void TeleportProgress(Agent agent, string message, TeleportFlags flags) { TeleportProgressPacket progress = new TeleportProgressPacket(); - progress.AgentData.AgentID = agent.Avatar.ID; + progress.AgentData.AgentID = agent.ID; progress.Info.Message = Utils.StringToBytes(message); progress.Info.TeleportFlags = (uint)flags; - server.UDP.SendPacket(agent.Avatar.ID, progress, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, progress, PacketCategory.Transaction); } static void WriteStringMember(XmlWriter writer, string name, string value) diff --git a/Programs/Simian/Extensions/Messaging.cs b/Programs/Simian/Extensions/Messaging.cs index b372c558..6d17337d 100644 --- a/Programs/Simian/Extensions/Messaging.cs +++ b/Programs/Simian/Extensions/Messaging.cs @@ -30,8 +30,8 @@ namespace Simian.Extensions { ChatFromViewerPacket viewerChat = (ChatFromViewerPacket)packet; - server.Scene.ObjectChat(this, agent.Avatar.ID, agent.Avatar.ID, ChatAudibleLevel.Fully, (ChatType)viewerChat.ChatData.Type, - ChatSourceType.Agent, agent.Avatar.Name, agent.GetSimulatorPosition(server.Scene), viewerChat.ChatData.Channel, + server.Scene.ObjectChat(this, agent.ID, agent.ID, ChatAudibleLevel.Fully, (ChatType)viewerChat.ChatData.Type, + ChatSourceType.Agent, agent.FullName, agent.Avatar.GetSimulatorPosition(), viewerChat.ChatData.Channel, Utils.BytesToString(viewerChat.ChatData.Message)); } @@ -51,19 +51,19 @@ namespace Simian.Extensions sendIM.MessageBlock.RegionID = server.Scene.RegionID; sendIM.MessageBlock.ParentEstateID = 1; sendIM.MessageBlock.FromGroup = false; - sendIM.MessageBlock.FromAgentName = Utils.StringToBytes(agent.Avatar.Name); + sendIM.MessageBlock.FromAgentName = Utils.StringToBytes(agent.FullName); sendIM.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; sendIM.MessageBlock.Dialog = im.MessageBlock.Dialog; sendIM.MessageBlock.Offline = (byte)InstantMessageOnline.Online; - sendIM.MessageBlock.ID = agent.Avatar.ID; + sendIM.MessageBlock.ID = agent.ID; sendIM.MessageBlock.Message = im.MessageBlock.Message; sendIM.MessageBlock.BinaryBucket = new byte[0]; sendIM.MessageBlock.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now); - sendIM.MessageBlock.Position = agent.GetSimulatorPosition(server.Scene); + sendIM.MessageBlock.Position = agent.Avatar.GetSimulatorPosition(); - sendIM.AgentData.AgentID = agent.Avatar.ID; + sendIM.AgentData.AgentID = agent.ID; - server.UDP.SendPacket(recipient.Avatar.ID, sendIM, PacketCategory.Messaging); + server.UDP.SendPacket(recipient.ID, sendIM, PacketCategory.Messaging); } } } diff --git a/Programs/Simian/Extensions/Money.cs b/Programs/Simian/Extensions/Money.cs index 56a4b2fd..018fd7eb 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.Avatar.ID; + reply.MoneyData.AgentID = agent.ID; reply.MoneyData.MoneyBalance = agent.Balance; reply.MoneyData.TransactionID = transactionID; reply.MoneyData.Description = Utils.StringToBytes(message); - server.UDP.SendPacket(agent.Avatar.ID, reply, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, reply, PacketCategory.Transaction); } void MoneyBalanceRequestHandler(Packet packet, Agent agent) @@ -59,10 +59,9 @@ namespace Simian.Extensions agent.Balance -= request.MoneyData.Amount; recipient.Balance += request.MoneyData.Amount; - SendBalance(agent, UUID.Zero, String.Format("You paid L${0} to {1}.", request.MoneyData.Amount, recipient.Avatar.Name)); - SendBalance(agent, UUID.Zero, String.Format("{1} paid you L${0}.", request.MoneyData.Amount, agent.Avatar.Name)); + SendBalance(agent, UUID.Zero, String.Format("You paid L${0} to {1}.", request.MoneyData.Amount, recipient.FullName)); + SendBalance(agent, UUID.Zero, String.Format("{1} paid you L${0}.", request.MoneyData.Amount, agent.FullName)); } } - } } diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index bcb75341..ac198ed6 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -76,7 +76,7 @@ namespace Simian.Extensions bool animsChanged = false; // Create forward and left vectors from the current avatar rotation - Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(agent.Avatar.Rotation); + Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(agent.Avatar.Prim.Rotation); Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix); Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); @@ -110,7 +110,7 @@ namespace Simian.Extensions if ((heldForward || heldBack) && (heldLeft || heldRight)) speed /= SQRT_TWO; - Vector3 agentPosition = agent.GetSimulatorPosition(server.Scene); + Vector3 agentPosition = agent.Avatar.GetSimulatorPosition(); float oldFloor = server.Scene.GetTerrainHeightAt(agentPosition.X, agentPosition.Y); agentPosition += (move * speed); @@ -121,7 +121,7 @@ namespace Simian.Extensions // least possible distance from avatar to the ground // TODO: calculate to get rid of "bot squat" - float lowerLimit = newFloor + agent.Avatar.Scale.Z / 2; + float lowerLimit = newFloor + agent.Avatar.Prim.Scale.Z / 2; // TODO: check our Z (minus height/2) compared to all the prim // bounding boxes, and define a new lowerLimit as a hack for platforms @@ -129,7 +129,7 @@ namespace Simian.Extensions // Z acceleration resulting from gravity float gravity = 0f; - float waterChestHeight = server.Scene.WaterHeight - (agent.Avatar.Scale.Z * .33f); + float waterChestHeight = server.Scene.WaterHeight - (agent.Avatar.Prim.Scale.Z * .33f); if (flying) { @@ -137,12 +137,12 @@ namespace Simian.Extensions agent.TickJump = 0; //velocity falloff while flying - agent.Avatar.Velocity.X *= 0.66f; - agent.Avatar.Velocity.Y *= 0.66f; - agent.Avatar.Velocity.Z *= 0.33f; + agent.Avatar.Prim.Velocity.X *= 0.66f; + agent.Avatar.Prim.Velocity.Y *= 0.66f; + agent.Avatar.Prim.Velocity.Z *= 0.33f; - if (agent.Avatar.Position.Z == lowerLimit) - agent.Avatar.Velocity.Z += INITIAL_HOVER_IMPULSE; + if (agent.Avatar.Prim.Position.Z == lowerLimit) + agent.Avatar.Prim.Velocity.Z += INITIAL_HOVER_IMPULSE; if (move.X != 0 || move.Y != 0) { //flying horizontally @@ -166,18 +166,18 @@ namespace Simian.Extensions } } - else if (agent.Avatar.Position.Z > lowerLimit + FALL_FORGIVENESS || agent.Avatar.Position.Z <= waterChestHeight) + else if (agent.Avatar.Prim.Position.Z > lowerLimit + FALL_FORGIVENESS || agent.Avatar.Prim.Position.Z <= waterChestHeight) { //falling, floating, or landing from a jump - if (agent.Avatar.Position.Z > server.Scene.WaterHeight) + if (agent.Avatar.Prim.Position.Z > server.Scene.WaterHeight) { //above water move = Vector3.Zero; //override controls while drifting - agent.Avatar.Velocity *= 0.95f; //keep most of our inertia + agent.Avatar.Prim.Velocity *= 0.95f; //keep most of our inertia float fallElapsed = (float)(Environment.TickCount - agent.TickFall) / 1000f; - if (agent.TickFall == 0 || (fallElapsed > FALL_DELAY && agent.Avatar.Velocity.Z >= 0f)) + if (agent.TickFall == 0 || (fallElapsed > FALL_DELAY && agent.Avatar.Prim.Velocity.Z >= 0f)) { //just started falling agent.TickFall = Environment.TickCount; } @@ -195,13 +195,13 @@ namespace Simian.Extensions } } } - else if (agent.Avatar.Position.Z >= waterChestHeight) + else if (agent.Avatar.Prim.Position.Z >= waterChestHeight) { //at the water line gravity = 0f; - agent.Avatar.Velocity *= 0.5f; - agent.Avatar.Velocity.Z = 0f; - if (move.Z < 1) agent.Avatar.Position.Z = waterChestHeight; + agent.Avatar.Prim.Velocity *= 0.5f; + agent.Avatar.Prim.Velocity.Z = 0f; + if (move.Z < 1) agent.Avatar.Prim.Position.Z = waterChestHeight; if (move.Z > 0) { @@ -223,8 +223,8 @@ namespace Simian.Extensions { //underwater gravity = 0f; //buoyant - agent.Avatar.Velocity *= 0.5f * seconds; - agent.Avatar.Velocity.Z += 0.75f * seconds; + agent.Avatar.Prim.Velocity *= 0.5f * seconds; + agent.Avatar.Prim.Velocity.Z += 0.75f * seconds; if (server.Avatars.SetDefaultAnimation(agent, Animations.FALLDOWN)) animsChanged = true; @@ -236,10 +236,10 @@ namespace Simian.Extensions agent.TickFall = 0; //friction - agent.Avatar.Acceleration *= 0.2f; - agent.Avatar.Velocity *= 0.2f; + agent.Avatar.Prim.Acceleration *= 0.2f; + agent.Avatar.Prim.Velocity *= 0.2f; - agent.Avatar.Position.Z = lowerLimit; + agent.Avatar.Prim.Position.Z = lowerLimit; if (move.Z > 0) { //jumping @@ -264,9 +264,9 @@ namespace Simian.Extensions if (server.Avatars.SetDefaultAnimation(agent, Animations.JUMP)) animsChanged = true; - agent.Avatar.Velocity.X += agent.Avatar.Acceleration.X * JUMP_IMPULSE_HORIZONTAL; - agent.Avatar.Velocity.Y += agent.Avatar.Acceleration.Y * JUMP_IMPULSE_HORIZONTAL; - agent.Avatar.Velocity.Z = JUMP_IMPULSE_VERTICAL * seconds; + agent.Avatar.Prim.Velocity.X += agent.Avatar.Prim.Acceleration.X * JUMP_IMPULSE_HORIZONTAL; + agent.Avatar.Prim.Velocity.Y += agent.Avatar.Prim.Acceleration.Y * JUMP_IMPULSE_HORIZONTAL; + agent.Avatar.Prim.Velocity.Z = JUMP_IMPULSE_VERTICAL * seconds; agent.TickJump = -1; //flag that we are currently jumping } @@ -321,29 +321,29 @@ namespace Simian.Extensions // static acceleration when any control is held, otherwise none if (moving) { - agent.Avatar.Acceleration = move * speed; - if (agent.Avatar.Acceleration.Z < -maxVel) - agent.Avatar.Acceleration.Z = -maxVel; - else if (agent.Avatar.Acceleration.Z > maxVel) - agent.Avatar.Acceleration.Z = maxVel; + agent.Avatar.Prim.Acceleration = move * speed; + if (agent.Avatar.Prim.Acceleration.Z < -maxVel) + agent.Avatar.Prim.Acceleration.Z = -maxVel; + else if (agent.Avatar.Prim.Acceleration.Z > maxVel) + agent.Avatar.Prim.Acceleration.Z = maxVel; } - else agent.Avatar.Acceleration = Vector3.Zero; + else agent.Avatar.Prim.Acceleration = Vector3.Zero; - agent.Avatar.Velocity += agent.Avatar.Acceleration - new Vector3(0f, 0f, gravity); - if (agent.Avatar.Velocity.Z < -maxVel) - agent.Avatar.Velocity.Z = -maxVel; - else if (agent.Avatar.Velocity.Z > maxVel) - agent.Avatar.Velocity.Z = maxVel; + agent.Avatar.Prim.Velocity += agent.Avatar.Prim.Acceleration - new Vector3(0f, 0f, gravity); + if (agent.Avatar.Prim.Velocity.Z < -maxVel) + agent.Avatar.Prim.Velocity.Z = -maxVel; + else if (agent.Avatar.Prim.Velocity.Z > maxVel) + agent.Avatar.Prim.Velocity.Z = maxVel; - agent.Avatar.Position += agent.Avatar.Velocity; + agent.Avatar.Prim.Position += agent.Avatar.Prim.Velocity; - if (agent.Avatar.Position.X < 0) agent.Avatar.Position.X = 0f; - else if (agent.Avatar.Position.X > 255) agent.Avatar.Position.X = 255f; + if (agent.Avatar.Prim.Position.X < 0) agent.Avatar.Prim.Position.X = 0f; + else if (agent.Avatar.Prim.Position.X > 255) agent.Avatar.Prim.Position.X = 255f; - if (agent.Avatar.Position.Y < 0) agent.Avatar.Position.Y = 0f; - else if (agent.Avatar.Position.Y > 255) agent.Avatar.Position.Y = 255f; + if (agent.Avatar.Prim.Position.Y < 0) agent.Avatar.Prim.Position.Y = 0f; + else if (agent.Avatar.Prim.Position.Y > 255) agent.Avatar.Prim.Position.Y = 255f; - if (agent.Avatar.Position.Z < lowerLimit) agent.Avatar.Position.Z = lowerLimit; + if (agent.Avatar.Prim.Position.Z < lowerLimit) agent.Avatar.Prim.Position.Z = lowerLimit; } ); } @@ -367,7 +367,7 @@ namespace Simian.Extensions response.SitTransform.SitPosition = request.TargetObject.Offset; response.SitTransform.SitRotation = obj.SitRotation; - server.UDP.SendPacket(agent.Avatar.ID, response, PacketCategory.State); + server.UDP.SendPacket(agent.ID, response, PacketCategory.State); } else { @@ -384,11 +384,11 @@ namespace Simian.Extensions SimulationObject obj; if (server.Scene.TryGetObject(agent.RequestedSitTarget, out obj)) { - agent.Avatar.ParentID = obj.Prim.LocalID; - agent.Avatar.Position = agent.RequestedSitOffset; + agent.Avatar.Prim.ParentID = obj.Prim.LocalID; + agent.Avatar.Prim.Position = agent.RequestedSitOffset; - ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, - server.Scene.RegionHandle, agent.Flags); + ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar.Prim, + server.Scene.RegionHandle, agent.Avatar.Prim.Flags); server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State); @@ -408,31 +408,31 @@ namespace Simian.Extensions { AgentUpdatePacket update = (AgentUpdatePacket)packet; - agent.Avatar.Rotation = update.AgentData.BodyRotation; + agent.Avatar.Prim.Rotation = update.AgentData.BodyRotation; agent.ControlFlags = (AgentManager.ControlFlags)update.AgentData.ControlFlags; - agent.Avatar.PrimData.State = update.AgentData.State; // FIXME: Are these two different state variables? - agent.Flags = (PrimFlags)update.AgentData.Flags; + agent.State = (AgentState)update.AgentData.State; + agent.HideTitle = update.AgentData.Flags != 0; - if (agent.Avatar.ParentID > 0 && (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) == AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) + if (agent.Avatar.Prim.ParentID > 0 && (agent.ControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) == AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) { SimulationObject obj; - if (server.Scene.TryGetObject(agent.Avatar.ParentID, out obj)) + if (server.Scene.TryGetObject(agent.Avatar.Prim.ParentID, out obj)) { - agent.Avatar.Position = obj.Prim.Position + agent.Avatar.Prim.Position = obj.Prim.Position + Vector3.Transform(obj.SitPosition, Matrix4.CreateFromQuaternion(obj.SitRotation)) + new Vector3(0f, 0f, 1f); } else { //TODO: get position from course locations? - agent.Avatar.Position = Vector3.Zero; + agent.Avatar.Prim.Position = Vector3.Zero; } - agent.Avatar.ParentID = 0; + agent.Avatar.Prim.ParentID = 0; server.Avatars.SetDefaultAnimation(agent, Animations.STAND); } - ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, - server.Scene.RegionHandle, agent.Flags); + ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar.Prim, + server.Scene.RegionHandle, agent.Avatar.Prim.Flags); server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State); } diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index 98acd0ee..4968fb40 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -120,7 +120,7 @@ namespace Simian.Extensions prim.GroupID = add.AgentData.GroupID; prim.ID = UUID.Random(); prim.MediaURL = String.Empty; - prim.OwnerID = agent.Avatar.ID; + prim.OwnerID = agent.ID; prim.Position = position; prim.PrimData.Material = (Material)add.ObjectData.Material; @@ -146,10 +146,10 @@ namespace Simian.Extensions prim.Properties = new Primitive.ObjectProperties(); prim.Properties.CreationDate = DateTime.Now; - prim.Properties.CreatorID = agent.Avatar.ID; + prim.Properties.CreatorID = agent.ID; prim.Properties.Description = String.Empty; prim.Properties.GroupID = add.AgentData.GroupID; - prim.Properties.LastOwnerID = agent.Avatar.ID; + prim.Properties.LastOwnerID = agent.ID; prim.Properties.Name = "New Object"; prim.Properties.ObjectID = prim.ID; prim.Properties.OwnerID = prim.OwnerID; @@ -163,7 +163,7 @@ namespace Simian.Extensions // Add this prim to the object database SimulationObject simObj = new SimulationObject(prim, server); - server.Scene.ObjectAdd(this, simObj, agent.Avatar.ID, 0, flags); + server.Scene.ObjectAdd(this, simObj, agent.ID, 0, flags); } void ObjectDuplicateHandler(Packet packet, Agent agent) @@ -184,7 +184,7 @@ namespace Simian.Extensions newObj.Prim.Position += offset; newObj.Prim.ID = UUID.Random(); - server.Scene.ObjectAdd(this, newObj, agent.Avatar.ID, 0, flags); + server.Scene.ObjectAdd(this, newObj, agent.ID, 0, flags); } else { @@ -195,7 +195,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.Avatar.ID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.ID, kill, PacketCategory.State); } } } @@ -241,7 +241,7 @@ namespace Simian.Extensions { properties.ObjectData[0].BaseMask = (uint)PermissionMask.All; properties.ObjectData[0].CreationDate = Utils.DateTimeToUnixTime(DateTime.Now); - properties.ObjectData[0].CreatorID = agent.Avatar.ID; + properties.ObjectData[0].CreatorID = agent.ID; properties.ObjectData[0].Description = Utils.StringToBytes(String.Empty); properties.ObjectData[0].EveryoneMask = (uint)PermissionMask.All; properties.ObjectData[0].GroupID = UUID.Zero; @@ -250,7 +250,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.Avatar.ID; + properties.ObjectData[0].OwnerID = agent.ID; properties.ObjectData[0].OwnerMask = (uint)PermissionMask.All; properties.ObjectData[0].OwnershipCost = 0; properties.ObjectData[0].SalePrice = 0; @@ -260,7 +260,7 @@ namespace Simian.Extensions properties.ObjectData[0].TouchName = new byte[0]; } - server.UDP.SendPacket(agent.Avatar.ID, properties, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, properties, PacketCategory.Transaction); } else { @@ -277,7 +277,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.Avatar.ID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.ID, kill, PacketCategory.State); } } @@ -313,7 +313,7 @@ namespace Simian.Extensions //TODO: send an error message return; } - else if (obj.Prim.OwnerID != agent.Avatar.ID) + else if (obj.Prim.OwnerID != agent.ID) { //TODO: send an error message return; @@ -385,7 +385,7 @@ namespace Simian.Extensions //TODO: send an error message return; } - else if (obj.Prim.OwnerID != agent.Avatar.ID) + else if (obj.Prim.OwnerID != agent.ID) { //TODO: send an error message return; @@ -635,13 +635,13 @@ namespace Simian.Extensions break; case DeRezDestination.TrashFolder: InventoryObject invObj; - if (server.Inventory.TryGetInventory(agent.Avatar.ID, derez.AgentBlock.DestinationID, out invObj) && + if (server.Inventory.TryGetInventory(agent.ID, derez.AgentBlock.DestinationID, out invObj) && invObj is InventoryFolder) { // FIXME: Handle children InventoryFolder trash = (InventoryFolder)invObj; - 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, + server.Inventory.CreateItem(agent.ID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object, + AssetType.Object, obj.Prim.ID, trash.ID, PermissionMask.All, PermissionMask.All, agent.ID, obj.Prim.Properties.CreatorID, derez.AgentBlock.TransactionID, 0, true); server.Scene.ObjectRemove(this, obj.Prim.LocalID); @@ -719,7 +719,7 @@ namespace Simian.Extensions obj.Prim.Rotation = rotation; obj.Prim.Scale = scale; - server.Scene.ObjectAdd(this, obj, agent.Avatar.ID, 0, PrimFlags.None); + server.Scene.ObjectAdd(this, obj, agent.ID, 0, PrimFlags.None); } else { @@ -735,7 +735,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.Avatar.ID, kill, PacketCategory.State); + server.UDP.SendPacket(agent.ID, kill, PacketCategory.State); } } } @@ -782,7 +782,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.Avatar.ID; + props.ObjectData.OwnerID = agent.ID; props.ObjectData.OwnerMask = (uint)PermissionMask.All; props.ObjectData.OwnershipCost = 0; props.ObjectData.RequestFlags = (uint)ReportType.None; @@ -790,7 +790,7 @@ namespace Simian.Extensions props.ObjectData.SaleType = (byte)SaleType.Not; } - server.UDP.SendPacket(agent.Avatar.ID, props, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, props, PacketCategory.Transaction); } else { diff --git a/Programs/Simian/Extensions/ParcelManager.cs b/Programs/Simian/Extensions/ParcelManager.cs index da810122..e719fe04 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.Avatar.ID) + if (parcel.OwnerID == agent.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.Avatar.ID)) + else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == agent.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.Avatar.ID, overlay, PacketCategory.State); + server.UDP.SendPacket(agent.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.Avatar.ID; + properties.ParcelData.OwnerID = agent.ID; - server.UDP.SendPacket(agent.Avatar.ID, properties, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, properties, PacketCategory.Transaction); } else { diff --git a/Programs/Simian/Extensions/Periscope.cs b/Programs/Simian/Extensions/Periscope.cs index 7489d54a..f4d17d69 100644 --- a/Programs/Simian/Extensions/Periscope.cs +++ b/Programs/Simian/Extensions/Periscope.cs @@ -71,14 +71,14 @@ namespace Simian.Extensions { SimulationObject simObj = new SimulationObject(prim, server); if (MasterAgent != null) - simObj.Prim.OwnerID = MasterAgent.Avatar.ID; - server.Scene.ObjectAdd(this, simObj, MasterAgent.Avatar.ID, 0, PrimFlags.None); + simObj.Prim.OwnerID = MasterAgent.ID; + server.Scene.ObjectAdd(this, simObj, MasterAgent.ID, 0, PrimFlags.None); } void Objects_OnNewAttachment(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation) { SimulationObject simObj = new SimulationObject(prim, server); - server.Scene.ObjectAdd(this, simObj, MasterAgent.Avatar.ID, 0, PrimFlags.None); + server.Scene.ObjectAdd(this, simObj, MasterAgent.ID, 0, PrimFlags.None); } void Objects_OnNewAvatar(Simulator simulator, Avatar avatar, ulong regionHandle, ushort timeDilation) @@ -86,9 +86,9 @@ namespace Simian.Extensions ulong localRegionHandle = Utils.UIntsToLong(256 * server.Scene.RegionX, 256 * server.Scene.RegionY); // Add the avatar to both the agents list and the scene objects - Agent agent = new Agent(); - agent.Avatar.ID = avatar.ID; - agent.Avatar = avatar; + SimulationObject obj = new SimulationObject(avatar, server); + Agent agent = new Agent(obj); + agent.Avatar.Prim.ID = avatar.ID; agent.CurrentRegionHandle = localRegionHandle; agent.FirstName = avatar.FirstName; agent.LastName = avatar.LastName; @@ -107,15 +107,15 @@ namespace Simian.Extensions if (update.LocalID == client.Self.LocalID) { - MasterAgent.Avatar.Acceleration = update.Acceleration; - MasterAgent.Avatar.AngularVelocity = update.AngularVelocity; - MasterAgent.Avatar.CollisionPlane = update.CollisionPlane; - MasterAgent.Avatar.Position = update.Position; - MasterAgent.Avatar.Rotation = update.Rotation; - MasterAgent.Avatar.Velocity = update.Velocity; + MasterAgent.Avatar.Prim.Acceleration = update.Acceleration; + MasterAgent.Avatar.Prim.AngularVelocity = update.AngularVelocity; + MasterAgent.Avatar.Prim.CollisionPlane = update.CollisionPlane; + MasterAgent.Avatar.Prim.Position = update.Position; + MasterAgent.Avatar.Prim.Rotation = update.Rotation; + MasterAgent.Avatar.Prim.Velocity = update.Velocity; if (update.Textures != null) - MasterAgent.Avatar.Textures = update.Textures; + MasterAgent.Avatar.Prim.Textures = update.Textures; } } @@ -139,7 +139,7 @@ namespace Simian.Extensions server.Scene.AgentAppearance(this, agent, te, vp); - if (agent.Avatar.ID == client.Self.AgentID) + if (agent.ID == client.Self.AgentID) server.Scene.AgentAppearance(this, MasterAgent, te, vp); } else @@ -196,10 +196,10 @@ namespace Simian.Extensions server.Scene.ForEachAgent( delegate(Agent agent) { - if (agent.Avatar.RegionHandle != localRegionHandle && - agent.Avatar.RegionHandle != client.Network.CurrentSim.Handle) + if (agent.Avatar.Prim.RegionHandle != localRegionHandle && + agent.Avatar.Prim.RegionHandle != client.Network.CurrentSim.Handle) { - server.Scene.ObjectRemove(this, agent.Avatar.ID); + server.Scene.ObjectRemove(this, agent.ID); } } ); @@ -248,7 +248,7 @@ namespace Simian.Extensions { RegionHandshakePacket handshake = (RegionHandshakePacket)packet; - handshake.RegionInfo.SimOwner = (MasterAgent != null ? MasterAgent.Avatar.ID : UUID.Zero); + handshake.RegionInfo.SimOwner = (MasterAgent != null ? MasterAgent.ID : UUID.Zero); handshake.RegionInfo.RegionFlags &= ~(uint)RegionFlags.NoFly; handshake.RegionInfo2.RegionID = server.Scene.RegionID; @@ -372,7 +372,7 @@ namespace Simian.Extensions } } - if (MasterAgent == null || update.AgentData.AgentID == MasterAgent.Avatar.ID) + if (MasterAgent == null || update.AgentData.AgentID == MasterAgent.ID) { update.AgentData.AgentID = client.Self.AgentID; update.AgentData.SessionID = client.Self.SessionID; @@ -384,7 +384,7 @@ namespace Simian.Extensions { ObjectGrabPacket grab = (ObjectGrabPacket)packet; - if (MasterAgent == null || grab.AgentData.AgentID == MasterAgent.Avatar.ID) + if (MasterAgent == null || grab.AgentData.AgentID == MasterAgent.ID) { grab.AgentData.AgentID = client.Self.AgentID; grab.AgentData.SessionID = client.Self.SessionID; @@ -397,7 +397,7 @@ namespace Simian.Extensions { ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)packet; - if (MasterAgent == null || grabUpdate.AgentData.AgentID == MasterAgent.Avatar.ID) + if (MasterAgent == null || grabUpdate.AgentData.AgentID == MasterAgent.ID) { grabUpdate.AgentData.AgentID = client.Self.AgentID; grabUpdate.AgentData.SessionID = client.Self.SessionID; @@ -410,7 +410,7 @@ namespace Simian.Extensions { ObjectDeGrabPacket degrab = (ObjectDeGrabPacket)packet; - if (MasterAgent == null || degrab.AgentData.AgentID == MasterAgent.Avatar.ID) + if (MasterAgent == null || degrab.AgentData.AgentID == MasterAgent.ID) { degrab.AgentData.AgentID = client.Self.AgentID; degrab.AgentData.SessionID = client.Self.SessionID; @@ -423,7 +423,7 @@ namespace Simian.Extensions { ViewerEffectPacket effect = (ViewerEffectPacket)packet; - if (MasterAgent == null || effect.AgentData.AgentID == MasterAgent.Avatar.ID) + if (MasterAgent == null || effect.AgentData.AgentID == MasterAgent.ID) { effect.AgentData.AgentID = client.Self.AgentID; effect.AgentData.SessionID = client.Self.SessionID; @@ -436,7 +436,7 @@ namespace Simian.Extensions { AgentAnimationPacket animation = (AgentAnimationPacket)packet; - if (MasterAgent == null || animation.AgentData.AgentID == MasterAgent.Avatar.ID) + if (MasterAgent == null || animation.AgentData.AgentID == MasterAgent.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 facb21a8..9a5c36ea 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.Avatar.ID, notfound, PacketCategory.Texture); + server.UDP.SendPacket(download.Agent.ID, notfound, PacketCategory.Texture); } } else @@ -147,7 +147,7 @@ namespace Simian.Extensions Helpers.LogLevel.Error); } - server.UDP.SendPacket(agent.Avatar.ID, data, PacketCategory.Texture); + server.UDP.SendPacket(agent.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.Avatar.ID, transfer, PacketCategory.Texture); + server.UDP.SendPacket(agent.ID, transfer, PacketCategory.Texture); ++download.CurrentPacket; } diff --git a/Programs/Simian/Extensions/PeriscopeMovement.cs b/Programs/Simian/Extensions/PeriscopeMovement.cs index 34972f7d..ebca8f4d 100644 --- a/Programs/Simian/Extensions/PeriscopeMovement.cs +++ b/Programs/Simian/Extensions/PeriscopeMovement.cs @@ -75,7 +75,7 @@ namespace Simian.Extensions bool animsChanged = false; // Create forward and left vectors from the current avatar rotation - Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(agent.Avatar.Rotation); + Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(agent.Avatar.Prim.Rotation); Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix); Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); @@ -109,7 +109,7 @@ namespace Simian.Extensions if ((heldForward || heldBack) && (heldLeft || heldRight)) speed /= SQRT_TWO; - Vector3 agentPosition = agent.GetSimulatorPosition(server.Scene); + Vector3 agentPosition = agent.Avatar.GetSimulatorPosition(); float oldFloor = server.Scene.GetTerrainHeightAt(agentPosition.X, agentPosition.Y); agentPosition += (move * speed); @@ -120,12 +120,12 @@ namespace Simian.Extensions // least possible distance from avatar to the ground // TODO: calculate to get rid of "bot squat" - float lowerLimit = newFloor + agent.Avatar.Scale.Z / 2; + float lowerLimit = newFloor + agent.Avatar.Prim.Scale.Z / 2; // Z acceleration resulting from gravity float gravity = 0f; - float waterChestHeight = server.Scene.WaterHeight - (agent.Avatar.Scale.Z * .33f); + float waterChestHeight = server.Scene.WaterHeight - (agent.Avatar.Prim.Scale.Z * .33f); if (flying) { @@ -133,12 +133,12 @@ namespace Simian.Extensions agent.TickJump = 0; //velocity falloff while flying - agent.Avatar.Velocity.X *= 0.66f; - agent.Avatar.Velocity.Y *= 0.66f; - agent.Avatar.Velocity.Z *= 0.33f; + agent.Avatar.Prim.Velocity.X *= 0.66f; + agent.Avatar.Prim.Velocity.Y *= 0.66f; + agent.Avatar.Prim.Velocity.Z *= 0.33f; - if (agent.Avatar.Position.Z == lowerLimit) - agent.Avatar.Velocity.Z += INITIAL_HOVER_IMPULSE; + if (agent.Avatar.Prim.Position.Z == lowerLimit) + agent.Avatar.Prim.Velocity.Z += INITIAL_HOVER_IMPULSE; if (move.X != 0 || move.Y != 0) { //flying horizontally @@ -161,18 +161,18 @@ namespace Simian.Extensions animsChanged = true; } } - else if (agent.Avatar.Position.Z > lowerLimit + FALL_FORGIVENESS || agent.Avatar.Position.Z <= waterChestHeight) + else if (agent.Avatar.Prim.Position.Z > lowerLimit + FALL_FORGIVENESS || agent.Avatar.Prim.Position.Z <= waterChestHeight) { //falling, floating, or landing from a jump - if (agent.Avatar.Position.Z > server.Scene.WaterHeight) + if (agent.Avatar.Prim.Position.Z > server.Scene.WaterHeight) { //above water move = Vector3.Zero; //override controls while drifting - agent.Avatar.Velocity *= 0.95f; //keep most of our inertia + agent.Avatar.Prim.Velocity *= 0.95f; //keep most of our inertia float fallElapsed = (float)(Environment.TickCount - agent.TickFall) / 1000f; - if (agent.TickFall == 0 || (fallElapsed > FALL_DELAY && agent.Avatar.Velocity.Z >= 0f)) + if (agent.TickFall == 0 || (fallElapsed > FALL_DELAY && agent.Avatar.Prim.Velocity.Z >= 0f)) { //just started falling agent.TickFall = Environment.TickCount; } @@ -197,10 +197,10 @@ namespace Simian.Extensions agent.TickFall = 0; //friction - agent.Avatar.Acceleration *= 0.2f; - agent.Avatar.Velocity *= 0.2f; + agent.Avatar.Prim.Acceleration *= 0.2f; + agent.Avatar.Prim.Velocity *= 0.2f; - agent.Avatar.Position.Z = lowerLimit; + agent.Avatar.Prim.Position.Z = lowerLimit; if (move.Z > 0) { //jumping @@ -225,9 +225,9 @@ namespace Simian.Extensions if (server.Avatars.SetDefaultAnimation(agent, Animations.JUMP)) animsChanged = true; - agent.Avatar.Velocity.X += agent.Avatar.Acceleration.X * JUMP_IMPULSE_HORIZONTAL; - agent.Avatar.Velocity.Y += agent.Avatar.Acceleration.Y * JUMP_IMPULSE_HORIZONTAL; - agent.Avatar.Velocity.Z = JUMP_IMPULSE_VERTICAL * seconds; + agent.Avatar.Prim.Velocity.X += agent.Avatar.Prim.Acceleration.X * JUMP_IMPULSE_HORIZONTAL; + agent.Avatar.Prim.Velocity.Y += agent.Avatar.Prim.Acceleration.Y * JUMP_IMPULSE_HORIZONTAL; + agent.Avatar.Prim.Velocity.Z = JUMP_IMPULSE_VERTICAL * seconds; agent.TickJump = -1; //flag that we are currently jumping } @@ -284,32 +284,32 @@ namespace Simian.Extensions // static acceleration when any control is held, otherwise none if (moving) { - agent.Avatar.Acceleration = move * speed; - if (agent.Avatar.Acceleration.Z < -maxVel) - agent.Avatar.Acceleration.Z = -maxVel; - else if (agent.Avatar.Acceleration.Z > maxVel) - agent.Avatar.Acceleration.Z = maxVel; + agent.Avatar.Prim.Acceleration = move * speed; + if (agent.Avatar.Prim.Acceleration.Z < -maxVel) + agent.Avatar.Prim.Acceleration.Z = -maxVel; + else if (agent.Avatar.Prim.Acceleration.Z > maxVel) + agent.Avatar.Prim.Acceleration.Z = maxVel; } else { - agent.Avatar.Acceleration = Vector3.Zero; + agent.Avatar.Prim.Acceleration = Vector3.Zero; } - agent.Avatar.Velocity += agent.Avatar.Acceleration - new Vector3(0f, 0f, gravity); - if (agent.Avatar.Velocity.Z < -maxVel) - agent.Avatar.Velocity.Z = -maxVel; - else if (agent.Avatar.Velocity.Z > maxVel) - agent.Avatar.Velocity.Z = maxVel; + agent.Avatar.Prim.Velocity += agent.Avatar.Prim.Acceleration - new Vector3(0f, 0f, gravity); + if (agent.Avatar.Prim.Velocity.Z < -maxVel) + agent.Avatar.Prim.Velocity.Z = -maxVel; + else if (agent.Avatar.Prim.Velocity.Z > maxVel) + agent.Avatar.Prim.Velocity.Z = maxVel; - agent.Avatar.Position += agent.Avatar.Velocity; + agent.Avatar.Prim.Position += agent.Avatar.Prim.Velocity; - if (agent.Avatar.Position.X < 0) agent.Avatar.Position.X = 0f; - else if (agent.Avatar.Position.X > 255) agent.Avatar.Position.X = 255f; + if (agent.Avatar.Prim.Position.X < 0) agent.Avatar.Prim.Position.X = 0f; + else if (agent.Avatar.Prim.Position.X > 255) agent.Avatar.Prim.Position.X = 255f; - if (agent.Avatar.Position.Y < 0) agent.Avatar.Position.Y = 0f; - else if (agent.Avatar.Position.Y > 255) agent.Avatar.Position.Y = 255f; + if (agent.Avatar.Prim.Position.Y < 0) agent.Avatar.Prim.Position.Y = 0f; + else if (agent.Avatar.Prim.Position.Y > 255) agent.Avatar.Prim.Position.Y = 255f; - if (agent.Avatar.Position.Z < lowerLimit) agent.Avatar.Position.Z = lowerLimit; + if (agent.Avatar.Prim.Position.Z < lowerLimit) agent.Avatar.Prim.Position.Z = lowerLimit; } } ); @@ -322,16 +322,23 @@ namespace Simian.Extensions // Don't use the local physics to update the master agent if (agent != periscope.MasterAgent) { - agent.Avatar.Rotation = update.AgentData.BodyRotation; + agent.Avatar.Prim.Rotation = update.AgentData.BodyRotation; agent.ControlFlags = (AgentManager.ControlFlags)update.AgentData.ControlFlags; - agent.Avatar.PrimData.State = update.AgentData.State; // FIXME: Are these two different state variables? - agent.Flags = (PrimFlags)update.AgentData.Flags; + agent.State = (AgentState)update.AgentData.State; + agent.HideTitle = update.AgentData.Flags != 0; } - ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, + SimulationObject obj; + if (server.Scene.TryGetObject(update.AgentData.AgentID, out obj)) + { + server.Scene.ObjectTransform(this, obj, obj.Prim.Position, update.AgentData.BodyRotation, obj.Prim.Velocity, + obj.Prim.Acceleration, obj.Prim.AngularVelocity); + } + + /*ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, server.Scene.RegionHandle, agent.Flags); - server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State); + server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State);*/ } void SetAlwaysRunHandler(Packet packet, Agent agent) diff --git a/Programs/Simian/Extensions/PeriscopeTransferManager.cs b/Programs/Simian/Extensions/PeriscopeTransferManager.cs index ebed75e2..237e7841 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.Avatar.ID, complete, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, complete, PacketCategory.Inventory); } else { @@ -94,7 +94,7 @@ namespace Simian.Extensions lock (CurrentUploads) CurrentUploads[xfer.XferID.ID] = asset; - server.UDP.SendPacket(agent.Avatar.ID, xfer, PacketCategory.Inventory); + server.UDP.SendPacket(agent.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.Avatar.ID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, complete, PacketCategory.Asset); + server.UDP.SendPacket(agent.ID, complete, PacketCategory.Asset); } } } @@ -221,7 +221,7 @@ namespace Simian.Extensions lock (currentDownloads) { currentDownloads.Add(client.Assets.RequestAsset(assetID, type, false), - new KeyValuePair(agent.Avatar.ID, request.TransferInfo.TransferID)); + new KeyValuePair(agent.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.Avatar.ID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, transfer, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.ID, response, PacketCategory.Asset); } } else diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 6fc6b6c7..3a20192c 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -34,7 +34,7 @@ namespace Simian.Extensions // Contains all scene objects, including prims and avatars DoubleDictionary sceneObjects = new DoubleDictionary(); // A duplicate of the avatar information stored in sceneObjects, improves operations such as iterating over all agents - DoubleDictionary sceneAgents = new DoubleDictionary(); + Dictionary sceneAgents = new Dictionary(); // Event queues for each avatar in the scene Dictionary eventQueues = new Dictionary(); int currentLocalID = 1; @@ -94,7 +94,7 @@ namespace Simian.Extensions public void Stop() { - sceneAgents.ForEach(delegate(Agent agent) { AgentRemove(this, agent); }); + ForEachAgent(delegate(Agent agent) { AgentRemove(this, agent); }); } public float GetTerrainHeightAt(float fx, float fy) @@ -287,8 +287,8 @@ namespace Simian.Extensions server.Scene.ForEachAgent( delegate(Agent recipient) { - if (recipient.Avatar.ID != obj.Prim.OwnerID) - server.UDP.SendPacket(recipient.Avatar.ID, updateToOthers, PacketCategory.State); + if (recipient.ID != obj.Prim.OwnerID) + server.UDP.SendPacket(recipient.ID, updateToOthers, PacketCategory.State); } ); @@ -300,11 +300,11 @@ namespace Simian.Extensions SimulationObject obj; Agent agent; - if (sceneAgents.TryGetValue(localID, out agent)) - AgentRemove(sender, agent); - if (sceneObjects.TryGetValue(localID, out obj)) { + if (sceneAgents.TryGetValue(obj.Prim.ID, out agent)) + AgentRemove(sender, agent); + if (OnObjectRemove != null) OnObjectRemove(sender, obj); @@ -356,17 +356,17 @@ namespace Simian.Extensions Logger.Log("Removing agent " + agent.FullName + " from the scene", Helpers.LogLevel.Info); - sceneAgents.Remove(agent.Avatar.LocalID, agent.Avatar.ID); + sceneAgents.Remove(agent.ID); KillObjectPacket kill = new KillObjectPacket(); kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); - kill.ObjectData[0].ID = agent.Avatar.LocalID; + kill.ObjectData[0].ID = agent.Avatar.Prim.LocalID; server.UDP.BroadcastPacket(kill, PacketCategory.State); // Kill the EventQueue - RemoveEventQueue(agent.Avatar.ID); + RemoveEventQueue(agent.ID); // Remove the UDP client server.UDP.RemoveClient(agent); @@ -375,7 +375,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.Avatar.ID; + offline.AgentBlock[0].AgentID = agent.ID; server.UDP.BroadcastPacket(offline, PacketCategory.State); } @@ -649,12 +649,12 @@ namespace Simian.Extensions public bool ContainsObject(uint localID) { - return sceneObjects.ContainsKey(localID) || sceneAgents.ContainsKey(localID); + return sceneObjects.ContainsKey(localID); } public bool ContainsObject(UUID id) { - return sceneObjects.ContainsKey(id) || sceneAgents.ContainsKey(id); + return sceneObjects.ContainsKey(id); } public int ObjectCount() @@ -675,34 +675,37 @@ namespace Simian.Extensions public bool AgentAdd(object sender, Agent agent, PrimFlags creatorFlags) { // Check if the agent already exists in the scene - if (sceneAgents.ContainsKey(agent.Avatar.ID)) - sceneAgents.Remove(agent.Avatar.LocalID, agent.Avatar.ID); + if (sceneAgents.ContainsKey(agent.ID)) + sceneAgents.Remove(agent.ID); - if (agent.Avatar.LocalID == 0) + // Avatars always have physics + agent.Avatar.Prim.Flags |= PrimFlags.Physics; + + if (agent.Avatar.Prim.LocalID == 0) { // Assign a unique LocalID to this agent - agent.Avatar.LocalID = (uint)Interlocked.Increment(ref currentLocalID); + agent.Avatar.Prim.LocalID = (uint)Interlocked.Increment(ref currentLocalID); } if (OnAgentAdd != null) OnAgentAdd(sender, agent, creatorFlags); // Add the agent to the scene dictionary - sceneAgents.Add(agent.Avatar.LocalID, agent.Avatar.ID, agent); + sceneAgents[agent.ID] = agent; // Send an update out to the agent - ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(agent.Avatar, regionHandle, - agent.Avatar.Flags | creatorFlags); - server.UDP.SendPacket(agent.Avatar.ID, updateToOwner, PacketCategory.State); + ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(agent.Avatar.Prim, regionHandle, + agent.Avatar.Prim.Flags | creatorFlags); + server.UDP.SendPacket(agent.ID, updateToOwner, PacketCategory.State); // Send an update out to everyone else - ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(agent.Avatar, regionHandle, - agent.Avatar.Flags); + ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(agent.Avatar.Prim, regionHandle, + agent.Avatar.Prim.Flags); server.Scene.ForEachAgent( delegate(Agent recipient) { - if (recipient.Avatar.ID != agent.Avatar.ID) - server.UDP.SendPacket(recipient.Avatar.ID, updateToOthers, PacketCategory.State); + if (recipient.ID != agent.ID) + server.UDP.SendPacket(recipient.ID, updateToOthers, PacketCategory.State); } ); @@ -718,12 +721,12 @@ namespace Simian.Extensions // Broadcast an object update for this avatar // TODO: Is this necessary here? - ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(agent.Avatar, - regionHandle, agent.Flags); - server.UDP.BroadcastPacket(update, PacketCategory.State); + //ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(agent.Avatar, + // regionHandle, agent.Flags); + //server.UDP.BroadcastPacket(update, PacketCategory.State); // Update the avatar - agent.Avatar.Textures = textures; + agent.Avatar.Prim.Textures = textures; if (visualParams != null && visualParams.Length > 1) agent.VisualParams = visualParams; @@ -731,11 +734,11 @@ namespace Simian.Extensions { // Send the appearance packet to all other clients AvatarAppearancePacket appearance = BuildAppearancePacket(agent); - sceneAgents.ForEach( + ForEachAgent( delegate(Agent recipient) { if (recipient != agent) - server.UDP.SendPacket(recipient.Avatar.ID, appearance, PacketCategory.State); + server.UDP.SendPacket(recipient.ID, appearance, PacketCategory.State); } ); } @@ -751,11 +754,6 @@ namespace Simian.Extensions return sceneObjects.FindValue(predicate); } - public bool TryGetAgent(uint localID, out Agent agent) - { - return sceneAgents.TryGetValue(localID, out agent); - } - public bool TryGetAgent(UUID id, out Agent agent) { return sceneAgents.TryGetValue(id, out agent); @@ -768,12 +766,25 @@ namespace Simian.Extensions public void ForEachAgent(Action action) { - sceneAgents.ForEach(action); + lock (sceneAgents) + { + foreach (Agent agent in sceneAgents.Values) + action(agent); + } } public Agent FindAgent(Predicate predicate) { - return sceneAgents.FindValue(predicate); + lock (sceneAgents) + { + foreach (Agent agent in sceneAgents.Values) + { + if (predicate(agent)) + return agent; + } + } + + return null; } public bool SeedCapabilityHandler(IHttpClientContext context, IHttpRequest request, IHttpResponse response, object state) @@ -852,13 +863,13 @@ namespace Simian.Extensions public bool HasRunningEventQueue(Agent agent) { - return eventQueues.ContainsKey(agent.Avatar.ID); + return eventQueues.ContainsKey(agent.ID); } public void SendEvent(Agent agent, string name, OSDMap body) { EventQueueServerCap eventQueue; - if (eventQueues.TryGetValue(agent.Avatar.ID, out eventQueue)) + if (eventQueues.TryGetValue(agent.ID, out eventQueue)) { eventQueue.Server.SendEvent(name, body); } @@ -875,19 +886,19 @@ namespace Simian.Extensions return eqServer.EventQueueHandler(context, request, response); } + // FIXME: This function needs to go away as soon as we stop sending full object updates for everything void BroadcastObjectUpdate(Primitive prim) { - ObjectUpdatePacket update = - SimulationObject.BuildFullUpdate(prim, regionHandle, prim.Flags); - - server.UDP.BroadcastPacket(update, PacketCategory.State); + SimulationObject obj; + if (TryGetObject(prim.ID, out obj)) + ObjectAdd(this, obj, obj.Prim.OwnerID, 0, PrimFlags.None); } void CompleteAgentMovementHandler(Packet packet, Agent agent) { // Create a representation for this agent Avatar avatar = new Avatar(); - avatar.ID = agent.Avatar.ID; + avatar.ID = agent.ID; avatar.LocalID = (uint)Interlocked.Increment(ref currentLocalID); avatar.Position = new Vector3(128f, 128f, 25f); avatar.Rotation = Quaternion.Identity; @@ -908,17 +919,17 @@ namespace Simian.Extensions avatar.NameValues = name; // Link this avatar up with the corresponding agent - agent.Avatar = avatar; + agent.Avatar.Prim = avatar; // Give testers a provisionary balance of 1000L agent.Balance = 1000; // Add this avatar as an object in the scene - if (ObjectAdd(this, new SimulationObject(agent.Avatar, server), agent.Avatar.ID, 0, PrimFlags.None)) + if (ObjectAdd(this, agent.Avatar, agent.ID, 0, PrimFlags.None)) { // Send a response back to the client AgentMovementCompletePacket complete = new AgentMovementCompletePacket(); - complete.AgentData.AgentID = agent.Avatar.ID; + complete.AgentData.AgentID = agent.ID; complete.AgentData.SessionID = agent.SessionID; complete.Data.LookAt = Vector3.UnitX; complete.Data.Position = avatar.Position; @@ -926,7 +937,7 @@ namespace Simian.Extensions complete.Data.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now); complete.SimData.ChannelVersion = Utils.StringToBytes("Simian"); - server.UDP.SendPacket(agent.Avatar.ID, complete, PacketCategory.Transaction); + server.UDP.SendPacket(agent.ID, complete, PacketCategory.Transaction); // Send updates and appearances for every avatar to this new avatar SynchronizeStateTo(agent); @@ -935,7 +946,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.Avatar.ID; + online.AgentBlock[0].AgentID = agent.ID; server.UDP.BroadcastPacket(online, PacketCategory.State); } else @@ -956,18 +967,18 @@ namespace Simian.Extensions { ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(obj.Prim, obj.Prim.RegionHandle, obj.Prim.Flags); - server.UDP.SendPacket(agent.Avatar.ID, update, PacketCategory.State); + server.UDP.SendPacket(agent.ID, update, PacketCategory.State); }); // Send appearances for all avatars - sceneAgents.ForEach( + ForEachAgent( delegate(Agent otherAgent) { if (otherAgent != agent) { // Send appearances for this avatar AvatarAppearancePacket appearance = BuildAppearancePacket(otherAgent); - server.UDP.SendPacket(agent.Avatar.ID, appearance, PacketCategory.State); + server.UDP.SendPacket(agent.ID, appearance, PacketCategory.State); } } ); @@ -1051,7 +1062,7 @@ namespace Simian.Extensions for (int x = 0; x < 16; x++) { LayerDataPacket layer = TerrainCompressor.CreateLandPacket(heightmap[y, x].Height, x, y); - server.UDP.SendPacket(agent.Avatar.ID, layer, PacketCategory.Terrain); + server.UDP.SendPacket(agent.ID, layer, PacketCategory.Terrain); } } } @@ -1059,8 +1070,8 @@ namespace Simian.Extensions static AvatarAppearancePacket BuildAppearancePacket(Agent agent) { AvatarAppearancePacket appearance = new AvatarAppearancePacket(); - appearance.ObjectData.TextureEntry = agent.Avatar.Textures.ToBytes(); - appearance.Sender.ID = agent.Avatar.ID; + appearance.ObjectData.TextureEntry = agent.Avatar.Prim.Textures.ToBytes(); + appearance.Sender.ID = agent.ID; appearance.Sender.IsTrial = false; appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[agent.VisualParams.Length]; diff --git a/Programs/Simian/Extensions/ScriptApi.cs b/Programs/Simian/Extensions/ScriptApi.cs index e227dbab..7f69ef65 100644 --- a/Programs/Simian/Extensions/ScriptApi.cs +++ b/Programs/Simian/Extensions/ScriptApi.cs @@ -1233,7 +1233,7 @@ namespace Simian.Extensions hostObject.AddScriptLPS(1); - Quaternion q = hostObject.GetSimulatorRotation(server.Scene); + Quaternion q = hostObject.GetSimulatorRotation(); return new LSL_Rotation(q.X, q.Y, q.Z, q.W); } diff --git a/Programs/Simian/Extensions/TransferManager.cs b/Programs/Simian/Extensions/TransferManager.cs index 061139fd..8dc041b9 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.Avatar.ID, complete, PacketCategory.Inventory); + server.UDP.SendPacket(agent.ID, complete, PacketCategory.Inventory); } else { @@ -89,7 +89,7 @@ namespace Simian.Extensions lock (CurrentUploads) CurrentUploads[xfer.XferID.ID] = asset; - server.UDP.SendPacket(agent.Avatar.ID, xfer, PacketCategory.Inventory); + server.UDP.SendPacket(agent.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.Avatar.ID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, confirm, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, complete, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, transfer, PacketCategory.Asset); + server.UDP.SendPacket(agent.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.Avatar.ID, response, PacketCategory.Asset); + server.UDP.SendPacket(agent.ID, response, PacketCategory.Asset); } } else if (source == SourceType.SimEstate) diff --git a/Programs/Simian/Extensions/UDPManager.cs b/Programs/Simian/Extensions/UDPManager.cs index a5763bb0..0f46c155 100644 --- a/Programs/Simian/Extensions/UDPManager.cs +++ b/Programs/Simian/Extensions/UDPManager.cs @@ -163,16 +163,16 @@ namespace Simian public void AddClient(Agent agent, IPEndPoint endpoint) { UDPClient client = new UDPClient(this, agent, endpoint); - clients.Add(agent.Avatar.ID, endpoint, client); + clients.Add(agent.ID, endpoint, client); } public bool RemoveClient(Agent agent) { UDPClient client; - if (clients.TryGetValue(agent.Avatar.ID, out client)) + if (clients.TryGetValue(agent.ID, out client)) { client.Shutdown(); - return clients.Remove(agent.Avatar.ID, client.Address); + return clients.Remove(agent.ID, client.Address); } else return false; @@ -421,10 +421,10 @@ namespace Simian //FIXME: Make 60000 an .ini setting if (Environment.TickCount - client.Agent.TickLastPacketReceived > 60000) { - Logger.Log(String.Format("Ack timeout for {0}, disconnecting", client.Agent.Avatar.Name), + Logger.Log(String.Format("Ack timeout for {0}, disconnecting", client.Agent.FullName), Helpers.LogLevel.Warning); - server.Scene.ObjectRemove(this, client.Agent.Avatar.ID); + server.Scene.ObjectRemove(this, client.Agent.ID); return; } } @@ -469,16 +469,16 @@ namespace Simian if (CompleteAgentConnection(useCircuitCode.CircuitCode.Code, out agent)) { // Sanity check that the agent isn't already logged in - if (clients.ContainsKey(agent.Avatar.ID)) + if (clients.ContainsKey(agent.ID)) { - Logger.Log("Client UDP reference already exists for " + agent.Avatar.ID.ToString() + ", removing", + Logger.Log("Client UDP reference already exists for " + agent.ID.ToString() + ", removing", Helpers.LogLevel.Warning); - server.Scene.ObjectRemove(this, agent.Avatar.ID); - clients.Remove(agent.Avatar.ID); + server.Scene.ObjectRemove(this, agent.ID); + clients.Remove(agent.ID); } AddClient(agent, address); - if (clients.TryGetValue(agent.Avatar.ID, out client)) + if (clients.TryGetValue(agent.ID, out client)) { Logger.Log("Activated UDP circuit " + useCircuitCode.CircuitCode.Code, Helpers.LogLevel.Info); } diff --git a/Programs/Simian/Interfaces/ISceneProvider.cs b/Programs/Simian/Interfaces/ISceneProvider.cs index edede1c6..2c9824c3 100644 --- a/Programs/Simian/Interfaces/ISceneProvider.cs +++ b/Programs/Simian/Interfaces/ISceneProvider.cs @@ -149,7 +149,6 @@ namespace Simian SimulationObject FindObject(Predicate predicate); int AgentCount(); - bool TryGetAgent(uint localID, out Agent agent); bool TryGetAgent(UUID id, out Agent agent); void ForEachAgent(Action action); Agent FindAgent(Predicate predicate); diff --git a/Programs/Simian/SimulationObject.cs b/Programs/Simian/SimulationObject.cs index 370b8b89..411ae111 100644 --- a/Programs/Simian/SimulationObject.cs +++ b/Programs/Simian/SimulationObject.cs @@ -115,12 +115,12 @@ namespace Simian return position; } - public Quaternion GetSimulatorRotation(ISceneProvider scene) + public Quaternion GetSimulatorRotation() { SimulationObject parent; Quaternion rotation = Prim.Rotation; - if (Prim.ParentID != 0 && scene.TryGetObject(Prim.ParentID, out parent)) + if (Prim.ParentID != 0 && Server.Scene.TryGetObject(Prim.ParentID, out parent)) rotation *= parent.Prim.Rotation; return rotation; diff --git a/bin/Simian.ini b/bin/Simian.ini index 9f7072ea..f3a231fe 100644 --- a/bin/Simian.ini +++ b/bin/Simian.ini @@ -7,6 +7,9 @@ UDPManager ; simulator, as well as keeping the UDP connection alive. ConnectionManagement +; Main scene graph engine. All spatial events are processed through here. +SceneManager + ; Creates an account for anyone who logs in. The account will be registered ; with the account provider so persistence between sessions is possible, but ; no form of authentication or authorization is done @@ -71,11 +74,19 @@ ImageDelivery ; Other asset downloads TransferManager +; Converts prims into 3D geometry data. This is only used if a physics engine +; is present that makes use of prim mesh data. +RenderingPluginMesher + ; A simple physics engine for avatar movement. Supports walking, flying, and ; swimming as well as avatar-avatar collisions. Does not support avatar-prim ; or prim-prim collisions. Movement +; Physics engine provided by the Open Dynamics Engine library. Work in progress, +; not functional yet. +;PhysicsODE + ; Object creation, editing, deleting, etc. Processes packets and passes events ; to the scene provider. ObjectManager @@ -83,13 +94,6 @@ ObjectManager ; Parcel management ParcelManager -; Converts prims into 3D geometry data. This is only used if a physics engine -; is present that makes use of prim mesh data. -RenderingPluginMesher - -; Main scene graph engine. All spatial events are processed through here. -SceneManager - ; An scripting engine implementation adapted from OpenSim XScriptEngine