using Mono.Addins; using Nini.Config; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using System; using System.Collections.Generic; using System.Linq; using System.Text; [assembly: Addin("TextureFetcher", "0.1")] [assembly: AddinDependency("OpenSim.Region.Framework", OpenSim.VersionInfo.VersionNumber)] namespace OpenSim.Modules.TextureFetcher { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RegionFullPerm")] class TextureFetcher : INonSharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); Scene m_scene = null; public string Name { get { return "TextureFetcher"; } } public void AddRegion(Scene scene) { } public void RemoveRegion(Scene scene) { } public void Close() { } public void Initialise(IConfigSource source) { } public Type ReplaceableInterface { get { return null; } } public void RegionLoaded(Scene scene) { m_scene = scene; scene.EventManager.OnObjectAddedToScene += AddObject; scene.EventManager.OnSceneObjectLoaded += AddObject; scene.EventManager.OnIncomingSceneObject += AddObject; scene.EventManager.OnSceneObjectPartUpdated += UpdateObject; scene.EventManager.OnSceneObjectPartCopy += CopyObject; } private void CopyObject(SceneObjectPart copy, SceneObjectPart original, bool userExposed) { copyTexturesToInventory(copy); } private void UpdateObject(SceneObjectPart sop, bool full) { copyTexturesToInventory(sop); } private void AddObject(SceneObjectGroup obj) { foreach(SceneObjectPart _part in obj.Parts) copyTexturesToInventory(_part); } private void copyTexturesToInventory(SceneObjectPart part) { if (part.ParentGroup.IsAttachment) return; List allTextures = new List(); List inventoryItems = new List(); //Get all Textures from the scene object Primitive.TextureEntry textures = part.Shape.Textures; int allSides = part.GetNumberOfSides(); for (uint i = 0; i < allSides; i++) if (textures.FaceTextures[i] != null) allTextures.Add(textures.FaceTextures[i].TextureID); //Convert texture uuid list to inventar items. foreach (UUID texture in allTextures) { TaskInventoryItem item = new TaskInventoryItem(); item.AssetID = texture; item.OwnerID = part.OwnerID; item.CurrentPermissions = 581639; item.Name = "tf-" + texture.ToString(); item.Description = "This item was generated by the texture fetcher module."; item.OwnerID = part.OwnerID; item.CreatorID = part.OwnerID; item.LastOwnerID = part.OwnerID; inventoryItems.Add(item); } //Check if the item is allready in the inventory and then add it. List inventarContend = part.Inventory.GetInventoryList(); bool updateNeeded = false; foreach (TaskInventoryItem item in inventoryItems) { if(!inventarContend.Contains(item.AssetID)) { updateNeeded = true; part.Inventory.AddInventoryItem(item, false); } } if(updateNeeded == true) { part.SendFullUpdateToAllClients(); } } } }