From b19562e033d74d2a6ec1dc2ee556be860fed9b29 Mon Sep 17 00:00:00 2001 From: Christopher Date: Sun, 28 Jun 2020 13:18:37 +0200 Subject: [PATCH] add code --- src/TextureFetcher.cs | 119 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/TextureFetcher.cs diff --git a/src/TextureFetcher.cs b/src/TextureFetcher.cs new file mode 100644 index 0000000..09e17f7 --- /dev/null +++ b/src/TextureFetcher.cs @@ -0,0 +1,119 @@ +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 + { + 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) + { + 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(); + } + } +}