* Added more profile fields to Agent
* Removed inventory hack from AccountManager
* Create an inventory skeleton in AuthFreeForAll
* Simplify logout process with DisconnectClient()
* Handle FetchInventory
* Added CreateFolder and CreateRootFolder to IInventoryProvider

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2251 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2008-10-01 00:12:59 +00:00
parent 7f8d162043
commit eaaef001fb
8 changed files with 229 additions and 100 deletions

View File

@@ -53,26 +53,6 @@ namespace Simian.Extensions
PrimFlags.ObjectAnyOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty |
PrimFlags.ObjectTransfer | PrimFlags.ObjectOwnerModify | PrimFlags.ObjectYouOwner;
// HACK: FIXME: These should point to actual inventories, not random UUIDs
// Agent inventory
InventoryFolder rootFolder = new InventoryFolder();
rootFolder.ID = agent.InventoryRoot;
rootFolder.Name = "Inventory";
rootFolder.OwnerID = agent.AgentID;
rootFolder.PreferredType = AssetType.RootFolder;
rootFolder.Version = 1;
agent.Inventory[rootFolder.ID] = rootFolder;
// Default library
InventoryFolder libRootFolder = new InventoryFolder();
libRootFolder.ID = agent.InventoryLibraryRoot;
libRootFolder.Name = "Library";
libRootFolder.OwnerID = agent.AgentID;
libRootFolder.PreferredType = AssetType.RootFolder;
libRootFolder.Version = 1;
agent.Library[libRootFolder.ID] = libRootFolder;
return agent;
}
else

View File

@@ -41,7 +41,7 @@ namespace Simian.Extensions
if (texture.DecodeLayerBoundaries())
{
lock (AssetStore)
AssetStore[asset.AssetID] = asset;
AssetStore[asset.AssetID] = texture;
}
else
{
@@ -285,11 +285,14 @@ namespace Simian.Extensions
{
Logger.Log(String.Format(
"Request for asset {0} with type {1} does not match actual asset type {2}",
asset.AssetID, type, asset.AssetType), Helpers.LogLevel.Warning);
assetID, type, asset.AssetType), Helpers.LogLevel.Warning);
}
}
else
{
Logger.Log(String.Format("Request for missing asset {0} with type {1}",
assetID, type), Helpers.LogLevel.Warning);
// Asset not found
response.TransferInfo.Size = 0;
response.TransferInfo.Status = (int)StatusCode.UnknownSource;

View File

@@ -41,14 +41,58 @@ namespace Simian.Extensions
agent.HomeLookAt = agent.CurrentLookAt;
agent.HomePosition = agent.CurrentPosition;
agent.HomeRegionHandle = agent.CurrentRegionHandle;
agent.InventoryLibraryOwner = UUID.Random(); // FIXME:
agent.InventoryLibraryRoot = UUID.Random(); // FIXME:
agent.InventoryRoot = UUID.Random(); // FIXME:
agent.LastName = lastName;
agent.PasswordHash = password;
// FIXME: Give new avatars a default appearance
//agent.VisualParams;
//agent.Texture;
// Create a very basic inventory skeleton
UUID rootFolder = UUID.Random();
server.Inventory.CreateRootFolder(agent, rootFolder, "Inventory", agent.AgentID);
UUID libraryRootFolder = UUID.Random();
server.Inventory.CreateRootFolder(agent, libraryRootFolder, "Library", agent.AgentID);
agent.InventoryRoot = rootFolder;
agent.InventoryLibraryOwner = agent.AgentID;
agent.InventoryLibraryRoot = libraryRootFolder;
// Create some inventory items for appearance
UUID clothingFolder = UUID.Random();
server.Inventory.CreateFolder(agent, clothingFolder, "Clothing", AssetType.Clothing,
UUID.Zero, agent.AgentID);
UUID defaultOutfitFolder = UUID.Random();
server.Inventory.CreateFolder(agent, defaultOutfitFolder, "Default Outfit", AssetType.Unknown,
clothingFolder, agent.AgentID);
UUID hairAsset = new UUID("dc675529-7ba5-4976-b91d-dcb9e5e36188");
UUID hairItem = server.Inventory.CreateItem(agent, "Default Hair", "Default Hair",
InventoryType.Wearable, AssetType.Bodypart, hairAsset, defaultOutfitFolder,
PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0);
UUID pantsAsset = new UUID("3e8ee2d6-4f21-4a55-832d-77daa505edff");
UUID pantsItem = server.Inventory.CreateItem(agent, "Default Pants", "Default Pants",
InventoryType.Wearable, AssetType.Clothing, pantsAsset, defaultOutfitFolder,
PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0);
UUID shapeAsset = new UUID("530a2614-052e-49a2-af0e-534bb3c05af0");
UUID shapeItem = server.Inventory.CreateItem(agent, "Default Shape", "Default Shape",
InventoryType.Wearable, AssetType.Clothing, shapeAsset, defaultOutfitFolder,
PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0);
UUID shirtAsset = new UUID("6a714f37-fe53-4230-b46f-8db384465981");
UUID shirtItem = server.Inventory.CreateItem(agent, "Default Shirt", "Default Shirt",
InventoryType.Wearable, AssetType.Clothing, shirtAsset, defaultOutfitFolder,
PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0);
UUID skinAsset = new UUID("5f787f25-f761-4a35-9764-6418ee4774c4");
UUID skinItem = server.Inventory.CreateItem(agent, "Default Skin", "Default Skin",
InventoryType.Wearable, AssetType.Clothing, skinAsset, defaultOutfitFolder,
PermissionMask.All, PermissionMask.All, agent.AgentID, agent.AgentID, UUID.Random(), 0);
agent.HairAsset = hairAsset;
agent.HairItem = hairItem;
agent.PantsAsset = pantsAsset;
agent.PantsItem = pantsItem;
agent.ShapeAsset = shapeAsset;
agent.ShapeItem = shapeItem;
agent.ShirtAsset = shirtAsset;
agent.ShirtItem = shirtItem;
agent.SkinAsset = skinAsset;
agent.SkinItem = skinItem;
server.Accounts.AddAccount(agent);

View File

@@ -73,29 +73,6 @@ namespace Simian.Extensions
{
LogoutRequestPacket request = (LogoutRequestPacket)packet;
lock (server.Agents)
{
if (server.Agents.ContainsKey(agent.AgentID))
{
KillObjectPacket kill = new KillObjectPacket();
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = agent.Avatar.LocalID;
server.UDP.BroadcastPacket(kill, PacketCategory.State);
}
}
// Remove the avatar from the scene
SimulationObject obj;
if (server.Scene.TryGetObject(agent.AgentID, out obj))
server.Scene.ObjectRemove(this, obj);
else
Logger.Log("Logout request from an agent that is not in the scene", Helpers.LogLevel.Warning);
// Remove the UDP client
server.UDP.RemoveClient(agent);
LogoutReplyPacket reply = new LogoutReplyPacket();
reply.AgentData.AgentID = agent.AgentID;
reply.AgentData.SessionID = agent.SessionID;
@@ -105,12 +82,7 @@ namespace Simian.Extensions
server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Transaction);
//HACK: Notify everyone when someone logs off
OfflineNotificationPacket offline = new OfflineNotificationPacket();
offline.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[1];
offline.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock();
offline.AgentBlock[0].AgentID = agent.AgentID;
server.UDP.BroadcastPacket(offline, PacketCategory.State);
server.DisconnectClient(agent);
}
}
}

View File

@@ -20,6 +20,7 @@ namespace Simian.Extensions
Server.UDP.RegisterPacketCallback(PacketType.CreateInventoryFolder, new PacketCallback(CreateInventoryFolderHandler));
Server.UDP.RegisterPacketCallback(PacketType.UpdateInventoryItem, new PacketCallback(UpdateInventoryItemHandler));
Server.UDP.RegisterPacketCallback(PacketType.FetchInventoryDescendents, new PacketCallback(FetchInventoryDescendentsHandler));
Server.UDP.RegisterPacketCallback(PacketType.FetchInventory, new PacketCallback(FetchInventoryHandler));
}
public void Stop()
@@ -56,44 +57,8 @@ namespace Simian.Extensions
{
CreateInventoryFolderPacket create = (CreateInventoryFolderPacket)packet;
lock (agent.Inventory)
{
InventoryObject parent;
if (agent.Inventory.TryGetValue(create.FolderData.ParentID, out parent))
{
InventoryFolder parentFolder = (InventoryFolder)parent;
if (!agent.Inventory.ContainsKey(create.FolderData.FolderID))
{
InventoryFolder folder = new InventoryFolder();
folder.Name = Utils.BytesToString(create.FolderData.Name);
folder.OwnerID = agent.AgentID;
folder.ParentID = create.FolderData.ParentID;
folder.Parent = parentFolder;
folder.PreferredType = (AssetType)create.FolderData.Type;
folder.ID = create.FolderData.FolderID;
folder.Version = 1;
Logger.DebugLog(String.Format("Creating inventory folder {0}", folder.Name));
agent.Inventory[folder.ID] = folder;
lock (parentFolder.Children.Dictionary)
parentFolder.Children.Dictionary[folder.ID] = folder;
}
else
{
Logger.Log(String.Format(
"Cannot create new inventory folder, item {0} already exists",
create.FolderData.FolderID), Helpers.LogLevel.Warning);
}
}
else
{
Logger.Log(String.Format(
"Cannot create new inventory folder, parent folder {0} does not exist",
create.FolderData.ParentID), Helpers.LogLevel.Warning);
}
}
CreateFolder(agent, create.FolderData.FolderID, Utils.BytesToString(create.FolderData.Name),
(AssetType)create.FolderData.Type, create.FolderData.ParentID, agent.AgentID);
}
void UpdateInventoryItemHandler(Packet packet, Agent agent)
@@ -246,12 +211,150 @@ namespace Simian.Extensions
}
else
{
Logger.Log(String.Format(
"FetchInventoryDescendents called for an unknown folder {0}",
fetch.InventoryData.FolderID), Helpers.LogLevel.Warning);
Logger.Log("FetchInventoryDescendents called for an unknown folder " + fetch.InventoryData.FolderID,
Helpers.LogLevel.Warning);
}
}
void FetchInventoryHandler(Packet packet, Agent agent)
{
FetchInventoryPacket fetch = (FetchInventoryPacket)packet;
FetchInventoryReplyPacket reply = new FetchInventoryReplyPacket();
reply.AgentData.AgentID = agent.AgentID;
reply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[fetch.InventoryData.Length];
for (int i = 0; i < fetch.InventoryData.Length; i++)
{
UUID itemID = fetch.InventoryData[i].ItemID;
reply.InventoryData[i] = new FetchInventoryReplyPacket.InventoryDataBlock();
reply.InventoryData[i].ItemID = itemID;
InventoryObject obj;
if (agent.Inventory.TryGetValue(itemID, out obj) && obj is InventoryItem)
{
InventoryItem item = (InventoryItem)obj;
reply.InventoryData[i].AssetID = item.AssetID;
reply.InventoryData[i].BaseMask = (uint)item.Permissions.BaseMask;
reply.InventoryData[i].CRC = Helpers.InventoryCRC((int)Utils.DateTimeToUnixTime(item.CreationDate),
(byte)item.SaleType, (sbyte)item.InventoryType, (sbyte)item.AssetType, item.AssetID, item.GroupID,
item.SalePrice, item.OwnerID, item.CreatorID, item.ID, item.ParentID,
(uint)item.Permissions.EveryoneMask, item.Flags, (uint)item.Permissions.NextOwnerMask,
(uint)item.Permissions.GroupMask, (uint)item.Permissions.OwnerMask);
reply.InventoryData[i].CreationDate = (int)Utils.DateTimeToUnixTime(item.CreationDate);
reply.InventoryData[i].CreatorID = item.CreatorID;
reply.InventoryData[i].Description = Utils.StringToBytes(item.Description);
reply.InventoryData[i].EveryoneMask = (uint)item.Permissions.EveryoneMask;
reply.InventoryData[i].Flags = item.Flags;
reply.InventoryData[i].FolderID = item.ParentID;
reply.InventoryData[i].GroupID = item.GroupID;
reply.InventoryData[i].GroupMask = (uint)item.Permissions.GroupMask;
reply.InventoryData[i].GroupOwned = item.GroupOwned;
reply.InventoryData[i].InvType = (sbyte)item.InventoryType;
reply.InventoryData[i].Name = Utils.StringToBytes(item.Name);
reply.InventoryData[i].NextOwnerMask = (uint)item.Permissions.NextOwnerMask;
reply.InventoryData[i].OwnerID = item.OwnerID;
reply.InventoryData[i].OwnerMask = (uint)item.Permissions.OwnerMask;
reply.InventoryData[i].SalePrice = item.SalePrice;
reply.InventoryData[i].SaleType = (byte)item.SaleType;
reply.InventoryData[i].Type = (sbyte)item.AssetType;
}
else
{
Logger.Log("FetchInventory called for an unknown item " + itemID.ToString(),
Helpers.LogLevel.Warning);
reply.InventoryData[i].Name = new byte[0];
reply.InventoryData[i].Description = new byte[0];
}
}
Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory);
}
public bool CreateRootFolder(Agent agent, UUID folderID, string name, UUID ownerID)
{
lock (agent.Inventory)
{
if (!agent.Inventory.ContainsKey(folderID))
{
InventoryFolder folder = new InventoryFolder();
folder.Name = name;
folder.OwnerID = agent.AgentID;
folder.ParentID = UUID.Zero;
folder.Parent = null;
folder.PreferredType = AssetType.Folder;
folder.ID = folderID;
folder.Version = 1;
Logger.DebugLog("Creating root inventory folder " + folder.Name);
agent.Inventory[folder.ID] = folder;
return true;
}
else
{
Logger.Log(String.Format(
"Cannot create root inventory folder, item {0} already exists", folderID),
Helpers.LogLevel.Warning);
}
}
return false;
}
public bool CreateFolder(Agent agent, UUID folderID, string name, AssetType preferredType,
UUID parentID, UUID ownerID)
{
if (parentID == UUID.Zero)
parentID = agent.InventoryRoot;
lock (agent.Inventory)
{
InventoryObject parent;
if (agent.Inventory.TryGetValue(parentID, out parent) && parent is InventoryFolder)
{
InventoryFolder parentFolder = (InventoryFolder)parent;
if (!agent.Inventory.ContainsKey(folderID))
{
InventoryFolder folder = new InventoryFolder();
folder.Name = name;
folder.OwnerID = agent.AgentID;
folder.ParentID = parentID;
folder.Parent = parentFolder;
folder.PreferredType = preferredType;
folder.ID = folderID;
folder.Version = 1;
Logger.DebugLog("Creating inventory folder " + folder.Name);
agent.Inventory[folder.ID] = folder;
lock (parentFolder.Children.Dictionary)
parentFolder.Children.Dictionary[folder.ID] = folder;
return true;
}
else
{
Logger.Log(String.Format(
"Cannot create new inventory folder, item {0} already exists", folderID),
Helpers.LogLevel.Warning);
}
}
else
{
Logger.Log(String.Format(
"Cannot create new inventory folder, parent folder {0} does not exist", parentID),
Helpers.LogLevel.Warning);
}
}
return false;
}
public UUID CreateItem(Agent agent, string name, string description, InventoryType invType, AssetType type,
UUID assetID, UUID parentID, PermissionMask ownerMask, PermissionMask nextOwnerMask, UUID ownerID,
UUID creatorID, UUID transactionID, uint callbackID)
@@ -277,6 +380,7 @@ namespace Simian.Extensions
item.Permissions.OwnerMask = ownerMask;
item.Permissions.NextOwnerMask = nextOwnerMask;
item.AssetType = type;
item.AssetID = assetID;
item.OwnerID = agent.AgentID;
item.CreatorID = agent.AgentID;
item.CreationDate = DateTime.Now;
@@ -333,7 +437,7 @@ namespace Simian.Extensions
else
{
Logger.Log(String.Format(
"Cannot created new inventory item, folder {0} does not exist",
"Cannot create new inventory item, folder {0} does not exist",
parentID), Helpers.LogLevel.Warning);
return UUID.Zero;