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 | 113 |
1 files changed, 84 insertions, 29 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 828288d..51c8c7e 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; |
@@ -147,6 +148,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
147 | m_ScriptEngine = ScriptEngine; | 148 | m_ScriptEngine = ScriptEngine; |
148 | m_host = host; | 149 | m_host = host; |
149 | m_item = item; | 150 | m_item = item; |
151 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); | ||
150 | 152 | ||
151 | m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); | 153 | m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); |
152 | 154 | ||
@@ -210,7 +212,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
210 | 212 | ||
211 | internal void OSSLError(string msg) | 213 | internal void OSSLError(string msg) |
212 | { | 214 | { |
213 | throw new ScriptException("OSSL Runtime Error: " + msg); | 215 | if (m_debuggerSafe) |
216 | { | ||
217 | OSSLShoutError(msg); | ||
218 | } | ||
219 | else | ||
220 | { | ||
221 | throw new ScriptException("OSSL Runtime Error: " + msg); | ||
222 | } | ||
214 | } | 223 | } |
215 | 224 | ||
216 | /// <summary> | 225 | /// <summary> |
@@ -918,18 +927,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
918 | if (target != null) | 927 | if (target != null) |
919 | { | 928 | { |
920 | UUID animID=UUID.Zero; | 929 | UUID animID=UUID.Zero; |
921 | lock (m_host.TaskInventory) | 930 | m_host.TaskInventory.LockItemsForRead(true); |
931 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
922 | { | 932 | { |
923 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 933 | if (inv.Value.Name == animation) |
924 | { | 934 | { |
925 | if (inv.Value.Name == animation) | 935 | if (inv.Value.Type == (int)AssetType.Animation) |
926 | { | 936 | animID = inv.Value.AssetID; |
927 | if (inv.Value.Type == (int)AssetType.Animation) | 937 | continue; |
928 | animID = inv.Value.AssetID; | ||
929 | continue; | ||
930 | } | ||
931 | } | 938 | } |
932 | } | 939 | } |
940 | m_host.TaskInventory.LockItemsForRead(false); | ||
933 | if (animID == UUID.Zero) | 941 | if (animID == UUID.Zero) |
934 | target.Animator.AddAnimation(animation, m_host.UUID); | 942 | target.Animator.AddAnimation(animation, m_host.UUID); |
935 | else | 943 | else |
@@ -970,6 +978,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
970 | else | 978 | else |
971 | animID = UUID.Zero; | 979 | animID = UUID.Zero; |
972 | } | 980 | } |
981 | m_host.TaskInventory.LockItemsForRead(false); | ||
973 | 982 | ||
974 | if (animID == UUID.Zero) | 983 | if (animID == UUID.Zero) |
975 | target.Animator.RemoveAnimation(animation); | 984 | target.Animator.RemoveAnimation(animation); |
@@ -1814,6 +1823,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1814 | 1823 | ||
1815 | if (!UUID.TryParse(notecardNameOrUuid, out assetID)) | 1824 | if (!UUID.TryParse(notecardNameOrUuid, out assetID)) |
1816 | { | 1825 | { |
1826 | m_host.TaskInventory.LockItemsForRead(true); | ||
1817 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | 1827 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) |
1818 | { | 1828 | { |
1819 | if (item.Type == 7 && item.Name == notecardNameOrUuid) | 1829 | if (item.Type == 7 && item.Name == notecardNameOrUuid) |
@@ -1821,6 +1831,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1821 | assetID = item.AssetID; | 1831 | assetID = item.AssetID; |
1822 | } | 1832 | } |
1823 | } | 1833 | } |
1834 | m_host.TaskInventory.LockItemsForRead(false); | ||
1824 | } | 1835 | } |
1825 | 1836 | ||
1826 | if (assetID == UUID.Zero) | 1837 | if (assetID == UUID.Zero) |
@@ -2306,7 +2317,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2306 | CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); | 2317 | CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); |
2307 | m_host.AddScriptLPS(1); | 2318 | m_host.AddScriptLPS(1); |
2308 | 2319 | ||
2309 | return NpcCreate(firstname, lastname, position, notecard, false, false); | 2320 | return NpcCreate(firstname, lastname, position, notecard, true, false); |
2310 | } | 2321 | } |
2311 | 2322 | ||
2312 | public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) | 2323 | public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) |
@@ -2317,24 +2328,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2317 | return NpcCreate( | 2328 | return NpcCreate( |
2318 | firstname, lastname, position, notecard, | 2329 | firstname, lastname, position, notecard, |
2319 | (options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0, | 2330 | (options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0, |
2320 | (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0); | 2331 | false); |
2332 | // (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0); | ||
2321 | } | 2333 | } |
2322 | 2334 | ||
2323 | private LSL_Key NpcCreate( | 2335 | private LSL_Key NpcCreate( |
2324 | string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent) | 2336 | string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent) |
2325 | { | 2337 | { |
2338 | if (!owned) | ||
2339 | OSSLError("Unowned NPCs are unsupported"); | ||
2340 | |||
2341 | string groupTitle = String.Empty; | ||
2342 | |||
2343 | if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z))) | ||
2344 | return new LSL_Key(UUID.Zero.ToString()); | ||
2345 | |||
2346 | if (firstname != String.Empty || lastname != String.Empty) | ||
2347 | { | ||
2348 | if (firstname != "Shown outfit:") | ||
2349 | groupTitle = "- NPC -"; | ||
2350 | } | ||
2351 | |||
2326 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | 2352 | INPCModule module = World.RequestModuleInterface<INPCModule>(); |
2327 | if (module != null) | 2353 | if (module != null) |
2328 | { | 2354 | { |
2329 | AvatarAppearance appearance = null; | 2355 | AvatarAppearance appearance = null; |
2330 | 2356 | ||
2331 | UUID id; | 2357 | // UUID id; |
2332 | if (UUID.TryParse(notecard, out id)) | 2358 | // if (UUID.TryParse(notecard, out id)) |
2333 | { | 2359 | // { |
2334 | ScenePresence clonePresence = World.GetScenePresence(id); | 2360 | // ScenePresence clonePresence = World.GetScenePresence(id); |
2335 | if (clonePresence != null) | 2361 | // if (clonePresence != null) |
2336 | appearance = clonePresence.Appearance; | 2362 | // appearance = clonePresence.Appearance; |
2337 | } | 2363 | // } |
2338 | 2364 | ||
2339 | if (appearance == null) | 2365 | if (appearance == null) |
2340 | { | 2366 | { |
@@ -2342,9 +2368,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2342 | 2368 | ||
2343 | if (appearanceSerialized != null) | 2369 | if (appearanceSerialized != null) |
2344 | { | 2370 | { |
2345 | OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); | 2371 | try |
2346 | appearance = new AvatarAppearance(); | 2372 | { |
2347 | appearance.Unpack(appearanceOsd); | 2373 | OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); |
2374 | appearance = new AvatarAppearance(); | ||
2375 | appearance.Unpack(appearanceOsd); | ||
2376 | } | ||
2377 | catch | ||
2378 | { | ||
2379 | return UUID.Zero.ToString(); | ||
2380 | } | ||
2348 | } | 2381 | } |
2349 | else | 2382 | else |
2350 | { | 2383 | { |
@@ -2363,6 +2396,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2363 | World, | 2396 | World, |
2364 | appearance); | 2397 | appearance); |
2365 | 2398 | ||
2399 | ScenePresence sp; | ||
2400 | if (World.TryGetScenePresence(x, out sp)) | ||
2401 | { | ||
2402 | sp.Grouptitle = groupTitle; | ||
2403 | sp.SendAvatarDataToAllAgents(); | ||
2404 | } | ||
2366 | return new LSL_Key(x.ToString()); | 2405 | return new LSL_Key(x.ToString()); |
2367 | } | 2406 | } |
2368 | 2407 | ||
@@ -2666,16 +2705,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2666 | CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); | 2705 | CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); |
2667 | m_host.AddScriptLPS(1); | 2706 | m_host.AddScriptLPS(1); |
2668 | 2707 | ||
2669 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | 2708 | ManualResetEvent ev = new ManualResetEvent(false); |
2670 | if (module != null) | ||
2671 | { | ||
2672 | UUID npcId = new UUID(npc.m_string); | ||
2673 | 2709 | ||
2674 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | 2710 | Util.FireAndForget(delegate(object x) { |
2675 | return; | 2711 | try |
2712 | { | ||
2713 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2714 | if (module != null) | ||
2715 | { | ||
2716 | UUID npcId = new UUID(npc.m_string); | ||
2676 | 2717 | ||
2677 | module.DeleteNPC(npcId, World); | 2718 | ILandObject l = World.LandChannel.GetLandObject(m_host.GroupPosition.X, m_host.GroupPosition.Y); |
2678 | } | 2719 | if (l == null || m_host.OwnerID != l.LandData.OwnerID) |
2720 | { | ||
2721 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2722 | return; | ||
2723 | } | ||
2724 | |||
2725 | module.DeleteNPC(npcId, World); | ||
2726 | } | ||
2727 | } | ||
2728 | finally | ||
2729 | { | ||
2730 | ev.Set(); | ||
2731 | } | ||
2732 | }); | ||
2733 | ev.WaitOne(); | ||
2679 | } | 2734 | } |
2680 | 2735 | ||
2681 | public void osNpcPlayAnimation(LSL_Key npc, string animation) | 2736 | public void osNpcPlayAnimation(LSL_Key npc, string animation) |