using log4net; using Mono.Addins; using Nini.Config; using OpenMetaverse; using OpenMetaverse.StructuredData; using OpenSim.Framework; using OpenSim.Modules.Appearance2Avatar.helper; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Interfaces; using OpenSim.Region.ScriptEngine.Shared.Api; using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; [assembly: Addin("Appearance2Avatar", "0.1")] [assembly: AddinDependency("OpenSim.Region.Framework", OpenSim.VersionInfo.VersionNumber)] namespace OpenSim.Modules.Appearance2Avatar { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "Appearance2Avatar")] public class Appearance2Avatar : INonSharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private IScriptModuleComms m_scriptModule = null; public static Scene m_scene = null; private IAssetCache m_assetCache = null; public string Name { get { return "Appearance2Avatar"; } } public Type ReplaceableInterface { get { return null; } } public void AddRegion(Scene scene) { } public void Close() { } public void Initialise(IConfigSource source) { } public void RegionLoaded(Scene scene) { m_scriptModule = scene.RequestModuleInterface(); if (m_scriptModule != null) { m_scriptModule.RegisterScriptInvocation(this, "osRemoveAllAttachmentsFromAvatar"); m_scriptModule.RegisterScriptInvocation(this, "osAppearance2Avatar"); } m_assetCache = scene.RequestModuleInterface(); m_scene = scene; } public void RemoveRegion(Scene scene) { } [ScriptInvocation] public void osRemoveAllAttachmentsFromAvatar(UUID hostID, UUID scriptID, String targetAvatar) { ScenePresence sp = m_scene.GetScenePresence(UUID.Parse(targetAvatar)); if (sp != null) { //Remove all attachments List _allAttachments = sp.GetAttachments(); foreach (SceneObjectGroup _attachment in _allAttachments) m_scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, _attachment); if (m_scene.AttachmentsModule != null) m_scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false); //Remove current outfit from inventory InventoryFolderBase _outfitFolder = m_scene.InventoryService.GetFolderForType(sp.UUID, FolderType.CurrentOutfit); if (_outfitFolder != null) { InventoryCollection _outfitFolderContend = m_scene.InventoryService.GetFolderContent(sp.UUID, _outfitFolder.ID); List _itemIDs = new List(); foreach (InventoryItemBase item in _outfitFolderContend.Items) if (item.InvType == (int)AssetType.Object) _itemIDs.Add(item.ID); m_scene.InventoryService.DeleteItems(sp.UUID, _itemIDs); m_scene.InventoryService.UpdateFolder(_outfitFolder); } } } [ScriptInvocation] public void osAppearance2Avatar(UUID hostID, UUID scriptID, String notecard, String targetAvatar) { SceneObjectPart _host = m_scene.GetSceneObjectPart(hostID); ScenePresence sp = m_scene.GetScenePresence(UUID.Parse(targetAvatar)); if(_host != null) { if (sp != null) { TaskInventoryItem notecardItem = _host.Inventory.GetInventoryItems().Find(X => X.Name == notecard); if (notecardItem != null) { if (notecardItem.Type != 7) throw new Exception("Given item is not a notecard."); m_log.Info("[" + Name + "] Info: Fetch asset data for notecard."); NoteCardReader _ncReader = new NoteCardReader(m_scene, _host); String noteCardContend = _ncReader.LoadNotecard(notecard); if(noteCardContend != null) { //Remove all attachments List _allAttachments = sp.GetAttachments(); foreach (SceneObjectGroup _attachment in _allAttachments) m_scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, _attachment); if (m_scene.AttachmentsModule != null) m_scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false); //Remove current outfit from inventory InventoryFolderBase _outfitFolder = m_scene.InventoryService.GetFolderForType(sp.UUID, FolderType.CurrentOutfit); if(_outfitFolder != null) { InventoryCollection _outfitFolderContend = m_scene.InventoryService.GetFolderContent(sp.UUID, _outfitFolder.ID); List _itemIDs = new List(); foreach (InventoryItemBase item in _outfitFolderContend.Items) if (item.InvType == (int)AssetType.Object) _itemIDs.Add(item.ID); m_scene.InventoryService.DeleteItems(sp.UUID, _itemIDs); m_scene.InventoryService.UpdateFolder(_outfitFolder); } //Load Appearance OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(noteCardContend); AvatarAppearance _appearance = new AvatarAppearance(appearanceOsd); AvatarAppearance newAppearance = new AvatarAppearance(_appearance, true); sp.Appearance = newAppearance; //Send Update m_log.Info("[" + Name + "] Info: Send update to all clients"); m_scene.AvatarFactory.SendAppearance(sp.UUID); } } else { m_log.Error("[" + Name + "] ERROR: Notecard not found in objekt inventory"); throw new Exception("Notecard not found in objekt inventory"); } } else { m_log.Error("[" + Name + "] ERROR: Target not found in region"); throw new Exception("Target not found in region"); } } else { m_log.Error("[" + Name + "] ERROR: Cant find objekt inworld"); throw new Exception("Cant find objekt inworld"); } } } }