diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
4 files changed, 130 insertions, 19 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 7c21ba9..86ee28a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -10565,9 +10565,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10565 | } | 10565 | } |
10566 | } | 10566 | } |
10567 | 10567 | ||
10568 | public static string GetLine(UUID assetID, int line, int maxLength) | 10568 | /// <summary> |
10569 | /// Get a notecard line. | ||
10570 | /// </summary> | ||
10571 | /// <param name="assetID"></param> | ||
10572 | /// <param name="line">Lines start at index 0</param> | ||
10573 | /// <returns></returns> | ||
10574 | public static string GetLine(UUID assetID, int lineNumber) | ||
10569 | { | 10575 | { |
10570 | if (line < 0) | 10576 | if (lineNumber < 0) |
10571 | return ""; | 10577 | return ""; |
10572 | 10578 | ||
10573 | string data; | 10579 | string data; |
@@ -10579,17 +10585,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10579 | { | 10585 | { |
10580 | m_Notecards[assetID].lastRef = DateTime.Now; | 10586 | m_Notecards[assetID].lastRef = DateTime.Now; |
10581 | 10587 | ||
10582 | if (line >= m_Notecards[assetID].text.Length) | 10588 | if (lineNumber >= m_Notecards[assetID].text.Length) |
10583 | return "\n\n\n"; | 10589 | return "\n\n\n"; |
10584 | 10590 | ||
10585 | data = m_Notecards[assetID].text[line]; | 10591 | data = m_Notecards[assetID].text[lineNumber]; |
10586 | if (data.Length > maxLength) | ||
10587 | data = data.Substring(0, maxLength); | ||
10588 | 10592 | ||
10589 | return data; | 10593 | return data; |
10590 | } | 10594 | } |
10591 | } | 10595 | } |
10592 | 10596 | ||
10597 | /// <summary> | ||
10598 | /// Get a notecard line. | ||
10599 | /// </summary> | ||
10600 | /// <param name="assetID"></param> | ||
10601 | /// <param name="line">Lines start at index 0</param> | ||
10602 | /// <param name="maxLength">Maximum length of the returned line. Longer lines will be truncated</para> | ||
10603 | /// <returns></returns> | ||
10604 | public static string GetLine(UUID assetID, int lineNumber, int maxLength) | ||
10605 | { | ||
10606 | string line = GetLine(assetID, lineNumber); | ||
10607 | |||
10608 | if (line.Length > maxLength) | ||
10609 | line = line.Substring(0, maxLength); | ||
10610 | |||
10611 | return line; | ||
10612 | } | ||
10613 | |||
10593 | public static void CacheCheck() | 10614 | public static void CacheCheck() |
10594 | { | 10615 | { |
10595 | foreach (UUID key in new List<UUID>(m_Notecards.Keys)) | 10616 | foreach (UUID key in new List<UUID>(m_Notecards.Keys)) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 154179c..07b36de 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -28,11 +28,16 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.IO; | ||
32 | using System.Reflection; | ||
31 | using System.Runtime.Remoting.Lifetime; | 33 | using System.Runtime.Remoting.Lifetime; |
32 | using System.Text; | 34 | using System.Text; |
33 | using System.Net; | 35 | using System.Net; |
34 | using System.Threading; | 36 | using System.Threading; |
37 | using System.Xml; | ||
38 | using log4net; | ||
35 | using OpenMetaverse; | 39 | using OpenMetaverse; |
40 | using OpenMetaverse.StructuredData; | ||
36 | using Nini.Config; | 41 | using Nini.Config; |
37 | using OpenSim; | 42 | using OpenSim; |
38 | using OpenSim.Framework; | 43 | using OpenSim.Framework; |
@@ -119,6 +124,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
119 | [Serializable] | 124 | [Serializable] |
120 | public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi | 125 | public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi |
121 | { | 126 | { |
127 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
128 | |||
122 | internal IScriptEngine m_ScriptEngine; | 129 | internal IScriptEngine m_ScriptEngine; |
123 | internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there | 130 | internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there |
124 | internal SceneObjectPart m_host; | 131 | internal SceneObjectPart m_host; |
@@ -1730,26 +1737,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1730 | for (int i = 0; i < contents.Length; i++) | 1737 | for (int i = 0; i < contents.Length; i++) |
1731 | notecardData.Append((string)(contents.GetLSLStringItem(i) + "\n")); | 1738 | notecardData.Append((string)(contents.GetLSLStringItem(i) + "\n")); |
1732 | 1739 | ||
1733 | SaveNotecard(notecardName, notecardData.ToString()); | 1740 | SaveNotecard(notecardName, "Script generated notecard", notecardData.ToString(), false); |
1734 | } | 1741 | } |
1735 | 1742 | ||
1736 | /// <summary> | 1743 | /// <summary> |
1737 | /// Save a notecard to prim inventory. | 1744 | /// Save a notecard to prim inventory. |
1738 | /// </summary> | 1745 | /// </summary> |
1739 | /// <param name="notecardName"></param> | 1746 | /// <param name="name"></param> |
1747 | /// <param name="description">Description of notecard</param> | ||
1740 | /// <param name="notecardData"></param> | 1748 | /// <param name="notecardData"></param> |
1749 | /// <param name="forceSameName"> | ||
1750 | /// If true, then if an item exists with the same name, it is replaced. | ||
1751 | /// If false, then a new item is created witha slightly different name (e.g. name 1) | ||
1752 | /// </param> | ||
1741 | /// <returns>Prim inventory item created.</returns> | 1753 | /// <returns>Prim inventory item created.</returns> |
1742 | protected TaskInventoryItem SaveNotecard(string notecardName, string notecardData) | 1754 | protected TaskInventoryItem SaveNotecard(string name, string description, string data, bool forceSameName) |
1743 | { | 1755 | { |
1744 | // Create new asset | 1756 | // Create new asset |
1745 | AssetBase asset = new AssetBase(UUID.Random(), notecardName, (sbyte)AssetType.Notecard, m_host.OwnerID.ToString()); | 1757 | AssetBase asset = new AssetBase(UUID.Random(), name, (sbyte)AssetType.Notecard, m_host.OwnerID.ToString()); |
1746 | asset.Description = "Script Generated Notecard"; | 1758 | asset.Description = description; |
1747 | 1759 | ||
1748 | int textLength = notecardData.Length; | 1760 | int textLength = data.Length; |
1749 | notecardData = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " | 1761 | data |
1750 | + textLength.ToString() + "\n" + notecardData + "}\n"; | 1762 | = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " |
1763 | + textLength.ToString() + "\n" + data + "}\n"; | ||
1751 | 1764 | ||
1752 | asset.Data = Util.UTF8.GetBytes(notecardData); | 1765 | asset.Data = Util.UTF8.GetBytes(data); |
1753 | World.AssetService.Store(asset); | 1766 | World.AssetService.Store(asset); |
1754 | 1767 | ||
1755 | // Create Task Entry | 1768 | // Create Task Entry |
@@ -1775,7 +1788,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1775 | taskItem.PermsMask = 0; | 1788 | taskItem.PermsMask = 0; |
1776 | taskItem.AssetID = asset.FullID; | 1789 | taskItem.AssetID = asset.FullID; |
1777 | 1790 | ||
1778 | m_host.Inventory.AddInventoryItem(taskItem, false); | 1791 | if (forceSameName) |
1792 | m_host.Inventory.AddInventoryItemExclusive(taskItem, false); | ||
1793 | else | ||
1794 | m_host.Inventory.AddInventoryItem(taskItem, false); | ||
1779 | 1795 | ||
1780 | return taskItem; | 1796 | return taskItem; |
1781 | } | 1797 | } |
@@ -1791,7 +1807,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1791 | StringBuilder notecardData = new StringBuilder(); | 1807 | StringBuilder notecardData = new StringBuilder(); |
1792 | 1808 | ||
1793 | for (int count = 0; count < NotecardCache.GetLines(assetID); count++) | 1809 | for (int count = 0; count < NotecardCache.GetLines(assetID); count++) |
1794 | notecardData.Append(NotecardCache.GetLine(assetID, count, 255) + "\n"); | 1810 | { |
1811 | string line = NotecardCache.GetLine(assetID, count) + "\n"; | ||
1812 | |||
1813 | // m_log.DebugFormat("[OSSL]: From notecard {0} loading line {1}", notecardNameOrUuid, line); | ||
1814 | |||
1815 | notecardData.Append(line); | ||
1816 | } | ||
1795 | 1817 | ||
1796 | return notecardData.ToString(); | 1818 | return notecardData.ToString(); |
1797 | } | 1819 | } |
@@ -1807,7 +1829,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1807 | protected UUID CacheNotecard(string notecardNameOrUuid) | 1829 | protected UUID CacheNotecard(string notecardNameOrUuid) |
1808 | { | 1830 | { |
1809 | UUID assetID = UUID.Zero; | 1831 | UUID assetID = UUID.Zero; |
1810 | StringBuilder notecardData = new StringBuilder(); | ||
1811 | 1832 | ||
1812 | if (!UUID.TryParse(notecardNameOrUuid, out assetID)) | 1833 | if (!UUID.TryParse(notecardNameOrUuid, out assetID)) |
1813 | { | 1834 | { |
@@ -1864,7 +1885,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1864 | return "ERROR!"; | 1885 | return "ERROR!"; |
1865 | } | 1886 | } |
1866 | 1887 | ||
1867 | return NotecardCache.GetLine(assetID, line, 255); | 1888 | return NotecardCache.GetLine(assetID, line); |
1868 | } | 1889 | } |
1869 | 1890 | ||
1870 | /// <summary> | 1891 | /// <summary> |
@@ -2122,9 +2143,66 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2122 | 2143 | ||
2123 | return new LSL_Key(x.ToString()); | 2144 | return new LSL_Key(x.ToString()); |
2124 | } | 2145 | } |
2146 | |||
2125 | return new LSL_Key(UUID.Zero.ToString()); | 2147 | return new LSL_Key(UUID.Zero.ToString()); |
2126 | } | 2148 | } |
2127 | 2149 | ||
2150 | public LSL_Key osNpcSaveAppearance(string avatar, string notecardName) | ||
2151 | { | ||
2152 | CheckThreatLevel(ThreatLevel.High, "osNpcSaveAppearance"); | ||
2153 | |||
2154 | INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); | ||
2155 | IAvatarFactory appearanceModule = World.RequestModuleInterface<IAvatarFactory>(); | ||
2156 | |||
2157 | if (npcModule != null && appearanceModule != null) | ||
2158 | { | ||
2159 | UUID avatarId = UUID.Zero; | ||
2160 | if (!UUID.TryParse(avatar, out avatarId)) | ||
2161 | return new LSL_Key(UUID.Zero.ToString()); | ||
2162 | |||
2163 | if (!npcModule.IsNPC(avatarId, m_host.ParentGroup.Scene)) | ||
2164 | return new LSL_Key(UUID.Zero.ToString()); | ||
2165 | |||
2166 | appearanceModule.SaveBakedTextures(avatarId); | ||
2167 | ScenePresence sp = m_host.ParentGroup.Scene.GetScenePresence(avatarId); | ||
2168 | OSDMap appearancePacked = sp.Appearance.Pack(); | ||
2169 | |||
2170 | TaskInventoryItem item | ||
2171 | = SaveNotecard(notecardName, "Avatar Appearance", Util.GetFormattedXml(appearancePacked as OSD), true); | ||
2172 | |||
2173 | return new LSL_Key(item.AssetID.ToString()); | ||
2174 | } | ||
2175 | |||
2176 | return new LSL_Key(UUID.Zero.ToString()); | ||
2177 | } | ||
2178 | |||
2179 | public void osNpcLoadAppearance(string avatar, string notecardNameOrUuid) | ||
2180 | { | ||
2181 | CheckThreatLevel(ThreatLevel.High, "osNpcLoadAppearance"); | ||
2182 | |||
2183 | INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); | ||
2184 | |||
2185 | if (npcModule != null) | ||
2186 | { | ||
2187 | UUID avatarId = UUID.Zero; | ||
2188 | if (!UUID.TryParse(avatar, out avatarId)) | ||
2189 | return; | ||
2190 | |||
2191 | if (!npcModule.IsNPC(avatarId, m_host.ParentGroup.Scene)) | ||
2192 | return; | ||
2193 | |||
2194 | string appearanceSerialized = LoadNotecard(notecardNameOrUuid); | ||
2195 | OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); | ||
2196 | // OSD a = OSDParser.DeserializeLLSDXml(appearanceSerialized); | ||
2197 | // Console.WriteLine("appearanceSerialized {0}", appearanceSerialized); | ||
2198 | // Console.WriteLine("a.Type {0}, a.ToString() {1}", a.Type, a); | ||
2199 | AvatarAppearance appearance = new AvatarAppearance(); | ||
2200 | appearance.Unpack(appearanceOsd); | ||
2201 | |||
2202 | npcModule.SetNPCAppearance(avatarId, appearance, m_host.ParentGroup.Scene); | ||
2203 | } | ||
2204 | } | ||
2205 | |||
2128 | public void osNpcMoveTo(LSL_Key npc, LSL_Vector position) | 2206 | public void osNpcMoveTo(LSL_Key npc, LSL_Vector position) |
2129 | { | 2207 | { |
2130 | CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); | 2208 | CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 19352f0..868af27 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -170,6 +170,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
170 | 170 | ||
171 | 171 | ||
172 | key osNpcCreate(string user, string name, vector position, key cloneFrom); | 172 | key osNpcCreate(string user, string name, vector position, key cloneFrom); |
173 | LSL_Key osNpcSaveAppearance(string avatar, string notecardName); | ||
174 | void osNpcLoadAppearance(string avatar, string notecardNameOrUuid); | ||
173 | void osNpcMoveTo(key npc, vector position); | 175 | void osNpcMoveTo(key npc, vector position); |
174 | void osNpcSay(key npc, string message); | 176 | void osNpcSay(key npc, string message); |
175 | void osNpcRemove(key npc); | 177 | void osNpcRemove(key npc); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 7c59098..959b5d5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -483,6 +483,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
483 | return m_OSSL_Functions.osNpcCreate(user, name, position, cloneFrom); | 483 | return m_OSSL_Functions.osNpcCreate(user, name, position, cloneFrom); |
484 | } | 484 | } |
485 | 485 | ||
486 | public key osNpcSaveAppearance(string avatar, string notecardName) | ||
487 | { | ||
488 | return m_OSSL_Functions.osNpcSaveAppearance(avatar, notecardName); | ||
489 | } | ||
490 | |||
491 | public void osNpcLoadAppearance(string avatar, string notecardNameOrUuid) | ||
492 | { | ||
493 | m_OSSL_Functions.osNpcLoadAppearance(avatar, notecardNameOrUuid); | ||
494 | } | ||
495 | |||
486 | public void osNpcMoveTo(key npc, vector position) | 496 | public void osNpcMoveTo(key npc, vector position) |
487 | { | 497 | { |
488 | m_OSSL_Functions.osNpcMoveTo(npc, position); | 498 | m_OSSL_Functions.osNpcMoveTo(npc, position); |