diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 155 |
1 files changed, 117 insertions, 38 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 1426070..6ff6b00 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -138,6 +138,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
138 | internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; | 138 | internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; |
139 | internal float m_ScriptDelayFactor = 1.0f; | 139 | internal float m_ScriptDelayFactor = 1.0f; |
140 | internal float m_ScriptDistanceFactor = 1.0f; | 140 | internal float m_ScriptDistanceFactor = 1.0f; |
141 | internal bool m_debuggerSafe = false; | ||
141 | internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); | 142 | internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); |
142 | 143 | ||
143 | protected IUrlModule m_UrlModule = null; | 144 | protected IUrlModule m_UrlModule = null; |
@@ -148,6 +149,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
148 | m_ScriptEngine = scriptEngine; | 149 | m_ScriptEngine = scriptEngine; |
149 | m_host = host; | 150 | m_host = host; |
150 | m_item = item; | 151 | m_item = item; |
152 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); | ||
151 | 153 | ||
152 | m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); | 154 | m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); |
153 | 155 | ||
@@ -211,7 +213,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
211 | 213 | ||
212 | internal void OSSLError(string msg) | 214 | internal void OSSLError(string msg) |
213 | { | 215 | { |
214 | throw new ScriptException("OSSL Runtime Error: " + msg); | 216 | if (m_debuggerSafe) |
217 | { | ||
218 | OSSLShoutError(msg); | ||
219 | } | ||
220 | else | ||
221 | { | ||
222 | throw new ScriptException("OSSL Runtime Error: " + msg); | ||
223 | } | ||
215 | } | 224 | } |
216 | 225 | ||
217 | /// <summary> | 226 | /// <summary> |
@@ -930,18 +939,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
930 | if (target != null) | 939 | if (target != null) |
931 | { | 940 | { |
932 | UUID animID=UUID.Zero; | 941 | UUID animID=UUID.Zero; |
933 | lock (m_host.TaskInventory) | 942 | m_host.TaskInventory.LockItemsForRead(true); |
943 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
934 | { | 944 | { |
935 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 945 | if (inv.Value.Name == animation) |
936 | { | 946 | { |
937 | if (inv.Value.Name == animation) | 947 | if (inv.Value.Type == (int)AssetType.Animation) |
938 | { | 948 | animID = inv.Value.AssetID; |
939 | if (inv.Value.Type == (int)AssetType.Animation) | 949 | continue; |
940 | animID = inv.Value.AssetID; | ||
941 | continue; | ||
942 | } | ||
943 | } | 950 | } |
944 | } | 951 | } |
952 | m_host.TaskInventory.LockItemsForRead(false); | ||
945 | if (animID == UUID.Zero) | 953 | if (animID == UUID.Zero) |
946 | target.Animator.AddAnimation(animation, m_host.UUID); | 954 | target.Animator.AddAnimation(animation, m_host.UUID); |
947 | else | 955 | else |
@@ -982,6 +990,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
982 | else | 990 | else |
983 | animID = UUID.Zero; | 991 | animID = UUID.Zero; |
984 | } | 992 | } |
993 | m_host.TaskInventory.LockItemsForRead(false); | ||
985 | 994 | ||
986 | if (animID == UUID.Zero) | 995 | if (animID == UUID.Zero) |
987 | target.Animator.RemoveAnimation(animation); | 996 | target.Animator.RemoveAnimation(animation); |
@@ -1848,15 +1857,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1848 | { | 1857 | { |
1849 | UUID assetID = UUID.Zero; | 1858 | UUID assetID = UUID.Zero; |
1850 | 1859 | ||
1851 | if (!UUID.TryParse(notecardNameOrUuid, out assetID)) | 1860 | bool notecardNameIsUUID = UUID.TryParse(notecardNameOrUuid, out assetID); |
1861 | |||
1862 | if (!notecardNameIsUUID) | ||
1852 | { | 1863 | { |
1853 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | 1864 | assetID = SearchTaskInventoryForAssetId(notecardNameOrUuid); |
1854 | { | ||
1855 | if (item.Type == 7 && item.Name == notecardNameOrUuid) | ||
1856 | { | ||
1857 | assetID = item.AssetID; | ||
1858 | } | ||
1859 | } | ||
1860 | } | 1865 | } |
1861 | 1866 | ||
1862 | if (assetID == UUID.Zero) | 1867 | if (assetID == UUID.Zero) |
@@ -1867,7 +1872,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1867 | AssetBase a = World.AssetService.Get(assetID.ToString()); | 1872 | AssetBase a = World.AssetService.Get(assetID.ToString()); |
1868 | 1873 | ||
1869 | if (a == null) | 1874 | if (a == null) |
1870 | return UUID.Zero; | 1875 | { |
1876 | // Whoops, it's still possible here that the notecard name was properly | ||
1877 | // formatted like a UUID but isn't an asset UUID so lets look it up by name after all | ||
1878 | assetID = SearchTaskInventoryForAssetId(notecardNameOrUuid); | ||
1879 | if (assetID == UUID.Zero) | ||
1880 | return UUID.Zero; | ||
1881 | |||
1882 | if (!NotecardCache.IsCached(assetID)) | ||
1883 | { | ||
1884 | a = World.AssetService.Get(assetID.ToString()); | ||
1885 | |||
1886 | if (a == null) | ||
1887 | { | ||
1888 | return UUID.Zero; | ||
1889 | } | ||
1890 | } | ||
1891 | } | ||
1871 | 1892 | ||
1872 | string data = Encoding.UTF8.GetString(a.Data); | 1893 | string data = Encoding.UTF8.GetString(a.Data); |
1873 | NotecardCache.Cache(assetID, data); | 1894 | NotecardCache.Cache(assetID, data); |
@@ -1875,6 +1896,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1875 | 1896 | ||
1876 | return assetID; | 1897 | return assetID; |
1877 | } | 1898 | } |
1899 | protected UUID SearchTaskInventoryForAssetId(string name) | ||
1900 | { | ||
1901 | UUID assetId = UUID.Zero; | ||
1902 | m_host.TaskInventory.LockItemsForRead(true); | ||
1903 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
1904 | { | ||
1905 | if (item.Type == 7 && item.Name == name) | ||
1906 | { | ||
1907 | assetId = item.AssetID; | ||
1908 | } | ||
1909 | } | ||
1910 | m_host.TaskInventory.LockItemsForRead(false); | ||
1911 | return assetId; | ||
1912 | } | ||
1878 | 1913 | ||
1879 | /// <summary> | 1914 | /// <summary> |
1880 | /// Directly get an entire notecard at once. | 1915 | /// Directly get an entire notecard at once. |
@@ -2342,7 +2377,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2342 | CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); | 2377 | CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); |
2343 | m_host.AddScriptLPS(1); | 2378 | m_host.AddScriptLPS(1); |
2344 | 2379 | ||
2345 | return NpcCreate(firstname, lastname, position, notecard, false, false); | 2380 | return NpcCreate(firstname, lastname, position, notecard, true, false); |
2346 | } | 2381 | } |
2347 | 2382 | ||
2348 | public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) | 2383 | public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) |
@@ -2353,24 +2388,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2353 | return NpcCreate( | 2388 | return NpcCreate( |
2354 | firstname, lastname, position, notecard, | 2389 | firstname, lastname, position, notecard, |
2355 | (options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0, | 2390 | (options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0, |
2356 | (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0); | 2391 | false); |
2392 | // (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0); | ||
2357 | } | 2393 | } |
2358 | 2394 | ||
2359 | private LSL_Key NpcCreate( | 2395 | private LSL_Key NpcCreate( |
2360 | string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent) | 2396 | string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent) |
2361 | { | 2397 | { |
2398 | if (!owned) | ||
2399 | OSSLError("Unowned NPCs are unsupported"); | ||
2400 | |||
2401 | string groupTitle = String.Empty; | ||
2402 | |||
2403 | if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z))) | ||
2404 | return new LSL_Key(UUID.Zero.ToString()); | ||
2405 | |||
2406 | if (firstname != String.Empty || lastname != String.Empty) | ||
2407 | { | ||
2408 | if (firstname != "Shown outfit:") | ||
2409 | groupTitle = "- NPC -"; | ||
2410 | } | ||
2411 | |||
2362 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | 2412 | INPCModule module = World.RequestModuleInterface<INPCModule>(); |
2363 | if (module != null) | 2413 | if (module != null) |
2364 | { | 2414 | { |
2365 | AvatarAppearance appearance = null; | 2415 | AvatarAppearance appearance = null; |
2366 | 2416 | ||
2367 | UUID id; | 2417 | // UUID id; |
2368 | if (UUID.TryParse(notecard, out id)) | 2418 | // if (UUID.TryParse(notecard, out id)) |
2369 | { | 2419 | // { |
2370 | ScenePresence clonePresence = World.GetScenePresence(id); | 2420 | // ScenePresence clonePresence = World.GetScenePresence(id); |
2371 | if (clonePresence != null) | 2421 | // if (clonePresence != null) |
2372 | appearance = clonePresence.Appearance; | 2422 | // appearance = clonePresence.Appearance; |
2373 | } | 2423 | // } |
2374 | 2424 | ||
2375 | if (appearance == null) | 2425 | if (appearance == null) |
2376 | { | 2426 | { |
@@ -2378,9 +2428,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2378 | 2428 | ||
2379 | if (appearanceSerialized != null) | 2429 | if (appearanceSerialized != null) |
2380 | { | 2430 | { |
2381 | OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); | 2431 | try |
2382 | appearance = new AvatarAppearance(); | 2432 | { |
2383 | appearance.Unpack(appearanceOsd); | 2433 | OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); |
2434 | appearance = new AvatarAppearance(); | ||
2435 | appearance.Unpack(appearanceOsd); | ||
2436 | } | ||
2437 | catch | ||
2438 | { | ||
2439 | return UUID.Zero.ToString(); | ||
2440 | } | ||
2384 | } | 2441 | } |
2385 | else | 2442 | else |
2386 | { | 2443 | { |
@@ -2399,6 +2456,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2399 | World, | 2456 | World, |
2400 | appearance); | 2457 | appearance); |
2401 | 2458 | ||
2459 | ScenePresence sp; | ||
2460 | if (World.TryGetScenePresence(x, out sp)) | ||
2461 | { | ||
2462 | sp.Grouptitle = groupTitle; | ||
2463 | sp.SendAvatarDataToAllAgents(); | ||
2464 | } | ||
2402 | return new LSL_Key(x.ToString()); | 2465 | return new LSL_Key(x.ToString()); |
2403 | } | 2466 | } |
2404 | 2467 | ||
@@ -2702,16 +2765,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2702 | CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); | 2765 | CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); |
2703 | m_host.AddScriptLPS(1); | 2766 | m_host.AddScriptLPS(1); |
2704 | 2767 | ||
2705 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | 2768 | ManualResetEvent ev = new ManualResetEvent(false); |
2706 | if (module != null) | ||
2707 | { | ||
2708 | UUID npcId = new UUID(npc.m_string); | ||
2709 | 2769 | ||
2710 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | 2770 | Util.FireAndForget(delegate(object x) { |
2711 | return; | 2771 | try |
2772 | { | ||
2773 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2774 | if (module != null) | ||
2775 | { | ||
2776 | UUID npcId = new UUID(npc.m_string); | ||
2712 | 2777 | ||
2713 | module.DeleteNPC(npcId, World); | 2778 | ILandObject l = World.LandChannel.GetLandObject(m_host.GroupPosition.X, m_host.GroupPosition.Y); |
2714 | } | 2779 | if (l == null || m_host.OwnerID != l.LandData.OwnerID) |
2780 | { | ||
2781 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2782 | return; | ||
2783 | } | ||
2784 | |||
2785 | module.DeleteNPC(npcId, World); | ||
2786 | } | ||
2787 | } | ||
2788 | finally | ||
2789 | { | ||
2790 | ev.Set(); | ||
2791 | } | ||
2792 | }); | ||
2793 | ev.WaitOne(); | ||
2715 | } | 2794 | } |
2716 | 2795 | ||
2717 | public void osNpcPlayAnimation(LSL_Key npc, string animation) | 2796 | public void osNpcPlayAnimation(LSL_Key npc, string animation) |